diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-17 15:10:34 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-17 15:10:34 +0000 |
| commit | 1b8851d95c737cf8ebc92977bc96d4bb838568f6 (patch) | |
| tree | 003af8def6e29b6e4ae4a845a7a753dd58859d22 /tools/driver/EmbeddedRunner.cc | |
| parent | dc33cd2faf6fa52486c02e86038c8f8c07c0fe27 (diff) | |
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 <noreply@anthropic.com>
Diffstat (limited to 'tools/driver/EmbeddedRunner.cc')
| -rw-r--r-- | tools/driver/EmbeddedRunner.cc | 16 |
1 files changed, 15 insertions, 1 deletions
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 <cstdio> #include <cstdlib> @@ -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<std::string> &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"; |
