Skip to content

Commit 0f06320

Browse files
committed
translations(rustc_session): migrate TargetDataLayout::parse
1 parent 60b4958 commit 0f06320

File tree

5 files changed

+111
-32
lines changed

5 files changed

+111
-32
lines changed

compiler/rustc_error_messages/locales/en-US/session.ftl

+14
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,17 @@ session_sanitizer_cfi_enabled = `-Zsanitizer=cfi` requires `-Clto`
4040
session_unstable_virtual_function_elimination = `-Zvirtual-function-elimination` requires `-Clto`
4141
4242
session_unsupported_dwarf_version = requested DWARF version {$dwarf_version} is greater than 5
43+
44+
session_target_invalid_address_space = invalid address space `{$addr_space}` for `{$cause}` in "data-layout": {$err}
45+
46+
session_target_invalid_bits = invalid {$kind} `{$bit}` for `{$cause}` in "data-layout": {$err}
47+
48+
session_target_missing_alignment = missing alignment for `{$cause}` in "data-layout"
49+
50+
session_target_invalid_alignment = invalid alignment for `{$cause}` in "data-layout": {$err}
51+
52+
session_target_inconsistent_architecture = inconsistent target specification: "data-layout" claims architecture is {$dl}-endian, while "target-endian" is `{$target}`
53+
54+
session_target_inconsistent_pointer_width = inconsistent target specification: "data-layout" claims pointers are {$pointer_size}-bit, while "target-pointer-width" is `{$target}`
55+
56+
session_target_invalid_bits_size = {$err}

compiler/rustc_errors/src/diagnostic.rs

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use rustc_target::spec::PanicStrategy;
1414
use std::borrow::Cow;
1515
use std::fmt;
1616
use std::hash::{Hash, Hasher};
17+
use std::num::ParseIntError;
1718
use std::path::{Path, PathBuf};
1819

1920
/// Error type for `Diagnostic`'s `suggestions` field, indicating that
@@ -91,6 +92,7 @@ into_diagnostic_arg_using_display!(
9192
Edition,
9293
Ident,
9394
MacroRulesNormalizedIdent,
95+
ParseIntError,
9496
);
9597

