Rollup merge of #126803 - tgross35:verbose-asm, r=Amanieu
Change `asm-comments` to `verbose-asm`, always emit user comments Implements what is described in https://github.com/rust-lang/compiler-team/issues/762 Tracking issue: https://github.com/rust-lang/rust/issues/126802
This commit is contained in:
commit
c74d620635
8 changed files with 94 additions and 11 deletions
|
@ -32,7 +32,7 @@ impl OwnedTargetMachine {
|
||||||
unique_section_names: bool,
|
unique_section_names: bool,
|
||||||
trap_unreachable: bool,
|
trap_unreachable: bool,
|
||||||
singletree: bool,
|
singletree: bool,
|
||||||
asm_comments: bool,
|
verbose_asm: bool,
|
||||||
emit_stack_size_section: bool,
|
emit_stack_size_section: bool,
|
||||||
relax_elf_relocations: bool,
|
relax_elf_relocations: bool,
|
||||||
use_init_array: bool,
|
use_init_array: bool,
|
||||||
|
@ -64,7 +64,7 @@ impl OwnedTargetMachine {
|
||||||
unique_section_names,
|
unique_section_names,
|
||||||
trap_unreachable,
|
trap_unreachable,
|
||||||
singletree,
|
singletree,
|
||||||
asm_comments,
|
verbose_asm,
|
||||||
emit_stack_size_section,
|
emit_stack_size_section,
|
||||||
relax_elf_relocations,
|
relax_elf_relocations,
|
||||||
use_init_array,
|
use_init_array,
|
||||||
|
|
|
@ -214,7 +214,7 @@ pub fn target_machine_factory(
|
||||||
sess.opts.unstable_opts.trap_unreachable.unwrap_or(sess.target.trap_unreachable);
|
sess.opts.unstable_opts.trap_unreachable.unwrap_or(sess.target.trap_unreachable);
|
||||||
let emit_stack_size_section = sess.opts.unstable_opts.emit_stack_sizes;
|
let emit_stack_size_section = sess.opts.unstable_opts.emit_stack_sizes;
|
||||||
|
|
||||||
let asm_comments = sess.opts.unstable_opts.asm_comments;
|
let verbose_asm = sess.opts.unstable_opts.verbose_asm;
|
||||||
let relax_elf_relocations =
|
let relax_elf_relocations =
|
||||||
sess.opts.unstable_opts.relax_elf_relocations.unwrap_or(sess.target.relax_elf_relocations);
|
sess.opts.unstable_opts.relax_elf_relocations.unwrap_or(sess.target.relax_elf_relocations);
|
||||||
|
|
||||||
|
@ -289,7 +289,7 @@ pub fn target_machine_factory(
|
||||||
funique_section_names,
|
funique_section_names,
|
||||||
trap_unreachable,
|
trap_unreachable,
|
||||||
singlethread,
|
singlethread,
|
||||||
asm_comments,
|
verbose_asm,
|
||||||
emit_stack_size_section,
|
emit_stack_size_section,
|
||||||
relax_elf_relocations,
|
relax_elf_relocations,
|
||||||
use_init_array,
|
use_init_array,
|
||||||
|
|
|
@ -2185,7 +2185,7 @@ extern "C" {
|
||||||
UniqueSectionNames: bool,
|
UniqueSectionNames: bool,
|
||||||
TrapUnreachable: bool,
|
TrapUnreachable: bool,
|
||||||
Singlethread: bool,
|
Singlethread: bool,
|
||||||
AsmComments: bool,
|
VerboseAsm: bool,
|
||||||
EmitStackSizeSection: bool,
|
EmitStackSizeSection: bool,
|
||||||
RelaxELFRelocations: bool,
|
RelaxELFRelocations: bool,
|
||||||
UseInitArray: bool,
|
UseInitArray: bool,
|
||||||
|
|
|
@ -757,7 +757,6 @@ fn test_unstable_options_tracking_hash() {
|
||||||
// tidy-alphabetical-start
|
// tidy-alphabetical-start
|
||||||
tracked!(allow_features, Some(vec![String::from("lang_items")]));
|
tracked!(allow_features, Some(vec![String::from("lang_items")]));
|
||||||
tracked!(always_encode_mir, true);
|
tracked!(always_encode_mir, true);
|
||||||
tracked!(asm_comments, true);
|
|
||||||
tracked!(assume_incomplete_release, true);
|
tracked!(assume_incomplete_release, true);
|
||||||
tracked!(binary_dep_depinfo, true);
|
tracked!(binary_dep_depinfo, true);
|
||||||
tracked!(box_noalias, false);
|
tracked!(box_noalias, false);
|
||||||
|
@ -862,6 +861,7 @@ fn test_unstable_options_tracking_hash() {
|
||||||
tracked!(uninit_const_chunk_threshold, 123);
|
tracked!(uninit_const_chunk_threshold, 123);
|
||||||
tracked!(unleash_the_miri_inside_of_you, true);
|
tracked!(unleash_the_miri_inside_of_you, true);
|
||||||
tracked!(use_ctors_section, Some(true));
|
tracked!(use_ctors_section, Some(true));
|
||||||
|
tracked!(verbose_asm, true);
|
||||||
tracked!(verify_llvm_ir, true);
|
tracked!(verify_llvm_ir, true);
|
||||||
tracked!(virtual_function_elimination, true);
|
tracked!(virtual_function_elimination, true);
|
||||||
tracked!(wasi_exec_model, Some(WasiExecModel::Reactor));
|
tracked!(wasi_exec_model, Some(WasiExecModel::Reactor));
|
||||||
|
|
|
@ -407,7 +407,7 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
|
||||||
const char *ABIStr, LLVMRustCodeModel RustCM, LLVMRustRelocModel RustReloc,
|
const char *ABIStr, LLVMRustCodeModel RustCM, LLVMRustRelocModel RustReloc,
|
||||||
LLVMRustCodeGenOptLevel RustOptLevel, bool UseSoftFloat,
|
LLVMRustCodeGenOptLevel RustOptLevel, bool UseSoftFloat,
|
||||||
bool FunctionSections, bool DataSections, bool UniqueSectionNames,
|
bool FunctionSections, bool DataSections, bool UniqueSectionNames,
|
||||||
bool TrapUnreachable, bool Singlethread, bool AsmComments,
|
bool TrapUnreachable, bool Singlethread, bool VerboseAsm,
|
||||||
bool EmitStackSizeSection, bool RelaxELFRelocations, bool UseInitArray,
|
bool EmitStackSizeSection, bool RelaxELFRelocations, bool UseInitArray,
|
||||||
const char *SplitDwarfFile, const char *OutputObjFile,
|
const char *SplitDwarfFile, const char *OutputObjFile,
|
||||||
const char *DebugInfoCompression, bool UseEmulatedTls,
|
const char *DebugInfoCompression, bool UseEmulatedTls,
|
||||||
|
@ -435,8 +435,9 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
|
||||||
Options.DataSections = DataSections;
|
Options.DataSections = DataSections;
|
||||||
Options.FunctionSections = FunctionSections;
|
Options.FunctionSections = FunctionSections;
|
||||||
Options.UniqueSectionNames = UniqueSectionNames;
|
Options.UniqueSectionNames = UniqueSectionNames;
|
||||||
Options.MCOptions.AsmVerbose = AsmComments;
|
Options.MCOptions.AsmVerbose = VerboseAsm;
|
||||||
Options.MCOptions.PreserveAsmComments = AsmComments;
|
// Always preserve comments that were written by the user
|
||||||
|
Options.MCOptions.PreserveAsmComments = true;
|
||||||
Options.MCOptions.ABIName = ABIStr;
|
Options.MCOptions.ABIName = ABIStr;
|
||||||
if (SplitDwarfFile) {
|
if (SplitDwarfFile) {
|
||||||
Options.MCOptions.SplitDwarfFile = SplitDwarfFile;
|
Options.MCOptions.SplitDwarfFile = SplitDwarfFile;
|
||||||
|
|
|
@ -1630,8 +1630,6 @@ options! {
|
||||||
"only allow the listed language features to be enabled in code (comma separated)"),
|
"only allow the listed language features to be enabled in code (comma separated)"),
|
||||||
always_encode_mir: bool = (false, parse_bool, [TRACKED],
|
always_encode_mir: bool = (false, parse_bool, [TRACKED],
|
||||||
"encode MIR of all functions into the crate metadata (default: no)"),
|
"encode MIR of all functions into the crate metadata (default: no)"),
|
||||||
asm_comments: bool = (false, parse_bool, [TRACKED],
|
|
||||||
"generate comments into the assembly (may change behavior) (default: no)"),
|
|
||||||
assert_incr_state: Option<String> = (None, parse_opt_string, [UNTRACKED],
|
assert_incr_state: Option<String> = (None, parse_opt_string, [UNTRACKED],
|
||||||
"assert that the incremental cache is in given state: \
|
"assert that the incremental cache is in given state: \
|
||||||
either `loaded` or `not-loaded`."),
|
either `loaded` or `not-loaded`."),
|
||||||
|
@ -2107,6 +2105,8 @@ written to standard error output)"),
|
||||||
"Generate sync unwind tables instead of async unwind tables (default: no)"),
|
"Generate sync unwind tables instead of async unwind tables (default: no)"),
|
||||||
validate_mir: bool = (false, parse_bool, [UNTRACKED],
|
validate_mir: bool = (false, parse_bool, [UNTRACKED],
|
||||||
"validate MIR after each transformation"),
|
"validate MIR after each transformation"),
|
||||||
|
verbose_asm: bool = (false, parse_bool, [TRACKED],
|
||||||
|
"add descriptive comments from LLVM to the assembly (may change behavior) (default: no)"),
|
||||||
#[rustc_lint_opt_deny_field_access("use `Session::verbose_internals` instead of this field")]
|
#[rustc_lint_opt_deny_field_access("use `Session::verbose_internals` instead of this field")]
|
||||||
verbose_internals: bool = (false, parse_bool, [TRACKED_NO_CRATE_HASH],
|
verbose_internals: bool = (false, parse_bool, [TRACKED_NO_CRATE_HASH],
|
||||||
"in general, enable more debug printouts (default: no)"),
|
"in general, enable more debug printouts (default: no)"),
|
||||||
|
|
70
src/doc/unstable-book/src/compiler-flags/verbose-asm.md
Normal file
70
src/doc/unstable-book/src/compiler-flags/verbose-asm.md
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
# `verbose-asm`
|
||||||
|
|
||||||
|
The tracking issue for this feature is: [#126802](https://github.com/rust-lang/rust/issues/126802).
|
||||||
|
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
This enables passing `-Zverbose-asm` to get contextual comments added by LLVM.
|
||||||
|
|
||||||
|
Sample code:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn foo(a: i32, b: i32) -> i32 {
|
||||||
|
a + b
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Default output:
|
||||||
|
|
||||||
|
```asm
|
||||||
|
foo:
|
||||||
|
push rax
|
||||||
|
add edi, esi
|
||||||
|
mov dword ptr [rsp + 4], edi
|
||||||
|
seto al
|
||||||
|
jo .LBB0_2
|
||||||
|
mov eax, dword ptr [rsp + 4]
|
||||||
|
pop rcx
|
||||||
|
ret
|
||||||
|
.LBB0_2:
|
||||||
|
lea rdi, [rip + .L__unnamed_1]
|
||||||
|
mov rax, qword ptr [rip + core::panicking::panic_const::panic_const_add_overflow::h9c85248fe0d735b2@GOTPCREL]
|
||||||
|
call rax
|
||||||
|
|
||||||
|
.L__unnamed_2:
|
||||||
|
.ascii "/app/example.rs"
|
||||||
|
|
||||||
|
.L__unnamed_1:
|
||||||
|
.quad .L__unnamed_2
|
||||||
|
.asciz "\017\000\000\000\000\000\000\000\004\000\000\000\005\000\000"
|
||||||
|
```
|
||||||
|
|
||||||
|
With `-Zverbose-asm`:
|
||||||
|
|
||||||
|
```asm
|
||||||
|
foo: # @foo
|
||||||
|
# %bb.0:
|
||||||
|
push rax
|
||||||
|
add edi, esi
|
||||||
|
mov dword ptr [rsp + 4], edi # 4-byte Spill
|
||||||
|
seto al
|
||||||
|
jo .LBB0_2
|
||||||
|
# %bb.1:
|
||||||
|
mov eax, dword ptr [rsp + 4] # 4-byte Reload
|
||||||
|
pop rcx
|
||||||
|
ret
|
||||||
|
.LBB0_2:
|
||||||
|
lea rdi, [rip + .L__unnamed_1]
|
||||||
|
mov rax, qword ptr [rip + core::panicking::panic_const::panic_const_add_overflow::h9c85248fe0d735b2@GOTPCREL]
|
||||||
|
call rax
|
||||||
|
# -- End function
|
||||||
|
.L__unnamed_2:
|
||||||
|
.ascii "/app/example.rs"
|
||||||
|
|
||||||
|
.L__unnamed_1:
|
||||||
|
.quad .L__unnamed_2
|
||||||
|
.asciz "\017\000\000\000\000\000\000\000\004\000\000\000\005\000\000"
|
||||||
|
|
||||||
|
# DW_AT_external
|
||||||
|
```
|
12
tests/assembly/asm-comments.rs
Normal file
12
tests/assembly/asm-comments.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
//@ assembly-output: emit-asm
|
||||||
|
//@ only-x86_64
|
||||||
|
// Check that comments in assembly get passed
|
||||||
|
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
// CHECK-LABEL: test_comments:
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn test_comments() {
|
||||||
|
// CHECK: example comment
|
||||||
|
unsafe { core::arch::asm!("nop // example comment") };
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue