diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-20 11:44:48 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-20 11:44:48 +0000 |
| commit | bfe2e75d7e3b372e55369677028429990c49bc54 (patch) | |
| tree | b64b0e999b428f7740c0cd2c4ec05d51a213ddd9 /tools/driver/StandardLibrary.cc | |
| parent | a3335110dc4f1283cf1680e273cc9775b7e8c8ac (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.cc | 43 |
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; +} |
