Clean up formatting.

Reflow overly long comments, plus some minor whitespace improvements.
This commit is contained in:
Nicholas Nethercote 2024-09-11 09:59:50 +10:00
parent bdacdfe95f
commit cd3da000c0
12 changed files with 72 additions and 48 deletions

View File

@ -154,7 +154,8 @@ fn unsized_info<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
let old_info = let old_info =
old_info.expect("unsized_info: missing old info for trait upcasting coercion"); old_info.expect("unsized_info: missing old info for trait upcasting coercion");
if data_a.principal_def_id() == data_b.principal_def_id() { if data_a.principal_def_id() == data_b.principal_def_id() {
// A NOP cast that doesn't actually change anything, should be allowed even with invalid vtables. // A NOP cast that doesn't actually change anything, should be allowed even with
// invalid vtables.
return old_info; return old_info;
} }
@ -985,7 +986,8 @@ pub fn new(tcx: TyCtxt<'_>, target_cpu: String) -> CrateInfo {
false false
} }
CrateType::Staticlib | CrateType::Rlib => { CrateType::Staticlib | CrateType::Rlib => {
// We don't invoke the linker for these, so we don't need to collect the NatVis for them. // We don't invoke the linker for these, so we don't need to collect the NatVis for
// them.
false false
} }
}); });

View File

