# HG changeset patch # User Matti Niemenmaa # Date 1268168828 -7200 # Node ID 9176437d98be449157a774a8af5ca60a117f9b8d # Parent 8f121883bce81df42c804ab2a7e065e8ca03eb8d Add -linkonce-templates for emitting linkonce_odr syms instead of weak_odr. diff -r 8f121883bce8 -r 9176437d98be gen/cl_options.cpp --- a/gen/cl_options.cpp Mon Mar 08 23:37:40 2010 -0700 +++ b/gen/cl_options.cpp Tue Mar 09 23:07:08 2010 +0200 @@ -313,6 +313,9 @@ cl::desc("Create only a single output object file"), cl::ZeroOrMore); +cl::opt linkonceTemplates("linkonce-templates", + cl::desc("Use linkonce_odr linkage for template symbols instead of weak_odr"), + cl::ZeroOrMore); static cl::extrahelp footer("\n" "-d-debug can also be specified without options, in which case it enables all\n" diff -r 8f121883bce8 -r 9176437d98be gen/cl_options.h --- a/gen/cl_options.h Mon Mar 08 23:37:40 2010 -0700 +++ b/gen/cl_options.h Tue Mar 09 23:07:08 2010 +0200 @@ -42,6 +42,7 @@ extern cl::list mAttrs; extern cl::opt mTargetTriple; extern cl::opt singleObj; + extern cl::opt linkonceTemplates; // Arguments to -d-debug extern std::vector debugArgs; diff -r 8f121883bce8 -r 9176437d98be gen/linkage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/linkage.cpp Tue Mar 09 23:07:08 2010 +0200 @@ -0,0 +1,4 @@ +#include "linkage.h" +#include "gen/cl_options.h" + +LLGlobalValue::LinkageTypes templateLinkage; diff -r 8f121883bce8 -r 9176437d98be gen/linkage.h --- a/gen/linkage.h Mon Mar 08 23:37:40 2010 -0700 +++ b/gen/linkage.h Tue Mar 09 23:07:08 2010 +0200 @@ -1,13 +1,14 @@ #ifndef LDC_GEN_LINKAGE_H #define LDC_GEN_LINKAGE_H +#include "gen/llvm.h" + // Make it easier to test new linkage types -# define TEMPLATE_LINKAGE_TYPE llvm::GlobalValue::WeakODRLinkage -# define TYPEINFO_LINKAGE_TYPE llvm::GlobalValue::LinkOnceODRLinkage +# define TYPEINFO_LINKAGE_TYPE LLGlobalValue::LinkOnceODRLinkage // The One-Definition-Rule shouldn't matter for debug info, right? -# define DEBUGINFO_LINKONCE_LINKAGE_TYPE \ - llvm::GlobalValue::LinkOnceAnyLinkage +# define DEBUGINFO_LINKONCE_LINKAGE_TYPE LLGlobalValue::LinkOnceAnyLinkage +extern LLGlobalValue::LinkageTypes templateLinkage; #endif diff -r 8f121883bce8 -r 9176437d98be gen/main.cpp --- a/gen/main.cpp Mon Mar 08 23:37:40 2010 -0700 +++ b/gen/main.cpp Tue Mar 09 23:07:08 2010 +0200 @@ -36,6 +36,7 @@ #include "cond.h" #include "gen/logger.h" +#include "gen/linkage.h" #include "gen/linker.h" #include "gen/irstate.h" #include "gen/optimizer.h" @@ -259,6 +260,10 @@ global.params.output_ll = opts::output_ll ? OUTPUTFLAGset : OUTPUTFLAGno; global.params.output_s = opts::output_s ? OUTPUTFLAGset : OUTPUTFLAGno; + templateLinkage = + opts::linkonceTemplates ? LLGlobalValue::LinkOnceODRLinkage + : LLGlobalValue::WeakODRLinkage; + if (global.params.run || !runargs.empty()) { // FIXME: how to properly detect the presence of a PositionalEatsArgs // option without parameters? We want to emit an error in that case... diff -r 8f121883bce8 -r 9176437d98be gen/tollvm.cpp --- a/gen/tollvm.cpp Mon Mar 08 23:37:40 2010 -0700 +++ b/gen/tollvm.cpp Tue Mar 09 23:07:08 2010 +0200 @@ -245,7 +245,7 @@ return llvm::GlobalValue::AvailableExternallyLinkage; // template if (needsTemplateLinkage(sym)) - return TEMPLATE_LINKAGE_TYPE; + return templateLinkage; } // function else if (FuncDeclaration* fdecl = sym->isFuncDeclaration()) @@ -263,12 +263,12 @@ return llvm::GlobalValue::AvailableExternallyLinkage; // array operations are always template linkage if (fdecl->isArrayOp) - return TEMPLATE_LINKAGE_TYPE; + return templateLinkage; // template instances should have weak linkage // but only if there's a body, and it's not naked // otherwise we make it external else if (needsTemplateLinkage(fdecl) && fdecl->fbody && !fdecl->naked) - return TEMPLATE_LINKAGE_TYPE; + return templateLinkage; // extern(C) functions are always external else if (ft->linkage == LINKc) return llvm::GlobalValue::ExternalLinkage; @@ -283,7 +283,7 @@ return llvm::GlobalValue::AvailableExternallyLinkage; // template if (needsTemplateLinkage(cd)) - return TEMPLATE_LINKAGE_TYPE; + return templateLinkage; } else { @@ -334,7 +334,7 @@ if (needsTemplateLinkage(sym)) { if (isAvailableExternally(sym) && mustDefineSymbol(sym)) return llvm::GlobalValue::AvailableExternallyLinkage; - return TEMPLATE_LINKAGE_TYPE; + return templateLinkage; } else return llvm::GlobalValue::InternalLinkage; @@ -345,7 +345,7 @@ if (isAvailableExternally(sym) && mustDefineSymbol(sym)) return llvm::GlobalValue::AvailableExternallyLinkage; if (needsTemplateLinkage(sym)) - return TEMPLATE_LINKAGE_TYPE; + return templateLinkage; else return llvm::GlobalValue::ExternalLinkage; }