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!;