llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
27k stars 11.06k forks source link

assembler output customization #17839

Open Trass3r opened 10 years ago

Trass3r commented 10 years ago
Bugzilla Link 17465
Version trunk
OS All
CC @gnzlbg,@jryans,@nico

Extended Description

It would be nice to have if clang supported gcc's -masm=dialect switch so I can get readable asm without a special case for clang to use -mllvm --x86-asm-syntax=intel.

But more importantly I'd love to have a way to generate assembler output with properly embedded source code, especially on Linux. But that would even allow to support the /FAs switch in clang-cl and enable me to seamlessly use my existing VS addin for quick asm inspection with the newly available clang toolkit.

I already tried several different approaches.

But neither of these approaches reaches the readability of /FAs (in combination with AsmHighlighter):

?set@Point@@QEAAXNNN@Z PROC ; Point::set, COMDAT ; 47 : void set(const double X, const double Y, const double Z) { _xyz[0] = X; _xyz[1] = Y; _xyz[2] = Z; }

movsdx    QWORD PTR [rcx], xmm1
movsdx    QWORD PTR [rcx+8], xmm2
movsdx    QWORD PTR [rcx+16], xmm3
ret       0

?set@Point@@QEAAXNNN@Z ENDP ; Point::set

In this case source code is properly injected as assembler comments and there are no line numbers or machine code confusing the syntax highlighter. But the /FA switch also allows you to add these if you need.

nico commented 4 years ago

Cross-ref "[cfe-dev] RFC: Add a way to interleave source code in assembler output" and https://reviews.llvm.org/D30897 / https://reviews.llvm.org/D30898 linked from there (apparently stalled, but maybe a good start).

See also bug 39360.

Trass3r commented 5 years ago

MCAsmStreamer::EmitDwarfLocDirective is a POI for this.

nico commented 7 years ago

fwiw, -masm=intel has been working since 208683 (clang 3.5).

54aefcd4-c07d-4252-8441-723563c8826f commented 8 years ago

+1 I would also like to generate source code annotated with assembly in a particular dialect. This is kind of a must to verify the assembly generated for a particular snippet of code within a large project.

nico commented 10 years ago

Here's a patch for -masm: http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20140505/105299.html

For the other thing, -fno-integrated-as -Xassembler -adhln might do the trick.

nickdesaulniers commented 2 years ago

-fverbose-asm support in clang has come up at least twice so far on LKML (this being most recent).

@efriedma-quic mentions in https://reviews.llvm.org/D30897#inline-268745 that clang should have the source buffer around, but I thought clang was pretty aggressive about discarding the AST from memory ASAP? I think @aeubanks had some changes recently related to -clear-ast-before-backend? https://reviews.llvm.org/D111270 https://lists.llvm.org/pipermail/cfe-dev/2021-September/068930.html

aeubanks commented 2 years ago

I'm not sure if the AST is needed in this case, perhaps just the source buffer is enough? But if you do need the AST, you could skip passing -clear-ast-before-backend if -fverbose-asm.

efriedma-quic commented 2 years ago

You shouldn't need the AST, just the source code. We don't discard the source code; it's usually just mmap'ed anyway.