[Issue 21364] New: Passing a struct by-value adds padding that breaks argument access within the function

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Nov 5 13:40:54 UTC 2020


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

          Issue ID: 21364
           Summary: Passing a struct by-value adds padding that breaks
                    argument access within the function
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: alexander.breckel at gmail.com

test.d
---------------------
struct X {
        float x0;
        long  x1;
}

void foo(int bar, X x, int i1, int i2, int i3, int i4, int i5, int i6, int i7,
int i8, int i9) {
        import std.stdio;
        writeln(bar); // prints 0 instead of 1
}

void main() {
        X x = X();
        foo(1, x, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}
---------------------
$ dmd -ofapp test.d && ./app

The writeln prints 0 instead of 1.

$ dmd --version
DMD64 D Compiler v2.094.0


The call to foo is compiled to:
   9c9ec:       48 83 ec 08             sub    $0x8,%rsp
   9c9f0:       6a 01                   pushq  $0x1
   9c9f2:       ff 75 f8                pushq  -0x8(%rbp)
   9c9f5:       ff 75 f0                pushq  -0x10(%rbp)
   9c9f8:       48 83 ec 08             sub    $0x8,%rsp   <----- wrong !!!
   9c9fc:       6a 02                   pushq  $0x2
   9c9fe:       6a 03                   pushq  $0x3
   9ca00:       6a 04                   pushq  $0x4
   9ca02:       41 b9 05 00 00 00       mov    $0x5,%r9d
   9ca08:       41 b8 06 00 00 00       mov    $0x6,%r8d
   9ca0e:       b9 07 00 00 00          mov    $0x7,%ecx
   9ca13:       ba 08 00 00 00          mov    $0x8,%edx
   9ca18:       be 09 00 00 00          mov    $0x9,%esi
   9ca1d:       bf 0a 00 00 00          mov    $0xa,%edi
   9ca22:       e8 91 ff ff ff          callq  9c9b8
<_D4test3fooFiSQm1XiiiiiiiiiZv>

After pushing the contents of the struct value x onto the stack, rsp is
additionally decreased by 8. However, when accessing the function argument
later on this additional space of 8 bytes is not taken into account. Smells
like an unnecessary alignment padding for struct by-value function call
arguments. Either the padding itself is wrong, or the offset in the symbol
table does not include the padding.

Any small deviation from the code above "fixes" the issue, e.g. removing
function arguments from the back, or changing the "float" to "long", or adding
extern (C).

--


More information about the Digitalmars-d-bugs mailing list