comparison gen/tollvm.cpp @ 940:39519a1ff603

Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Wed, 04 Feb 2009 18:48:03 +0100
parents 545f54041d91
children 03d7c4aac654
comparison
equal deleted inserted replaced
939:cac9895be400 940:39519a1ff603
273 { 273 {
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 (needsTemplateLinkage(sym))
279 return TEMPLATE_LINKAGE_TYPE; 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 }
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, and it's not naked 297 // but only if there's a body, and it's not naked
298 // otherwise we make it external 298 // otherwise we make it external
299 else if (DtoIsTemplateInstance(fdecl) && fdecl->fbody && !fdecl->naked) 299 else if (needsTemplateLinkage(fdecl) && fdecl->fbody && !fdecl->naked)
300 return TEMPLATE_LINKAGE_TYPE; 300 return TEMPLATE_LINKAGE_TYPE;
301 // extern(C) functions are always external 301 // extern(C) functions are always external
302 else if (ft->linkage == LINKc) 302 else if (ft->linkage == LINKc)
303 return llvm::GlobalValue::ExternalLinkage; 303 return llvm::GlobalValue::ExternalLinkage;
304 } 304 }
305 // class 305 // class
306 else if (ClassDeclaration* cd = sym->isClassDeclaration()) 306 else if (ClassDeclaration* cd = sym->isClassDeclaration())
307 { 307 {
308 // template 308 // template
309 if (DtoIsTemplateInstance(cd)) 309 if (needsTemplateLinkage(cd))
310 return TEMPLATE_LINKAGE_TYPE; 310 return TEMPLATE_LINKAGE_TYPE;
311 } 311 }
312 else 312 else
313 { 313 {
314 assert(0 && "not global/function"); 314 assert(0 && "not global/function");
318 return llvm::GlobalValue::ExternalLinkage; 318 return llvm::GlobalValue::ExternalLinkage;
319 } 319 }
320 320
321 llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym) 321 llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym)
322 { 322 {
323 if (DtoIsTemplateInstance(sym)) 323 if (needsTemplateLinkage(sym))
324 return TEMPLATE_LINKAGE_TYPE; 324 return TEMPLATE_LINKAGE_TYPE;
325 else 325 else
326 return llvm::GlobalValue::InternalLinkage; 326 return llvm::GlobalValue::InternalLinkage;
327 } 327 }
328 328
329 llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym) 329 llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym)
330 { 330 {
331 if (DtoIsTemplateInstance(sym)) 331 if (needsTemplateLinkage(sym))
332 return TEMPLATE_LINKAGE_TYPE; 332 return TEMPLATE_LINKAGE_TYPE;
333 else 333 else
334 return llvm::GlobalValue::ExternalLinkage; 334 return llvm::GlobalValue::ExternalLinkage;
335 } 335 }
336 336