Mercurial > projects > ldc
comparison gen/tollvm.cpp @ 149:4c577c2b7229 trunk
[svn r155] Fixed a bunch of linkage problems (especially with templates)
author | lindquist |
---|---|
date | Mon, 24 Mar 2008 19:43:02 +0100 |
parents | a27941d00351 |
children | 7f92f477ff53 |
comparison
equal
deleted
inserted
replaced
148:86d3bb8ca33e | 149:4c577c2b7229 |
---|---|
342 return b; | 342 return b; |
343 } | 343 } |
344 | 344 |
345 ////////////////////////////////////////////////////////////////////////////////////////// | 345 ////////////////////////////////////////////////////////////////////////////////////////// |
346 | 346 |
347 llvm::GlobalValue::LinkageTypes DtoLinkage(PROT prot, uint stc) | 347 llvm::GlobalValue::LinkageTypes DtoLinkage(Dsymbol* sym) |
348 { | 348 { |
349 // turns out we can't really make anything internal with the way D works :( | 349 // global variable |
350 // the things we can need much more info than this can extract. | 350 if (VarDeclaration* vd = sym->isVarDeclaration()) |
351 // TODO : remove this useless function | 351 { |
352 switch(prot) | 352 // template |
353 { | 353 if (DtoIsTemplateInstance(sym)) |
354 case PROTprivate: | 354 return llvm::GlobalValue::WeakLinkage; |
355 //if (stc & STCextern) | 355 // local static |
356 else if (sym->parent && sym->parent->isFuncDeclaration()) | |
357 return llvm::GlobalValue::InternalLinkage; | |
358 } | |
359 // function | |
360 else if (FuncDeclaration* fdecl = sym->isFuncDeclaration()) | |
361 { | |
362 assert(fdecl->type->ty == Tfunction); | |
363 TypeFunction* ft = (TypeFunction*)fdecl->type; | |
364 | |
365 // intrinsics are always external | |
366 if (fdecl->llvmInternal == LLVMintrinsic) | |
356 return llvm::GlobalValue::ExternalLinkage; | 367 return llvm::GlobalValue::ExternalLinkage; |
357 //else | 368 // template instances should have weak linkage |
358 // return llvm::GlobalValue::InternalLinkage; | 369 else if (DtoIsTemplateInstance(fdecl)) |
359 | 370 return llvm::GlobalValue::WeakLinkage; |
360 case PROTpublic: | 371 // extern(C) functions are always external |
361 case PROTpackage: | 372 else if (ft->linkage == LINKc) |
362 case PROTprotected: | 373 return llvm::GlobalValue::ExternalLinkage; |
363 case PROTexport: | 374 } |
364 return llvm::GlobalValue::ExternalLinkage; | 375 // class |
365 | 376 else if (ClassDeclaration* cd = sym->isClassDeclaration()) |
366 case PROTundefined: | 377 { |
367 case PROTnone: | 378 // template |
368 assert(0 && "Unsupported linkage type"); | 379 if (DtoIsTemplateInstance(cd)) |
369 } | 380 return llvm::GlobalValue::WeakLinkage; |
381 } | |
382 else | |
383 { | |
384 assert(0 && "not global/function"); | |
385 } | |
386 | |
387 // default to external linkage | |
370 return llvm::GlobalValue::ExternalLinkage; | 388 return llvm::GlobalValue::ExternalLinkage; |
371 | 389 |
390 // llvm linkage types | |
372 /* ExternalLinkage = 0, LinkOnceLinkage, WeakLinkage, AppendingLinkage, | 391 /* ExternalLinkage = 0, LinkOnceLinkage, WeakLinkage, AppendingLinkage, |
373 InternalLinkage, DLLImportLinkage, DLLExportLinkage, ExternalWeakLinkage, | 392 InternalLinkage, DLLImportLinkage, DLLExportLinkage, ExternalWeakLinkage, |
374 GhostLinkage */ | 393 GhostLinkage */ |
394 } | |
395 | |
396 llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym) | |
397 { | |
398 if (DtoIsTemplateInstance(sym)) | |
399 return llvm::GlobalValue::WeakLinkage; | |
400 else | |
401 return llvm::GlobalValue::InternalLinkage; | |
402 } | |
403 | |
404 llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym) | |
405 { | |
406 if (DtoIsTemplateInstance(sym)) | |
407 return llvm::GlobalValue::WeakLinkage; | |
408 else | |
409 return llvm::GlobalValue::ExternalLinkage; | |
375 } | 410 } |
376 | 411 |
377 ////////////////////////////////////////////////////////////////////////////////////////// | 412 ////////////////////////////////////////////////////////////////////////////////////////// |
378 | 413 |
379 unsigned DtoCallingConv(LINK l) | 414 unsigned DtoCallingConv(LINK l) |