Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Add -linkonce-templates for emitting linkonce_odr syms instead of wea…

…k_odr.
  • Loading branch information...
commit 68daadf53c1136ead3a01295bcbef6884b10af00 1 parent b38845e
Matti Niemenmaa Deewiant authored
3  gen/cl_options.cpp
View
@@ -313,6 +313,9 @@ cl::opt<bool> singleObj("singleobj",
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"
1  gen/cl_options.h
View
@@ -42,6 +42,7 @@ namespace opts {
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;
4 gen/linkage.cpp
View
@@ -0,0 +1,4 @@
+#include "linkage.h"
+#include "gen/cl_options.h"
+
+LLGlobalValue::LinkageTypes templateLinkage;
9 gen/linkage.h
View
@@ -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
5 gen/main.cpp
View
@@ -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 @@ int main(int argc, char** argv)
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...
12 gen/tollvm.cpp
View
@@ -245,7 +245,7 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
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 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
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 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
return llvm::GlobalValue::AvailableExternallyLinkage;
// template
if (needsTemplateLinkage(cd))
- return TEMPLATE_LINKAGE_TYPE;
+ return templateLinkage;
}
else
{
@@ -334,7 +334,7 @@ llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym)
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 @@ llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym)
if (isAvailableExternally(sym) && mustDefineSymbol(sym))
return llvm::GlobalValue::AvailableExternallyLinkage;
if (needsTemplateLinkage(sym))
- return TEMPLATE_LINKAGE_TYPE;
+ return templateLinkage;
else
return llvm::GlobalValue::ExternalLinkage;
}
Please sign in to comment.
Something went wrong with that request. Please try again.