@ -317,9 +317,9 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
"extern mutable statics are not allowed with `#[linkage]`", "extern mutable statics are not allowed with `#[linkage]`",
); );
diag.note( diag.note(
"marking the extern static mutable would allow changing which symbol \ "marking the extern static mutable would allow changing which \
the static references rather than make the target of the symbol \ symbol the static references rather than make the target of the \
mutable", symbol mutable",
); );
diag.emit(); diag.emit();
} }
@ -711,18 +711,19 @@ fn check_link_ordinal(tcx: TyCtxt<'_>, attr: &ast::Attribute) -> Option<u16> {
if let Some(MetaItemLit { kind: LitKind::Int(ordinal, LitIntType::Unsuffixed), .. }) = if let Some(MetaItemLit { kind: LitKind::Int(ordinal, LitIntType::Unsuffixed), .. }) =
sole_meta_list sole_meta_list
{ {
// According to the table at https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#import-header, // According to the table at
// the ordinal must fit into 16 bits. Similarly, the Ordinal field in COFFShortExport (defined // https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#import-header, the
// in llvm/include/llvm/Object/COFFImportFile.h), which we use to communicate import information // ordinal must fit into 16 bits. Similarly, the Ordinal field in COFFShortExport (defined
// to LLVM for `#[link(kind = "raw-dylib"_])`, is also defined to be uint16_t. // in llvm/include/llvm/Object/COFFImportFile.h), which we use to communicate import
// information to LLVM for `#[link(kind = "raw-dylib"_])`, is also defined to be uint16_t.
// //
// FIXME: should we allow an ordinal of 0? The MSVC toolchain has inconsistent support for this: // FIXME: should we allow an ordinal of 0? The MSVC toolchain has inconsistent support for
// both LINK.EXE and LIB.EXE signal errors and abort when given a .DEF file that specifies // this: both LINK.EXE and LIB.EXE signal errors and abort when given a .DEF file that
// a zero ordinal. However, llvm-dlltool is perfectly happy to generate an import library // specifies a zero ordinal. However, llvm-dlltool is perfectly happy to generate an import
// for such a .DEF file, and MSVC's LINK.EXE is also perfectly happy to consume an import // library for such a .DEF file, and MSVC's LINK.EXE is also perfectly happy to consume an
// library produced by LLVM with an ordinal of 0, and it generates an .EXE. (I don't know yet // import library produced by LLVM with an ordinal of 0, and it generates an .EXE. (I
// if the resulting EXE runs, as I haven't yet built the necessary DLL -- see earlier comment // don't know yet if the resulting EXE runs, as I haven't yet built the necessary DLL --
// about LINK.EXE failing.) // see earlier comment about LINK.EXE failing.)
if *ordinal <= u16::MAX as u128 { if *ordinal <= u16::MAX as u128 {
Some(ordinal.get() as u16) Some(ordinal.get() as u16)
} else { } else {

View File

@ -200,7 +200,8 @@ pub fn i686_decorated_name(
let mut decorated_name = String::with_capacity(name.len() + 6); let mut decorated_name = String::with_capacity(name.len() + 6);
if disable_name_mangling { if disable_name_mangling {
// LLVM uses a binary 1 ('\x01') prefix to a name to indicate that mangling needs to be disabled. // LLVM uses a binary 1 ('\x01') prefix to a name to indicate that mangling needs to be
// disabled.
decorated_name.push('\x01'); decorated_name.push('\x01');
} }

View File

@ -76,9 +76,9 @@ fn tag_base_type_opt<'tcx>(
Primitive::Float(f) => Integer::from_size(f.size()).unwrap(), Primitive::Float(f) => Integer::from_size(f.size()).unwrap(),
// FIXME(erikdesjardins): handle non-default addrspace ptr sizes // FIXME(erikdesjardins): handle non-default addrspace ptr sizes
Primitive::Pointer(_) => { Primitive::Pointer(_) => {
// If the niche is the NULL value of a reference, then `discr_enum_ty` will be // If the niche is the NULL value of a reference, then `discr_enum_ty` will
// a RawPtr. CodeView doesn't know what to do with enums whose base type is a // be a RawPtr. CodeView doesn't know what to do with enums whose base type
// pointer so we fix this up to just be `usize`. // is a pointer so we fix this up to just be `usize`.
// DWARF might be able to deal with this but with an integer type we are on // DWARF might be able to deal with this but with an integer type we are on
// the safe side there too. // the safe side there too.
tcx.data_layout.ptr_sized_integer() tcx.data_layout.ptr_sized_integer()

View File

@ -95,7 +95,8 @@ fn push_debuginfo_type_name<'tcx>(
} }
Err(e) => { Err(e) => {
// Computing the layout can still fail here, e.g. if the target architecture // Computing the layout can still fail here, e.g. if the target architecture
// cannot represent the type. See https://github.com/rust-lang/rust/issues/94961. // cannot represent the type. See
// https://github.com/rust-lang/rust/issues/94961.
tcx.dcx().emit_fatal(e.into_diagnostic()); tcx.dcx().emit_fatal(e.into_diagnostic());
} }
} }

View File

@ -996,7 +996,8 @@ fn codegen_call_terminator(
// To get a `*mut RcBox<Self>`, we just keep unwrapping newtypes until // To get a `*mut RcBox<Self>`, we just keep unwrapping newtypes until
// we get a value of a built-in pointer type. // we get a value of a built-in pointer type.
// //
// This is also relevant for `Pin<&mut Self>`, where we need to peel the `Pin`. // This is also relevant for `Pin<&mut Self>`, where we need to peel the
// `Pin`.
while !op.layout.ty.is_unsafe_ptr() && !op.layout.ty.is_ref() { while !op.layout.ty.is_unsafe_ptr() && !op.layout.ty.is_ref() {
let (idx, _) = op.layout.non_1zst_field(bx).expect( let (idx, _) = op.layout.non_1zst_field(bx).expect(
"not exactly one non-1-ZST field in a `DispatchFromDyn` type", "not exactly one non-1-ZST field in a `DispatchFromDyn` type",
@ -1004,9 +1005,9 @@ fn codegen_call_terminator(
op = op.extract_field(bx, idx); op = op.extract_field(bx, idx);
} }
// now that we have `*dyn Trait` or `&dyn Trait`, split it up into its // Now that we have `*dyn Trait` or `&dyn Trait`, split it up into its
// data pointer and vtable. Look up the method in the vtable, and pass // data pointer and vtable. Look up the method in the vtable, and pass
// the data pointer as the first argument // the data pointer as the first argument.
llfn = Some(meth::VirtualIndex::from_index(idx).get_fn( llfn = Some(meth::VirtualIndex::from_index(idx).get_fn(
bx, bx,
meta, meta,
@ -1440,8 +1441,9 @@ fn codegen_argument(
let (mut llval, align, by_ref) = match op.val { let (mut llval, align, by_ref) = match op.val {
Immediate(_) | Pair(..) => match arg.mode { Immediate(_) | Pair(..) => match arg.mode {
PassMode::Indirect { attrs, .. } => { PassMode::Indirect { attrs, .. } => {
// Indirect argument may have higher alignment requirements than the type's alignment. // Indirect argument may have higher alignment requirements than the type's
// This can happen, e.g. when passing types with <4 byte alignment on the stack on x86. // alignment. This can happen, e.g. when passing types with <4 byte alignment
// on the stack on x86.
let required_align = match attrs.pointee_align { let required_align = match attrs.pointee_align {
Some(pointee_align) => cmp::max(pointee_align, arg.layout.align.abi), Some(pointee_align) => cmp::max(pointee_align, arg.layout.align.abi),
None => arg.layout.align.abi, None => arg.layout.align.abi,

View File

@ -32,7 +32,8 @@ pub fn eval_mir_constant(&self, constant: &mir::ConstOperand<'tcx>) -> mir::Cons
/// that the given `constant` is an `Const::Unevaluated` and must be convertible to /// that the given `constant` is an `Const::Unevaluated` and must be convertible to
/// a `ValTree`. If you want a more general version of this, talk to `wg-const-eval` on zulip. /// a `ValTree`. If you want a more general version of this, talk to `wg-const-eval` on zulip.
/// ///
/// Note that this function is cursed, since usually MIR consts should not be evaluated to valtrees! /// Note that this function is cursed, since usually MIR consts should not be evaluated to
/// valtrees!
fn eval_unevaluated_mir_constant_to_valtree( fn eval_unevaluated_mir_constant_to_valtree(
&self, &self,
constant: &mir::ConstOperand<'tcx>, constant: &mir::ConstOperand<'tcx>,
@ -40,19 +41,19 @@ fn eval_unevaluated_mir_constant_to_valtree(
let uv = match self.monomorphize(constant.const_) { let uv = match self.monomorphize(constant.const_) {
mir::Const::Unevaluated(uv, _) => uv.shrink(), mir::Const::Unevaluated(uv, _) => uv.shrink(),
mir::Const::Ty(_, c) => match c.kind() { mir::Const::Ty(_, c) => match c.kind() {
// A constant that came from a const generic but was then used as an argument to old-style // A constant that came from a const generic but was then used as an argument to
// simd_shuffle (passing as argument instead of as a generic param). // old-style simd_shuffle (passing as argument instead of as a generic param).
rustc_type_ir::ConstKind::Value(_, valtree) => return Ok(Ok(valtree)), rustc_type_ir::ConstKind::Value(_, valtree) => return Ok(Ok(valtree)),
other => span_bug!(constant.span, "{other:#?}"), other => span_bug!(constant.span, "{other:#?}"),
}, },
// We should never encounter `Const::Val` unless MIR opts (like const prop) evaluate // We should never encounter `Const::Val` unless MIR opts (like const prop) evaluate
// a constant and write that value back into `Operand`s. This could happen, but is unlikely. // a constant and write that value back into `Operand`s. This could happen, but is
// Also: all users of `simd_shuffle` are on unstable and already need to take a lot of care // unlikely. Also: all users of `simd_shuffle` are on unstable and already need to take
// around intrinsics. For an issue to happen here, it would require a macro expanding to a // a lot of care around intrinsics. For an issue to happen here, it would require a
// `simd_shuffle` call without wrapping the constant argument in a `const {}` block, but // macro expanding to a `simd_shuffle` call without wrapping the constant argument in a
// the user pass through arbitrary expressions. // `const {}` block, but the user pass through arbitrary expressions.
// FIXME(oli-obk): replace the magic const generic argument of `simd_shuffle` with a real // FIXME(oli-obk): replace the magic const generic argument of `simd_shuffle` with a
// const generic, and get rid of this entire function. // real const generic, and get rid of this entire function.
other => span_bug!(constant.span, "{other:#?}"), other => span_bug!(constant.span, "{other:#?}"),
}; };
let uv = self.monomorphize(uv); let uv = self.monomorphize(uv);

View File

@ -24,6 +24,7 @@ pub struct FunctionDebugContext<'tcx, S, L> {
/// Maps from an inlined function to its debug info declaration. /// Maps from an inlined function to its debug info declaration.
pub inlined_function_scopes: FxHashMap<Instance<'tcx>, S>, pub inlined_function_scopes: FxHashMap<Instance<'tcx>, S>,
} }
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub enum VariableKind { pub enum VariableKind {
ArgumentVariable(usize /*index*/), ArgumentVariable(usize /*index*/),

View File

@ -478,8 +478,8 @@ pub(crate) fn store_with_flags<Bx: BuilderMethods<'a, 'tcx, Value = V>>(
debug!("OperandRef::store: operand={:?}, dest={:?}", self, dest); debug!("OperandRef::store: operand={:?}, dest={:?}", self, dest);
match self { match self {
OperandValue::ZeroSized => { OperandValue::ZeroSized => {
// Avoid generating stores of zero-sized values, because the only way to have a zero-sized // Avoid generating stores of zero-sized values, because the only way to have a
// value is through `undef`/`poison`, and the store itself is useless. // zero-sized value is through `undef`/`poison`, and the store itself is useless.
} }
OperandValue::Ref(val) => { OperandValue::Ref(val) => {
assert!(dest.layout.is_sized(), "cannot directly store unsized values"); assert!(dest.layout.is_sized(), "cannot directly store unsized values");

View File

@ -45,11 +45,13 @@ pub fn size_and_align_of_dst<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
// The info in this case is the length of the str, so the size is that // The info in this case is the length of the str, so the size is that
// times the unit size. // times the unit size.
( (
// All slice sizes must fit into `isize`, so this multiplication cannot (signed) wrap. // All slice sizes must fit into `isize`, so this multiplication cannot (signed)
// wrap.
// NOTE: ideally, we want the effects of both `unchecked_smul` and `unchecked_umul` // NOTE: ideally, we want the effects of both `unchecked_smul` and `unchecked_umul`
// (resulting in `mul nsw nuw` in LLVM IR), since we know that the multiplication // (resulting in `mul nsw nuw` in LLVM IR), since we know that the multiplication
// cannot signed wrap, and that both operands are non-negative. But at the time of writing, // cannot signed wrap, and that both operands are non-negative. But at the time of
// the `LLVM-C` binding can't do this, and it doesn't seem to enable any further optimizations. // writing, the `LLVM-C` binding can't do this, and it doesn't seem to enable any
// further optimizations.
bx.unchecked_smul(info.unwrap(), bx.const_usize(unit.size.bytes())), bx.unchecked_smul(info.unwrap(), bx.const_usize(unit.size.bytes())),
bx.const_usize(unit.align.abi.bytes()), bx.const_usize(unit.align.abi.bytes()),
) )
@ -67,9 +69,9 @@ pub fn size_and_align_of_dst<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
let (fn_abi, llfn, _instance) = let (fn_abi, llfn, _instance) =
common::build_langcall(bx, None, LangItem::PanicNounwind); common::build_langcall(bx, None, LangItem::PanicNounwind);
// Generate the call. // Generate the call. Cannot use `do_call` since we don't have a MIR terminator so we
// Cannot use `do_call` since we don't have a MIR terminator so we can't create a `TerminationCodegenHelper`. // can't create a `TerminationCodegenHelper`. (But we are in good company, this code is
// (But we are in good company, this code is duplicated plenty of times.) // duplicated plenty of times.)
let fn_ty = bx.fn_decl_backend_type(fn_abi); let fn_ty = bx.fn_decl_backend_type(fn_abi);
bx.call( bx.call(
@ -148,9 +150,14 @@ pub fn size_and_align_of_dst<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
// The full formula for the size would be: // The full formula for the size would be:
// let unsized_offset_adjusted = unsized_offset_unadjusted.align_to(unsized_align); // let unsized_offset_adjusted = unsized_offset_unadjusted.align_to(unsized_align);
// let full_size = (unsized_offset_adjusted + unsized_size).align_to(full_align); // let full_size = (unsized_offset_adjusted + unsized_size).align_to(full_align);
// However, `unsized_size` is a multiple of `unsized_align`. // However, `unsized_size` is a multiple of `unsized_align`. Therefore, we can
// Therefore, we can equivalently do the `align_to(unsized_align)` *after* adding `unsized_size`: // equivalently do the `align_to(unsized_align)` *after* adding `unsized_size`:
// let full_size = (unsized_offset_unadjusted + unsized_size).align_to(unsized_align).align_to(full_align); //
// let full_size =
// (unsized_offset_unadjusted + unsized_size)
// .align_to(unsized_align)
// .align_to(full_align);
//
// Furthermore, `align >= unsized_align`, and therefore we only need to do: // Furthermore, `align >= unsized_align`, and therefore we only need to do:
// let full_size = (unsized_offset_unadjusted + unsized_size).align_to(full_align); // let full_size = (unsized_offset_unadjusted + unsized_size).align_to(full_align);

View File

@ -59,11 +59,15 @@ pub trait CodegenBackend {
fn locale_resource(&self) -> &'static str; fn locale_resource(&self) -> &'static str;
fn init(&self, _sess: &Session) {} fn init(&self, _sess: &Session) {}
fn print(&self, _req: &PrintRequest, _out: &mut String, _sess: &Session) {} fn print(&self, _req: &PrintRequest, _out: &mut String, _sess: &Session) {}
fn target_features(&self, _sess: &Session, _allow_unstable: bool) -> Vec<Symbol> { fn target_features(&self, _sess: &Session, _allow_unstable: bool) -> Vec<Symbol> {
vec![] vec![]
} }
fn print_passes(&self) {} fn print_passes(&self) {}
fn print_version(&self) {} fn print_version(&self) {}
/// The metadata loader used to load rlib and dylib metadata. /// The metadata loader used to load rlib and dylib metadata.
@ -75,6 +79,7 @@ fn metadata_loader(&self) -> Box<MetadataLoaderDyn> {
} }
fn provide(&self, _providers: &mut Providers) {} fn provide(&self, _providers: &mut Providers) {}
fn codegen_crate<'tcx>( fn codegen_crate<'tcx>(
&self, &self,
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
@ -120,6 +125,7 @@ fn codegen_allocator<'tcx>(
kind: AllocatorKind, kind: AllocatorKind,
alloc_error_handler_kind: AllocatorKind, alloc_error_handler_kind: AllocatorKind,
) -> Self::Module; ) -> Self::Module;
/// This generates the codegen unit and returns it along with /// This generates the codegen unit and returns it along with
/// a `u64` giving an estimate of the unit's processing cost. /// a `u64` giving an estimate of the unit's processing cost.
fn compile_codegen_unit( fn compile_codegen_unit(
@ -127,6 +133,7 @@ fn compile_codegen_unit(
tcx: TyCtxt<'_>, tcx: TyCtxt<'_>,
cgu_name: Symbol, cgu_name: Symbol,
) -> (ModuleCodegen<Self::Module>, u64); ) -> (ModuleCodegen<Self::Module>, u64);
fn target_machine_factory( fn target_machine_factory(
&self, &self,
sess: &Session, sess: &Session,

View File

@ -25,6 +25,7 @@ fn apply_vcall_visibility_metadata(
fn codegen_unit(&self) -> &'tcx CodegenUnit<'tcx>; fn codegen_unit(&self) -> &'tcx CodegenUnit<'tcx>;
fn set_frame_pointer_type(&self, llfn: Self::Function); fn set_frame_pointer_type(&self, llfn: Self::Function);
fn apply_target_cpu_attr(&self, llfn: Self::Function); fn apply_target_cpu_attr(&self, llfn: Self::Function);
/// Declares the extern "C" main function for the entry point. Returns None if the symbol already exists. /// Declares the extern "C" main function for the entry point. Returns None if the symbol
/// already exists.
fn declare_c_main(&self, fn_type: Self::Type) -> Option<Self::Function>; fn declare_c_main(&self, fn_type: Self::Type) -> Option<Self::Function>;
} }