From: Jonas Hahnfeld Date: Tue, 24 Jan 2023 09:54:55 +0000 (+0100) Subject: [ORC] Drop Comdat when discarding IR symbol X-Git-Tag: upstream/17.0.6~18737 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=76b3f0b4d5a0b8c54147c4c73a30892bbca76467;p=platform%2Fupstream%2Fllvm.git [ORC] Drop Comdat when discarding IR symbol According to the IR verifier, "Declaration[s] may not be in a Comdat!" Differential Revision: https://reviews.llvm.org/D142443 --- diff --git a/llvm/lib/ExecutionEngine/Orc/Layer.cpp b/llvm/lib/ExecutionEngine/Orc/Layer.cpp index 95380d91..3368d32 100644 --- a/llvm/lib/ExecutionEngine/Orc/Layer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Layer.cpp @@ -125,6 +125,10 @@ void IRMaterializationUnit::discard(const JITDylib &JD, assert(!I->second->isDeclaration() && "Discard should only apply to definitions"); I->second->setLinkage(GlobalValue::AvailableExternallyLinkage); + // According to the IR verifier, "Declaration[s] may not be in a Comdat!" + // Remove it, if this is a GlobalObject. + if (auto *GO = dyn_cast(I->second)) + GO->setComdat(nullptr); SymbolToDefinition.erase(I); } diff --git a/llvm/test/ExecutionEngine/Orc/Inputs/weak-comdat-def.ll b/llvm/test/ExecutionEngine/Orc/Inputs/weak-comdat-def.ll new file mode 100644 index 0000000..9c308a3 --- /dev/null +++ b/llvm/test/ExecutionEngine/Orc/Inputs/weak-comdat-def.ll @@ -0,0 +1,6 @@ +$c = comdat any + +define i32 @f() comdat($c) { +entry: + ret i32 0 +} diff --git a/llvm/test/ExecutionEngine/Orc/weak-comdat.ll b/llvm/test/ExecutionEngine/Orc/weak-comdat.ll new file mode 100644 index 0000000..d11e462 --- /dev/null +++ b/llvm/test/ExecutionEngine/Orc/weak-comdat.ll @@ -0,0 +1,14 @@ +; RUN: lli -extra-module %p/Inputs/weak-comdat-def.ll %s + +$c = comdat any + +define weak i32 @f() comdat($c) { +entry: + ret i32 0 +} + +define i32 @main() { +entry: + %0 = call i32 @f() + ret i32 %0 +}