[LLVMbugs] [Bug 20091] New: Invalid assembly code generated by clang-cl from the inline assembly

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Fri Jun 20 15:22:00 PDT 2014


http://llvm.org/bugs/show_bug.cgi?id=20091

            Bug ID: 20091
           Summary: Invalid assembly code generated by clang-cl from the
                    inline assembly
           Product: clang
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Frontend
          Assignee: unassignedclangbugs at nondot.org
          Reporter: ehsan at mozilla.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Here's the source code:

extern "C" __declspec(dllexport) nsresult __stdcall
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
                 uint32_t paramCount, nsXPTCVariant* params)
{
    __asm {
        mov     edx,paramCount      // Save paramCount for later
        test    edx,edx             // maybe we don't have any params to copy
        jz      noparams
        mov     eax,edx             
        shl     eax,3               // *= 8 (max possible param size)
        sub     esp,eax             // make space for params
        mov     ecx,esp
        push    params
        call    invoke_copy_to_stack // fastcall, ecx = d, edx = paramCount,
params is on the stack
noparams:
        mov     ecx,that            // instance in ecx
        push    ecx                 // push this
        mov     edx,[ecx]           // vtable in edx
        mov     eax,methodIndex
        call    [edx][eax*4]        // stdcall, i.e. callee cleans up stack.
        mov     esp,ebp
    }
}

Here is the code generated by cl:

_NS_InvokeByIndex:                                                              
       0:       55                                              push    ebp     
       1:       8b ec                                           mov     ebp,
esp                          
       3:       8b 55 10                                        mov     edx,
dword ptr [ebp + 16]         
       6:       85 d2                                           test    edx,
edx                          
       8:       74 11                                           je      17      
       a:       8b c2                                           mov     eax,
edx                          
       c:       c1 e0 03                                        shl     eax, 3  
       f:       2b e0                                           sub     esp,
eax                          
      11:       8b cc                                           mov     ecx,
esp                          
      13:       ff 75 14                                        push    dword
ptr [ebp + 20]              
      16:       e8 00 00 00 00                                  call    0       

$noparams$4:                                                                    
      1b:       8b 4d 08                                        mov     ecx,
dword ptr [ebp + 8]          
      1e:       51                                              push    ecx     
      1f:       8b 11                                           mov     edx,
dword ptr [ecx]              
      21:       8b 45 0c                                        mov     eax,
dword ptr [ebp + 12]         
      24:       ff 14 82                                        call    dword
ptr [edx + 4*eax]           
      27:       8b e5                                           mov     esp,
ebp                          
      29:       5d                                              pop     ebp     
      2a:       c3                                              ret             


Here is the code generated by clang-cl:

_NS_InvokeByIndex:
55BD89A0  push        ebp  
55BD89A1  mov         ebp,esp  
55BD89A3  push        esi  
55BD89A4  sub         esp,18h  
55BD89A7  mov         eax,dword ptr [ebp+14h]  
55BD89AA  mov         ecx,dword ptr [ebp+10h]  
55BD89AD  mov         edx,dword ptr [ebp+0Ch]  
55BD89B0  mov         esi,dword ptr [ebp+8]  
55BD89B3  mov         dword ptr [ebp-0Ch],eax  
55BD89B6  mov         dword ptr [ebp-10h],ecx  
55BD89B9  mov         dword ptr [ebp-14h],edx  
55BD89BC  mov         dword ptr [ebp-18h],esi  
55BD89BF  mov         eax,55BD8A10h  
55BD89C4  mov         dword ptr [ebp-1Ch],eax  
55BD89C7  mov         esi,dword ptr [ebp-1Ch]  
55BD89CA  mov         edx,dword ptr [ebp-10h]  
55BD89CD  test        edx,edx  
55BD89CF  je          _NS_InvokeByIndex+43h (55BD89E3h)  
55BD89D5  mov         eax,edx  
55BD89D7  shl         eax,3  
55BD89DA  sub         esp,eax  
55BD89DC  mov         ecx,esp  
55BD89DE  push        dword ptr [ebp-0Ch]  
55BD89E1  call        esi  
55BD89E3  mov         ecx,dword ptr [ebp-18h]  
55BD89E6  push        ecx  
55BD89E7  mov         edx,dword ptr [ecx]  
55BD89E9  mov         eax,dword ptr [ebp-14h]  
55BD89EC  call        word ptr [edx+eax*4]  
55BD89F0  mov         esp,ebp  
55BD89F2  ud2  

Note the incorrect short dereference above (at 55BD89EC) and the invalid
instruction at 55BD89F2.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20140620/8a3ec1c0/attachment.html>


More information about the llvm-bugs mailing list