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.

Reply via email to