diff --git a/llvm/lib/ExecutionEngine/Orc/Layer.cpp b/llvm/lib/ExecutionEngine/Orc/Layer.cpp --- a/llvm/lib/ExecutionEngine/Orc/Layer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Layer.cpp @@ -125,6 +125,10 @@ 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 --- /dev/null +++ b/llvm/test/ExecutionEngine/Orc/Inputs/weak-comdat-def.ll @@ -0,0 +1,12 @@ +define i32 @g() { +entry: + ret i32 0 +} + +$f = comdat nodeduplicate + +define i32 @f() comdat { +entry: + %0 = call i32 @g() + 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 --- /dev/null +++ b/llvm/test/ExecutionEngine/Orc/weak-comdat.ll @@ -0,0 +1,18 @@ +; RUN: lli -extra-module %p/Inputs/weak-comdat-def.ll %s +; UNSUPPORTED: target={{.*}}-darwin{{.*}} + +declare i32 @g() + +$f = comdat nodeduplicate + +define weak i32 @f() comdat { +entry: + %0 = call i32 @g() + ret i32 %0 +} + +define i32 @main() { +entry: + %0 = call i32 @f() + ret i32 %0 +}