[cfe-dev] Treating constant strings as dynamically initialized globals

Rafael Ávila De Espíndola rafael.espindola at gmail.com
Mon Jun 17 09:07:04 PDT 2013


I would be better user experience IMHO.

Sent from my iPhone

On 2013-06-17, at 11:49, Alexey Samsonov <samsonov at google.com> wrote:

> 
> On Mon, Jun 17, 2013 at 7:28 PM, Eli Friedman <eli.friedman at gmail.com> wrote:
>> 
>> On Mon, Jun 17, 2013 at 1:50 AM, Alexey Samsonov <samsonov at google.com> wrote:
>>> Hi cfe-dev!
>>> 
>>> Consider the following code:
>>> $ cat str.cc
>>> extern const char* const AAA;
>>> extern const char* const BBB;
>>> const char* const AAA = "aaa";
>>> const char* const BBB = AAA;
>>> 
>>> "g++ -O0" and "clang++ -O0" behave differently: gcc emits both AAA and BBB as
>>> linker-initialized constants, while Clang initializes BBB during static initialization:
>>> $ g++ -O0 -c str.cc -o a.o ; objdump -d a.o
>>> a.o:     file format elf64-x86-64
>>> $ ./bin/clang++ -O0 -c str.cc -o a.o ; objdump -d a.o
>>> a.o:     file format elf64-x86-64
>>> Disassembly of section .text.startup:
>>> 0000000000000000 <__cxx_global_var_init>:
>>>    0:	55                   	push   %rbp
>>>    1:	48 89 e5             	mov    %rsp,%rbp
>>>    4:	48 8b 04 25 00 00 00 	mov    0x0,%rax
>>>    b:	00 
>>>    c:	48 89 04 25 00 00 00 	mov    %rax,0x0
>>>   13:	00 
>>>   14:	5d                   	pop    %rbp
>>>   15:	c3                   	retq   
>>>   16:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
>>>   1d:	00 00 00 
>>> 0000000000000020 <_GLOBAL__I_a>:
>>>   20:	55                   	push   %rbp
>>>   21:	48 89 e5             	mov    %rsp,%rbp
>>>   24:	e8 d7 ff ff ff       	callq  0 <__cxx_global_var_init>
>>>   29:	5d                   	pop    %rbp
>>>   2a:	c3                   	retq
>>> 
>>> 
>>> Is Clang correct here? I imagine that user who wrote the code might expect the
>>> "constant strings" to go in .rodata and be safely accessible during static initialization.
>> 
>> clang is correct in the sense that the C++ standard doesn't require the compiler to use static initialization for BBB.  [basic.start.init] is the relevant section in the standard; "AAA" doesn't count as a constant expression.  You can "fix" this using constexpr.
> 
> I see.  Another question is whether Clang should always do constant initialization, although it's not required.
> 
> 
> -- 
> Alexey Samsonov, MSK
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130617/e44ecd81/attachment.html>


More information about the cfe-dev mailing list