Skip to content

Commit

Permalink
Rollup merge of rust-lang#58601 - gnzlbg:json_error, r=oli-obk
Browse files Browse the repository at this point in the history
Search for target_triple.json only if builtin target not found

Before this commit, if the builtin target was found, but an error
happened when instantiating it (e.g. validating the target
specification file failed, etc.), then we ignored those errors
and proceeded to try to find a `target_triple.json` file, and if
that failed, reported that as an error.

With this commit, if rustc is supposed to provide the builtin target,
and something fails while instantiating it, that error will
get properly propagated.

r? @oli-obk
  • Loading branch information
Centril committed Feb 22, 2019
2 parents 575a209 + 103ed0c commit 555df2b
Showing 1 changed file with 16 additions and 6 deletions.
22 changes: 16 additions & 6 deletions src/librustc_target/spec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,11 @@ impl ToJson for MergeFunctions {
}
}

pub enum LoadTargetError {
BuiltinTargetNotFound(String),
Other(String),
}

pub type LinkArgs = BTreeMap<LinkerFlavor, Vec<String>>;
pub type TargetResult = Result<Target, String>;

Expand All @@ -269,21 +274,24 @@ macro_rules! supported_targets {
/// List of supported targets
const TARGETS: &[&str] = &[$($triple),*];

fn load_specific(target: &str) -> TargetResult {
fn load_specific(target: &str) -> Result<Target, LoadTargetError> {
match target {
$(
$triple => {
let mut t = $module::target()?;
let mut t = $module::target()
.map_err(LoadTargetError::Other)?;
t.options.is_builtin = true;

// round-trip through the JSON parser to ensure at
// run-time that the parser works correctly
t = Target::from_json(t.to_json())?;
t = Target::from_json(t.to_json())
.map_err(LoadTargetError::Other)?;
debug!("Got builtin target: {:?}", t);
Ok(t)
},
)+
_ => Err(format!("Unable to find target: {}", target))
_ => Err(LoadTargetError::BuiltinTargetNotFound(
format!("Unable to find target: {}", target)))
}
}

Expand Down Expand Up @@ -1176,8 +1184,10 @@ impl Target {
match *target_triple {
TargetTriple::TargetTriple(ref target_triple) => {
// check if triple is in list of supported targets
if let Ok(t) = load_specific(target_triple) {
return Ok(t)
match load_specific(target_triple) {
Ok(t) => return Ok(t),
Err(LoadTargetError::BuiltinTargetNotFound(_)) => (),
Err(LoadTargetError::Other(e)) => return Err(e),
}

// search for a file named `target_triple`.json in RUST_TARGET_PATH
Expand Down

0 comments on commit 555df2b

Please sign in to comment.