[Bug c++/81533] New: g++ pops up a constructor for objects that could be initialized at load-time
gjl at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Jul 24 13:41:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81533
Bug ID: 81533
Summary: g++ pops up a constructor for objects that could be
initialized at load-time
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: gjl at gcc dot gnu.org
Target Milestone: ---
Created attachment 41817
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41817&action=edit
foo.cpp: C++ test case
When compiling the following module with g++ from v8 trunk
$ g++ foo.cpp -S -O2 -save-temps
then it pops a constructor to initialize s:
struct S { int id; const char *labl; };
const S* get_S_B()
{
static const S s =
{ 456,
(__extension__({
static char ccc[] = "TextB";
&ccc[0];
})) };
return &s;
}
The generated assembly reads (x86_64):
_Z7get_S_Bv:
.LFB0:
.cfi_startproc
movzbl _ZGVZ7get_S_BvE1s(%rip), %eax
testb %al, %al
je .L13
movl $_ZZ7get_S_BvE1s, %eax
ret
.p2align 4,,10
.p2align 3
.L13:
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $_ZGVZ7get_S_BvE1s, %edi
call __cxa_guard_acquire
testl %eax, %eax
jne .L14
movl $_ZZ7get_S_BvE1s, %eax
addq $8, %rsp
.cfi_remember_state
.cfi_def_cfa_offset 8
ret
The code could be just as smart as with the following test case
struct S { int id; const char *labl; };
const S* get_S_A()
{
static const S s = { 123, "TextA" };
return &s;
}
which generates:
_Z7get_S_Av:
movl $_ZZ7get_S_AvE1s, %eax
ret
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "TextA"
.section .rodata
_ZZ7get_S_AvE1s:
.long 123
.zero 4
.quad .LC0
.ident "GCC: (GNU) 8.0.0 20170724 (experimental)"
The first version with the "TextB" assignment to ccc is useful when ccc needs a
variable attribute.
More information about the Gcc-bugs
mailing list