Auto merge of #99422 - Dylan-DPC:rollup-htjofm6, r=Dylan-DPC
Rollup of 7 pull requests Successful merges: - #98839 (Add assertion that `transmute_copy`'s U is not larger than T) - #98998 (Remove branch target prologues from `#[naked] fn`) - #99198 (add missing null ptr check in alloc example) - #99344 (rustdoc: avoid inlining items with duplicate `(type, name)`) - #99351 (Use `typeck_results` to get accurate qpath res for arg mismatch error) - #99378 (interpret/visitor: add missing early return) - #99394 (Add regression test for #95230) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
f8588549c3
21 changed files with 233 additions and 21 deletions
|
@ -299,6 +299,12 @@ pub fn from_fn_attrs<'ll, 'tcx>(
|
|||
}
|
||||
if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NAKED) {
|
||||
to_add.push(AttributeKind::Naked.create_attr(cx.llcx));
|
||||
// HACK(jubilee): "indirect branch tracking" works by attaching prologues to functions.
|
||||
// And it is a module-level attribute, so the alternative is pulling naked functions into new LLVM modules.
|
||||
// Otherwise LLVM's "naked" functions come with endbr prefixes per https://github.com/rust-lang/rust/issues/98768
|
||||
to_add.push(AttributeKind::NoCfCheck.create_attr(cx.llcx));
|
||||
// Need this for AArch64.
|
||||
to_add.push(llvm::CreateAttrStringValue(cx.llcx, "branch-target-enforcement", "false"));
|
||||
}
|
||||
if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::ALLOCATOR) {
|
||||
// apply to return place instead of function (unlike all other attributes applied in this function)
|
||||
|
|
|
@ -191,6 +191,7 @@ pub enum AttributeKind {
|
|||
StackProtect = 32,
|
||||
NoUndef = 33,
|
||||
SanitizeMemTag = 34,
|
||||
NoCfCheck = 35,
|
||||
}
|
||||
|
||||
/// LLVMIntPredicate
|
||||
|
|
|
@ -473,6 +473,9 @@ macro_rules! make_value_visitor {
|
|||
// The second `Box` field is the allocator, which we recursively check for validity
|
||||
// like in regular structs.
|
||||
self.visit_field(v, 1, &alloc)?;
|
||||
|
||||
// We visited all parts of this one.
|
||||
return Ok(());
|
||||
}
|
||||
_ => {},
|
||||
};
|
||||
|
|
|
@ -84,6 +84,7 @@ enum LLVMRustAttribute {
|
|||
StackProtect = 32,
|
||||
NoUndef = 33,
|
||||
SanitizeMemTag = 34,
|
||||
NoCfCheck = 35,
|
||||
};
|
||||
|
||||
typedef struct OpaqueRustString *RustStringRef;
|
||||
|
|
|
@ -176,6 +176,8 @@ static Attribute::AttrKind fromRust(LLVMRustAttribute Kind) {
|
|||
return Attribute::NoAlias;
|
||||
case NoCapture:
|
||||
return Attribute::NoCapture;
|
||||
case NoCfCheck:
|
||||
return Attribute::NoCfCheck;
|
||||
case NoInline:
|
||||
return Attribute::NoInline;
|
||||
case NonNull:
|
||||
|
|
|
@ -443,17 +443,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// Next, let's construct the error
|
||||
let (error_span, full_call_span, ctor_of) = match &call_expr.kind {
|
||||
hir::ExprKind::Call(
|
||||
hir::Expr {
|
||||
span,
|
||||
kind:
|
||||
hir::ExprKind::Path(hir::QPath::Resolved(
|
||||
_,
|
||||
hir::Path { res: Res::Def(DefKind::Ctor(of, _), _), .. },
|
||||
)),
|
||||
..
|
||||
},
|
||||
hir::Expr { hir_id, span, kind: hir::ExprKind::Path(qpath), .. },
|
||||
_,
|
||||
) => (call_span, *span, Some(of)),
|
||||
) => {
|
||||
if let Res::Def(DefKind::Ctor(of, _), _) =
|
||||
self.typeck_results.borrow().qpath_res(qpath, *hir_id)
|
||||
{
|
||||
(call_span, *span, Some(of))
|
||||
} else {
|
||||
(call_span, *span, None)
|
||||
}
|
||||
}
|
||||
hir::ExprKind::Call(hir::Expr { span, .. }, _) => (call_span, *span, None),
|
||||
hir::ExprKind::MethodCall(path_segment, _, span) => {
|
||||
let ident_span = path_segment.ident.span;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue