Skip to content

Commit 01a4165

Browse files
bstriefolkertdev
authored andcommitted
Add naked to the attribute index
1 parent fd1188b commit 01a4165

File tree

2 files changed

+46
-71
lines changed

2 files changed

+46
-71
lines changed

src/attributes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ The following is an index of all built-in attributes.
291291
- Code generation
292292
- [`inline`] --- Hint to inline code.
293293
- [`cold`] --- Hint that a function is unlikely to be called.
294+
- [`naked`] - Prevent the compiler from emitting a function prologue.
294295
- [`no_builtins`] --- Disables use of certain built-in functions.
295296
- [`target_feature`] --- Configure platform-specific code generation.
296297
- [`track_caller`] --- Pass the parent call location to `std::panic::Location::caller()`.
@@ -367,6 +368,7 @@ The following is an index of all built-in attributes.
367368
[`macro_export`]: macros-by-example.md#path-based-scope
368369
[`macro_use`]: macros-by-example.md#the-macro_use-attribute
369370
[`must_use`]: attributes/diagnostics.md#the-must_use-attribute
371+
[`naked`]: attributes/codegen.md#the-naked-attribute
370372
[`no_builtins`]: attributes/codegen.md#the-no_builtins-attribute
371373
[`no_implicit_prelude`]: names/preludes.md#the-no_implicit_prelude-attribute
372374
[`no_link`]: items/extern-crates.md#the-no_link-attribute

src/attributes/codegen.md

Lines changed: 44 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -53,77 +53,49 @@ be called.
5353

5454
## The `naked` attribute
5555

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

128100
## The `no_builtins` attribute
129101

@@ -545,6 +517,7 @@ trait object whose methods are attributed.
545517
[`is_aarch64_feature_detected`]: ../../std/arch/macro.is_aarch64_feature_detected.html
546518
[`naked_asm!`]: ../inline-assembly.md
547519
[`inline`]: #the-inline-attribute
520+
[`track_caller`]: #the-track-caller-attribute
548521
[`target_feature` conditional compilation option]: ../conditional-compilation.md#target_feature
549522
[`unused_variables`]: ../../rustc/lints/listing/warn-by-default.html#unused-variables
550523
[attribute]: ../attributes.md

0 commit comments

Comments
 (0)