1
Fork 0

translations(rustc_session): migrate TargetDataLayout::parse

This commit is contained in:
Luis Cardoso 2022-09-02 19:29:52 +02:00
parent 60b49581c4
commit 0f06320c24
5 changed files with 111 additions and 32 deletions

View file

@ -40,3 +40,17 @@ session_sanitizer_cfi_enabled = `-Zsanitizer=cfi` requires `-Clto`
session_unstable_virtual_function_elimination = `-Zvirtual-function-elimination` requires `-Clto` session_unstable_virtual_function_elimination = `-Zvirtual-function-elimination` requires `-Clto`
session_unsupported_dwarf_version = requested DWARF version {$dwarf_version} is greater than 5 session_unsupported_dwarf_version = requested DWARF version {$dwarf_version} is greater than 5
session_target_invalid_address_space = invalid address space `{$addr_space}` for `{$cause}` in "data-layout": {$err}
session_target_invalid_bits = invalid {$kind} `{$bit}` for `{$cause}` in "data-layout": {$err}
session_target_missing_alignment = missing alignment for `{$cause}` in "data-layout"
session_target_invalid_alignment = invalid alignment for `{$cause}` in "data-layout": {$err}
session_target_inconsistent_architecture = inconsistent target specification: "data-layout" claims architecture is {$dl}-endian, while "target-endian" is `{$target}`
session_target_inconsistent_pointer_width = inconsistent target specification: "data-layout" claims pointers are {$pointer_size}-bit, while "target-pointer-width" is `{$target}`
session_target_invalid_bits_size = {$err}

View file

