Mercurial > projects > ldc
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 |