mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-06 19:06:02 +03:00
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:
parent
9b85a345e9
commit
75591b3c16
6 changed files with 26 additions and 18 deletions
|
@ -65,6 +65,10 @@ enum OS
|
||||||
OSSolaris,
|
OSSolaris,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// make it easier to test new linkage types
|
||||||
|
#define TEMPLATE_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||||
|
#define TYPEINFO_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||||
|
|
||||||
// Put command line switches in here
|
// Put command line switches in here
|
||||||
struct Param
|
struct Param
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,6 +65,10 @@ enum OS
|
||||||
OSSolaris,
|
OSSolaris,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// make it easier to test new linkage types
|
||||||
|
#define TEMPLATE_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||||
|
#define TYPEINFO_LINKAGE_TYPE llvm::GlobalValue::LinkOnceLinkage
|
||||||
|
|
||||||
// Put command line switches in here
|
// Put command line switches in here
|
||||||
struct Param
|
struct Param
|
||||||
{
|
{
|
||||||
|
|
|
@ -844,7 +844,7 @@ bool DtoIsTemplateInstance(Dsymbol* s)
|
||||||
void DtoLazyStaticInit(bool istempl, LLValue* gvar, Initializer* init, Type* t)
|
void DtoLazyStaticInit(bool istempl, LLValue* gvar, Initializer* init, Type* t)
|
||||||
{
|
{
|
||||||
// create a flag to make sure initialization only happens once
|
// create a flag to make sure initialization only happens once
|
||||||
llvm::GlobalValue::LinkageTypes gflaglink = istempl ? llvm::GlobalValue::WeakLinkage : llvm::GlobalValue::InternalLinkage;
|
llvm::GlobalValue::LinkageTypes gflaglink = istempl ? TEMPLATE_LINKAGE_TYPE : llvm::GlobalValue::InternalLinkage;
|
||||||
std::string gflagname(gvar->getName());
|
std::string gflagname(gvar->getName());
|
||||||
gflagname.append("__initflag");
|
gflagname.append("__initflag");
|
||||||
llvm::GlobalVariable* gflag = new llvm::GlobalVariable(LLType::Int1Ty,false,gflaglink,DtoConstBool(false),gflagname,gIR->module);
|
llvm::GlobalVariable* gflag = new llvm::GlobalVariable(LLType::Int1Ty,false,gflaglink,DtoConstBool(false),gflagname,gIR->module);
|
||||||
|
|
|
@ -391,7 +391,7 @@ DValue* StringExp::toElem(IRState* p)
|
||||||
else
|
else
|
||||||
assert(0);
|
assert(0);
|
||||||
|
|
||||||
llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage;
|
llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;
|
||||||
if (Logger::enabled())
|
if (Logger::enabled())
|
||||||
Logger::cout() << "type: " << *at << "\ninit: " << *_init << '\n';
|
Logger::cout() << "type: " << *at << "\ninit: " << *_init << '\n';
|
||||||
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(at,true,_linkage,_init,".str",gIR->module);
|
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(at,true,_linkage,_init,".str",gIR->module);
|
||||||
|
@ -467,7 +467,7 @@ LLConstant* StringExp::toConstElem(IRState* p)
|
||||||
return _init;
|
return _init;
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage;
|
llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;
|
||||||
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_init->getType(),true,_linkage,_init,".str",gIR->module);
|
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_init->getType(),true,_linkage,_init,".str",gIR->module);
|
||||||
|
|
||||||
llvm::ConstantInt* zero = llvm::ConstantInt::get(LLType::Int32Ty, 0, false);
|
llvm::ConstantInt* zero = llvm::ConstantInt::get(LLType::Int32Ty, 0, false);
|
||||||
|
|
|
@ -276,7 +276,7 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
|
||||||
{
|
{
|
||||||
// template
|
// template
|
||||||
if (DtoIsTemplateInstance(sym))
|
if (DtoIsTemplateInstance(sym))
|
||||||
return llvm::GlobalValue::WeakLinkage;
|
return TEMPLATE_LINKAGE_TYPE;
|
||||||
// local static
|
// local static
|
||||||
else if (sym->parent && sym->parent->isFuncDeclaration())
|
else if (sym->parent && sym->parent->isFuncDeclaration())
|
||||||
return llvm::GlobalValue::InternalLinkage;
|
return llvm::GlobalValue::InternalLinkage;
|
||||||
|
@ -296,7 +296,7 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
|
||||||
// template instances should have weak linkage
|
// template instances should have weak linkage
|
||||||
// but only if there's a body, otherwise we make it external
|
// but only if there's a body, otherwise we make it external
|
||||||
else if (DtoIsTemplateInstance(fdecl) && fdecl->fbody)
|
else if (DtoIsTemplateInstance(fdecl) && fdecl->fbody)
|
||||||
return llvm::GlobalValue::WeakLinkage;
|
return TEMPLATE_LINKAGE_TYPE;
|
||||||
// extern(C) functions are always external
|
// extern(C) functions are always external
|
||||||
else if (ft->linkage == LINKc)
|
else if (ft->linkage == LINKc)
|
||||||
return llvm::GlobalValue::ExternalLinkage;
|
return llvm::GlobalValue::ExternalLinkage;
|
||||||
|
@ -306,7 +306,7 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
|
||||||
{
|
{
|
||||||
// template
|
// template
|
||||||
if (DtoIsTemplateInstance(cd))
|
if (DtoIsTemplateInstance(cd))
|
||||||
return llvm::GlobalValue::WeakLinkage;
|
return TEMPLATE_LINKAGE_TYPE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -320,7 +320,7 @@ LLGlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym)
|
||||||
llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym)
|
llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym)
|
||||||
{
|
{
|
||||||
if (DtoIsTemplateInstance(sym))
|
if (DtoIsTemplateInstance(sym))
|
||||||
return llvm::GlobalValue::WeakLinkage;
|
return TEMPLATE_LINKAGE_TYPE;
|
||||||
else
|
else
|
||||||
return llvm::GlobalValue::InternalLinkage;
|
return llvm::GlobalValue::InternalLinkage;
|
||||||
}
|
}
|
||||||
|
@ -328,7 +328,7 @@ llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym)
|
||||||
llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym)
|
llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym)
|
||||||
{
|
{
|
||||||
if (DtoIsTemplateInstance(sym))
|
if (DtoIsTemplateInstance(sym))
|
||||||
return llvm::GlobalValue::WeakLinkage;
|
return TEMPLATE_LINKAGE_TYPE;
|
||||||
else
|
else
|
||||||
return llvm::GlobalValue::ExternalLinkage;
|
return llvm::GlobalValue::ExternalLinkage;
|
||||||
}
|
}
|
||||||
|
|
|
@ -379,7 +379,7 @@ void TypeInfoTypedefDeclaration::llvmDeclare()
|
||||||
const LLStructType* stype = isaStruct(base->type->ir.type->get());
|
const LLStructType* stype = isaStruct(base->type->ir.type->get());
|
||||||
|
|
||||||
// create the symbol
|
// create the symbol
|
||||||
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
|
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeInfoTypedefDeclaration::llvmDefine()
|
void TypeInfoTypedefDeclaration::llvmDefine()
|
||||||
|
@ -453,7 +453,7 @@ void TypeInfoEnumDeclaration::llvmDeclare()
|
||||||
DtoResolveClass(base);
|
DtoResolveClass(base);
|
||||||
|
|
||||||
// create the symbol
|
// create the symbol
|
||||||
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
|
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeInfoEnumDeclaration::llvmDefine()
|
void TypeInfoEnumDeclaration::llvmDefine()
|
||||||
|
@ -528,7 +528,7 @@ static void LLVM_D_Declare_TypeInfoBase(TypeInfoDeclaration* tid, ClassDeclarati
|
||||||
DtoResolveClass(base);
|
DtoResolveClass(base);
|
||||||
|
|
||||||
// create the symbol
|
// create the symbol
|
||||||
tid->ir.irGlobal->value = new llvm::GlobalVariable(tid->ir.irGlobal->type.get(), true,llvm::GlobalValue::WeakLinkage,NULL,tid->toChars(),gIR->module);
|
tid->ir.irGlobal->value = new llvm::GlobalVariable(tid->ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, tid->toChars(), gIR->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void LLVM_D_Define_TypeInfoBase(Type* basetype, TypeInfoDeclaration* tid, ClassDeclaration* cd)
|
static void LLVM_D_Define_TypeInfoBase(Type* basetype, TypeInfoDeclaration* tid, ClassDeclaration* cd)
|
||||||
|
@ -627,7 +627,7 @@ void TypeInfoStaticArrayDeclaration::llvmDeclare()
|
||||||
DtoResolveClass(base);
|
DtoResolveClass(base);
|
||||||
|
|
||||||
// create the symbol
|
// create the symbol
|
||||||
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
|
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeInfoStaticArrayDeclaration::llvmDefine()
|
void TypeInfoStaticArrayDeclaration::llvmDefine()
|
||||||
|
@ -687,7 +687,7 @@ void TypeInfoAssociativeArrayDeclaration::llvmDeclare()
|
||||||
DtoResolveClass(base);
|
DtoResolveClass(base);
|
||||||
|
|
||||||
// create the symbol
|
// create the symbol
|
||||||
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
|
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeInfoAssociativeArrayDeclaration::llvmDefine()
|
void TypeInfoAssociativeArrayDeclaration::llvmDefine()
|
||||||
|
@ -808,7 +808,7 @@ void TypeInfoStructDeclaration::llvmDeclare()
|
||||||
DtoResolveClass(base);
|
DtoResolveClass(base);
|
||||||
|
|
||||||
// create the symbol
|
// create the symbol
|
||||||
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
|
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeInfoStructDeclaration::llvmDefine()
|
void TypeInfoStructDeclaration::llvmDefine()
|
||||||
|
@ -1024,7 +1024,7 @@ void TypeInfoClassDeclaration::llvmDeclare()
|
||||||
DtoResolveClass(base);
|
DtoResolveClass(base);
|
||||||
|
|
||||||
// create the symbol
|
// create the symbol
|
||||||
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, llvm::GlobalValue::WeakLinkage, NULL, toChars(), gIR->module);
|
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeInfoClassDeclaration::llvmDefine()
|
void TypeInfoClassDeclaration::llvmDefine()
|
||||||
|
@ -1080,7 +1080,7 @@ void TypeInfoInterfaceDeclaration::llvmDeclare()
|
||||||
DtoResolveClass(base);
|
DtoResolveClass(base);
|
||||||
|
|
||||||
// create the symbol
|
// create the symbol
|
||||||
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
|
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeInfoInterfaceDeclaration::llvmDefine()
|
void TypeInfoInterfaceDeclaration::llvmDefine()
|
||||||
|
@ -1138,7 +1138,7 @@ void TypeInfoTupleDeclaration::llvmDeclare()
|
||||||
DtoResolveClass(base);
|
DtoResolveClass(base);
|
||||||
|
|
||||||
// create the symbol
|
// create the symbol
|
||||||
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
|
ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeInfoTupleDeclaration::llvmDefine()
|
void TypeInfoTupleDeclaration::llvmDefine()
|
||||||
|
@ -1185,7 +1185,7 @@ void TypeInfoTupleDeclaration::llvmDefine()
|
||||||
LLConstant* arrC = llvm::ConstantArray::get(arrTy, arrInits);
|
LLConstant* arrC = llvm::ConstantArray::get(arrTy, arrInits);
|
||||||
|
|
||||||
// need the pointer to the first element of arrC, so create a global for it
|
// need the pointer to the first element of arrC, so create a global for it
|
||||||
llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage;
|
llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;
|
||||||
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(arrTy,true,_linkage,arrC,".tupleelements",gIR->module);
|
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(arrTy,true,_linkage,arrC,".tupleelements",gIR->module);
|
||||||
|
|
||||||
// get pointer to first element
|
// get pointer to first element
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue