[cfe-dev] Treating constant strings as dynamically initialized globals
Eli Friedman
eli.friedman at gmail.com
Mon Jun 17 08:28:16 PDT 2013
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.
-Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130617/9c3345b7/attachment.html>
More information about the cfe-dev
mailing list