From 622a93a81091f0c7593036e38df7e341fc091e30 Mon Sep 17 00:00:00 2001 From: Frits van Bommel Date: Sun, 8 Mar 2009 16:13:10 +0100 Subject: [PATCH] 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) --- .hgignore | 2 +- CMakeLists.txt | 20 ++++++++++++++------ dmd/mars.c | 4 ++-- dmd/mars.h | 4 ---- dmd2/mars.h | 4 ---- gen/linkage.h | 31 +++++++++++++++++++++++++++++++ gen/todebug.cpp | 5 ++++- gen/tollvm.cpp | 1 + gen/typinf.cpp | 1 + revisions.pl.in | 20 +++++++++++++++----- 10 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 gen/linkage.h diff --git a/.hgignore b/.hgignore index 4e63f82e..b3c092aa 100644 --- a/.hgignore +++ b/.hgignore @@ -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$ diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c2fbe1f..bb9072f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) # diff --git a/dmd/mars.c b/dmd/mars.c index 1189b0fd..e1ca8144 100644 --- a/dmd/mars.c +++ b/dmd/mars.c @@ -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 diff --git a/dmd/mars.h b/dmd/mars.h index 4113d646..4c456bff 100644 --- a/dmd/mars.h +++ b/dmd/mars.h @@ -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 { diff --git a/dmd2/mars.h b/dmd2/mars.h index e8326a09..a34a9284 100644 --- a/dmd2/mars.h +++ b/dmd2/mars.h @@ -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 { diff --git a/gen/linkage.h b/gen/linkage.h new file mode 100644 index 00000000..fba8432a --- /dev/null +++ b/gen/linkage.h @@ -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 --git a/gen/todebug.cpp b/gen/todebug.cpp index 9b969b87..5567e7a7 100644 --- a/gen/todebug.cpp +++ b/gen/todebug.cpp @@ -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; diff --git a/gen/tollvm.cpp b/gen/tollvm.cpp index 1ab37fff..c9397ec8 100644 --- a/gen/tollvm.cpp +++ b/gen/tollvm.cpp @@ -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 --git a/gen/typinf.cpp b/gen/typinf.cpp index b6c444df..41707cea 100644 --- a/gen/typinf.cpp +++ b/gen/typinf.cpp @@ -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 --git a/revisions.pl.in b/revisions.pl.in index 8901ebfe..cc13e1ab 100644 --- a/revisions.pl.in +++ b/revisions.pl.in @@ -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+:)?(?(?\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!;