comparison gen/tollvm.cpp @ 918:a4fcc13da3cd

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.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Mon, 02 Feb 2009 01:44:51 +0100
parents fcab41e144c9
children 545f54041d91
comparison
equal deleted inserted replaced
917:7e272f2b4fc3 918:a4fcc13da3cd
274 // global variable 274 // global variable
275 if (VarDeclaration* vd = sym->isVarDeclaration()) 275 if (VarDeclaration* vd = sym->isVarDeclaration())
276 { 276 {
277 // template 277 // template
278 if (DtoIsTemplateInstance(sym)) 278 if (DtoIsTemplateInstance(sym))
279 return llvm::GlobalValue::WeakLinkage; 279 return TEMPLATE_LINKAGE_TYPE;
280 // local static 280 // local static
281 else if (sym->parent && sym->parent->isFuncDeclaration()) 281 else if (sym->parent && sym->parent->isFuncDeclaration())
282 return llvm::GlobalValue::InternalLinkage; 282 return llvm::GlobalValue::InternalLinkage;
283 } 283 }
284 // function 284 // function
294 if (fdecl->llvmInternal == LLVMintrinsic) 294 if (fdecl->llvmInternal == LLVMintrinsic)
295 return llvm::GlobalValue::ExternalLinkage; 295 return llvm::GlobalValue::ExternalLinkage;
296 // template instances should have weak linkage 296 // template instances should have weak linkage
297 // but only if there's a body, otherwise we make it external 297 // but only if there's a body, otherwise we make it external
298 else if (DtoIsTemplateInstance(fdecl) && fdecl->fbody) 298 else if (DtoIsTemplateInstance(fdecl) && fdecl->fbody)
299 return llvm::GlobalValue::WeakLinkage; 299 return TEMPLATE_LINKAGE_TYPE;
300 // extern(C) functions are always external 300 // extern(C) functions are always external
301 else if (ft->linkage == LINKc) 301 else if (ft->linkage == LINKc)
302 return llvm::GlobalValue::ExternalLinkage; 302 return llvm::GlobalValue::ExternalLinkage;
303 } 303 }
304 // class 304 // class
305 else if (ClassDeclaration* cd = sym->isClassDeclaration()) 305 else if (ClassDeclaration* cd = sym->isClassDeclaration())
306 { 306 {
307 // template 307 // template
308 if (DtoIsTemplateInstance(cd)) 308 if (DtoIsTemplateInstance(cd))
309 return llvm::GlobalValue::WeakLinkage; 309 return TEMPLATE_LINKAGE_TYPE;
310 } 310 }
311 else 311 else
312 { 312 {
313 assert(0 && "not global/function"); 313 assert(0 && "not global/function");
314 } 314 }
318 } 318 }
319 319
320 llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym) 320 llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym)
321 { 321 {
322 if (DtoIsTemplateInstance(sym)) 322 if (DtoIsTemplateInstance(sym))
323 return llvm::GlobalValue::WeakLinkage; 323 return TEMPLATE_LINKAGE_TYPE;
324 else 324 else
325 return llvm::GlobalValue::InternalLinkage; 325 return llvm::GlobalValue::InternalLinkage;
326 } 326 }
327 327
328 llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym) 328 llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym)
329 { 329 {
330 if (DtoIsTemplateInstance(sym)) 330 if (DtoIsTemplateInstance(sym))
331 return llvm::GlobalValue::WeakLinkage; 331 return TEMPLATE_LINKAGE_TYPE;
332 else 332 else
333 return llvm::GlobalValue::ExternalLinkage; 333 return llvm::GlobalValue::ExternalLinkage;
334 } 334 }
335 335
336 ////////////////////////////////////////////////////////////////////////////////////////// 336 //////////////////////////////////////////////////////////////////////////////////////////