https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79042

            Bug ID: 79042
           Summary: LTO doesn't propagate node->dynamically_initialized
                    bit for varpool nodes.
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: lto
          Assignee: unassigned at gcc dot gnu.org
          Reporter: m.ostapenko at samsung dot com
  Target Milestone: ---
              Host: x86_64-pc-linux-gnu
            Target: x86_64-pc-linux-gnu
             Build: x86_64-pc-linux-gnu

Created attachment 40490
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=40490&action=edit
Trivial fix

Consider following testcase:

$ cat test.cc

class A {
public:
  A () : x_(0) {};
private:
  int x_;
};

static A a;

int main () {
  return 0;
}

Running this with ASan and LTO gives us:

$ ~/install/master/bin/g++ -fsanitize=address test.cc -static-libasan -flto
$ ASAN_OPTIONS=report_globals=3 ./a.out 
    #0 0x41d7b6 in __asan_register_globals
/home/max/workspace/downloads/gcc/libsanitizer/asan/asan_globals.cc:326
    #1 0x58a186 in _GLOBAL__sub_I_00099_1_main.4327
(/tmp/usr/apps/ise-default/mobile/bin/a.out+0x58a186)
    #2 0x58a1dc in __libc_csu_init
(/tmp/usr/apps/ise-default/mobile/bin/a.out+0x58a1dc)
    #3 0x7f16b2316ed4 in __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x21ed4)
    #4 0x405e68  (/tmp/usr/apps/ise-default/mobile/bin/a.out+0x405e68)

=== ID 1098907649; 0x0000007c6f40 0x0000007c6f80
==16281==Added Global[0x0000007c6f40]: beg=0x00000142bd60 size=4/64 name=a
module=/tmp/ccQdsNjQ.ltrans0.o dyn_init=0


The dyn_init field should be equal to 1 (we have a global constructor), as we
can confirm running the testcase without LTO:

$ ~/install/master/bin/g++ -fsanitize=address test.cc -static-libasan
$ ASAN_OPTIONS=report_globals=3 ./a.out 
    #0 0x41d7b6 in __asan_register_globals
/home/max/workspace/downloads/gcc/libsanitizer/asan/asan_globals.cc:326
    #1 0x58a138 in _GLOBAL__sub_I_00099_1_main
(/tmp/usr/apps/ise-default/mobile/bin/a.out+0x58a138)
    #2 0x58a1dc in __libc_csu_init
(/tmp/usr/apps/ise-default/mobile/bin/a.out+0x58a1dc)
    #3 0x7f9cdad24ed4 in __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x21ed4)
    #4 0x405e68  (/tmp/usr/apps/ise-default/mobile/bin/a.out+0x405e68)

=== ID 385875969; 0x0000007c6f40 0x0000007c6f40
==16302==Added Global[0x0000007c6f40]: beg=0x00000142bd20 size=4/64 name=a
module=test.cc dyn_init=1


This happens because LTO doesn't propagate node->dynamically_initialized to
LTRANS stage.
The trivial fix (untested) is attached.

Reply via email to