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:
Frits van Bommel
2009-03-08 16:13:10 +01:00
parent 532cccbd3a
commit 622a93a810
10 changed files with 69 additions and 23 deletions

View File

@@ -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$

View File

@@ -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)
#

View File

@@ -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

View File

@@ -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
{

View File

@@ -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
View 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

View File

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

View File

@@ -19,6 +19,7 @@
#include "gen/typeinf.h"
#include "gen/complex.h"
#include "gen/llvmhelpers.h"
#include "gen/linkage.h"
bool DtoIsPassedByRef(Type* type)
{

View File

@@ -39,6 +39,7 @@
#include "gen/arrays.h"
#include "gen/structs.h"
#include "gen/classes.h"
#include "gen/linkage.h"
#include "ir/irvar.h"

View File

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