systems-nuts / unifico

Compiler and build harness for heterogeneous-ISA binaries with the same stack layout.
4 stars 1 forks source link

Different register allocation on three-parameter function #244

Open blackgeorge-boom opened 1 year ago

blackgeorge-boom commented 1 year ago

Minimal example:

void rec(int a, int b, int c)
{
    if (a == 0)
        return;
    else {
        rec(a - 1, b, c);
        return;
    }
}

int main()
{
    rec(1, 2, 3);
}
 [STACKMAPS CHECK] Checking stackmaps for main_aarch64_aligned.out main_x86_64_aligned.out
make[1]: warning: jobserver unavailable: using -j1.  Add '+' to parent make rule.
make[1]: Entering directory '/home/blackgeorge/Documents/phd/unified_abi/stack-metadata'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/home/blackgeorge/Documents/phd/unified_abi/stack-metadata'
WARNING: rec: callsite 0, value locations 0/0 have different location type (3 vs. 1)
WARNING: rec: callsite 0, value locations 0/0 have different location offset or  different constant (-40 vs. 0)
WARNING: rec: callsite 0, value locations 1/1 have different location type (1 vs. 3)
WARNING: rec: callsite 0, value locations 1/1 have different location offset or  different constant (0 vs. -40)
ERROR: stackmaps in 'main_aarch64_aligned.out' & 'main_x86_64_aligned.out' differ - different stack layout!
make: *** [../../common/common.mk:193: stackmaps-check] Error 1
blackgeorge-boom commented 1 year ago

It seems that AArch64 spills the first argument, inside the recursive call to rec, whereas X86 spills the second.

AArch64:


0000000000501020 rec:
  501020: ff 03 01 d1                   sub sp, sp, #0x40
  501024: f4 4f 02 a9                   stp x20, x19, [sp, #0x20]
  501028: fd 7b 03 a9                   stp x29, x30, [sp, #0x30]
  50102c: fd c3 00 91                   add x29, sp, #0x30
  501030: e1 03 02 29                   stp w1, w0, [sp, #0x10]
  501034: e2 0f 00 b9                   str w2, [sp, #0xc]
  501038: 00 01 00 34                   cbz w0, #0x20 <rec+0x38>
  50103c: f4 23 42 29                   ldp w20, w8, [sp, #0x10]
  501040: f3 0f 40 b9                   ldr w19, [sp, #0xc]
  501044: 00 05 00 51                   sub w0, w8, #0x1
  501048: e1 03 14 2a                   mov w1, w20
  50104c: e2 03 13 2a                   mov w2, w19
  501050: e0 0b 00 b9                   str w0, [sp, #0x8]    <---
  501054: f3 ff ff 97                   bl  #-0x34 <rec>
...

X86:


0000000000501020 <rec>:
  501020:   55                      push   rbp
  501021:   48 89 e5                mov    rbp,rsp
  501024:   53                      push   rbx
  501025:   41 57                   push   r15
  501027:   48 83 ec 20             sub    rsp,0x20
  50102b:   89 7d e4                mov    DWORD PTR [rbp-0x1c],edi
  50102e:   89 75 e0                mov    DWORD PTR [rbp-0x20],esi
  501031:   89 55 dc                mov    DWORD PTR [rbp-0x24],edx
  501034:   85 ff                   test   edi,edi
  501036:   0f 84 1c 00 00 00       je     501058 <rec+0x38>
  50103c:   8b 5d e4                mov    ebx,DWORD PTR [rbp-0x1c]
  50103f:   ff cb                   dec    ebx
  501041:   8b 75 e0                mov    esi,DWORD PTR [rbp-0x20]
  501044:   89 75 d8                mov    DWORD PTR [rbp-0x28],esi   <---
  501047:   44 8b 7d dc             mov    r15d,DWORD PTR [rbp-0x24]
  50104b:   89 df                   mov    edi,ebx
  50104d:   44 89 fa                mov    edx,r15d
  501050:   0f 1f 00                nop    DWORD PTR [rax]
  501053:   e8 c8 ff ff ff          call   501020 <rec>
...