9698
impl IntoDiagnosticArg for bool {

compiler/rustc_middle/src/ty/context.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ use rustc_query_system::ich::StableHashingContext;
5252
use rustc_serialize::opaque::{FileEncodeResult, FileEncoder};
5353
use rustc_session::config::{CrateType, OutputFilenames};
5454
use rustc_session::cstore::CrateStoreDyn;
55+
use rustc_session::errors::TargetDataLayoutParseError;
5556
use rustc_session::lint::{Level, Lint};
5657
use rustc_session::Limit;
5758
use rustc_session::Session;
@@ -1251,7 +1252,7 @@ impl<'tcx> TyCtxt<'tcx> {
12511252
output_filenames: OutputFilenames,
12521253
) -> GlobalCtxt<'tcx> {
12531254
let data_layout = TargetDataLayout::parse(&s.target).unwrap_or_else(|err| {
1254-
s.fatal(&err);
1255+
s.emit_fatal(TargetDataLayoutParseError { err });
12551256
});
12561257
let interners = CtxtInterners::new(arena);
12571258
let common_types = CommonTypes::new(

compiler/rustc_session/src/errors.rs

+56-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
use std::num::NonZeroU32;
22

33
use crate::cgu_reuse_tracker::CguReuse;
4+
use crate::parse::ParseSess;
45
use crate::{self as rustc_session};
5-
use rustc_errors::MultiSpan;
6+
use rustc_errors::{fluent, MultiSpan};
67
use rustc_macros::SessionDiagnostic;
78
use rustc_span::{Span, Symbol};
9+
use rustc_target::abi::TargetDataLayoutErrors;
810

911
#[derive(SessionDiagnostic)]
1012
#[diag(session::incorrect_cgu_reuse_type)]
@@ -44,10 +46,59 @@ pub struct FeatureDiagnosticHelp {
4446
pub feature: Symbol,
4547
}
4648

47-
#[derive(SessionDiagnostic)]
48-
#[diag(session::target_data_layout_parse_error)]
49-
pub struct TargetDataLayoutParseError {
50-
pub err: String,
49+
pub struct TargetDataLayoutParseError<'a> {
50+
pub err: TargetDataLayoutErrors<'a>,
51+
}
52+
53+
impl crate::SessionDiagnostic<'_, !> for TargetDataLayoutParseError<'_> {
54+
fn into_diagnostic(self, sess: &ParseSess) -> rustc_errors::DiagnosticBuilder<'_, !> {
55+
let mut diag;
56+
match self.err {
57+
TargetDataLayoutErrors::InvalidAddressSpace { addr_space, err, cause } => {
58+
diag = sess.struct_fatal(fluent::session::target_invalid_address_space);
59+
diag.set_arg("addr_space", addr_space);
60+
diag.set_arg("cause", cause);
61+
diag.set_arg("err", err);
62+
diag
63+
}
64+
TargetDataLayoutErrors::InvalidBits { kind, bit, cause, err } => {
65+
diag = sess.struct_fatal(fluent::session::target_invalid_bits);
66+
diag.set_arg("kind", kind);
67+
diag.set_arg("bit", bit);
68+
diag.set_arg("cause", cause);
69+
diag.set_arg("err", err);
70+
diag
71+
}
72+
TargetDataLayoutErrors::MissingAlignment { cause } => {
73+
diag = sess.struct_fatal(fluent::session::target_missing_alignment);
74+
diag.set_arg("cause", cause);
75+
diag
76+
}
77+
TargetDataLayoutErrors::InvalidAlignment { cause, err } => {
78+
diag = sess.struct_fatal(fluent::session::target_invalid_alignment);
79+
diag.set_arg("cause", cause);
80+
diag.set_arg("err", err);
81+
diag
82+
}
83+
TargetDataLayoutErrors::InconsistentTargetArchitecture { dl, target } => {
84+
diag = sess.struct_fatal(fluent::session::target_inconsistent_architecture);
85+
diag.set_arg("dl", dl);
86+
diag.set_arg("target", target);
87+
diag
88+
}
89+
TargetDataLayoutErrors::InconsistentTargetPointerWidth { pointer_size, target } => {
90+
diag = sess.struct_fatal(fluent::session::target_inconsistent_pointer_width);
91+
diag.set_arg("pointer_size", pointer_size);
92+
diag.set_arg("target", target);
93+
diag
94+
}
95+
TargetDataLayoutErrors::InvalidBitsSize { err } => {
96+
diag = sess.struct_fatal(fluent::session::target_invalid_bits_size);
97+
diag.set_arg("err", err);
98+
diag
99+
}
100+
}
101+
}
51102
}
52103

53104
#[derive(SessionDiagnostic)]

compiler/rustc_target/src/abi/mod.rs

+37-26
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::spec::Target;
77
use std::convert::{TryFrom, TryInto};
88
use std::fmt;
99
use std::iter::Step;
10-
use std::num::NonZeroUsize;
10+
use std::num::{NonZeroUsize, ParseIntError};
1111
use std::ops::{Add, AddAssign, Deref, Mul, RangeInclusive, Sub};
1212
use std::str::FromStr;
1313

@@ -69,34 +69,46 @@ impl Default for TargetDataLayout {
6969
}
7070
}
7171

