Use the correct logging crate while monomorphing

This makes sure that the top-level crate name is correct when emitting log
statements for a monomorphized function in another crate. This happens by
tracing the monomorphized ID back to the external source and then using that
crate index to get the name of the crate.

Closes #3046
This commit is contained in:
Alex Crichton 2013-10-01 15:24:49 -07:00
parent 320af9b157
commit a1ffb06ac8
3 changed files with 53 additions and 3 deletions

View File

@ -119,6 +119,7 @@ use back::link;
use lib::llvm::{ValueRef, llvm, SetLinkage, False};
use lib;
use metadata::csearch;
use metadata::cstore;
use middle::trans::_match;
use middle::trans::adt;
use middle::trans::asm;
@ -1797,9 +1798,14 @@ pub fn trans_log_level(bcx: @mut Block) -> DatumBlock {
let ccx = bcx.ccx();
let (modpath, modname) = {
let path = &mut bcx.fcx.path;
let mut modpath = ~[path_mod(ccx.sess.ident_of(ccx.link_meta.name))];
for e in path.iter() {
let srccrate = match ccx.external_srcs.find(&bcx.fcx.id) {
Some(&src) => {
cstore::get_crate_data(ccx.sess.cstore, src.crate).name
}
None => ccx.link_meta.name,
};
let mut modpath = ~[path_mod(ccx.sess.ident_of(srccrate))];
for e in bcx.fcx.path.iter() {
match *e {
path_mod(_) => { modpath.push(*e) }
_ => {}

View File

@ -0,0 +1,14 @@
// 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.
pub fn foo<T>() {
fn death() -> int { fail2!() }
debug2!("{:?}", (||{ death() })());
}

View File

@ -0,0 +1,30 @@
// 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.
// aux-build:logging_right_crate.rs
// xfail-fast
// exec-env:RUST_LOG=logging-right-crate=debug
// This is a test for issue #3046 to make sure that when we monomorphize a
// function from one crate to another the right top-level logging name is
// preserved.
//
// It used to be the case that if logging were turned on for this crate, all
// monomorphized functions from other crates had logging turned on (their
// logging module names were all incorrect). This test ensures that this no
// longer happens by enabling logging for *this* crate and then invoking a
// function in an external crate which will fail when logging is enabled.
extern mod logging_right_crate;
fn main() {
// this function fails if logging is turned on
logging_right_crate::foo::<int>();
}