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)