From 1b8851d95c737cf8ebc92977bc96d4bb838568f6 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 15:10:34 +0000 Subject: feat(driver): link INCLUDE_OBJ objects and check EXTERN symbols Each EXTERN symbol must be defined by an INCLUDE_OBJ object file or by the embedded C library selected with INCLUDE_OBJ "__libc". Objects are linked natively, loaded by the embedded JIT and passed to lli. Co-Authored-By: Claude Opus 5.5 --- tools/driver/EmbeddedRunner.cc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'tools/driver/EmbeddedRunner.cc') diff --git a/tools/driver/EmbeddedRunner.cc b/tools/driver/EmbeddedRunner.cc index 8bfeccb..3216882 100644 --- a/tools/driver/EmbeddedRunner.cc +++ b/tools/driver/EmbeddedRunner.cc @@ -5,6 +5,7 @@ #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" #include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h" #include "llvm/Support/Error.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/TargetSelect.h" #include #include @@ -344,7 +345,7 @@ static llvm::Error defineRuntimeSymbols(llvm::orc::LLJIT &J) { llvm::orc::absoluteSymbols(std::move(Symbols))); } -int runEmbedded(const cps::CodeGen &CG) { +int runEmbedded(const cps::CodeGen &CG, const std::vector &Objects) { if (llvm::InitializeNativeTarget() || llvm::InitializeNativeTargetAsmPrinter()) { llvm::errs() << "error: cannot initialize the embedded LLVM target\n"; return 1; @@ -405,6 +406,19 @@ int runEmbedded(const cps::CodeGen &CG) { << llvm::toString(std::move(Err)) << "\n"; return 1; } + for (const auto &Path : Objects) { + auto Buffer = llvm::MemoryBuffer::getFile(Path); + if (!Buffer) { + llvm::errs() << "error: cannot read object file '" << Path << "': " + << Buffer.getError().message() << "\n"; + return 1; + } + if (auto Err = J->addObjectFile(std::move(*Buffer))) { + llvm::errs() << "error: cannot load object file '" << Path << "': " + << llvm::toString(std::move(Err)) << "\n"; + return 1; + } + } if (auto Err = J->initialize(J->getMainJITDylib())) { llvm::errs() << "error: embedded LLVM execution failed: " << llvm::toString(std::move(Err)) << "\n"; -- cgit v1.3.1-4-g156e