summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hir/deserialise.cpp1
-rw-r--r--src/hir/hir.hpp1
-rw-r--r--src/hir/serialise.cpp1
-rw-r--r--src/main.cpp3
-rw-r--r--src/trans/codegen_c.cpp11
5 files changed, 16 insertions, 1 deletions
diff --git a/src/hir/deserialise.cpp b/src/hir/deserialise.cpp
index 1953828b..5bc83395 100644
--- a/src/hir/deserialise.cpp
+++ b/src/hir/deserialise.cpp
@@ -1152,6 +1152,7 @@ namespace {
}
rv.m_ext_libs = deserialise_vec< ::HIR::ExternLibrary>();
+ rv.m_link_paths = deserialise_vec< ::std::string>();
return rv;
}
diff --git a/src/hir/hir.hpp b/src/hir/hir.hpp
index b3322352..a1cc7c16 100644
--- a/src/hir/hir.hpp
+++ b/src/hir/hir.hpp
@@ -463,6 +463,7 @@ public:
::std::unordered_map< ::std::string, ExternCrate> m_ext_crates;
::std::vector<ExternLibrary> m_ext_libs;
+ ::std::vector<::std::string> m_link_paths;
/// Method called to populate runtime state after deserialisation
/// See hir/crate_post_load.cpp
diff --git a/src/hir/serialise.cpp b/src/hir/serialise.cpp
index d26e9a7c..f50aa5c1 100644
--- a/src/hir/serialise.cpp
+++ b/src/hir/serialise.cpp
@@ -263,6 +263,7 @@ namespace {
for(const auto& ext : crate.m_ext_crates)
m_out.write_string(ext.first);
serialise_vec(crate.m_ext_libs);
+ serialise_vec(crate.m_link_paths);
}
void serialise(const ::HIR::ExternLibrary& lib)
{
diff --git a/src/main.cpp b/src/main.cpp
index 2a5744c2..67a50421 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -501,7 +501,8 @@ int main(int argc, char *argv[])
TransOptions trans_opt;
trans_opt.opt_level = params.opt_level;
for(const char* libdir : params.lib_search_dirs ) {
- trans_opt.library_search_dirs.push_back( libdir );
+ // TODO: Store these paths for use in final linking.
+ hir_crate->m_link_paths.push_back( libdir );
}
for(const char* libname : params.libraries ) {
//trans_opt.libraries.push_back( libname );
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index b7c3806a..c57c4d5a 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -480,6 +480,9 @@ namespace {
}
for( const auto& crate : m_crate.m_ext_crates )
{
+ for(const auto& path : crate.second.m_data->m_link_paths ) {
+ args.push_back("-L"); args.push_back(path.c_str());
+ }
for(const auto& lib : crate.second.m_data->m_ext_libs) {
ASSERT_BUG(Span(), lib.name != "", "Empty lib from " << crate.first);
args.push_back("-l"); args.push_back(lib.name.c_str());
@@ -4213,7 +4216,11 @@ namespace {
if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' )
m_of << v;
else
+ {
m_of << "\\" << ((unsigned int)v & 0xFF);
+ if( isdigit( *(&v+1) ) )
+ m_of << "\"\"";
+ }
}
m_of << "\"" << ::std::dec;
),
@@ -4223,7 +4230,11 @@ namespace {
if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' )
m_of << v;
else
+ {
m_of << "\\" << ((unsigned int)v & 0xFF);
+ if( isdigit( *(&v+1) ) )
+ m_of << "\"\"";
+ }
}
m_of << "\", " << ::std::dec << c.size() << ")";
),