mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-20 14:53:14 +01:00
Make LDC work with LLVM trunk (s/LinkOnceLinkage/LinkOnceOdrLinkage/)
Also moved the #defines for linkage types into a separate header instead of mars.h so we can #include revisions.h without having to rebuild the entire frontend every time we update. (I'm using revisions.h to get the LLVM revision for use in preprocessor conditionals. It should work with LLVM release 2.5, old trunk and new trunk)
This commit is contained in:
@@ -28,9 +28,9 @@ syntax: regexp
|
||||
^impcnvgen\.make$
|
||||
^ldc\.make$
|
||||
^revisions\.pl$
|
||||
^gen/revisions\.h$
|
||||
^dmd2?/idgen$
|
||||
^dmd2?/impcnvgen$
|
||||
^dmd2?/revisions\.h$
|
||||
^dmd2?/impcnvtab\.c$
|
||||
^dmd2?/id\.c$
|
||||
^dmd2?/id\.h$
|
||||
|
||||
@@ -168,13 +168,21 @@ endif(CMAKE_MINOR_VERSION LESS 6)
|
||||
add_executable(${LDC_EXE} ${LDC_SOURCE_FILES})
|
||||
|
||||
# generate revision info
|
||||
configure_file(${PROJECT_SOURCE_DIR}/revisions.pl.in ${PROJECT_BINARY_DIR}/revisions.pl)
|
||||
add_custom_command(
|
||||
OUTPUT ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/revisions.h
|
||||
COMMAND ${PERL_EXECUTABLE} ${PROJECT_BINARY_DIR}/revisions.pl
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${DMDFE_PATH}
|
||||
configure_file(
|
||||
${PROJECT_SOURCE_DIR}/revisions.pl.in
|
||||
${PROJECT_BINARY_DIR}/revisions.pl
|
||||
@ONLY
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT ${PROJECT_BINARY_DIR}/gen/revisions.h
|
||||
COMMAND ${PERL_EXECUTABLE} ${PROJECT_BINARY_DIR}/revisions.pl
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/gen
|
||||
)
|
||||
add_custom_target(
|
||||
gen_revs_h ALL
|
||||
DEPENDS ${PROJECT_BINARY_DIR}/revisions.pl
|
||||
${PROJECT_BINARY_DIR}/gen/revisions.h
|
||||
)
|
||||
add_custom_target(gen_revs_h ALL DEPENDS ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/revisions.h)
|
||||
add_dependencies(${LDC_EXE} gen_revs_h)
|
||||
#
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
#include "expression.h"
|
||||
#include "lexer.h"
|
||||
|
||||
#include "revisions.h"
|
||||
#include "gen/revisions.h"
|
||||
|
||||
Global global;
|
||||
|
||||
@@ -61,7 +61,7 @@ Global::Global()
|
||||
written = "written by Walter Bright and Tomas Lindquist Olsen";
|
||||
version = "v1.039";
|
||||
ldc_version = LDC_REV;
|
||||
llvm_version = LLVM_REV;
|
||||
llvm_version = LLVM_REV_STR;
|
||||
global.structalign = 8;
|
||||
|
||||
// This should only be used as a global, so the other fields are
|
||||
|
||||
@@ -66,10 +66,6 @@ enum OS
|
||||
OSSolaris,
|
||||
};
|
||||
|
||||
// make it easier to test new linkage types
|
||||
#define TEMPLATE_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||
#define TYPEINFO_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||
|
||||
// Put command line switches in here
|
||||
struct Param
|
||||
{
|
||||
|
||||
@@ -66,10 +66,6 @@ enum OS
|
||||
OSSolaris,
|
||||
};
|
||||
|
||||
// make it easier to test new linkage types
|
||||
#define TEMPLATE_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||
#define TYPEINFO_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||
|
||||
// Put command line switches in here
|
||||
struct Param
|
||||
{
|
||||
|
||||
31
gen/linkage.h
Normal file
31
gen/linkage.h
Normal file
@@ -0,0 +1,31 @@
|
||||
#ifndef LDC_GEN_LINKAGE_H
|
||||
#define LDC_GEN_LINKAGE_H
|
||||
|
||||
#include "gen/revisions.h"
|
||||
|
||||
// Make it easier to test new linkage types
|
||||
// Also used to adapt to some changes in LLVM between 2.5 and 2.6
|
||||
|
||||
|
||||
// LLVM r66339 introduces LinkOnceODRLinkage, which is just what we want here.
|
||||
// (It also renamed LinkOnceLinkage, so this #if is needed for LDC to compile
|
||||
// with both 2.5 and trunk)
|
||||
#if LLVM_REV >= 66339
|
||||
# define TEMPLATE_LINKAGE_TYPE llvm::GlobalValue::LinkOnceODRLinkage
|
||||
# define TYPEINFO_LINKAGE_TYPE llvm::GlobalValue::LinkOnceODRLinkage
|
||||
// The One-Definition-Rule shouldn't matter for debug info, right?
|
||||
# define DEBUGINFO_LINKONCE_LINKAGE_TYPE \
|
||||
llvm::GlobalValue::LinkOnceAnyLinkage
|
||||
|
||||
// For 2.5 and any LLVM revision before 66339 we want to use LinkOnceLinkage
|
||||
// It's equivalent to LinkOnceAnyLinkage in trunk except that the inliner had a
|
||||
// hack (removed in r66339) to allow inlining of templated functions even though
|
||||
// LinkOnce doesn't technically allow that.
|
||||
#else
|
||||
# define TEMPLATE_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||
# define TYPEINFO_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||
# define DEBUGINFO_LINKONCE_LINKAGE_TYPE \
|
||||
llvm::GlobalValue::LinkOnceLinkage
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "gen/tollvm.h"
|
||||
#include "gen/logger.h"
|
||||
#include "gen/llvmhelpers.h"
|
||||
#include "gen/linkage.h"
|
||||
|
||||
#include "ir/irmodule.h"
|
||||
|
||||
@@ -33,7 +34,9 @@ using namespace llvm::dwarf;
|
||||
*/
|
||||
static LLGlobalVariable* emitDwarfGlobalDecl(const LLStructType* type, const char* name, bool linkonce=false)
|
||||
{
|
||||
LLGlobalValue::LinkageTypes linkage = linkonce ? LLGlobalValue::LinkOnceLinkage : LLGlobalValue::InternalLinkage;
|
||||
LLGlobalValue::LinkageTypes linkage = linkonce
|
||||
? DEBUGINFO_LINKONCE_LINKAGE_TYPE
|
||||
: LLGlobalValue::InternalLinkage;
|
||||
LLGlobalVariable* gv = new LLGlobalVariable(type, true, linkage, NULL, name, gIR->module);
|
||||
gv->setSection("llvm.metadata");
|
||||
return gv;
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "gen/typeinf.h"
|
||||
#include "gen/complex.h"
|
||||
#include "gen/llvmhelpers.h"
|
||||
#include "gen/linkage.h"
|
||||
|
||||
bool DtoIsPassedByRef(Type* type)
|
||||
{
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "gen/arrays.h"
|
||||
#include "gen/structs.h"
|
||||
#include "gen/classes.h"
|
||||
#include "gen/linkage.h"
|
||||
|
||||
#include "ir/irvar.h"
|
||||
|
||||
|
||||
@@ -7,15 +7,20 @@ use Time::localtime;
|
||||
|
||||
my $llvm_src = `perl @LLVM_CONFIG@ --src-root`;
|
||||
|
||||
my $llvm_rev = `svnversion $llvm_src`;
|
||||
my $llvm_rev = `svnversion --committed $llvm_src`;
|
||||
my $llvm_rev_str;
|
||||
my $llvm_rev_nr;
|
||||
|
||||
if ($llvm_rev =~ s/(\d+M?)\s+$/$1/) {
|
||||
$llvm_rev = qq!#define LLVM_REV "LLVM rev. $llvm_rev"!
|
||||
if ($llvm_rev =~ /^\s*(\d+:)?(?<str>(?<nr>\d+)[MSP]*)\s*$/) {
|
||||
$llvm_rev_str = qq!#define LLVM_REV_STR "LLVM rev. $+{str}"!;
|
||||
$llvm_rev_nr = "$+{nr}";
|
||||
} else {
|
||||
my $llvm_lib = `perl @LLVM_CONFIG@ --libdir`;
|
||||
$llvm_lib =~ s/\s+$//;
|
||||
$llvm_rev = ctime(stat($llvm_lib)->mtime) if (-d $llvm_lib);
|
||||
$llvm_rev = qq!#include "llvm/Config/config.h"\n#define LLVM_REV PACKAGE_STRING" ($llvm_rev)"!;
|
||||
$llvm_rev_str = qq!#include "llvm/Config/config.h"\n#define LLVM_REV_STR PACKAGE_STRING" ($llvm_rev)"!;
|
||||
# Assume latest release, so < any version we should be testing for.
|
||||
$llvm_rev_nr = 0;
|
||||
}
|
||||
|
||||
my $ldc_rev = `hg -R@PROJECT_SOURCE_DIR@ log -r qparent --template '{rev}:{node|short} ({date|isodate})' 2>/dev/null || hg -R@PROJECT_SOURCE_DIR@ tip --template '{rev}:{node|short} ({date|isodate})'`;
|
||||
@@ -23,7 +28,12 @@ my $ldc_rev = `hg -R@PROJECT_SOURCE_DIR@ log -r qparent --template '{rev}:{node|
|
||||
my $out = qq!#ifndef LDC_VERSIONS_H
|
||||
#define LDC_VERSIONS_H
|
||||
|
||||
$llvm_rev
|
||||
// LLVM version string, for use in -version output
|
||||
$llvm_rev_str
|
||||
// LLVM svn revision number, used to adapt to changes in LLVM
|
||||
// (Is 0 if LLVM is not an SVN version)
|
||||
#define LLVM_REV $llvm_rev_nr
|
||||
// LDC version string, for use in -version output
|
||||
#define LDC_REV "rev. $ldc_rev"
|
||||
|
||||
#endif // LDC_VERSIONS_H\n!;
|
||||
|
||||
Reference in New Issue
Block a user