Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.

This commit is contained in:
Tomas Lindquist Olsen
2009-02-02 01:44:51 +01:00
parent 9b85a345e9
commit 75591b3c16
6 changed files with 26 additions and 18 deletions

View File

@@ -276,7 +276,7 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
{
// template
if (DtoIsTemplateInstance(sym))
return llvm::GlobalValue::WeakLinkage;
return TEMPLATE_LINKAGE_TYPE;
// local static
else if (sym->parent && sym->parent->isFuncDeclaration())
return llvm::GlobalValue::InternalLinkage;
@@ -296,7 +296,7 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
// template instances should have weak linkage
// but only if there's a body, otherwise we make it external
else if (DtoIsTemplateInstance(fdecl) && fdecl->fbody)
return llvm::GlobalValue::WeakLinkage;
return TEMPLATE_LINKAGE_TYPE;
// extern(C) functions are always external
else if (ft->linkage == LINKc)
return llvm::GlobalValue::ExternalLinkage;
@@ -306,7 +306,7 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
{
// template
if (DtoIsTemplateInstance(cd))
return llvm::GlobalValue::WeakLinkage;
return TEMPLATE_LINKAGE_TYPE;
}
else
{
@@ -320,7 +320,7 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym)
{
if (DtoIsTemplateInstance(sym))
return llvm::GlobalValue::WeakLinkage;
return TEMPLATE_LINKAGE_TYPE;
else
return llvm::GlobalValue::InternalLinkage;
}
@@ -328,7 +328,7 @@ llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym)
llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym)
{
if (DtoIsTemplateInstance(sym))
return llvm::GlobalValue::WeakLinkage;
return TEMPLATE_LINKAGE_TYPE;
else
return llvm::GlobalValue::ExternalLinkage;
}