-
Notifications
You must be signed in to change notification settings - Fork 14.4k
draft: inline asm mode #146215
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
androm3da
wants to merge
4
commits into
llvm:main
Choose a base branch
from
androm3da:bcain/inline_asm_mode
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
draft: inline asm mode #146215
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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,154 @@ | ||
# Inline Assembly Safety Directive | ||
|
||
## Overview | ||
|
||
The `.inline_asm_mode` directive provides enhanced safety for inline assembly blocks by warning about potentially unsafe label usage. This directive helps prevent common errors where programmers create non-numeric labels in inline assembly that could be inadvertently jumped to from external code. | ||
|
||
## Syntax | ||
|
||
```assembly | ||
.inline_asm_mode strict # Enable strict mode - warn on non-numeric labels | ||
.inline_asm_mode relaxed # Disable strict mode (default) | ||
``` | ||
|
||
## Description | ||
|
||
When `.inline_asm_mode strict` is active, the assembler will emit warnings for labels that are considered potentially unsafe for inline assembly: | ||
|
||
- **Safe labels** (no warnings): | ||
- Numeric labels (e.g., `1:`, `42:`, `999:`) | ||
|
||
- **Unsafe labels** (warnings emitted): | ||
- All non-numeric labels including: | ||
- Global labels (e.g., `my_function:`, `loop:`) | ||
- Local labels (e.g., `.L_loop`, `.L_end`) | ||
- Special prefixed labels (e.g., `$symbol`, `__symbol`) | ||
- Any label that doesn't start with a digit | ||
|
||
## Use Cases | ||
|
||
### Frontend Integration | ||
|
||
Compiler frontends can use this directive when generating inline assembly: | ||
|
||
```c++ | ||
// Emitted by the compiler: .inline_asm_mode strict | ||
// C++ inline assembly example | ||
asm( | ||
"1:\n" // Safe - numeric label | ||
" add %0, %1\n" | ||
" jne 1b\n" // Safe - numeric jump | ||
"exit:\n" // Warning - non-numeric label | ||
: "=r"(result) : "r"(input)); | ||
``` | ||
// Emitted by the compiler: .inline_asm_mode relaxed | ||
|
||
### Assembly Development | ||
|
||
Assembly programmers can use this directive for safer inline assembly blocks: | ||
|
||
```assembly | ||
.inline_asm_mode strict | ||
|
||
# Safe labels - no warnings (numeric only) | ||
1: # Loop start | ||
inc %eax | ||
dec %ebx | ||
jnz 1b # Jump back to label 1 | ||
|
||
2: # Alternative path | ||
nop | ||
jmp 3f # Jump forward to label 3 | ||
|
||
3: # End label | ||
ret | ||
|
||
# Unsafe labels - will generate warnings | ||
# unsafe_global: # Warning: non-numeric label | ||
# .L_local: # Warning: non-numeric label | ||
# $special: # Warning: non-numeric label | ||
|
||
.inline_asm_mode relaxed | ||
``` | ||
|
||
## Rationale | ||
|
||
Inline assembly blocks are often embedded within larger functions or modules. Non-numeric labels in these blocks can create several problems: | ||
|
||
1. **Naming conflicts**: Named labels may conflict with other symbols in the compilation unit | ||
2. **Unintended control flow**: External code might accidentally jump to named labels intended for internal use | ||
3. **Maintenance issues**: Named labels make inline assembly less self-contained | ||
4. **Assembly convention**: Numeric labels are the standard convention for temporary, local labels in assembly | ||
|
||
The strict mode helps identify these potential issues during compilation, encouraging developers to use safer numeric labels instead. | ||
|
||
## Error Handling | ||
|
||
Invalid directive usage will produce parse errors: | ||
|
||
```assembly | ||
.inline_asm_mode invalid_mode | ||
# Error: expected 'strict' or 'relaxed' | ||
|
||
.inline_asm_mode | ||
# Error: expected 'strict' or 'relaxed' after '.inline_asm_mode' | ||
``` | ||
|
||
## Implementation Details | ||
|
||
- The directive affects only subsequent label definitions until changed | ||
- Default mode is `relaxed` (no additional warnings) | ||
- The directive state is maintained in the MC streamer | ||
- Warnings are emitted through the standard LLVM diagnostic system | ||
|
||
## Examples | ||
|
||
### Complete Example | ||
|
||
```assembly | ||
.text | ||
.globl example_function | ||
example_function: | ||
# Regular function labels (outside inline asm) - no warnings | ||
|
||
# Simulate inline assembly block with safety | ||
.inline_asm_mode strict | ||
|
||
# Only numeric labels are safe | ||
1: # Safe - numeric label | ||
mov $1, %eax | ||
test %eax, %eax | ||
jz 2f | ||
|
||
3: # Safe - numeric label | ||
inc %eax | ||
cmp $10, %eax | ||
jl 3b | ||
|
||
2: # Safe - numeric label | ||
# End of safe inline block | ||
|
||
# These would generate warnings | ||
# .L_inline_start: # Warning - non-numeric | ||
# global_inline_label: # Warning - non-numeric | ||
|
||
.inline_asm_mode relaxed | ||
|
||
# Back to normal mode | ||
ret | ||
``` | ||
|
||
## Integration with Build Systems | ||
|
||
Build systems can use standard LLVM warning controls to manage these diagnostics: | ||
|
||
```bash | ||
# Treat inline assembly warnings as errors | ||
llvm-mc -Werror=inline-asm-unsafe-label input.s | ||
|
||
# Suppress inline assembly warnings | ||
llvm-mc -Wno-inline-asm-unsafe-label input.s | ||
``` | ||
|
||
Note: The specific warning flag names are implementation-dependent and may vary. | ||
|
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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,27 @@ | ||
# RUN: llvm-mc -triple x86_64-unknown-unknown %s 2>&1 | FileCheck %s | ||
|
||
# Test basic .inline_asm_mode directive functionality | ||
|
||
.text | ||
|
||
# Test that the directive is parsed correctly | ||
.inline_asm_mode strict | ||
.inline_asm_mode relaxed | ||
|
||
# Test strict mode warnings | ||
.inline_asm_mode strict | ||
|
||
# This should produce a warning (non-numeric label) | ||
# CHECK: warning: non-numeric label 'unsafe_global' in inline assembly strict mode may be unsafe for external jumps; consider using numeric labels (1:, 2:, etc.) instead | ||
unsafe_global: | ||
nop | ||
|
||
# This should also warn | ||
# CHECK: warning: non-numeric label '.L_unsafe_local' in inline assembly strict mode may be unsafe for external jumps; consider using numeric labels (1:, 2:, etc.) instead | ||
.L_unsafe_local: | ||
nop | ||
|
||
# No warning | ||
1: | ||
nop | ||
|
This file contains hidden or 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,54 @@ | ||
# RUN: llvm-mc -triple x86_64-unknown-unknown %s 2>&1 | FileCheck %s | ||
|
||
# Test the .inline_asm_mode directive for safer inline assembly label handling | ||
|
||
.text | ||
|
||
# Test relaxed mode (default) - no warnings | ||
.inline_asm_mode relaxed | ||
|
||
# These labels should not produce warnings in relaxed mode | ||
my_label: | ||
nop | ||
global_symbol: | ||
nop | ||
.L_local_label: | ||
nop | ||
|
||
|
||
# Test strict mode - should warn about non-numeric labels | ||
.inline_asm_mode strict | ||
|
||
# Only numeric labels are safe - should not warn | ||
1: | ||
nop | ||
42: | ||
nop | ||
999: | ||
nop | ||
|
||
# All other labels should warn | ||
# CHECK: :[[@LINE+1]]:1: warning: non-numeric label '.L_local1' in inline assembly strict mode may be unsafe for external jumps; consider using numeric labels (1:, 2:, etc.) instead | ||
.L_local1: | ||
nop | ||
|
||
# CHECK: :[[@LINE+1]]:1: warning: non-numeric label '.L_local_with_numbers_123' in inline assembly strict mode may be unsafe for external jumps; consider using numeric labels (1:, 2:, etc.) instead | ||
.L_local_with_numbers_123: | ||
nop | ||
|
||
# CHECK: :[[@LINE+1]]:1: warning: non-numeric label 'unsafe_label' in inline assembly strict mode may be unsafe for external jumps; consider using numeric labels (1:, 2:, etc.) instead | ||
unsafe_label: | ||
nop | ||
|
||
# CHECK: :[[@LINE+1]]:1: warning: non-numeric label 'another_global' in inline assembly strict mode may be unsafe for external jumps; consider using numeric labels (1:, 2:, etc.) instead | ||
another_global: | ||
nop | ||
|
||
# Switch back to relaxed mode | ||
.inline_asm_mode relaxed | ||
|
||
# This should not warn again | ||
yet_another_label: | ||
nop | ||
|
||
|
This file contains hidden or 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,13 @@ | ||
# RUN: not llvm-mc -triple x86_64-unknown-unknown %s 2>&1 | FileCheck %s | ||
|
||
# Test error handling for .inline_asm_mode directive | ||
|
||
.text | ||
|
||
# Test invalid mode | ||
.inline_asm_mode invalid | ||
# CHECK: error: expected 'strict' or 'relaxed' | ||
|
||
# Test missing mode | ||
.inline_asm_mode | ||
# CHECK: error: expected 'strict' or 'relaxed' after '.inline_asm_mode' |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm especially willing to consider a better name for this directive.