[cfe-dev] Getting clang to give dwarf info for macro expansions?

David Blaikie dblaikie at gmail.com
Mon Nov 10 15:35:32 PST 2014


DWARF doesn't really have a way to describe multiple source locations for a
single instruction, so far as I know.

I imagine we could add something like DW_TAG_inlined_subroutine (though it
wouldn't be quite as simple, since they're not necessarily strictly
nested), and/or the new two-level line tables that're being proposed/worked
on.

DWARF does have a macro section, but I believe this is just to describe the
original macro templates (so you can use them in debugger expressions, etc)
not to provide source fidelity for macro uses.

- David

On Sun, Nov 9, 2014 at 1:53 PM, Christian Convey <christian.convey at gmail.com
> wrote:

> Does anyone know if/how I can get clang to generate dwarf information
> that lets me trace / debug *into* macro-generated code?
>
> It seems that when a C program invokes a macro, all of the source code
> produced by that macro invocation is attributed to the line at which
> the macro is called.  I've seen this in both dwarfdump and gdb, as
> described below.  (The exception seems to be when a macro expansion
> causes the definition of a new function.  That new function shows up
> in the dwarf info as one might hope.)
>
> What I'd ideally like is for tracing tools to clearly describe which
> branches within macro-generated code were taken.  When all of the
> source code generated by a macro invocation is attributed to the macro
> *call* site by the dwarf information, that level of precision seems
> impossible.
>
> For example, suppose I have this code:
> >>>> foo.c
> #define FOO \
>    if (x == 3) { \
>    return 1; \
>    }
>
> int bar(int x) {
>    FOO
>    return 0;
> }
> <<<<<
>
> And I compile it with this command:
> clang -c -g -Xclang -dwarf-column-info foo.c
>
> And I look at the dwarf information using the command:
> objdump -dgls foo.o
>
> I get this:
> ...
> Disassembly of section .text:
>
> 0000000000000000 <bar>:
> bar():
> /tmp/foo.c:6
>    0:   55                      push   %rbp
>    1:   48 89 e5                mov    %rsp,%rbp
>    4:   89 7d f8                mov    %edi,-0x8(%rbp)
> /tmp/foo.c:7
>    7:   81 7d f8 03 00 00 00    cmpl   $0x3,-0x8(%rbp)
>    e:   0f 85 0c 00 00 00       jne    20 <bar+0x20>
>   14:   c7 45 fc 01 00 00 00    movl   $0x1,-0x4(%rbp)
>   1b:   e9 07 00 00 00          jmpq   27 <bar+0x27>
> /tmp/foo.c:8
>   20:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
> /tmp/foo.c:9
>   27:   8b 45 fc                mov    -0x4(%rbp),%eax
>   2a:   5d                      pop    %rbp
>   2b:   c3                      retq
> ...
>
> Note that all of the reported source locations are in lines 6-9;
> nothing is attributed to lines 1-3.
>
> To double-check that I really can't get detailed trace information
> from macro-generated code, I added a main() function and stepped
> through the code with gdb.  Here's what I got:
>
> (gdb) list
> 4          }
> 5
> 6       int bar(int x) {
> 7          FOO
> 8          return 0;
> 9       }
> 10
> 11      int main(int argc, const char* argv[] )
> 12      {
> 13          return bar( argc );
> (gdb) break main
> Breakpoint 1 at 0x4004d6: file foo.c, line 13.
> (gdb) run
> Starting program: /tmp/a.out
>
> Breakpoint 1, main (argc=1, argv=0x7fffffffdf98) at foo.c:13
> 13          return bar( argc );
> (gdb) step
> bar (x=1) at foo.c:7
> 7          FOO
> (gdb) step
> 8          return 0;
> (gdb) step
> 9       }
> (gdb) step
> __libc_start_main (main=0x4004c0 <main>, argc=1, argv=0x7fffffffdf98,
> init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
> stack_end=0x7fffffffdf88) at libc-start.c:321
> 321     libc-start.c: No such file or directory.
> (gdb)
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141110/635375e7/attachment.html>


More information about the cfe-dev mailing list