Auto merge of #121298 - nikic:writable, r=cuviper
Set writable and dead_on_unwind attributes for sret arguments Set the `writable` and `dead_on_unwind` attributes for `sret` arguments. This allows call slot optimization to remove more memcpy's. See https://llvm.org/docs/LangRef.html#parameter-attributes for the specification of these attributes. In short, the statement we're making here is that: * The return slot is writable. * The return slot will not be read if the function unwinds. Fixes https://github.com/rust-lang/rust/issues/90595.
This commit is contained in:
commit
284f94f9c0
7 changed files with 33 additions and 4 deletions
|
@ -91,6 +91,8 @@ enum LLVMRustAttribute {
|
|||
AllocAlign = 39,
|
||||
SanitizeSafeStack = 40,
|
||||
FnRetThunkExtern = 41,
|
||||
Writable = 42,
|
||||
DeadOnUnwind = 43,
|
||||
};
|
||||
|
||||
typedef struct OpaqueRustString *RustStringRef;
|
||||
|
|
|
@ -312,6 +312,16 @@ static Attribute::AttrKind fromRust(LLVMRustAttribute Kind) {
|
|||
return Attribute::SafeStack;
|
||||
case FnRetThunkExtern:
|
||||
return Attribute::FnRetThunkExtern;
|
||||
#if LLVM_VERSION_GE(18, 0)
|
||||
case Writable:
|
||||
return Attribute::Writable;
|
||||
case DeadOnUnwind:
|
||||
return Attribute::DeadOnUnwind;
|
||||
#else
|
||||
case Writable:
|
||||
case DeadOnUnwind:
|
||||
report_fatal_error("Not supported on this LLVM version");
|
||||
#endif
|
||||
}
|
||||
report_fatal_error("bad AttributeKind");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue