C calling convention failure on i386
bgamari/test-primops> appears to have turned up yet another C calling convention issue. The following call form results in a segfault:
CCallDesc {callRet = SomeNumber @W32 0xed258ca3, callArgs = [SomeNumber @W32 0x717fd092,SomeNumber @W16 0x687b,SomeNumber @W16 0x9427,SomeNumber @W32 0x14a91194,SomeNumber @W8 0xcf,SomeNumber @W16 0xcf66,SomeNumber @W8 0x65,SomeNumber @W16 0x7bc2,SomeNumber @W8 0xc5,SomeNumber @W16 0x1741,SomeNumber @W8 0xef,SomeNumber @W8 0xbf,SomeNumber @W16 0xe95,SomeNumber @W16 0xed8e,SomeNumber @W32 0xdee36ced,SomeNumber @W32 0x4c1eb3b0,SomeNumber @W32 0xca61f521,SomeNumber @W32 0x500cf91f,SomeNumber @W8 0x8c]}
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
uint32_t test_c(uint32_t arg0, uint16_t arg1, uint16_t arg2, uint32_t arg3, uint8_t arg4, uint16_t arg5, uint8_t arg6, uint16_t arg7, uint8_t arg8, uint16_t arg9, uint8_t arg10, uint8_t arg11, uint16_t arg12, uint16_t arg13, uint32_t arg14, uint32_t arg15, uint32_t arg16, uint32_t arg17, uint8_t arg18) {
printf("0x%"PRIx32"\n", arg0);
printf("0x%"PRIx16"\n", arg1);
printf("0x%"PRIx16"\n", arg2);
printf("0x%"PRIx32"\n", arg3);
printf("0x%"PRIx8"\n", arg4);
printf("0x%"PRIx16"\n", arg5);
printf("0x%"PRIx8"\n", arg6);
printf("0x%"PRIx16"\n", arg7);
printf("0x%"PRIx8"\n", arg8);
printf("0x%"PRIx16"\n", arg9);
printf("0x%"PRIx8"\n", arg10);
printf("0x%"PRIx8"\n", arg11);
printf("0x%"PRIx16"\n", arg12);
printf("0x%"PRIx16"\n", arg13);
printf("0x%"PRIx32"\n", arg14);
printf("0x%"PRIx32"\n", arg15);
printf("0x%"PRIx32"\n", arg16);
printf("0x%"PRIx32"\n", arg17);
printf("0x%"PRIx8"\n", arg18);
fflush(stdout);
return 3978661027ULL;
}
test(bits64 buffer) {
bits32 ret;
(ret) = foreign "C" test_c((1904201874 :: bits32), (26747 :: bits16), (-27609 :: bits16), (346624404 :: bits32), (-49 :: bits8), (-12442 :: bits16), (101 :: bits8), (31682 :: bits16), (-59 :: bits8), (5953 :: bits16), (-17 :: bits8), (-65 :: bits8), (3733 :: bits16), (-4722 :: bits16), (-555520787 :: bits32), (1277080496 :: bits32), (-899549919 :: bits32), (1343027487 :: bits32), (-116 :: bits8));
return (%zx64(ret));
}