# HG changeset patch # User Frits van Bommel # Date 1236525190 -3600 # Node ID f0b6549055abf509e2bd438fecb175fd71b21836 # Parent 40d7f9b7357f7916bf0bdfa17dd4879631917fb1 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) diff -r 40d7f9b7357f -r f0b6549055ab .hgignore --- a/.hgignore Sun Mar 08 12:13:22 2009 +0100 +++ b/.hgignore Sun Mar 08 16:13:10 2009 +0100 @@ -28,9 +28,9 @@ ^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$ diff -r 40d7f9b7357f -r f0b6549055ab CMakeLists.txt --- a/CMakeLists.txt Sun Mar 08 12:13:22 2009 +0100 +++ b/CMakeLists.txt Sun Mar 08 16:13:10 2009 +0100 @@ -168,13 +168,21 @@ add_executable(${LDC_EXE} ${LDC_SOURCE_FILES}) # generate revision info -configure_file(${PROJECT_SOURCE_DIR}/revisions.pl.in ${PROJECT_BINARY_DIR}/revisions.pl) +configure_file( + ${PROJECT_SOURCE_DIR}/revisions.pl.in + ${PROJECT_BINARY_DIR}/revisions.pl + @ONLY +) add_custom_command( - OUTPUT ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/revisions.h + OUTPUT ${PROJECT_BINARY_DIR}/gen/revisions.h COMMAND ${PERL_EXECUTABLE} ${PROJECT_BINARY_DIR}/revisions.pl - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${DMDFE_PATH} + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/gen ) -add_custom_target(gen_revs_h ALL DEPENDS ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/revisions.h) +add_custom_target( + gen_revs_h ALL + DEPENDS ${PROJECT_BINARY_DIR}/revisions.pl + ${PROJECT_BINARY_DIR}/gen/revisions.h +) add_dependencies(${LDC_EXE} gen_revs_h) # diff -r 40d7f9b7357f -r f0b6549055ab dmd/mars.c --- a/dmd/mars.c Sun Mar 08 12:13:22 2009 +0100 +++ b/dmd/mars.c Sun Mar 08 16:13:10 2009 +0100 @@ -36,7 +36,7 @@ #include "expression.h" #include "lexer.h" -#include "revisions.h" +#include "gen/revisions.h" Global global; @@ -61,7 +61,7 @@ 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 diff -r 40d7f9b7357f -r f0b6549055ab dmd/mars.h --- a/dmd/mars.h Sun Mar 08 12:13:22 2009 +0100 +++ b/dmd/mars.h Sun Mar 08 16:13:10 2009 +0100 @@ -66,10 +66,6 @@ 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 { diff -r 40d7f9b7357f -r f0b6549055ab dmd2/mars.h --- a/dmd2/mars.h Sun Mar 08 12:13:22 2009 +0100 +++ b/dmd2/mars.h Sun Mar 08 16:13:10 2009 +0100 @@ -66,10 +66,6 @@ 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 { diff -r 40d7f9b7357f -r f0b6549055ab gen/linkage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/linkage.h Sun Mar 08 16:13:10 2009 +0100 @@ -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 diff -r 40d7f9b7357f -r f0b6549055ab gen/todebug.cpp --- a/gen/todebug.cpp Sun Mar 08 12:13:22 2009 +0100 +++ b/gen/todebug.cpp Sun Mar 08 16:13:10 2009 +0100 @@ -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 @@ */ 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; diff -r 40d7f9b7357f -r f0b6549055ab gen/tollvm.cpp --- a/gen/tollvm.cpp Sun Mar 08 12:13:22 2009 +0100 +++ b/gen/tollvm.cpp Sun Mar 08 16:13:10 2009 +0100 @@ -19,6 +19,7 @@ #include "gen/typeinf.h" #include "gen/complex.h" #include "gen/llvmhelpers.h" +#include "gen/linkage.h" bool DtoIsPassedByRef(Type* type) { diff -r 40d7f9b7357f -r f0b6549055ab gen/typinf.cpp --- a/gen/typinf.cpp Sun Mar 08 12:13:22 2009 +0100 +++ b/gen/typinf.cpp Sun Mar 08 16:13:10 2009 +0100 @@ -39,6 +39,7 @@ #include "gen/arrays.h" #include "gen/structs.h" #include "gen/classes.h" +#include "gen/linkage.h" #include "ir/irvar.h" diff -r 40d7f9b7357f -r f0b6549055ab revisions.pl.in --- a/revisions.pl.in Sun Mar 08 12:13:22 2009 +0100 +++ b/revisions.pl.in Sun Mar 08 16:13:10 2009 +0100 @@ -7,15 +7,20 @@ 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+:)?(?(?\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 $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!;