From 76b3f0b4d5a0b8c54147c4c73a30892bbca76467 Mon Sep 17 00:00:00 2001 From: Jonas Hahnfeld Date: Tue, 24 Jan 2023 10:54:55 +0100 Subject: [PATCH] [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 --- llvm/lib/ExecutionEngine/Orc/Layer.cpp | 4 ++++ llvm/test/ExecutionEngine/Orc/Inputs/weak-comdat-def.ll | 6 ++++++ llvm/test/ExecutionEngine/Orc/weak-comdat.ll | 14 ++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 llvm/test/ExecutionEngine/Orc/Inputs/weak-comdat-def.ll create mode 100644 llvm/test/ExecutionEngine/Orc/weak-comdat.ll 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 +} -- 2.7.4