From 9dea210730f1e5f8de32302db786deca3381f2bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ka=CC=8Are=20Alsaker?= Date: Fri, 9 Jan 2015 02:14:10 +0100 Subject: [PATCH] Make the metadata loader use the appropriate Target structure Fixes #19907 --- src/librustc/metadata/creader.rs | 3 +++ src/librustc/metadata/loader.rs | 7 +++++-- src/librustc/session/mod.rs | 11 +++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/librustc/metadata/creader.rs b/src/librustc/metadata/creader.rs index 4a2981b8cdfe5..a8326cc060ae7 100644 --- a/src/librustc/metadata/creader.rs +++ b/src/librustc/metadata/creader.rs @@ -409,6 +409,7 @@ impl<'a> CrateReader<'a> { crate_name: name, hash: hash.map(|a| &*a), filesearch: self.sess.target_filesearch(kind), + target: &self.sess.target.target, triple: &self.sess.opts.target_triple[], root: root, rejected_via_hash: vec!(), @@ -472,6 +473,7 @@ impl<'a> CrateReader<'a> { crate_name: &name[], hash: None, filesearch: self.sess.host_filesearch(PathKind::Crate), + target: &self.sess.host, triple: config::host_triple(), root: &None, rejected_via_hash: vec!(), @@ -486,6 +488,7 @@ impl<'a> CrateReader<'a> { target_only = true; should_link = info.should_link; + load_ctxt.target = &self.sess.target.target; load_ctxt.triple = target_triple; load_ctxt.filesearch = self.sess.target_filesearch(PathKind::Crate); load_ctxt.load_library_crate() diff --git a/src/librustc/metadata/loader.rs b/src/librustc/metadata/loader.rs index 3a925aba0b7c3..f749721cca8c2 100644 --- a/src/librustc/metadata/loader.rs +++ b/src/librustc/metadata/loader.rs @@ -225,6 +225,7 @@ use metadata::filesearch::{FileSearch, FileMatches, FileDoesntMatch}; use syntax::codemap::Span; use syntax::diagnostic::SpanHandler; use util::fs; +use rustc_back::target::Target; use std::ffi::CString; use std::cmp; @@ -248,6 +249,8 @@ pub struct Context<'a> { pub ident: &'a str, pub crate_name: &'a str, pub hash: Option<&'a Svh>, + // points to either self.sess.target.target or self.sess.host, must match triple + pub target: &'a Target, pub triple: &'a str, pub filesearch: FileSearch<'a>, pub root: &'a Option, @@ -499,7 +502,7 @@ impl<'a> Context<'a> { for lib in m.into_iter() { info!("{} reading metadata from: {}", flavor, lib.display()); - let metadata = match get_metadata_section(self.sess.target.target.options.is_like_osx, + let metadata = match get_metadata_section(self.target.options.is_like_osx, &lib) { Ok(blob) => { if self.crate_matches(blob.as_slice(), &lib) { @@ -588,7 +591,7 @@ impl<'a> Context<'a> { // Returns the corresponding (prefix, suffix) that files need to have for // dynamic libraries fn dylibname(&self) -> (String, String) { - let t = &self.sess.target.target; + let t = &self.target; (t.options.dll_prefix.clone(), t.options.dll_suffix.clone()) } diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 79e4d0f7aea30..26d5a9daf89b0 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -25,6 +25,8 @@ use syntax::parse::token; use syntax::parse::ParseSess; use syntax::{ast, codemap}; +use rustc_back::target::Target; + use std::os; use std::cell::{Cell, RefCell}; @@ -35,6 +37,7 @@ pub mod search_paths; // session for a single crate. pub struct Session { pub target: config::Config, + pub host: Target, pub opts: config::Options, pub cstore: CStore, pub parse_sess: ParseSess, @@ -243,6 +246,13 @@ pub fn build_session_(sopts: config::Options, local_crate_source_file: Option, span_diagnostic: diagnostic::SpanHandler) -> Session { + let host = match Target::search(config::host_triple()) { + Ok(t) => t, + Err(e) => { + span_diagnostic.handler() + .fatal((format!("Error loading host specification: {}", e)).as_slice()); + } + }; let target_cfg = config::build_target_config(&sopts, &span_diagnostic); let p_s = parse::new_parse_sess_special_handler(span_diagnostic); let default_sysroot = match sopts.maybe_sysroot { @@ -268,6 +278,7 @@ pub fn build_session_(sopts: config::Options, let sess = Session { target: target_cfg, + host: host, opts: sopts, cstore: CStore::new(token::get_ident_interner()), parse_sess: p_s,