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