comparison gen/tollvm.cpp @ 1644:9176437d98be

Add -linkonce-templates for emitting linkonce_odr syms instead of weak_odr.
author Matti Niemenmaa <matti.niemenmaa+hg@iki.fi>
date Tue, 09 Mar 2010 23:07:08 +0200
parents d8e558087001
children 40bd4a0d4870
comparison
equal deleted inserted replaced
1643:8f121883bce8 1644:9176437d98be
243 // generated by inlining semantics run 243 // generated by inlining semantics run
244 if (vd->availableExternally && mustDefineSymbol(sym)) 244 if (vd->availableExternally && mustDefineSymbol(sym))
245 return llvm::GlobalValue::AvailableExternallyLinkage; 245 return llvm::GlobalValue::AvailableExternallyLinkage;
246 // template 246 // template
247 if (needsTemplateLinkage(sym)) 247 if (needsTemplateLinkage(sym))
248 return TEMPLATE_LINKAGE_TYPE; 248 return templateLinkage;
249 } 249 }
250 // function 250 // function
251 else if (FuncDeclaration* fdecl = sym->isFuncDeclaration()) 251 else if (FuncDeclaration* fdecl = sym->isFuncDeclaration())
252 { 252 {
253 if (mustDefineSymbol(fdecl)) 253 if (mustDefineSymbol(fdecl))
261 // generated by inlining semantics run 261 // generated by inlining semantics run
262 if (fdecl->availableExternally && mustDefineSymbol(sym)) 262 if (fdecl->availableExternally && mustDefineSymbol(sym))
263 return llvm::GlobalValue::AvailableExternallyLinkage; 263 return llvm::GlobalValue::AvailableExternallyLinkage;
264 // array operations are always template linkage 264 // array operations are always template linkage
265 if (fdecl->isArrayOp) 265 if (fdecl->isArrayOp)
266 return TEMPLATE_LINKAGE_TYPE; 266 return templateLinkage;
267 // template instances should have weak linkage 267 // template instances should have weak linkage
268 // but only if there's a body, and it's not naked 268 // but only if there's a body, and it's not naked
269 // otherwise we make it external 269 // otherwise we make it external
270 else if (needsTemplateLinkage(fdecl) && fdecl->fbody && !fdecl->naked) 270 else if (needsTemplateLinkage(fdecl) && fdecl->fbody && !fdecl->naked)
271 return TEMPLATE_LINKAGE_TYPE; 271 return templateLinkage;
272 // extern(C) functions are always external 272 // extern(C) functions are always external
273 else if (ft->linkage == LINKc) 273 else if (ft->linkage == LINKc)
274 return llvm::GlobalValue::ExternalLinkage; 274 return llvm::GlobalValue::ExternalLinkage;
275 } 275 }
276 // class 276 // class
281 // generated by inlining semantics run 281 // generated by inlining semantics run
282 if (cd->availableExternally && mustDefineSymbol(sym)) 282 if (cd->availableExternally && mustDefineSymbol(sym))
283 return llvm::GlobalValue::AvailableExternallyLinkage; 283 return llvm::GlobalValue::AvailableExternallyLinkage;
284 // template 284 // template
285 if (needsTemplateLinkage(cd)) 285 if (needsTemplateLinkage(cd))
286 return TEMPLATE_LINKAGE_TYPE; 286 return templateLinkage;
287 } 287 }
288 else 288 else
289 { 289 {
290 assert(0 && "not global/function"); 290 assert(0 && "not global/function");
291 } 291 }
332 llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym) 332 llvm::GlobalValue::LinkageTypes DtoInternalLinkage(Dsymbol* sym)
333 { 333 {
334 if (needsTemplateLinkage(sym)) { 334 if (needsTemplateLinkage(sym)) {
335 if (isAvailableExternally(sym) && mustDefineSymbol(sym)) 335 if (isAvailableExternally(sym) && mustDefineSymbol(sym))
336 return llvm::GlobalValue::AvailableExternallyLinkage; 336 return llvm::GlobalValue::AvailableExternallyLinkage;
337 return TEMPLATE_LINKAGE_TYPE; 337 return templateLinkage;
338 } 338 }
339 else 339 else
340 return llvm::GlobalValue::InternalLinkage; 340 return llvm::GlobalValue::InternalLinkage;
341 } 341 }
342 342
343 llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym) 343 llvm::GlobalValue::LinkageTypes DtoExternalLinkage(Dsymbol* sym)
344 { 344 {
345 if (isAvailableExternally(sym) && mustDefineSymbol(sym)) 345 if (isAvailableExternally(sym) && mustDefineSymbol(sym))
346 return llvm::GlobalValue::AvailableExternallyLinkage; 346 return llvm::GlobalValue::AvailableExternallyLinkage;
347 if (needsTemplateLinkage(sym)) 347 if (needsTemplateLinkage(sym))
348 return TEMPLATE_LINKAGE_TYPE; 348 return templateLinkage;
349 else 349 else
350 return llvm::GlobalValue::ExternalLinkage; 350 return llvm::GlobalValue::ExternalLinkage;
351 } 351 }
352 352
353 ////////////////////////////////////////////////////////////////////////////////////////// 353 //////////////////////////////////////////////////////////////////////////////////////////