Index: llvm/lib/ExecutionEngine/Orc/Layer.cpp =================================================================== --- llvm/lib/ExecutionEngine/Orc/Layer.cpp +++ llvm/lib/ExecutionEngine/Orc/Layer.cpp @@ -122,6 +122,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); } Index: llvm/test/ExecutionEngine/Orc/Inputs/weak-comdat-def.ll =================================================================== --- /dev/null +++ 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 +} Index: llvm/test/ExecutionEngine/Orc/weak-comdat.ll =================================================================== --- /dev/null +++ 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 +}