James Peach created TS-2251:
-------------------------------

             Summary: LogBuffer::destroy() defeated by compiler optimizations
                 Key: TS-2251
                 URL: https://issues.apache.org/jira/browse/TS-2251
             Project: Traffic Server
          Issue Type: Bug
          Components: Logging, Portability, Quality
            Reporter: James Peach


{{LogBuffer::destroy()}} uses atomic compare and swaps on the {{LogBuffer}} 
reference count to decrement the refcount and destroy the LogBuffer object. 
However, the compiler (Apple clang-500.2.75) hoists the read of 
LogBuffer::m_references out of the loop, so it won't work correctly if 
{{ink_atomic_cas}} ever fails:

{code}
__ZN9LogBuffer7destroyEPS_:             ## @_ZN9LogBuffer7destroyEPS_
        .cfi_startproc
        .cfi_personality 155, ___gxx_personality_v0
Leh_func_begin1:
        .cfi_lsda 16, Lexception1
Lfunc_begin1:
        .loc    1 66 0                  ## 
/Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:66:0
## BB#0:
        pushq   %rbp
Ltmp13:
        .cfi_def_cfa_offset 16
Ltmp14:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
Ltmp15:
        .cfi_def_cfa_register %rbp
        pushq   %r14
        pushq   %rbx
        subq    $32, %rsp
Ltmp16:
        .cfi_offset %rbx, -32
Ltmp17:
        .cfi_offset %r14, -24
        ##DEBUG_VALUE: destroy:lb <- RDI+0
        movq    %rdi, %rbx
{code}

Notice that the following load of LogBuffer::m_references is outside the loop 
labelled {{LBB1_1}}:
{code}
Ltmp18:
        ##DEBUG_VALUE: destroy:lb <- RBX+0
        .loc    1 70 0 prologue_end     ## 
/Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:70:0
        leaq    104(%rbx), %rsi
Ltmp19:
        ##DEBUG_VALUE: ink_atomic_cas<int>:mem <- RSI+0
        .align  4, 0x90
LBB1_1:                                 ## =>This Inner Loop Header: Depth=1
        ##DEBUG_VALUE: destroy:lb <- RBX+0
        ##DEBUG_VALUE: ink_atomic_cas<int>:mem <- RSI+0
        movl    (%rsi), %ecx
Ltmp20:
        ##DEBUG_VALUE: old_ref <- ECX+0
        ##DEBUG_VALUE: ink_atomic_cas<int>:prev <- ECX+0
        .loc    1 71 0                  ## 
/Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:71:0
        leal    -1(%rcx), %edx
Ltmp21:
        ##DEBUG_VALUE: ink_atomic_cas<int>:next <- EDX+0
        ##DEBUG_VALUE: new_ref <- EDX+0
        .loc    29 153 0                ## 
/Users/jpeach/src/trafficserver.git/lib/ts/ink_atomic.h:153:0
        movl    %ecx, %eax
        lock
        cmpxchgl        %edx, (%rsi)
        cmpl    %ecx, %eax
Ltmp22:
        .loc    1 73 0                  ## 
/Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:73:0
        jne     LBB1_1
Ltmp23:
## BB#2:
        ##DEBUG_VALUE: destroy:lb <- RBX+0
        .loc    1 75 0                  ## 
/Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:75:0
        testl   %ecx, %ecx
        jle     LBB1_15
## BB#3:
        ##DEBUG_VALUE: destroy:lb <- RBX+0
        .loc    1 77 0                  ## 
/Users/jpeach/src/trafficserver.git/proxy/logging/LogBuffer.cc:77:0
        testl   %edx, %edx
        jne     LBB1_14
## BB#4:
        ##DEBUG_VALUE: destroy:lb <- RBX+0
        testq   %rbx, %rbx
        jne     LBB1_5
{code}


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to