Skip to content

Commit 1375337

Browse files
bstriefolkertdev
authored andcommitted
Add documentation for the naked function attribute
1 parent 7982061 commit 1375337

File tree

1 file changed

+86
-2
lines changed

1 file changed

+86
-2
lines changed

src/attributes/codegen.md

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,84 @@ r[attributes.codegen.cold]
4949
The *`cold` [attribute]* suggests that the attributed function is unlikely to
5050
be called.
5151

52+
r[attributes.codegen.naked]
53+
## The `naked` attribute
54+
55+
The *`naked` [attribute]* may be applied to a function in order to prevent the compiler
56+
from emitting a function prologue.
57+
58+
### Requirements
59+
60+
Any function marked with the `naked` attribute must meet the following requirements;
61+
failure to do so will result in a compiler error.
62+
63+
* The [function body] must consist of exactly one [`asm!`] macro invocation,
64+
which may be enclosed within an [unsafe block].
65+
* This `asm!` invocation must not contain any [operands]
66+
except for `const` and `sym` operands.
67+
* This `asm!` invocation must specify the `noreturn` [option],
68+
and must not specify any other options except for `att_syntax`.
69+
* The function must not be marked with the [`inline`] attribute.
70+
71+
### Recommendations
72+
73+
Any function marked with the `naked` attribute should adhere to the following recommendations;
74+
failure to do so will result in a compiler warning.
75+
76+
* The function should feature an [extern function qualifier] that is not `extern "Rust"`.
77+
* All arguments and return types of the function should be [FFI-safe].
78+
79+
### Effects
80+
81+
Marking a function with the `naked` attribute has the following effects:
82+
83+
* The compiler will not generate a prologue for this function.
84+
Within the function, all registers will remain precisely as they were set up
85+
by its caller.
86+
* The compiler will suppress the [`unused_variables`] lint for this function.
87+
88+
### Notes
89+
90+
* The [rules for inline assembly] ordinarily consider it undefined behavior to
91+
refer to registers not specified as input operands, or to modify
92+
registers not specified as output operands.
93+
The reason for this is because ordinarily an `asm!` invocation cannot guarantee
94+
the state of the registers surrounding the assembly block.
95+
However, in naked functions the state of the registers is guaranteed
96+
by adherence to the specified calling convention.
97+
Therefore, it is not undefined behavior for the `asm!` invocation in a naked function
98+
to refer to registers without specifying them as operands.
99+
* A naked function that makes use of registers in a way that does not conform
100+
to the specified calling convention imposes additional safety invariants on its caller,
101+
and therefore must be marked as an [unsafe function].
102+
* Implementations may assume that naked functions never unwind.
103+
Unwinding through a naked function is undefined behavior.
104+
* The semantics of naked functions require implementations to set up the call stack
105+
according to the specified calling convention before executing a naked function,
106+
even in contexts where setting up the call stack would ordinarily be unnecessary,
107+
such as when the function is inlined.
108+
An implementation can fulfill this requirement by guaranteeing that naked functions
109+
are never inlined.
110+
However, implementations are not currently required to guarantee that naked functions
111+
are never inlined.
112+
In the future it may become a requirement for implementations to guarantee that
113+
naked functions are never inlined;
114+
users must not rely on any observable behavior that may result from inlining.
115+
* Although implementations are prohibited from generating code for a naked function that
116+
contains any instructions that precede the naked function's `asm!` block,
117+
under some circumstances, implementations may generate code that contains instructions
118+
*after* a naked function's `asm!` block.
119+
In the future it may become a requirement for implementations to guarantee
120+
the absence of any instructions following a naked function's `asm!` block;
121+
users must not rely on the presence of any trailing instructions.
122+
If a user of the `naked` attribute relies on the absence of trailing instructions
123+
for correctness, for the time being it is the user's responsibility to ensure that
124+
the instructions truly are absent,
125+
for example by passing any necessary code generation flags to the compiler.
126+
52127
r[attributes.codegen.no_builtins]
53128
## The `no_builtins` attribute
54129

55-
56130
The *`no_builtins` [attribute]* may be applied at the crate level to disable
57131
optimizing certain code patterns to invocations of library functions that are
58132
assumed to exist.
@@ -463,14 +537,24 @@ trait object whose methods are attributed.
463537
[`-C target-feature`]: ../../rustc/codegen-options/index.html#target-feature
464538
[`is_x86_feature_detected`]: ../../std/arch/macro.is_x86_feature_detected.html
465539
[`is_aarch64_feature_detected`]: ../../std/arch/macro.is_aarch64_feature_detected.html
540+
[`naked_asm!`]: ../inline-assembly.md
541+
[`inline`]: #the-inline-attribute
466542
[`target_feature` conditional compilation option]: ../conditional-compilation.md#target_feature
543+
[`unused_variables`]: ../../rustc/lints/listing/warn-by-default.html#unused-variables
467544
[attribute]: ../attributes.md
468545
[attributes]: ../attributes.md
546+
[extern function qualifier]: ../items/functions.md#extern-function-qualifier
547+
[FFI-safe]: ../../rustc/lints/listing/warn-by-default.html#improper-ctypes-definitions
548+
[function body]: ../items/functions.md#function-body
469549
[functions]: ../items/functions.md
550+
[operands]: ../inline-assembly.md#operand-type
551+
[option]: ../inline-assembly.md#options
552+
[rules for inline assembly]: ../inline-assembly.md#rules-for-inline-assembly
470553
[target architecture]: ../conditional-compilation.md#target_arch
471554
[trait]: ../items/traits.md
472555
[undefined behavior]: ../behavior-considered-undefined.md
473-
[unsafe function]: ../unsafe-keyword.md
556+
[unsafe block]: ../unsafe-blocks.md
557+
[unsafe function]: ../unsafe-functions.md
474558
[rust-abi]: ../items/external-blocks.md#abi
475559
[`Location`]: core::panic::Location
476560

0 commit comments

Comments
 (0)