Open Trass3r opened 10 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.
MCAsmStreamer::EmitDwarfLocDirective is a POI for this.
fwiw, -masm=intel has been working since 208683 (clang 3.5).
+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.
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.
-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
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
.
You shouldn't need the AST, just the source code. We don't discard the source code; it's usually just mmap'ed anyway.
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; }
?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.