diff options
| author | bors <bors@rust-lang.org> | 2016-03-29 11:10:39 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-03-29 11:10:39 -0700 |
| commit | 8f5c3f1fcf77ec890d340dc3beb676f2a01ae99c (patch) | |
| tree | 50bd691fddf0839196b938fb8fb4aec408f73a06 /src/rustllvm/RustWrapper.cpp | |
| parent | 0c07a3cc599b0a88c35b5c1bd3fc92fa6925e4ce (diff) | |
| parent | 22f458758652d309b7c65fa904d44f090214456c (diff) | |
| download | rust-8f5c3f1fcf77ec890d340dc3beb676f2a01ae99c.tar.gz rust-8f5c3f1fcf77ec890d340dc3beb676f2a01ae99c.zip | |
Auto merge of #32557 - dotdash:issue-32518, r=nikomatsakis
Use weak_odr linkage when reusing definitions across codegen units When reuing a definition across codegen units, we obviously cannot use internal linkage, but using external linkage means that we can end up with multiple conflicting definitions of a single symbol across multiple crates. Since the definitions should all be equal semantically, we can use weak_odr linkage to resolve the situation. Fixes #32518 r? @nikomatsakis
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 6ff90a8f53a..697b2d3f539 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -1189,3 +1189,16 @@ extern "C" void LLVMRustPositionBuilderAtStart(LLVMBuilderRef B, LLVMBasicBlockR auto point = unwrap(BB)->getFirstInsertionPt(); unwrap(B)->SetInsertPoint(unwrap(BB), point); } + +extern "C" void LLVMRustSetComdat(LLVMModuleRef M, LLVMValueRef V, const char *Name) { + Triple TargetTriple(unwrap(M)->getTargetTriple()); + GlobalObject *GV = unwrap<GlobalObject>(V); + if (!TargetTriple.isOSBinFormatMachO()) { + GV->setComdat(unwrap(M)->getOrInsertComdat(Name)); + } +} + +extern "C" void LLVMRustUnsetComdat(LLVMValueRef V) { + GlobalObject *GV = unwrap<GlobalObject>(V); + GV->setComdat(nullptr); +} |
