diff --git a/src/grammar/Visitor.hpp b/src/grammar/Visitor.hpp index 7550126..0f946a4 100644 --- a/src/grammar/Visitor.hpp +++ b/src/grammar/Visitor.hpp @@ -71,6 +71,7 @@ class Visitor public: Environment env; std::vector include_paths; + std::string builtins_path; ScopeStack scopes; std::stack files; @@ -82,18 +83,38 @@ class Visitor const std::string &target_arch, const std::string &target_cpu, const std::string &target_features, + const std::string &builtins_path_, const std::vector &include_paths_ = {}) : env("output", target_os, target_arch, target_cpu, target_features), include_paths(include_paths_), + builtins_path(builtins_path_), scopes(this->env) { - this->include_paths.push_back(Environment::get_std_directory().u8string()); + auto std_directory = Environment::get_std_directory(); + + if (this->builtins_path.empty()) + { + this->builtins_path = (std_directory / "builtins").u8string(); + } + + this->include_paths.push_back(std_directory.u8string()); + } + + void load_builtins() + { + for (const auto &p : fs::recursive_directory_iterator(this->builtins_path, fs::directory_options::follow_directory_symlink | fs::directory_options::skip_permission_denied)) + { + if (!p.is_directory()) + { + this->from_file(p.path()); + } + } } void from_file(std::string path) { if (!this->files.empty()) { - if (Helpers::starts_with(path, "./")) + if (Helpers::starts_with(path, "./") || Helpers::starts_with(path, "../")) { auto from = this->files.top(); path = from.replace_filename(path).u8string(); @@ -143,7 +164,7 @@ class Visitor std::ifstream stream; stream.open(fullpath); - files.push(fullpath); + this->files.push(fullpath); auto input = new ANTLRInputStream(stream); auto lexer = new SandLexer(input); diff --git a/src/main.cpp b/src/main.cpp index 70f7b67..b65fb57 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -108,6 +108,8 @@ struct Options std::string output_file = OUTPUT_FILENAME; std::vector include_paths; + std::string builtins_path = ""; + std::string os = CURRENT_OS; std::string arch = CURRENT_ARCH; std::string mode = CURRENT_MODE; @@ -157,12 +159,13 @@ bool compile(const Options &options, Sand::Debugger &debug) llvm::InitializeAllAsmParsers(); llvm::InitializeAllAsmPrinters(); - Sand::Visitor visitor(options.os, options.arch, options.cpu, options.features, options.include_paths); + Sand::Visitor visitor(options.os, options.arch, options.cpu, options.features, options.builtins_path, options.include_paths); debug.start_timer("bytecode"); try { + visitor.load_builtins(); visitor.from_file(options.entry_file); } catch (Sand::CompilationException &e) @@ -254,6 +257,7 @@ int main(int argc, char **argv) build->add_option("-O", options.optimization_level, "Optimization level", true); build->add_option("-I", options.include_paths, "Include paths", true); + build->add_option("-B,--builtins", options.builtins_path, "Builtins path", true); build->add_option("--arch", options.arch, "Target architecture", true); build->add_option("--os", options.os, "Target operating system", true); @@ -282,8 +286,9 @@ int main(int argc, char **argv) CLI::App *run = app.add_subcommand("run", "Run sources"); run->add_option("ENTRY", options.entry_file, "Entry file")->required()->check(CLI::ExistingFile); - run->add_option("-O", options.optimization_level, "Optimization level"); - run->add_option("-I", options.include_paths, "Include paths"); + run->add_option("-O", options.optimization_level, "Optimization level", true); + run->add_option("-I", options.include_paths, "Include paths", true); + run->add_option("-B,--builtins", options.builtins_path, "Builtins path", true); run->add_option("--arch", options.arch, "Target architecture", true); run->add_option("--os", options.os, "Target operating system", true); diff --git a/std/linux/crt0.sn b/std/builtins/intrinsics.sn similarity index 92% rename from std/linux/crt0.sn rename to std/builtins/intrinsics.sn index b15826b..168d874 100644 --- a/std/linux/crt0.sn +++ b/std/builtins/intrinsics.sn @@ -1,4 +1,4 @@ -import "./syscalls" +import "../linux/syscalls" #[target_os = "linux"] #[target_arch = "x86_64"] diff --git a/std/windows/chkstk.sn b/std/builtins/x86_64.sn similarity index 95% rename from std/windows/chkstk.sn rename to std/builtins/x86_64.sn index 0e08c3b..acef09d 100644 --- a/std/windows/chkstk.sn +++ b/std/builtins/x86_64.sn @@ -1,3 +1,5 @@ +let _fltused: i32 = 0; + #[target_os = "windows"] #[target_arch = "x86_64"] fn __chkstk() {