@@ -49,10 +49,84 @@ r[attributes.codegen.cold]
49
49
The * ` cold ` [ attribute] * suggests that the attributed function is unlikely to
50
50
be called.
51
51
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
+
52
127
r[ attributes.codegen.no_builtins]
53
128
## The ` no_builtins ` attribute
54
129
55
-
56
130
The * ` no_builtins ` [ attribute] * may be applied at the crate level to disable
57
131
optimizing certain code patterns to invocations of library functions that are
58
132
assumed to exist.
@@ -463,14 +537,24 @@ trait object whose methods are attributed.
463
537
[ `-C target-feature` ] : ../../rustc/codegen-options/index.html#target-feature
464
538
[ `is_x86_feature_detected` ] : ../../std/arch/macro.is_x86_feature_detected.html
465
539
[ `is_aarch64_feature_detected` ] : ../../std/arch/macro.is_aarch64_feature_detected.html
540
+ [ `naked_asm!` ] : ../inline-assembly.md
541
+ [ `inline` ] : #the-inline-attribute
466
542
[ `target_feature` conditional compilation option ] : ../conditional-compilation.md#target_feature
543
+ [ `unused_variables` ] : ../../rustc/lints/listing/warn-by-default.html#unused-variables
467
544
[ attribute ] : ../attributes.md
468
545
[ 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
469
549
[ 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
470
553
[ target architecture ] : ../conditional-compilation.md#target_arch
471
554
[ trait ] : ../items/traits.md
472
555
[ undefined behavior ] : ../behavior-considered-undefined.md
473
- [ unsafe function ] : ../unsafe-keyword.md
556
+ [ unsafe block ] : ../unsafe-blocks.md
557
+ [ unsafe function ] : ../unsafe-functions.md
474
558
[ rust-abi ] : ../items/external-blocks.md#abi
475
559
[ `Location` ] : core::panic::Location
476
560
0 commit comments