aboutsummaryrefslogtreecommitdiff
path: root/tools/driver/StandardLibrary.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-20 11:44:48 +0000
committer_ov4 <ov4@ov4.org>2026-10-20 11:44:48 +0000
commitbfe2e75d7e3b372e55369677028429990c49bc54 (patch)
treeb64b0e999b428f7740c0cd2c4ec05d51a213ddd9 /tools/driver/StandardLibrary.cc
parenta3335110dc4f1283cf1680e273cc9775b7e8c8ac (diff)
feat(driver): embed and automatically link the standard library
Add -no-std to disable default library loading and linking. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'tools/driver/StandardLibrary.cc')
-rw-r--r--tools/driver/StandardLibrary.cc43
1 files changed, 43 insertions, 0 deletions
diff --git a/tools/driver/StandardLibrary.cc b/tools/driver/StandardLibrary.cc
new file mode 100644
index 0000000..ac88745
--- /dev/null
+++ b/tools/driver/StandardLibrary.cc
@@ -0,0 +1,43 @@
+#include "StandardLibrary.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/raw_ostream.h"
+
+namespace {
+struct LibraryFile {
+ const char *Name;
+ const char *Data;
+ size_t Size;
+};
+#include "StandardLibrary.inc"
+}
+
+StandardLibrary::~StandardLibrary() {
+ if (!Directory.empty()) llvm::sys::fs::remove_directories(Directory);
+}
+
+bool StandardLibrary::load(std::vector<std::string> &Inputs) {
+ auto Error = llvm::sys::fs::createUniqueDirectory("cpsc-std", Directory);
+ if (Error) {
+ llvm::errs() << "cpsc: fatal error: cannot extract standard library: " << Error.message() << "\n";
+ return false;
+ }
+ for (const auto &File : LibraryFiles) {
+ llvm::SmallString<256> Path(Directory);
+ llvm::sys::path::append(Path, File.Name);
+ llvm::raw_fd_ostream Output(Path, Error);
+ if (!Error) {
+ Output.write(File.Data, File.Size);
+ Output.close();
+ Error = Output.error();
+ }
+ if (Error) {
+ llvm::errs() << "cpsc: fatal error: cannot extract standard library file '"
+ << File.Name << "': " << Error.message() << "\n";
+ Output.clear_error();
+ return false;
+ }
+ if (llvm::sys::path::extension(Path) == ".cps") Inputs.emplace_back(Path);
+ }
+ return true;
+}