bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/12944] New: GNU LD incorrectly optimize away COMDAT sections ref


From: hubicka at gcc dot gnu.org
Subject: [Bug ld/12944] New: GNU LD incorrectly optimize away COMDAT sections refered from data sections.
Date: Tue, 28 Jun 2011 12:59:36 +0000

http://sourceware.org/bugzilla/show_bug.cgi?id=12944

           Summary: GNU LD incorrectly optimize away COMDAT sections
                    refered from data sections.
           Product: binutils
           Version: 2.22 (HEAD)
            Status: NEW
          Severity: normal
          Priority: P2
         Component: ld
        AssignedTo: address@hidden
        ReportedBy: address@hidden


Compiling the following testcase:
#include <stdio.h>
#include "x.h"

__attribute__ ((noinline))
void aa(class A *a)
{
  a->test();
}

__attribute__ ((noinline))
void bb(class B *b)
{
  b->test();
}

int
main(void)
{
  class A a;
  class B b;
  aa (&a);
  bb (&b);
}
with LTO and GNU LD:
/abuild/jh/trunk-install/bin/g++ x.cc -O2 -flto -fuse-linker-plugin
-flto-partition=none

Leads to typeinfo being taken away by GNU LD:

00000000004005d2 W _ZTI1A
00000000004005d2 W _ZTI1B
00000000004005d2 W _ZTS1A
00000000004005d2 W _ZTS1B
0000000000400720 r _ZTV1A
0000000000400740 r _ZTV1B

As one can verify the second pointers of  _ZTV1A and  _ZTV1B are equilvalent
even though they should be different typeinfos:

evans:/abuild/jh/dealIIb/:[0]# gdb a.out
(gdb) p ((void **)0x400720)[0]
$1 = (void *) 0x0
(gdb) p ((void **)0x400720)[1]
$2 = (void *) 0x4005d2
(gdb) p ((void **)0x400720)[2]
$3 = (void *) 0x4006f0
(gdb) p ((void **)0x400740)[0]
$4 = (void *) 0x0
(gdb) p ((void **)0x400740)[1]
$5 = (void *) 0x4005d2
(gdb) p ((void **)0x400740)[2]
$6 = (void *) 0x4006e0
(gdb)

Thinks works well with GOLD:
0000000000400720 V _ZTI1A
0000000000400700 V _ZTI1B
0000000000400730 V _ZTS1A
0000000000400710 V _ZTS1B
00000000004006c0 r _ZTV1A
00000000004006e0 r _ZTV1B
(gdb) p ((void **)0x4006c0)[0]
$1 = (void *) 0x0
(gdb) p ((void **)0x4006c0)[1]
$2 = (void *) 0x400720
(gdb) p ((void **)0x4006c0)[2]
$3 = (void *) 0x400590
(gdb) p ((void **)0x4006e0)[0]
$4 = (void *) 0x0
(gdb) p ((void **)0x4006e0)[1]
$5 = (void *) 0x400700
(gdb) p ((void **)0x4006e0)[2]
$6 = (void *) 0x400580

This is what breaks DealII SPEC2k6 benchmark.

Honza

-- 
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]