From cf0fb69b3d489cd0aebaa2d759b2d2c0c4e230b1 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Mon, 19 Oct 2026 10:51:13 +0000 Subject: fix(driver): normalize MinGW JIT archive symbol definitions Make absolute-zero pure virtual fallbacks local and compute runtime archive interfaces from normalized objects so ORC definitions match JITLink. Co-Authored-By: Claude Opus 5.5 --- tools/driver/EmbeddedRunner.cc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'tools/driver/EmbeddedRunner.cc') diff --git a/tools/driver/EmbeddedRunner.cc b/tools/driver/EmbeddedRunner.cc index 28fe2db..c8c3fcd 100644 --- a/tools/driver/EmbeddedRunner.cc +++ b/tools/driver/EmbeddedRunner.cc @@ -5,6 +5,7 @@ #include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h" #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" #include "llvm/ExecutionEngine/Orc/LLJIT.h" +#include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h" #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" #include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h" #include "llvm/Support/Error.h" @@ -439,6 +440,18 @@ static llvm::Error loadCxxRuntime(llvm::orc::LLJIT &J) { if (!unpackCxxRuntime(Archives)) return llvm::make_error("cannot unpack the C++ runtime", llvm::inconvertibleErrorCode()); for (auto &Archive : Archives) { + llvm::orc::StaticLibraryDefinitionGenerator::GetObjectFileInterface GetInterface; +#if defined(_WIN32) && defined(__x86_64__) + // Match the normalized object that MinGWObjectLinkingLayer::emit links. + GetInterface = [](llvm::orc::ExecutionSession &ES, llvm::MemoryBufferRef Ref) + -> llvm::Expected { + auto Normalized = normalizeMinGWObject( + llvm::MemoryBuffer::getMemBuffer(Ref, false)); + if (!Normalized) + return Normalized.takeError(); + return llvm::orc::getObjectFileInterface(ES, (*Normalized)->getMemBufferRef()); + }; +#endif auto Generator = llvm::orc::StaticLibraryDefinitionGenerator::Create( J.getObjLinkingLayer(), std::move(Archive), [](llvm::object::Archive &, llvm::MemoryBufferRef Buffer, size_t) -> llvm::Expected { @@ -458,7 +471,7 @@ static llvm::Error loadCxxRuntime(llvm::orc::LLJIT &J) { N.starts_with("_Unwind_") || N == "_ZTIi") return false; } return true; - }); + }, std::move(GetInterface)); if (!Generator) return Generator.takeError(); J.getMainJITDylib().addGenerator(std::move(*Generator)); } -- cgit v1.3.1-4-g156e