Skip to content

Commit 9991aab

Browse files
authored
Merge pull request #1904 from ehuss/no_mangle
Update `no_mangle` to use the attribute template
2 parents 2ed1cb8 + af7ff70 commit 9991aab

1 file changed

Lines changed: 49 additions & 9 deletions

File tree

src/abi.md

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,23 +65,62 @@ r[abi.no_mangle]
6565
## The `no_mangle` attribute
6666
6767
r[abi.no_mangle.intro]
68-
The *`no_mangle` attribute* may be used on any [item] to disable standard symbol name mangling. The symbol for the item will be the identifier of the item's name.
68+
The *`no_mangle` attribute* may be used on functions and statics to disable standard symbol name mangling. The symbol for the item will be the identifier of the item's name.
6969
70-
r[abi.no_mangle.publicly-exported]
71-
Additionally, the item will be publicly exported from the produced library or object file, similar to the [`used` attribute](#the-used-attribute).
70+
> [!EXAMPLE]
71+
> ```rust
72+
> #[unsafe(no_mangle)]
73+
> extern "C" fn foo() {}
74+
> ```
7275
73-
r[abi.no_mangle.unsafe]
74-
This attribute is unsafe as an unmangled symbol may collide with another symbol with the same name (or with a well-known symbol), leading to undefined behavior.
76+
r[abi.no_mangle.syntax]
77+
The `no_mangle` attribute uses the [MetaWord] syntax and thus does not take any inputs.
7578
76-
```rust
77-
#[unsafe(no_mangle)]
78-
extern "C" fn foo() {}
79-
```
79+
r[abi.no_mangle.allowed-positions]
80+
The `no_mangle` attribute may only be applied to:
81+
82+
- [Static items][items.static]
83+
- [Free functions][items.fn]
84+
- [Inherent associated functions][items.associated.fn]
85+
- [Trait impl functions][items.impl.trait]
86+
87+
> [!NOTE]
88+
> `rustc` currently warns in other positions, but this may be rejected in the future.
89+
90+
<!-- TODO: Currently it works on a trait function with a body, but generates a warning about being phased out. how do we document that?
91+
https://github.com/rust-lang/rust/pull/86492#issuecomment-885682960
92+
-->
93+
94+
<!-- TODO: should this clarify that external block items are already unmangled?, and thus the attribute does nothing? Currently it is "phased out" warning. -->
95+
96+
r[abi.no_mangle.closures]
97+
`no_mangle` may not be used with a [closure].
98+
99+
r[abi.no_mangle.generics]
100+
`no_mangle` may not be used on an item with generic parameters.
101+
102+
r[abi.no_mangle.duplicates]
103+
Only the first instance of `no_mangle` on an item is honored. Subsequent `no_mangle` attributes are ignored.
104+
105+
> [!NOTE]
106+
> `rustc` currently warns on subsequent duplicate `no_mangle` attributes.
107+
108+
r[abi.no_mangle.export_name]
109+
If `no_mangle` is used with [`export_name`][abi.export_name], then the `export_name` is used instead.
110+
111+
r[abi.no_mangle.unsafe]
112+
The `no_mangle` attribute must be marked with [`unsafe`][attributes.safety] because an unmangled symbol may collide with another symbol with the same name (or with a well-known symbol), leading to undefined behavior.
80113
81114
r[abi.no_mangle.edition2024]
82115
> [!EDITION-2024]
83116
> Before the 2024 edition it is allowed to use the `no_mangle` attribute without the `unsafe` qualification.
84117
118+
r[abi.no_mangle.publicly-exported]
119+
In addition to disabling name mangling, the item will be publicly exported from the produced library or object file, similar to the [`used` attribute](#the-used-attribute).
120+
121+
r[abi.no_mangle.ascii-only]
122+
`no_mangle` may only be used on items with a name that only contains ASCII characters.
123+
85124
r[abi.link_section]
86125
## The `link_section` attribute
87126
@@ -141,6 +180,7 @@ r[abi.export_name.edition2024]
141180
> Before the 2024 edition it is allowed to use the `export_name` attribute without the `unsafe` qualification.
142181
143182
[attribute]: attributes.md
183+
[closure]: expr.closure
144184
[extern functions]: items/functions.md#extern-function-qualifier
145185
[external blocks]: items/external-blocks.md
146186
[function]: items/functions.md

0 commit comments

Comments
 (0)