Mercurial > projects > ldc
changeset 1644:9176437d98be
Add -linkonce-templates for emitting linkonce_odr syms instead of weak_odr.
author | Matti Niemenmaa <matti.niemenmaa+hg@iki.fi> |
---|---|
date | Tue, 09 Mar 2010 23:07:08 +0200 |
parents | 8f121883bce8 |
children | 1d2d1aa16841 |
files | gen/cl_options.cpp gen/cl_options.h gen/linkage.cpp gen/linkage.h gen/main.cpp gen/tollvm.cpp |
diffstat | 6 files changed, 24 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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<bool> 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"
--- 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<std::string> mAttrs; extern cl::opt<std::string> mTargetTriple; extern cl::opt<bool> singleObj; + extern cl::opt<bool> linkonceTemplates; // Arguments to -d-debug extern std::vector<std::string> debugArgs;
--- /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;
--- 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
--- 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...
--- 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; }