-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add global_asm! for module-level inline assembly
- Loading branch information
Showing
1 changed file
with
61 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
- Feature Name: global_asm | ||
- Start Date: 2016-03-18 | ||
- RFC PR: (leave this empty) | ||
- Rust Issue: (leave this empty) | ||
|
||
# Summary | ||
[summary]: #summary | ||
|
||
This RFC exposes LLVM's support for [module-level inline assembly](http://llvm.org/docs/LangRef.html#module-level-inline-assembly) by adding a `global_asm!` macro. The syntax is very simple: it just takes a string literal containing the assembly code. | ||
|
||
Example: | ||
```rust | ||
global_asm!(r#" | ||
.globl my_asm_func | ||
my_asm_func: | ||
ret | ||
"#); | ||
|
||
extern { | ||
fn my_asm_func(); | ||
} | ||
``` | ||
|
||
# Motivation | ||
[motivation]: #motivation | ||
|
||
There are two main use cases for this feature. The first is that it allows functions to be written completely in assembly, which mostly eliminates the need for a `naked` attribute. This is mainly useful for function that use a custom calling convention, such as interrupt handlers. | ||
|
||
Another important use case is that it allows external assembly files to be used in a Rust module without needing hacks in the build system: | ||
|
||
```rust | ||
global_asm!(include_str!("my_asm_file.s")); | ||
``` | ||
|
||
Assembly files can also be preprocessed or generated by `build.rs` (for example using the C preprocessor), which will produce output files in the Cargo output directory: | ||
|
||
```rust | ||
global_asm!(include_str!(concat!(env!("OUT_DIR"), "/preprocessed_asm.s"))); | ||
``` | ||
|
||
# Detailed design | ||
[design]: #detailed-design | ||
|
||
See description above, not much to add. The macro will map directly to LLVM's `module asm`. | ||
|
||
# Drawbacks | ||
[drawbacks]: #drawbacks | ||
|
||
Like `asm!`, this feature depends on LLVM's integrated assembler. | ||
|
||
# Alternatives | ||
[alternatives]: #alternatives | ||
|
||
The current way of including external assembly is to compile the assembly files using gcc in `build.rs` and link them into the Rust program as a static library. | ||
|
||
An alternative for functions written entirely in assembly is to add a [`#[naked]` function attribute](https://github.com/rust-lang/rfcs/pull/1201). | ||
|
||
# Unresolved questions | ||
[unresolved]: #unresolved-questions | ||
|
||
None |