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