[Bug c++/78047] New: [7 Regression] Chromium apparently gets miscompiled
trippels at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Oct 20 05:52:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78047
Bug ID: 78047
Summary: [7 Regression] Chromium apparently gets miscompiled
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: trippels at gcc dot gnu.org
Target Milestone: ---
Chromium gets miscompiled with gcc trunk.
Bizarrely, it crashes when one tries to view Stroustrup's CppCon2016 keynote
on github:
https://github.com/CppCon/CppCon2016/blob/master/Keynotes/The%20Evolution%20of%20C++%20-%20Past,%20Present,%20and%20Future/The%20Evolution%20of%20C++%20-%20Past,%20Present,%20and%20Future%20-%20Bjarne%20Stroustrup%20-%20CppCon%202016.pdf
../../third_party/tcmalloc/chromium/src/tcmalloc.cc:289] Attempt to free
invalid pointer 0x55555f0c76f0
Thread 1 "chrome" received signal SIGSEGV, Segmentation fault.
0x0000555556028d00 in tcmalloc::Abort() ()
(gdb) bt
#0 0x0000555556028d00 in tcmalloc::Abort() ()
#1 0x000055555602d1d5 in tcmalloc::Log(tcmalloc::LogMode, char const*, int,
tcmalloc::LogItem, tcmalloc::LogItem, tcmalloc::LogItem, tcmalloc::LogItem) ()
#2 0x000055555d00ee6f in tc_free ()
#3 0x0000555557eb9b4c in GrResourceProvider::GrResourceProvider(GrGpu*,
GrResourceCache*, GrSingleOwner*) ()
#4 0x0000555557e88345 in GrContext::initCommon(GrContextOptions const&) ()
#5 0x0000555557e88734 in GrContext::Create(GrBackend, long) ()
...
I narrowed it down to a single function:
23 __attribute__((optimize("-O1")))
24 GrResourceProvider::GrResourceProvider(GrGpu* gpu, GrResourceCache* cache,
GrSingleOwner* owner)
25 : INHERITED(gpu, cache, owner) {
26 GR_DEFINE_STATIC_UNIQUE_KEY(gQuadIndexBufferKey);
27 fQuadIndexBufferKey = gQuadIndexBufferKey;
28 }
__attribute__((optimize("-O1"))) "fixes" the issue.
33929 class SkOnce {
33930 public:
33931 constexpr SkOnce() = default;
33932
33933 template <typename Fn, typename... Args>
33934 void operator()(Fn&& fn, Args&&... args) {
33935 auto state = fState.load(std::memory_order_acquire);
33936
33937 if (state == Done) {
33938 return;
33939 }
33940
33941
33942 if (state == NotStarted && fState.compare_exchange_strong(state,
Claimed,
33943
std::memory_order_relaxed)) {
33944
33945 fn(std::forward<Args>(args)...);
33946 return fState.store(Done, std::memory_order_release);
33947 }
33948
33949
33950
33951 while (fState.load(std::memory_order_acquire) != Done) { }
33952 }
33953
33954 private:
33955 enum State : uint8_t { NotStarted, Claimed, Done};
33956 std::atomic<uint8_t> fState{NotStarted};
33957 };
34201 static inline void
gr_init_static_unique_key_once(SkAlignedSTStorage<1,GrUniqueKey>* keyStorage) {
34202 GrUniqueKey* key = new (keyStorage->get()) GrUniqueKey;
34203 GrUniqueKey::Builder builder(key, GrUniqueKey::GenerateDomain(), 0);
34204 }
109423 static SkOnce gQuadIndexBufferKey_once;
109424
109425 GrResourceProvider::GrResourceProvider(GrGpu* gpu, GrResourceCache*
cache, GrSingleOwner* owner)
109426 : INHERITED(gpu, cache, owner) {
109427 static SkAlignedSTStorage<1, GrUniqueKey>
gQuadIndexBufferKey_storage;
109428
gQuadIndexBufferKey_once(gr_init_static_unique_key_once,
&gQuadIndexBufferKey_storage);
109429 static const GrUniqueKey&
gQuadIndexBufferKey =
*reinterpret_cast<GrUniqueKey*>(gQuadIndexBufferKey_storage.get());;
109430 fQuadIndexBufferKey = gQuadIndexBufferKey;
109431 }
good:
35 .type
_ZN18GrResourceProviderC2EP5GrGpuP15GrResourceCacheP13GrSingleOwner, @function
36 _ZN18GrResourceProviderC2EP5GrGpuP15GrResourceCacheP13GrSingleOwner:
37 .LFB10679:
38 .cfi_startproc
39 pushq %r14
40 .cfi_def_cfa_offset 16
41 .cfi_offset 14, -16
42 pushq %r13
43 .cfi_def_cfa_offset 24
44 .cfi_offset 13, -24
45 pushq %r12
46 .cfi_def_cfa_offset 32
47 .cfi_offset 12, -32
48 pushq %rbp
49 .cfi_def_cfa_offset 40
50 .cfi_offset 6, -40
51 pushq %rbx
52 .cfi_def_cfa_offset 48
53 .cfi_offset 3, -48
54 movq %rdi, %rbx
55 leaq 24(%rbx), %r13
56 leaq 16(%rbx), %r12
57 subq $16, %rsp
58 .cfi_def_cfa_offset 64
59 call
_ZN17GrTextureProviderC2EP5GrGpuP15GrResourceCacheP13GrSingleOwner@PLT
60 cmpb $0,
_ZGVZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
61 movq %r13, 16(%rbx)
62 movl $0, 24(%rbx)
63 movl $0, 28(%rbx)
64 movq $0, 56(%rbx)
65 jne .L4
66 movb $1,
_ZGVZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
67 .L4:
68 movzbl _ZL24gQuadIndexBufferKey_once(%rip), %eax
69 cmpb $2, %al
70 je .L8
71 testb %al, %al
72 jne .L9
73 movl $1, %edx
74 lock cmpxchgb %dl, _ZL24gQuadIndexBufferKey_once(%rip)
75 jne .L9
76 leaq
16+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip),
%rbp
77 movl $0,
16+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
78 movl $0,
20+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
79 movq %rbp,
8+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
80 movq $0,
48+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
81 call _ZN11GrUniqueKey14GenerateDomainEv@PLT
82 movq
8+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip),
%rdi
83 cmpq %rbp, %rdi
84 je .L7
85 movl %eax, 12(%rsp)
86 call _Z7sk_freePv@PLT
87 movl 12(%rsp), %eax
88 .L7:
89 orl $524288, %eax
======================================================================
bad:
35 .type
_ZN18GrResourceProviderC2EP5GrGpuP15GrResourceCacheP13GrSingleOwner, @function
36 _ZN18GrResourceProviderC2EP5GrGpuP15GrResourceCacheP13GrSingleOwner:
37 .LFB10679:
38 .cfi_startproc
39 pushq %r14
40 .cfi_def_cfa_offset 16
41 .cfi_offset 14, -16
42 pushq %r13
43 .cfi_def_cfa_offset 24
44 .cfi_offset 13, -24
45 pushq %r12
46 .cfi_def_cfa_offset 32
47 .cfi_offset 12, -32
48 pushq %rbp
49 .cfi_def_cfa_offset 40
50 .cfi_offset 6, -40
51 pushq %rbx
52 .cfi_def_cfa_offset 48
53 .cfi_offset 3, -48
54 movq %rdi, %rbx
55 leaq 24(%rbx), %r12
56 leaq 16(%rbx), %r13
57 call
_ZN17GrTextureProviderC2EP5GrGpuP15GrResourceCacheP13GrSingleOwner@PLT
58 cmpb $0,
_ZGVZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
59 movq %r12, 16(%rbx)
60 movl $0, 24(%rbx)
61 movl $0, 28(%rbx)
62 movq $0, 56(%rbx)
63 jne .L4
64 movb $1,
_ZGVZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
65 .L4:
66 movzbl _ZL24gQuadIndexBufferKey_once(%rip), %eax
67 cmpb $2, %al
68 je .L7
69 testb %al, %al
70 jne .L8
71 movl $1, %edx
72 lock cmpxchgb %dl, _ZL24gQuadIndexBufferKey_once(%rip)
73 jne .L8
74 leaq
16+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip),
%r14
75 movl $0,
16+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
76 movl $0,
20+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
77 movq %r14,
8+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
78 movq $0,
48+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip)
79 call _ZN11GrUniqueKey14GenerateDomainEv@PLT
80 movq
8+_ZZN18GrResourceProviderC4EP5GrGpuP15GrResourceCacheP13GrSingleOwnerE27gQuadIndexBufferKey_storage(%rip),
%rdi
81 movl %eax, %ebp
82 call _Z7sk_freePv@PLT
83 movl %ebp, %eax
84 orl $524288, %eax
Since this is using different std::memory_orders I'm not sure what is going on.
Will try to bisect it later today.
More information about the Gcc-bugs
mailing list