@ -14,6 +14,7 @@ use rustc_target::spec::PanicStrategy;
use std::borrow::Cow; use std::borrow::Cow;
use std::fmt; use std::fmt;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
use std::num::ParseIntError;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
/// Error type for `Diagnostic`'s `suggestions` field, indicating that /// Error type for `Diagnostic`'s `suggestions` field, indicating that
@ -91,6 +92,7 @@ into_diagnostic_arg_using_display!(
Edition, Edition,
Ident, Ident,
MacroRulesNormalizedIdent, MacroRulesNormalizedIdent,
ParseIntError,
); );
impl IntoDiagnosticArg for bool { impl IntoDiagnosticArg for bool {

View file

@ -52,6 +52,7 @@ use rustc_query_system::ich::StableHashingContext;
use rustc_serialize::opaque::{FileEncodeResult, FileEncoder}; use rustc_serialize::opaque::{FileEncodeResult, FileEncoder};
use rustc_session::config::{CrateType, OutputFilenames}; use rustc_session::config::{CrateType, OutputFilenames};
use rustc_session::cstore::CrateStoreDyn; use rustc_session::cstore::CrateStoreDyn;
use rustc_session::errors::TargetDataLayoutParseError;
use rustc_session::lint::{Level, Lint}; use rustc_session::lint::{Level, Lint};
use rustc_session::Limit; use rustc_session::Limit;
use rustc_session::Session; use rustc_session::Session;
@ -1251,7 +1252,7 @@ impl<'tcx> TyCtxt<'tcx> {
output_filenames: OutputFilenames, output_filenames: OutputFilenames,
) -> GlobalCtxt<'tcx> { ) -> GlobalCtxt<'tcx> {
let data_layout = TargetDataLayout::parse(&s.target).unwrap_or_else(|err| { let data_layout = TargetDataLayout::parse(&s.target).unwrap_or_else(|err| {
s.fatal(&err); s.emit_fatal(TargetDataLayoutParseError { err });
}); });
let interners = CtxtInterners::new(arena); let interners = CtxtInterners::new(arena);
let common_types = CommonTypes::new( let common_types = CommonTypes::new(

View file

@ -1,10 +1,12 @@
use std::num::NonZeroU32; use std::num::NonZeroU32;
use crate::cgu_reuse_tracker::CguReuse; use crate::cgu_reuse_tracker::CguReuse;
use crate::parse::ParseSess;
use crate::{self as rustc_session}; use crate::{self as rustc_session};
use rustc_errors::MultiSpan; use rustc_errors::{fluent, MultiSpan};
use rustc_macros::SessionDiagnostic; use rustc_macros::SessionDiagnostic;
use rustc_span::{Span, Symbol}; use rustc_span::{Span, Symbol};
use rustc_target::abi::TargetDataLayoutErrors;
#[derive(SessionDiagnostic)] #[derive(SessionDiagnostic)]
#[diag(session::incorrect_cgu_reuse_type)] #[diag(session::incorrect_cgu_reuse_type)]
@ -44,10 +46,59 @@ pub struct FeatureDiagnosticHelp {
pub feature: Symbol, pub feature: Symbol,
} }
#[derive(SessionDiagnostic)] pub struct TargetDataLayoutParseError<'a> {
#[diag(session::target_data_layout_parse_error)] pub err: TargetDataLayoutErrors<'a>,
pub struct TargetDataLayoutParseError { }
pub err: String,
impl crate::SessionDiagnostic<'_, !> for TargetDataLayoutParseError<'_> {
fn into_diagnostic(self, sess: &ParseSess) -> rustc_errors::DiagnosticBuilder<'_, !> {
let mut diag;
match self.err {
TargetDataLayoutErrors::InvalidAddressSpace { addr_space, err, cause } => {
diag = sess.struct_fatal(fluent::session::target_invalid_address_space);
diag.set_arg("addr_space", addr_space);
diag.set_arg("cause", cause);
diag.set_arg("err", err);
diag
}
TargetDataLayoutErrors::InvalidBits { kind, bit, cause, err } => {
diag = sess.struct_fatal(fluent::session::target_invalid_bits);
diag.set_arg("kind", kind);
diag.set_arg("bit", bit);
diag.set_arg("cause", cause);
diag.set_arg("err", err);
diag
}
TargetDataLayoutErrors::MissingAlignment { cause } => {
diag = sess.struct_fatal(fluent::session::target_missing_alignment);
diag.set_arg("cause", cause);
diag
}
TargetDataLayoutErrors::InvalidAlignment { cause, err } => {
diag = sess.struct_fatal(fluent::session::target_invalid_alignment);
diag.set_arg("cause", cause);
diag.set_arg("err", err);
diag
}
TargetDataLayoutErrors::InconsistentTargetArchitecture { dl, target } => {
diag = sess.struct_fatal(fluent::session::target_inconsistent_architecture);
diag.set_arg("dl", dl);
diag.set_arg("target", target);
diag
}
TargetDataLayoutErrors::InconsistentTargetPointerWidth { pointer_size, target } => {
diag = sess.struct_fatal(fluent::session::target_inconsistent_pointer_width);
diag.set_arg("pointer_size", pointer_size);
diag.set_arg("target", target);
diag
}
TargetDataLayoutErrors::InvalidBitsSize { err } => {
diag = sess.struct_fatal(fluent::session::target_invalid_bits_size);
diag.set_arg("err", err);
diag
}
}
}
} }
#[derive(SessionDiagnostic)] #[derive(SessionDiagnostic)]

View file

@ -7,7 +7,7 @@ use crate::spec::Target;
use std::convert::{TryFrom, TryInto}; use std::convert::{TryFrom, TryInto};
use std::fmt; use std::fmt;
use std::iter::Step; use std::iter::Step;
use std::num::NonZeroUsize; use std::num::{NonZeroUsize, ParseIntError};
use std::ops::{Add, AddAssign, Deref, Mul, RangeInclusive, Sub}; use std::ops::{Add, AddAssign, Deref, Mul, RangeInclusive, Sub};
use std::str::FromStr; use std::str::FromStr;
@ -69,34 +69,46 @@ impl Default for TargetDataLayout {
} }
} }
pub enum TargetDataLayoutErrors<'a> {
InvalidAddressSpace { addr_space: &'a str, cause: &'a str, err: ParseIntError },
InvalidBits { kind: &'a str, bit: &'a str, cause: &'a str, err: ParseIntError },
MissingAlignment { cause: &'a str },
InvalidAlignment { cause: &'a str, err: String },
InconsistentTargetArchitecture { dl: &'a str, target: &'a str },
InconsistentTargetPointerWidth { pointer_size: u64, target: u32 },
InvalidBitsSize { err: String },
}
impl TargetDataLayout { impl TargetDataLayout {
pub fn parse(target: &Target) -> Result<TargetDataLayout, String> { pub fn parse<'a>(target: &'a Target) -> Result<TargetDataLayout, TargetDataLayoutErrors<'a>> {
// Parse an address space index from a string. // Parse an address space index from a string.
let parse_address_space = |s: &str, cause: &str| { let parse_address_space = |s: &'a str, cause: &'a str| {
s.parse::<u32>().map(AddressSpace).map_err(|err| { s.parse::<u32>().map(AddressSpace).map_err(|err| {
format!("invalid address space `{}` for `{}` in \"data-layout\": {}", s, cause, err) TargetDataLayoutErrors::InvalidAddressSpace { addr_space: s, cause, err }
}) })
}; };
// Parse a bit count from a string. // Parse a bit count from a string.
let parse_bits = |s: &str, kind: &str, cause: &str| { let parse_bits = |s: &'a str, kind: &'a str, cause: &'a str| {
s.parse::<u64>().map_err(|err| { s.parse::<u64>().map_err(|err| TargetDataLayoutErrors::InvalidBits {
format!("invalid {} `{}` for `{}` in \"data-layout\": {}", kind, s, cause, err) kind,
bit: s,
cause,
err,
}) })
}; };
// Parse a size string. // Parse a size string.
let size = |s: &str, cause: &str| parse_bits(s, "size", cause).map(Size::from_bits); let size = |s: &'a str, cause: &'a str| parse_bits(s, "size", cause).map(Size::from_bits);
// Parse an alignment string. // Parse an alignment string.
let align = |s: &[&str], cause: &str| { let align = |s: &[&'a str], cause: &'a str| {
if s.is_empty() { if s.is_empty() {
return Err(format!("missing alignment for `{}` in \"data-layout\"", cause)); return Err(TargetDataLayoutErrors::MissingAlignment { cause });
} }
let align_from_bits = |bits| { let align_from_bits = |bits| {
Align::from_bits(bits).map_err(|err| { Align::from_bits(bits)
format!("invalid alignment for `{}` in \"data-layout\": {}", cause, err) .map_err(|err| TargetDataLayoutErrors::InvalidAlignment { cause, err })
})
}; };
let abi = parse_bits(s[0], "alignment", cause)?; let abi = parse_bits(s[0], "alignment", cause)?;
let pref = s.get(1).map_or(Ok(abi), |pref| parse_bits(pref, "alignment", cause))?; let pref = s.get(1).map_or(Ok(abi), |pref| parse_bits(pref, "alignment", cause))?;
@ -158,25 +170,24 @@ impl TargetDataLayout {
// Perform consistency checks against the Target information. // Perform consistency checks against the Target information.
if dl.endian != target.endian { if dl.endian != target.endian {
return Err(format!( return Err(TargetDataLayoutErrors::InconsistentTargetArchitecture {
"inconsistent target specification: \"data-layout\" claims \ dl: dl.endian.as_str(),
architecture is {}-endian, while \"target-endian\" is `{}`", target: target.endian.as_str(),
dl.endian.as_str(), });
target.endian.as_str(),
));
} }
let target_pointer_width: u64 = target.pointer_width.into(); let target_pointer_width: u64 = target.pointer_width.into();
if dl.pointer_size.bits() != target_pointer_width { if dl.pointer_size.bits() != target_pointer_width {
return Err(format!( return Err(TargetDataLayoutErrors::InconsistentTargetPointerWidth {
"inconsistent target specification: \"data-layout\" claims \ pointer_size: dl.pointer_size.bits(),
pointers are {}-bit, while \"target-pointer-width\" is `{}`", target: target.pointer_width,
dl.pointer_size.bits(), });
target.pointer_width
));
} }
dl.c_enum_min_size = Integer::from_size(Size::from_bits(target.c_enum_min_bits))?; dl.c_enum_min_size = match Integer::from_size(Size::from_bits(target.c_enum_min_bits)) {
Ok(bits) => bits,
Err(err) => return Err(TargetDataLayoutErrors::InvalidBitsSize { err }),
};
Ok(dl) Ok(dl)
} }