Clean up formatting.
Reflow overly long comments, plus some minor whitespace improvements.
This commit is contained in:
parent
bdacdfe95f
commit
cd3da000c0
@ -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
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -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 {
|
||||||
|
@ -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');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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*/),
|
||||||
|
@ -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");
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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>;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user