Allow linking against crates with #[no_std]

Previously having optional lang_items caused an assertion failure at
compile-time, and then once that was fixed there was a segfault at runtime of
using a NULL crate-map (crates with no_std)
This commit is contained in:
Alex Crichton 2013-07-17 20:27:20 -07:00
parent 0012b5008b
commit 09e49a8e6c
5 changed files with 64 additions and 2 deletions

View File

@ -1455,6 +1455,9 @@ fn encode_lang_items(ecx: &EncodeContext, ebml_w: &mut writer::Encoder) {
ebml_w.start_tag(tag_lang_items);
for ecx.tcx.lang_items.each_item |def_id, i| {
let def_id = match def_id {
Some(id) => id, None => { loop }
};
if def_id.crate != local_crate {
loop;
}

View File

@ -92,8 +92,8 @@ impl LanguageItems {
}
}
pub fn each_item(&self, f: &fn(def_id: def_id, i: uint) -> bool) -> bool {
self.items.iter().enumerate().advance(|(i, &item)| f(item.get(), i))
pub fn each_item(&self, f: &fn(Option<def_id>, uint) -> bool) -> bool {
self.items.iter().enumerate().advance(|(i, &item)| f(item, i))
}
pub fn item_name(index: uint) -> &'static str {

View File

@ -0,0 +1,3 @@
#[no_std];
pub fn foo() {}

View File

@ -0,0 +1,21 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// xfail-fast
// aux-build:no_std_crate.rs
// This tests that crates which link to std can also be linked to crates with
// #[no_std] that have no lang items.
extern mod no_std_crate;
fn main() {
no_std_crate::foo();
}

View File

@ -0,0 +1,35 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// xfail-test: this has weird linking problems on linux, and it probably needs a
// solution along the lines of disabling segmented stacks and/or the
// stack checks.
// aux-build:no_std_crate.rs
// This tests that libraries built with #[no_std] can be linked to crates with
// #[no_std] and actually run.
#[no_std];
extern mod no_std_crate;
// This is an unfortunate thing to have to do on linux :(
#[cfg(target_os = "linux")]
#[doc(hidden)]
pub mod linkhack {
#[link_args="-lrustrt -lrt"]
extern {}
}
#[start]
fn main(_: int, _: **u8, _: *u8) -> int {
no_std_crate::foo();
0
}