summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp27
-rw-r--r--src/trans/codegen.cpp4
-rw-r--r--src/trans/codegen.hpp3
-rw-r--r--src/trans/codegen_c.cpp26
-rw-r--r--src/trans/main_bindings.hpp11
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);