www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 21914] New: naked assembler functions get wrong offset to

https://issues.dlang.org/show_bug.cgi?id=21914

          Issue ID: 21914
           Summary: naked assembler functions get wrong offset to
                    parameters
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: regression
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: bugzilla digitalmars.com

Consider the function:

  extern (C++) int insbad(int a, int b) {
    asm {
        naked            ;
        mov EAX,a-4+[ESP] ;
        mov EBX,b-4+[ESP] ;
    }
  }

In 2.079 and earlier, the inline assembler assumed that an EBP was set up and
provided offsets to the parameters accordingly. Hence, in the above code, a -4
was inserted to correct for not having EBP pushed on the stack.

Somewhere between 2.079 and 2.090 this was changed to not consider EBP, and the
offsets look like this for the above function:

  ?insbad  YAHHH Z:
         mov    EAX,[ESP]    // should be 4[ESP]
         mov    EBX,4[ESP]   // should be 8[ESP]

The problem looks to be the computation of Para.size in cgcod.d from this PR:

 https://github.com/dlang/dmd/pull/9620/files

i.e. my fault.

--
May 11 2021