Rollup merge of #148770 - folkertdev:naked-c-variadic, r=workingjubilee
implement `feature(c_variadic_naked_functions)` tracking issue: https://github.com/rust-lang/rust/issues/148767 [#t-lang > C-variadic naked functions](https://rust-lang.zulipchat.com/#narrow/channel/213817-t-lang/topic/C-variadic.20naked.20functions/with/554593886) This feature allows naked c-variadic function definitions with any ABI that is supported for foreign c-variadic functions. ```rust #![feature(c_variadic, c_variadic_naked_functions)] #[unsafe(naked)] unsafe extern "win64" fn variadic_win64(_: u32, _: ...) -> u32 { core::arch::naked_asm!( r#" push rax mov qword ptr [rsp + 40], r9 mov qword ptr [rsp + 24], rdx mov qword ptr [rsp + 32], r8 lea rax, [rsp + 40] mov qword ptr [rsp], rax lea eax, [rdx + rcx] add eax, r8d pop rcx ret "#, ) } ``` r? ````@workingjubilee````
This commit is contained in:
commit
60b2068eed
19 changed files with 284 additions and 80 deletions
|
|
@ -645,8 +645,9 @@ macro_rules! common_visitor_and_walkers {
|
|||
fn visit_fn(
|
||||
&mut self,
|
||||
fk: FnKind<$($lt)? $(${ignore($mut)} '_)?>,
|
||||
_: &AttrVec,
|
||||
_: Span,
|
||||
_: NodeId
|
||||
_: NodeId,
|
||||
) -> Self::Result {
|
||||
walk_fn(self, fk)
|
||||
}
|
||||
|
|
@ -740,6 +741,7 @@ macro_rules! common_visitor_and_walkers {
|
|||
type Ctxt;
|
||||
fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
|
||||
&$($lt)? $($mut)? self,
|
||||
attrs: &AttrVec,
|
||||
span: Span,
|
||||
id: NodeId,
|
||||
visibility: &$($lt)? $($mut)? Visibility,
|
||||
|
|
@ -773,7 +775,7 @@ macro_rules! common_visitor_and_walkers {
|
|||
) -> V::Result {
|
||||
let Item { attrs, id, kind, vis, span, tokens: _ } = item;
|
||||
visit_visitable!($($mut)? visitor, id, attrs, vis);
|
||||
try_visit!(kind.walk(*span, *id, vis, ctxt, visitor));
|
||||
try_visit!(kind.walk(attrs, *span, *id, vis, ctxt, visitor));
|
||||
visit_visitable!($($mut)? visitor, span);
|
||||
V::Result::output()
|
||||
}
|
||||
|
|
@ -799,6 +801,7 @@ macro_rules! common_visitor_and_walkers {
|
|||
type Ctxt = ();
|
||||
fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
|
||||
&$($lt)? $($mut)? self,
|
||||
attrs: &AttrVec,
|
||||
span: Span,
|
||||
id: NodeId,
|
||||
visibility: &$($lt)? $($mut)? Visibility,
|
||||
|
|
@ -808,7 +811,7 @@ macro_rules! common_visitor_and_walkers {
|
|||
match self {
|
||||
ItemKind::Fn(func) => {
|
||||
let kind = FnKind::Fn(FnCtxt::Free, visibility, &$($mut)? *func);
|
||||
try_visit!(vis.visit_fn(kind, span, id));
|
||||
try_visit!(vis.visit_fn(kind, attrs, span, id));
|
||||
}
|
||||
ItemKind::ExternCrate(orig_name, ident) =>
|
||||
visit_visitable!($($mut)? vis, orig_name, ident),
|
||||
|
|
@ -856,6 +859,7 @@ macro_rules! common_visitor_and_walkers {
|
|||
type Ctxt = AssocCtxt;
|
||||
fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
|
||||
&$($lt)? $($mut)? self,
|
||||
attrs: &AttrVec,
|
||||
span: Span,
|
||||
id: NodeId,
|
||||
visibility: &$($lt)? $($mut)? Visibility,
|
||||
|
|
@ -867,7 +871,7 @@ macro_rules! common_visitor_and_walkers {
|
|||
visit_visitable!($($mut)? vis, item),
|
||||
AssocItemKind::Fn(func) => {
|
||||
let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), visibility, &$($mut)? *func);
|
||||
try_visit!(vis.visit_fn(kind, span, id))
|
||||
try_visit!(vis.visit_fn(kind, attrs, span, id))
|
||||
}
|
||||
AssocItemKind::Type(alias) =>
|
||||
visit_visitable!($($mut)? vis, alias),
|
||||
|
|
@ -886,6 +890,7 @@ macro_rules! common_visitor_and_walkers {
|
|||
type Ctxt = ();
|
||||
fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
|
||||
&$($lt)? $($mut)? self,
|
||||
attrs: &AttrVec,
|
||||
span: Span,
|
||||
id: NodeId,
|
||||
visibility: &$($lt)? $($mut)? Visibility,
|
||||
|
|
@ -897,7 +902,7 @@ macro_rules! common_visitor_and_walkers {
|
|||
visit_visitable!($($mut)? vis, item),
|
||||
ForeignItemKind::Fn(func) => {
|
||||
let kind = FnKind::Fn(FnCtxt::Foreign, visibility, &$($mut)?*func);
|
||||
try_visit!(vis.visit_fn(kind, span, id))
|
||||
try_visit!(vis.visit_fn(kind, attrs, span, id))
|
||||
}
|
||||
ForeignItemKind::TyAlias(alias) =>
|
||||
visit_visitable!($($mut)? vis, alias),
|
||||
|
|
@ -999,7 +1004,7 @@ macro_rules! common_visitor_and_walkers {
|
|||
}) => {
|
||||
visit_visitable!($($mut)? vis, constness, movability, capture_clause);
|
||||
let kind = FnKind::Closure(binder, coroutine_kind, fn_decl, body);
|
||||
try_visit!(vis.visit_fn(kind, *span, *id));
|
||||
try_visit!(vis.visit_fn(kind, attrs, *span, *id));
|
||||
visit_visitable!($($mut)? vis, fn_decl_span, fn_arg_span);
|
||||
}
|
||||
ExprKind::Block(block, opt_label) =>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue