diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 27 | ||||
-rw-r--r-- | src/trans/codegen.cpp | 4 | ||||
-rw-r--r-- | src/trans/codegen.hpp | 3 | ||||
-rw-r--r-- | src/trans/codegen_c.cpp | 26 | ||||
-rw-r--r-- | src/trans/main_bindings.hpp | 11 |
5 files changed, 61 insertions, 10 deletions
diff --git a/src/main.cpp b/src/main.cpp index 8ab3a241..c69ddf49 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -131,6 +131,8 @@ struct ProgramParams ::AST::Crate::Type crate_type = ::AST::Crate::Type::Unknown; ::std::string crate_name; + ::std::vector<const char*> lib_search_dirs; + ::std::set< ::std::string> features; ProgramParams(int argc, char *argv[]); @@ -440,6 +442,10 @@ int main(int argc, char *argv[]) // - Signature Exportable (public) // - MIR Exportable (public generic, #[inline], or used by a either of those) // - Require codegen (public or used by an exported function) + TransOptions trans_opt; + for(const char* libdir : params.lib_search_dirs ) { + trans_opt.library_search_dirs.push_back( libdir ); + } // Generate code for non-generic public items (if requested) switch( crate_type ) @@ -451,7 +457,7 @@ int main(int argc, char *argv[]) #if 1 // Generate a .o TransList items = CompilePhase<TransList>("Trans Enumerate", [&]() { return Trans_Enumerate_Public(*hir_crate); }); - CompilePhaseV("Trans Codegen", [&]() { Trans_Codegen(params.outfile + ".o", *hir_crate, items, false); }); + CompilePhaseV("Trans Codegen", [&]() { Trans_Codegen(params.outfile + ".o", trans_opt, *hir_crate, items, false); }); #endif // Save a loadable HIR dump @@ -466,7 +472,7 @@ int main(int argc, char *argv[]) #if 1 // Generate a .o TransList items = CompilePhase<TransList>("Trans Enumerate", [&]() { return Trans_Enumerate_Public(*hir_crate); }); - CompilePhaseV("Trans Codegen", [&]() { Trans_Codegen(params.outfile + ".o", *hir_crate, items, false); }); + CompilePhaseV("Trans Codegen", [&]() { Trans_Codegen(params.outfile + ".o", trans_opt, *hir_crate, items, false); }); #endif // Save a loadable HIR dump CompilePhaseV("HIR Serialise", [&]() { HIR_Serialise(params.outfile, *hir_crate); }); @@ -482,7 +488,7 @@ int main(int argc, char *argv[]) // - Enumerate items for translation TransList items = CompilePhase<TransList>("Trans Enumerate", [&]() { return Trans_Enumerate_Main(*hir_crate); }); // - Perform codegen - CompilePhaseV("Trans Codegen", [&]() { Trans_Codegen(params.outfile, *hir_crate, items, true); }); + CompilePhaseV("Trans Codegen", [&]() { Trans_Codegen(params.outfile, trans_opt, *hir_crate, items, true); }); // - Invoke linker? break; } @@ -525,6 +531,21 @@ ProgramParams::ProgramParams(int argc, char *argv[]) else if( arg[1] != '-' ) { arg ++; // eat '-' + + if( *arg == 'L' ) { + if( arg[1] == '\0' ) { + if( i == argc - 1 ) { + // TODO: BAIL! + exit(1); + } + this->lib_search_dirs.push_back( argv[++i] ); + } + else { + this->lib_search_dirs.push_back( arg+1 ); + } + continue ; + } + for( ; *arg; arg ++ ) { switch(*arg) diff --git a/src/trans/codegen.cpp b/src/trans/codegen.cpp index e4ca0b5a..8b34cda3 100644 --- a/src/trans/codegen.cpp +++ b/src/trans/codegen.cpp @@ -14,7 +14,7 @@ #include "codegen.hpp" #include "monomorphise.hpp" -void Trans_Codegen(const ::std::string& outfile, const ::HIR::Crate& crate, const TransList& list, bool is_executable) +void Trans_Codegen(const ::std::string& outfile, const TransOptions& opt, const ::HIR::Crate& crate, const TransList& list, bool is_executable) { static Span sp; auto codegen = Trans_Codegen_GetGeneratorC(crate, outfile); @@ -142,6 +142,6 @@ void Trans_Codegen(const ::std::string& outfile, const ::HIR::Crate& crate, cons } } - codegen->finalise(is_executable); + codegen->finalise(is_executable, opt); } diff --git a/src/trans/codegen.hpp b/src/trans/codegen.hpp index 040449bf..3e936361 100644 --- a/src/trans/codegen.hpp +++ b/src/trans/codegen.hpp @@ -8,6 +8,7 @@ #pragma once #include "trans_list.hpp" +#include "main_bindings.hpp" // TransOptions namespace HIR { class TypeRef; @@ -26,7 +27,7 @@ class CodeGenerator { public: virtual ~CodeGenerator() {} - virtual void finalise(bool is_executable) {} + virtual void finalise(bool is_executable, const TransOptions& opt) {} // Called on all types directly mentioned (e.g. variables, arguments, and fields) // - Inner-most types are visited first. diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index cbb3de1d..56607e8c 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -103,7 +103,7 @@ namespace { ~CodeGenerator_C() {} - void finalise(bool is_executable) override + void finalise(bool is_executable, const TransOptions& opt) override { // Emit box drop glue after everything else to avoid definition ordering issues for(auto& e : m_box_glue_todo) @@ -135,8 +135,20 @@ namespace { ::std::vector<const char*> args; args.push_back( getenv("CC") ? getenv("CC") : "gcc" ); args.push_back("-pthread"); - args.push_back("-O2"); - args.push_back("-g"); + switch(opt.opt_level) + { + case 0: break; + case 1: + args.push_back("-O1"); + break; + case 2: + args.push_back("-O2"); + break; + } + if( opt.emit_debug_info ) + { + args.push_back("-g"); + } args.push_back("-o"); args.push_back(m_outfile_path.c_str()); args.push_back(m_outfile_path_c.c_str()); @@ -147,6 +159,10 @@ namespace { tmp.push_back(crate.second.m_filename + ".o"); args.push_back(tmp.back().c_str()); } + for(const auto& path : opt.library_search_dirs ) + { + args.push_back("-L"); args.push_back(path.c_str()); + } for(const auto& lib : m_crate.m_ext_libs) { ASSERT_BUG(Span(), lib.name != "", ""); args.push_back("-l"); args.push_back(lib.name.c_str()); @@ -158,6 +174,10 @@ namespace { args.push_back("-l"); args.push_back(lib.name.c_str()); } } + for(const auto& path : opt.libraries ) + { + args.push_back("-l"); args.push_back(path.c_str()); + } args.push_back("-z"); args.push_back("muldefs"); args.push_back("-Wl,--gc-sections"); } diff --git a/src/trans/main_bindings.hpp b/src/trans/main_bindings.hpp index 2029cb28..2878cc66 100644 --- a/src/trans/main_bindings.hpp +++ b/src/trans/main_bindings.hpp @@ -13,8 +13,17 @@ namespace HIR { class Crate; } +struct TransOptions +{ + unsigned int opt_level = 0; + bool emit_debug_info = false; + + ::std::vector< ::std::string> library_search_dirs; + ::std::vector< ::std::string> libraries; +}; + extern TransList Trans_Enumerate_Main(const ::HIR::Crate& crate); // NOTE: This also sets the saveout flags extern TransList Trans_Enumerate_Public(::HIR::Crate& crate); -extern void Trans_Codegen(const ::std::string& outfile, const ::HIR::Crate& crate, const TransList& list, bool is_executable); +extern void Trans_Codegen(const ::std::string& outfile, const TransOptions& opt, const ::HIR::Crate& crate, const TransList& list, bool is_executable); |