about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2013-03-06 22:06:53 -0800
committerPatrick Walton <pcwalton@mimiga.net>2013-03-07 22:37:58 -0800
commit48b14f55625dda49477a733f28e5a9317b6a26bc (patch)
treeac9065d6a8fbeaeaf35323422f82548dd6ff00c1
parentd661711cc2fb1365ad9f25cbabe3c34550eaafbe (diff)
downloadrust-48b14f55625dda49477a733f28e5a9317b6a26bc.tar.gz
rust-48b14f55625dda49477a733f28e5a9317b6a26bc.zip
librustc: Add #[link_args] to metadata
-rw-r--r--src/librustc/back/link.rs10
-rw-r--r--src/librustc/metadata/common.rs3
-rw-r--r--src/librustc/metadata/csearch.rs7
-rw-r--r--src/librustc/metadata/decoder.rs9
-rw-r--r--src/librustc/metadata/encoder.rs22
5 files changed, 50 insertions, 1 deletions
diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs
index 5c924b172fc..eaac7dd1a0b 100644
--- a/src/librustc/back/link.rs
+++ b/src/librustc/back/link.rs
@@ -17,7 +17,7 @@ use lib::llvm::llvm;
 use lib::llvm::{ModuleRef, mk_pass_manager, mk_target_data, True, False};
 use lib;
 use metadata::common::LinkMeta;
-use metadata::{encoder, cstore};
+use metadata::{encoder, csearch, cstore};
 use middle::trans::common::CrateContext;
 use middle::ty;
 use util::ppaux;
@@ -814,6 +814,14 @@ pub fn link_binary(sess: Session,
     let ula = cstore::get_used_link_args(cstore);
     for ula.each |arg| { cc_args.push(/*bad*/copy *arg); }
 
+    // Add all the link args for external crates.
+    do cstore::iter_crate_data(cstore) |crate_num, _| {
+        let link_args = csearch::get_link_args_for_crate(cstore, crate_num);
+        do vec::consume(link_args) |_, link_arg| {
+            cc_args.push(link_arg);
+        }
+    }
+
     // # Extern library linking
 
     // User-supplied library search paths (-L on the cammand line) These are
diff --git a/src/librustc/metadata/common.rs b/src/librustc/metadata/common.rs
index daf369f7279..38b76c4ace2 100644
--- a/src/librustc/metadata/common.rs
+++ b/src/librustc/metadata/common.rs
@@ -156,6 +156,9 @@ pub const tag_item_unnamed_field: uint = 0x76;
 pub const tag_items_data_item_struct_ctor: uint = 0x77;
 pub const tag_items_data_item_visibility: uint = 0x78;
 
+pub const tag_link_args: uint = 0x79;
+pub const tag_link_args_arg: uint = 0x7a;
+
 pub struct LinkMeta {
     name: @str,
     vers: @str,
diff --git a/src/librustc/metadata/csearch.rs b/src/librustc/metadata/csearch.rs
index 8ccf2e6d003..427867845fe 100644
--- a/src/librustc/metadata/csearch.rs
+++ b/src/librustc/metadata/csearch.rs
@@ -237,6 +237,13 @@ pub fn get_method_visibility(cstore: @mut cstore::CStore,
     decoder::get_method_visibility(cdata, def_id.node)
 }
 
+pub fn get_link_args_for_crate(cstore: @mut cstore::CStore,
+                               crate_num: ast::crate_num)
+                            -> ~[~str] {
+    let cdata = cstore::get_crate_data(cstore, crate_num);
+    decoder::get_link_args_for_crate(cdata)
+}
+
 // Local Variables:
 // mode: rust
 // fill-column: 78;
diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs
index 8554f40b4b1..6a2ba78bfe9 100644
--- a/src/librustc/metadata/decoder.rs
+++ b/src/librustc/metadata/decoder.rs
@@ -1131,6 +1131,15 @@ pub fn translate_def_id(cdata: cmd, did: ast::def_id) -> ast::def_id {
     }
 }
 
+pub fn get_link_args_for_crate(cdata: cmd) -> ~[~str] {
+    let link_args = reader::get_doc(reader::Doc(cdata.data), tag_link_args);
+    let mut result = ~[];
+    for reader::tagged_docs(link_args, tag_link_args_arg) |arg_doc| {
+        result.push(reader::doc_as_str(arg_doc));
+    }
+    result
+}
+
 // Local Variables:
 // mode: rust
 // fill-column: 78;
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs
index 9a90b5f364c..1b106cc1218 100644
--- a/src/librustc/metadata/encoder.rs
+++ b/src/librustc/metadata/encoder.rs
@@ -74,6 +74,7 @@ struct Stats {
     attr_bytes: uint,
     dep_bytes: uint,
     lang_item_bytes: uint,
+    link_args_bytes: uint,
     item_bytes: uint,
     index_bytes: uint,
     zero_bytes: uint,
@@ -1255,6 +1256,20 @@ fn encode_lang_items(ecx: @EncodeContext, ebml_w: writer::Encoder) {
     ebml_w.end_tag();   // tag_lang_items
 }
 
+fn encode_link_args(ecx: @EncodeContext,
+                    ebml_w: writer::Encoder) {
+    ebml_w.start_tag(tag_link_args);
+
+    let link_args = cstore::get_used_link_args(ecx.cstore);
+    for link_args.each |link_arg| {
+        ebml_w.start_tag(tag_link_args_arg);
+        ebml_w.writer.write_str(link_arg.to_str());
+        ebml_w.end_tag();
+    }
+
+    ebml_w.end_tag();
+}
+
 fn encode_crate_dep(ecx: @EncodeContext, ebml_w: writer::Encoder,
                     dep: decoder::crate_dep) {
     ebml_w.start_tag(tag_crate_dep);
@@ -1291,6 +1306,7 @@ pub fn encode_metadata(parms: EncodeParams, crate: &crate) -> ~[u8] {
         attr_bytes: 0,
         dep_bytes: 0,
         lang_item_bytes: 0,
+        link_args_bytes: 0,
         item_bytes: 0,
         index_bytes: 0,
         zero_bytes: 0,
@@ -1329,6 +1345,11 @@ pub fn encode_metadata(parms: EncodeParams, crate: &crate) -> ~[u8] {
     encode_lang_items(ecx, ebml_w);
     ecx.stats.lang_item_bytes = wr.pos - i;
 
+    // Encode the link args.
+    i = wr.pos;
+    encode_link_args(ecx, ebml_w);
+    ecx.stats.link_args_bytes = wr.pos - i;
+
     // Encode and index the items.
     ebml_w.start_tag(tag_items);
     i = wr.pos;
@@ -1359,6 +1380,7 @@ pub fn encode_metadata(parms: EncodeParams, crate: &crate) -> ~[u8] {
         io::println(fmt!(" attribute bytes: %u", ecx.stats.attr_bytes));
         io::println(fmt!("       dep bytes: %u", ecx.stats.dep_bytes));
         io::println(fmt!(" lang item bytes: %u", ecx.stats.lang_item_bytes));
+        io::println(fmt!(" link args bytes: %u", ecx.stats.link_args_bytes));
         io::println(fmt!("      item bytes: %u", ecx.stats.item_bytes));
         io::println(fmt!("     index bytes: %u", ecx.stats.index_bytes));
         io::println(fmt!("      zero bytes: %u", ecx.stats.zero_bytes));