changeset 1064:f0b6549055ab

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)
author Frits van Bommel <fvbommel wxs.nl>
date Sun, 08 Mar 2009 16:13:10 +0100
parents 40d7f9b7357f
children dc576c7e4b1e 7db4bb9602ed
files .hgignore CMakeLists.txt dmd/mars.c dmd/mars.h dmd2/mars.h gen/linkage.h gen/todebug.cpp gen/tollvm.cpp gen/typinf.cpp revisions.pl.in
diffstat 10 files changed, 67 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- 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$
--- 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)
 #
 
--- 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
--- 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
 {
--- 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
 {
--- /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
--- 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;
--- 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)
 {
--- 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"
 
--- 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+:)?(?<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 $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!;