aboutsummaryrefslogtreecommitdiff
path: root/tools/driver/EmbeddedRunner.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-17 15:10:34 +0000
committer_ov4 <ov4@ov4.org>2026-10-17 15:10:34 +0000
commit1b8851d95c737cf8ebc92977bc96d4bb838568f6 (patch)
tree003af8def6e29b6e4ae4a845a7a753dd58859d22 /tools/driver/EmbeddedRunner.cc
parentdc33cd2faf6fa52486c02e86038c8f8c07c0fe27 (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.cc16
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";