http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56502



             Bug #: 56502

           Summary: entry-value: Missing DW_AT_linkage_name for C<->C++

                    calls

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: debug

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: jan.kratoch...@redhat.com

            Target: x86_64-unknown-linux-gnu





Created attachment 29564

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29564

FSF GDB HEAD patch before it is upstreamed.



gcc-4.8.0-0.14.fc19.x86_64

gdb FSF HEAD with attached patch (reproducer does not work without patched GDB)



gcc -o extcall3.o -c extcall3.c -Wall -g -O2; g++ -o extcall extcall3.o

extcall{,2}.C -Wall -g -O2

gdb ./extcall -ex 'b a' -ex 'b b' -ex 'set debug entry-values 1' -ex r



Breakpoint 1, Cannot find function "f(int)" for a call site target at 0x4004ce

in main

(gdb) bt

#0  a (y=1) at extcall3.c:2

#1  0x00000000004004ce in main () at extcall.C:4

(gdb) c

[...]

(gdb) bt

#0  b (y=y@entry=2) at extcall2.C:2

#1  0x0000000000400607 in g (x=x@entry=42) at extcall2.C:3

#2  0x00000000004004d8 in main () at extcall.C:5



You can see the first case main->f->a is missing the tail call frame because:

  Cannot find function "f(int)" for a call site target at 0x4004ce in main

 <0><bb>: Abbrev Number: 1 (DW_TAG_compile_unit)

    <c0>   DW_AT_language    : 4        (C++)

    <c1>   DW_AT_name        : extcall.C

 <2><fa>: Abbrev Number: 3 (DW_TAG_GNU_call_site)

    <fb>   DW_AT_low_pc      : 0x4004ce

    <103>   DW_AT_abstract_origin: <0x12e>

 <1><12e>: Abbrev Number: 7 (DW_TAG_subprogram)

    <12f>   DW_AT_external    : 1

    <12f>   DW_AT_name        : f

    <133>   DW_AT_declaration : 1

 <2><137>: Abbrev Number: 8 (DW_TAG_formal_parameter)

    <138>   DW_AT_type        : <0x127>

 <2><13c>: Abbrev Number: 0



As <12e> is in C++ CU and it has no DW_AT_linkage_name GDB expects it is

"f(int)" but the C symbol is "f".



==> extcall.C <==

extern "C" { void f(int x); }

void g(int x);

int main() {

  f(42);

  g(42);

}



==> extcall2.C <==

static volatile int j;

static __attribute__((noinline, noclone)) void b(int y) { j=y; }

void g(int x) { b(2); }



==> extcall3.c <==

static volatile int i;

static __attribute__((noinline, noclone)) void a(int y) { i=y; }

void f(int x) { a(1); }

Reply via email to