about summary refs log tree commit diff
path: root/src/rustc/metadata
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2012-03-09 13:35:20 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2012-03-15 10:22:46 +0100
commitb6ad34bef4f0b3613d51557cd327055a2c5311fd (patch)
tree9d94307570687aedc031e0e8b8b16a6b8cd4f9fc /src/rustc/metadata
parente4cbd43c430ef0d5f63ca7cb86a65a618521e175 (diff)
downloadrust-b6ad34bef4f0b3613d51557cd327055a2c5311fd.tar.gz
rust-b6ad34bef4f0b3613d51557cd327055a2c5311fd.zip
Properly recognize external intrinsics
Diffstat (limited to 'src/rustc/metadata')
-rw-r--r--src/rustc/metadata/common.rs1
-rw-r--r--src/rustc/metadata/csearch.rs6
-rw-r--r--src/rustc/metadata/decoder.rs8
-rw-r--r--src/rustc/metadata/encoder.rs24
4 files changed, 30 insertions, 9 deletions
diff --git a/src/rustc/metadata/common.rs b/src/rustc/metadata/common.rs
index db3dc4078ed..88800e17aff 100644
--- a/src/rustc/metadata/common.rs
+++ b/src/rustc/metadata/common.rs
@@ -68,6 +68,7 @@ const tag_mod_impl: uint = 0x30u;
 
 const tag_item_method: uint = 0x31u;
 const tag_impl_iface: uint = 0x32u;
+const tag_item_is_intrinsic: uint = 0x33u;
 
 // discriminator value for variants
 const tag_disr_val: uint = 0x34u;
diff --git a/src/rustc/metadata/csearch.rs b/src/rustc/metadata/csearch.rs
index 6be4124d5e6..08836703836 100644
--- a/src/rustc/metadata/csearch.rs
+++ b/src/rustc/metadata/csearch.rs
@@ -19,6 +19,7 @@ export get_type;
 export get_impl_iface;
 export get_impl_method;
 export get_item_path;
+export item_is_intrinsic;
 export maybe_get_item_ast, found_ast, found, found_parent, not_found;
 
 fn get_symbol(cstore: cstore::cstore, def: ast::def_id) -> str {
@@ -134,6 +135,11 @@ fn get_impl_method(cstore: cstore::cstore, def: ast::def_id, mname: str)
     decoder::get_impl_method(cdata, def.node, mname)
 }
 
+fn item_is_intrinsic(cstore: cstore::cstore, def: ast::def_id) -> bool {
+    let cdata = cstore::get_crate_data(cstore, def.crate);
+    decoder::item_is_intrinsic(cdata, def.node)
+}
+
 // Local Variables:
 // mode: rust
 // fill-column: 78;
diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs
index ac6e32f292d..70c771b85c1 100644
--- a/src/rustc/metadata/decoder.rs
+++ b/src/rustc/metadata/decoder.rs
@@ -34,6 +34,7 @@ export get_iface_methods;
 export get_crate_module_paths;
 export get_item_path;
 export maybe_get_item_ast;
+export item_is_intrinsic;
 
 // Used internally by astencode:
 export translate_def_id;
@@ -272,6 +273,13 @@ fn get_impl_method(cdata: cmd, id: ast::node_id, name: str) -> ast::def_id {
     option::get(found)
 }
 
+fn item_is_intrinsic(cdata: cmd, id: ast::node_id) -> bool {
+    let intrinsic = false;
+    ebml::tagged_docs(lookup_item(id, cdata.data), tag_item_is_intrinsic,
+                      {|_i| intrinsic = true;});
+    intrinsic
+}
+
 fn get_symbol(data: @[u8], id: ast::node_id) -> str {
     ret item_symbol(lookup_item(id, data));
 }
diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs
index 57813f1791b..fee50a927e6 100644
--- a/src/rustc/metadata/encoder.rs
+++ b/src/rustc/metadata/encoder.rs
@@ -502,7 +502,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
 fn encode_info_for_native_item(ecx: @encode_ctxt, ebml_w: ebml::writer,
                                nitem: @native_item,
                                index: @mutable [entry<int>],
-                               path: ast_map::path) {
+                               path: ast_map::path, abi: native_abi) {
     if !ecx.reachable.contains_key(nitem.id) { ret; }
     *index += [{val: nitem.id, pos: ebml_w.writer.tell()}];
 
@@ -512,6 +512,10 @@ fn encode_info_for_native_item(ecx: @encode_ctxt, ebml_w: ebml::writer,
         encode_def_id(ebml_w, local_def(nitem.id));
         encode_family(ebml_w, purity_fn_family(fn_decl.purity));
         encode_type_param_bounds(ebml_w, ecx, tps);
+        if abi == native_abi_rust_intrinsic {
+            ebml_w.start_tag(tag_item_is_intrinsic);
+            ebml_w.end_tag();
+        }
         encode_type(ecx, ebml_w, node_id_to_type(ecx.ccx.tcx, nitem.id));
         encode_symbol(ecx, ebml_w, nitem.id);
         encode_path(ebml_w, path, ast_map::path_name(nitem.ident));
@@ -531,17 +535,19 @@ fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer,
         visit_expr: {|_e, _cx, _v|},
         visit_item: {|i, cx, v|
             visit::visit_item(i, cx, v);
-            let path = alt check ecx.ccx.tcx.items.get(i.id) {
-              ast_map::node_item(_, pt) { pt }
-            };
-            encode_info_for_item(ecx, ebml_w, i, index, *path);
+            alt check ecx.ccx.tcx.items.get(i.id) {
+              ast_map::node_item(_, pt) {
+                encode_info_for_item(ecx, ebml_w, i, index, *pt);
+              }
+            }
         },
         visit_native_item: {|ni, cx, v|
             visit::visit_native_item(ni, cx, v);
-            let path = alt check ecx.ccx.tcx.items.get(ni.id) {
-              ast_map::node_native_item(_, _, pt) { pt }
-            };
-            encode_info_for_native_item(ecx, ebml_w, ni, index, *path);
+            alt check ecx.ccx.tcx.items.get(ni.id) {
+              ast_map::node_native_item(_, abi, pt) {
+                encode_info_for_native_item(ecx, ebml_w, ni, index, *pt, abi);
+              }
+            }
         }
         with *visit::default_visitor()
     }));