72+
pub enum TargetDataLayoutErrors<'a> {
73+
InvalidAddressSpace { addr_space: &'a str, cause: &'a str, err: ParseIntError },
74+
InvalidBits { kind: &'a str, bit: &'a str, cause: &'a str, err: ParseIntError },
75+
MissingAlignment { cause: &'a str },
76+
InvalidAlignment { cause: &'a str, err: String },
77+
InconsistentTargetArchitecture { dl: &'a str, target: &'a str },
78+
InconsistentTargetPointerWidth { pointer_size: u64, target: u32 },
79+
InvalidBitsSize { err: String },
80+
}
81+
7282
impl TargetDataLayout {
73-
pub fn parse(target: &Target) -> Result<TargetDataLayout, String> {
83+
pub fn parse<'a>(target: &'a Target) -> Result<TargetDataLayout, TargetDataLayoutErrors<'a>> {
7484
// Parse an address space index from a string.
75-
let parse_address_space = |s: &str, cause: &str| {
85+
let parse_address_space = |s: &'a str, cause: &'a str| {
7686
s.parse::<u32>().map(AddressSpace).map_err(|err| {
77-
format!("invalid address space `{}` for `{}` in \"data-layout\": {}", s, cause, err)
87+
TargetDataLayoutErrors::InvalidAddressSpace { addr_space: s, cause, err }
7888
})
7989
};
8090

8191
// Parse a bit count from a string.
82-
let parse_bits = |s: &str, kind: &str, cause: &str| {
83-
s.parse::<u64>().map_err(|err| {
84-
format!("invalid {} `{}` for `{}` in \"data-layout\": {}", kind, s, cause, err)
92+
let parse_bits = |s: &'a str, kind: &'a str, cause: &'a str| {
93+
s.parse::<u64>().map_err(|err| TargetDataLayoutErrors::InvalidBits {
94+
kind,
95+
bit: s,
96+
cause,
97+
err,
8598
})
8699
};
87100

88101
// Parse a size string.
89-
let size = |s: &str, cause: &str| parse_bits(s, "size", cause).map(Size::from_bits);
102+
let size = |s: &'a str, cause: &'a str| parse_bits(s, "size", cause).map(Size::from_bits);
90103

91104
// Parse an alignment string.
92-
let align = |s: &[&str], cause: &str| {
105+
let align = |s: &[&'a str], cause: &'a str| {
93106
if s.is_empty() {
94-
return Err(format!("missing alignment for `{}` in \"data-layout\"", cause));
107+
return Err(TargetDataLayoutErrors::MissingAlignment { cause });
95108
}
96109
let align_from_bits = |bits| {
97-
Align::from_bits(bits).map_err(|err| {
98-
format!("invalid alignment for `{}` in \"data-layout\": {}", cause, err)
99-
})
110+
Align::from_bits(bits)
111+
.map_err(|err| TargetDataLayoutErrors::InvalidAlignment { cause, err })
100112
};
101113
let abi = parse_bits(s[0], "alignment", cause)?;
102114
let pref = s.get(1).map_or(Ok(abi), |pref| parse_bits(pref, "alignment", cause))?;
@@ -158,25 +170,24 @@ impl TargetDataLayout {
158170

159171
// Perform consistency checks against the Target information.
160172
if dl.endian != target.endian {
161-
return Err(format!(
162-
"inconsistent target specification: \"data-layout\" claims \
163-
architecture is {}-endian, while \"target-endian\" is `{}`",
164-
dl.endian.as_str(),
165-
target.endian.as_str(),
166-
));
173+
return Err(TargetDataLayoutErrors::InconsistentTargetArchitecture {
174+
dl: dl.endian.as_str(),
175+
target: target.endian.as_str(),
176+
});
167177
}
168178

169179
let target_pointer_width: u64 = target.pointer_width.into();
170180
if dl.pointer_size.bits() != target_pointer_width {
171-
return Err(format!(
172-
"inconsistent target specification: \"data-layout\" claims \
173-
pointers are {}-bit, while \"target-pointer-width\" is `{}`",
174-
dl.pointer_size.bits(),
175-
target.pointer_width
176-
));
181+
return Err(TargetDataLayoutErrors::InconsistentTargetPointerWidth {
182+
pointer_size: dl.pointer_size.bits(),
183+
target: target.pointer_width,
184+
});
177185
}
178186

179-
dl.c_enum_min_size = Integer::from_size(Size::from_bits(target.c_enum_min_bits))?;
187+
dl.c_enum_min_size = match Integer::from_size(Size::from_bits(target.c_enum_min_bits)) {
188+
Ok(bits) => bits,
189+
Err(err) => return Err(TargetDataLayoutErrors::InvalidBitsSize { err }),
190+
};
180191

181192
Ok(dl)
182193
}

0 commit comments

Comments
 (0)