[cfe-dev] Getting clang to give dwarf info for macro expansions?
Christian Convey
christian.convey at gmail.com
Mon Nov 10 15:41:29 PST 2014
Thanks David. I'm certainly no dwarf expert, but I was wondering if
we could just have something like this:
foo.c:6:1
(various machine instructions)
bar.h:20
(some machine instruction resulting from a macro call at, for example,
line 7 of foo.c)
foo.c:8:1
(more machine instructions)
Anyway, I'm not proposing a modification. I was just curious if there
was some existing way to get better insight into the object code
associated with macro-generated source.
On Mon, Nov 10, 2014 at 6:35 PM, David Blaikie <dblaikie at gmail.com> wrote:
> 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
>
>
More information about the cfe-dev
mailing list