test-segregate-stack-accesses: test i386 as well

This commit is contained in:
Alessandro Di Federico
2026-06-16 11:53:42 +02:00
parent 64fa538051
commit 1ff0eedc5f
4 changed files with 585 additions and 141 deletions
@@ -16,7 +16,7 @@ commands:
revng model override-by-name
"$OUTPUT/context/model.yml"
${SOURCE}.override.yml
${SOURCE}.override.$QEMU_NAME.yml
> "$OUTPUT/context/model-tmp.yml";
mv "$OUTPUT/context/model-tmp.yml" "$OUTPUT/context/model.yml";
@@ -25,6 +25,7 @@ commands:
revng analyze --resume "$OUTPUT" detect-stack-size "$INPUT" -o /dev/null;
revng artifact --resume "$OUTPUT" segregate-stack-accesses "$INPUT" |
revng opt -S | FileCheck ${SOURCE}.filecheck.ll;
revng opt -remove-llvmassume-calls -instcombine-noarrays -sroa-noarrays -drop-redundant-ptrint-casts -dce -type-shrinking -dce -drop-redundant-ptrint-casts -early-cse -instsimplify -dce -S |
FileCheck --check-prefix=CHECK-$QEMU_NAME ${SOURCE}.filecheck.ll;
revng artifact --resume "$OUTPUT" emit-c "$INPUT" -o /dev/null;
@@ -2,163 +2,332 @@
; This file is distributed under the MIT License. See LICENSE.md for details.
;
CHECK: define i64 @local_raw_primitives_on_registers(i64 %[[ARG1:.*]], i64 %[[ARG2:.*]]) [[IGN:.*]] {
CHECK-DAG: add i64 [[IGN:.*]]%[[ARG1]]
CHECK-DAG: add i64 [[IGN:.*]]%[[ARG2]]
CHECK: }
; This file mixes checks for what we expect to happen on a x86-64 binarya and an
; i386 binary. In this case, the i386 binary is interesting due to SystemV ABI
; making heavy use of stack arguments.
CHECK: define i64 @local_call_raw_primitives_on_registers() [[IGN:.*]] {
CHECK-DAG: = call i64 @local_raw_primitives_on_registers(i64 2, i64 1)
CHECK: }
; raw_primitives_on_registers
CHECK: define i64 @local_raw_pointers_on_registers(i64 %[[ARG1:.*]], i64 %[[ARG2:.*]]) [[IGN:.*]] {
CHECK-DAG: %[[ARG1_PTR:.*]] = inttoptr i64 %[[ARG1]] to ptr
CHECK-DAG: load i64, ptr %[[ARG1_PTR:.*]]
CHECK-DAG: %[[ARG2_PTR:.*]] = inttoptr i64 %[[ARG2]] to ptr
CHECK-DAG: load i64, ptr %[[ARG2_PTR]]
CHECK: }
CHECK-x86_64: define i64 @local_raw_primitives_on_registers(i64 %[[ARG1:.*]], i64 %[[ARG2:.*]]) [[IGN:.*]] {
CHECK-x86_64-DAG: add i64 [[IGN:.*]]%[[ARG1]]
CHECK-x86_64-DAG: add i64 [[IGN:.*]]%[[ARG2]]
CHECK-x86_64: }
CHECK: define i64 @local_call_raw_pointers_on_registers() [[IGN:.*]] {
CHECK-DAG: = call i64 @local_raw_pointers_on_registers(i64 [[ARG:.*]], i64 [[ARG]])
CHECK: }
CHECK-x86_64: define i64 @local_call_raw_primitives_on_registers() [[IGN:.*]] {
CHECK-x86_64-DAG: = call i64 @local_raw_primitives_on_registers(i64 2, i64 1)
CHECK-x86_64: }
CHECK: define i64 @local_raw_primitives_on_stack(i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[STACK_ARG:.*]]) [[IGN:.*]] {
CHECK-DAG: %[[STACK_ARG8:.*]] = add i64 %[[STACK_ARG]], 8
CHECK-DAG: %[[STACK_ARG8_PTR:.*]] = inttoptr i64 %[[STACK_ARG8]] to ptr
CHECK-DAG: load i64, ptr %[[STACK_ARG8_PTR:.*]]
CHECK-DAG: %[[STACK_ARG_PTR:.*]] = inttoptr i64 %[[STACK_ARG]] to ptr
CHECK-DAG: load i64, ptr %[[STACK_ARG_PTR]]
CHECK: }
; raw_pointers_on_registers
CHECK: define i64 @local_call_raw_primitives_on_stack() [[IGN:.*]] {
CHECK-DAG: %[[STACK:.*]] = alloca [16 x i8]
CHECK-DAG: %[[STACK_INT:.*]] = ptrtoint ptr %[[STACK]] to i64
CHECK-DAG: %[[STACK_INT_8:.*]] = add i64 %[[STACK_INT]], 8
CHECK-DAG: %[[STACK_8:.*]] = inttoptr i64 %[[STACK_INT_8]] to ptr
CHECK-DAG: store i64 8, ptr %[[STACK_8]]
CHECK-DAG: store i64 7, ptr %[[STACK]]
CHECK-DAG: = call i64 @local_raw_primitives_on_stack(i64 4, i64 3, i64 2, i64 1, i64 5, i64 6, i64 %[[STACK_INT]])
CHECK: }
CHECK-x86_64: define i64 @local_raw_pointers_on_registers(i64 %[[ARG1:.*]], i64 %[[ARG2:.*]]) [[IGN:.*]] {
CHECK-x86_64-DAG: %[[ARG1_PTR:.*]] = inttoptr i64 %[[ARG1]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[ARG1_PTR]]
CHECK-x86_64-DAG: %[[ARG2_PTR:.*]] = inttoptr i64 %[[ARG2]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[ARG2_PTR]]
CHECK-x86_64: }
CHECK: define i64 @local_cabi_primitives_on_registers(i64 %[[ARG1:.*]], i64 %[[ARG2:.*]]) [[IGN:.*]] {
CHECK-DAG: add i64 [[IGN:.*]]%[[ARG1]]
CHECK-DAG: add i64 [[IGN:.*]]%[[ARG2]]
CHECK: }
CHECK-x86_64: define i64 @local_call_raw_pointers_on_registers() [[IGN:.*]] {
CHECK-x86_64-DAG: = call i64 @local_raw_pointers_on_registers(i64 [[ARG:.*]], i64 [[ARG]])
CHECK-x86_64: }
CHECK: define i64 @local_call_cabi_primitives_on_registers() [[IGN:.*]] {
CHECK-DAG: = call i64 @local_cabi_primitives_on_registers(i64 1, i64 2)
CHECK: }
; raw_primitives_on_stack
CHECK: define i64 @local_cabi_primitives_on_stack(i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[STACK_ARG1:.*]], i64 %[[STACK_ARG2:.*]]) [[IGN:.*]] {
CHECK-DAG: %[[IGN:.*]] = add i64 %[[IGN:.*]]%[[STACK_ARG1]]
CHECK-DAG: %[[IGN:.*]] = add i64 %[[IGN:.*]]%[[STACK_ARG2]]
CHECK: }
CHECK-x86_64: define i64 @local_raw_primitives_on_stack(i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[STACK_ARG:.*]]) [[IGN:.*]] {
CHECK-x86_64-DAG: %[[STACK_ARG8:.*]] = add i64 %[[STACK_ARG]], 8
CHECK-x86_64-DAG: %[[STACK_ARG8_PTR:.*]] = inttoptr i64 %[[STACK_ARG8]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[STACK_ARG8_PTR]]
CHECK-x86_64-DAG: %[[STACK_ARG_PTR:.*]] = inttoptr i64 %[[STACK_ARG]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[STACK_ARG_PTR]]
CHECK-x86_64: }
CHECK: define i64 @local_call_cabi_primitives_on_stack() [[IGN:.*]] {
CHECK-DAG: = call i64 @local_cabi_primitives_on_stack(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 [[SCALAR1:.*]], i64 [[SCALAR2:.*]])
CHECK: }
CHECK-x86_64: define i64 @local_call_raw_primitives_on_stack() [[IGN:.*]] {
CHECK-x86_64-DAG: %[[STACK:.*]] = alloca [16 x i8]
CHECK-x86_64-DAG: %[[STACK_INT:.*]] = ptrtoint ptr %[[STACK]] to i64
CHECK-x86_64-DAG: %[[STACK_INT_8:.*]] = add i64 %[[STACK_INT]], 8
CHECK-x86_64-DAG: %[[STACK_8:.*]] = inttoptr i64 %[[STACK_INT_8]] to ptr
CHECK-x86_64-DAG: store i64 8, ptr %[[STACK_8]]
CHECK-x86_64-DAG: store i64 7, ptr %[[STACK]]
CHECK-x86_64-DAG: = call i64 @local_raw_primitives_on_stack(i64 4, i64 3, i64 2, i64 1, i64 5, i64 6, i64 %[[STACK_INT]])
CHECK-x86_64: }
CHECK: define i64 @local_cabi_aggregate_on_registers(i64 %[[ARG1:.*]]) [[IGN:.*]] {
CHECK-DAG: %[[FIELD1_PTR:.*]] = inttoptr i64 %[[ARG1]] to ptr
CHECK-DAG: load i64, ptr %[[FIELD1_PTR]]
CHECK-DAG: %[[FIELD2_ADDR:.*]] = add i64 %[[ARG1]], 8
CHECK-DAG: %[[FIELD2_PTR:.*]] = inttoptr i64 %[[FIELD2_ADDR]] to ptr
CHECK-DAG: load i64, ptr %[[FIELD2_PTR]], align 8
CHECK: }
; cabi_primitives_on_registers
CHECK: define i64 @local_call_cabi_aggregate_on_registers() [[IGN:.*]] {
CHECK-DAG: %[[STACK:.*]] = alloca [16 x i8]
CHECK-DAG: %[[STACK_INT:.*]] = ptrtoint ptr %[[STACK]] to i64
CHECK-DAG: store i64 1, ptr %[[STACK]]
CHECK-DAG: %[[STACK_INT_8:.*]] = add i64 %[[STACK_INT]], 8
CHECK-DAG: %[[STACK_8:.*]] = inttoptr i64 %[[STACK_INT_8]] to ptr
CHECK-DAG: store i64 2, ptr %[[STACK_8]]
CHECK-DAG: = call i64 @local_cabi_aggregate_on_registers(i64 %[[STACK_INT]])
CHECK: }
CHECK-x86_64: define i64 @local_cabi_primitives_on_registers(i64 %[[ARG1:.*]], i64 %[[ARG2:.*]]) [[IGN:.*]] {
CHECK-x86_64-DAG: add i64 [[IGN:.*]]%[[ARG1]]
CHECK-x86_64-DAG: add i64 [[IGN:.*]]%[[ARG2]]
CHECK-x86_64: }
CHECK: define i64 @local_cabi_aggregate_on_stack(i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[STACK_ARG:.*]]) [[IGN:.*]] {
CHECK-DAG: %[[FIELD1_PTR:.*]] = inttoptr i64 %[[STACK_ARG]] to ptr
CHECK-DAG: load i64, ptr %[[FIELD1_PTR]]
CHECK-DAG: %[[FIELD2_ADDR:.*]] = add i64 %[[STACK_ARG]], 8
CHECK-DAG: %[[FIELD2_PTR:.*]] = inttoptr i64 %[[FIELD2_ADDR]] to ptr
CHECK-DAG: load i64, ptr %[[FIELD2_PTR]]
CHECK: }
CHECK-x86_64: define i64 @local_call_cabi_primitives_on_registers() [[IGN:.*]] {
CHECK-x86_64-DAG: = call i64 @local_cabi_primitives_on_registers(i64 1, i64 2)
CHECK-x86_64: }
CHECK: define i64 @local_call_cabi_aggregate_on_stack() [[IGN:.*]] {
CHECK-DAG: %[[STACK:.*]] = alloca [16 x i8]
CHECK-DAG: %[[STACK_INT:.*]] = ptrtoint ptr %[[STACK]] to i64
CHECK-DAG: store i64 1, ptr %[[STACK]]
CHECK-DAG: %[[STACK_INT_8:.*]] = add i64 %[[STACK_INT]], 8
CHECK-DAG: %[[STACK_8:.*]] = inttoptr i64 %[[STACK_INT_8]] to ptr
CHECK-DAG: store i64 2, ptr %[[STACK_8]]
CHECK-DAG: = call i64 @local_cabi_aggregate_on_stack(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 %[[STACK_INT]])
CHECK: }
CHECK-i386: define i32 @local_cabi_primitives_on_registers(i32 %[[A:.*]], i32 %[[B:.*]]) [[IGN:.*]] {
CHECK-i386-DAG: %[[T1:.*]] = add i32 {{.*}}, %[[A]]
CHECK-i386-DAG: %[[T2:.*]] = add i32 %[[T1]], %[[B]]
CHECK-i386: ret i32 %[[T2]]
CHECK-i386: }
CHECK: define i64 @local_cabi_aggregate_on_stack_and_registers(i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[STACK_ARG:.*]]) [[IGN:.*]] {
CHECK-DAG: %[[FIELD1_PTR:.*]] = inttoptr i64 %[[STACK_ARG]] to ptr
CHECK-DAG: load i64, ptr %[[FIELD1_PTR]]
CHECK-DAG: %[[FIELD2_ADDR:.*]] = add i64 %[[STACK_ARG]], 8
CHECK-DAG: %[[FIELD2_PTR:.*]] = inttoptr i64 %[[FIELD2_ADDR]] to ptr
CHECK-DAG: load i64, ptr %[[FIELD2_PTR]]
CHECK: }
CHECK-i386: define i32 @local_call_cabi_primitives_on_registers() [[IGN:.*]] {
CHECK-i386: %[[CALL:.*]] = call i32 @local_cabi_primitives_on_registers(i32 1, i32 2)
CHECK-i386: %[[RET:.*]] = add i32 %[[CALL]], {{.*}}
CHECK-i386: ret i32 %[[RET]]
CHECK-i386: }
CHECK: define i64 @local_call_cabi_aggregate_on_stack_and_registers() [[IGN:.*]] {
CHECK-DAG: %[[STACK:.*]] = alloca [16 x i8]
CHECK-DAG: %[[STACK_INT:.*]] = ptrtoint ptr %[[STACK]] to i64
CHECK-DAG: store i64 1, ptr %[[STACK]]
CHECK-DAG: %[[STACK_INT_8:.*]] = add i64 %[[STACK_INT]], 8
CHECK-DAG: %[[STACK_8:.*]] = inttoptr i64 %[[STACK_INT_8]] to ptr
CHECK-DAG: store i64 2, ptr %[[STACK_8]]
CHECK-DAG: = call i64 @local_cabi_aggregate_on_stack_and_registers(i64 1, i64 2, i64 3, i64 4, i64 5, i64 %[[STACK_INT]])
CHECK: }
; cabi_primitives_on_stack
CHECK: define <{ i64, i64 }> @local_raw_return_small_aggregate() [[IGN:.*]] {
CHECK-DAG: %[[RESULT:.*]] = call <{ i64, i64 }> @struct_initializer(i64 124, i64 123)
CHECK-DAG: ret <{ i64, i64 }> %[[RESULT]]
CHECK: }
CHECK-x86_64: define i64 @local_cabi_primitives_on_stack(i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[STACK_ARG1:.*]], i64 %[[STACK_ARG2:.*]]) [[IGN:.*]] {
CHECK-x86_64-DAG: %[[IGN:.*]] = add i64 %[[IGN:.*]]%[[STACK_ARG1]]
CHECK-x86_64-DAG: %[[IGN:.*]] = add i64 %[[IGN:.*]]%[[STACK_ARG2]]
CHECK-x86_64: }
CHECK: define i64 @local_call_raw_return_small_aggregate() [[IGN:.*]] {
CHECK: %[[RESULT:.*]] = call <{ i64, i64 }> @local_raw_return_small_aggregate()
CHECK-DAG: call i64 @OpaqueExtractvalue(<{ i64, i64 }> %[[RESULT]], i64 1)
CHECK: }
CHECK-x86_64: define i64 @local_call_cabi_primitives_on_stack() [[IGN:.*]] {
CHECK-x86_64-DAG: = call i64 @local_cabi_primitives_on_stack(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 [[SCALAR1:.*]], i64 [[SCALAR2:.*]])
CHECK-x86_64: }
CHECK: define [16 x i8] @local_cabi_return_small_aggregate() [[IGN:.*]] {
CHECK-DAG: %[[RETURN_ALLOCA:.*]] = alloca [16 x i8]
CHECK-DAG: %[[RETURN_ALLOCA_INT:.*]] = ptrtoint ptr %[[RETURN_ALLOCA]] to i64
CHECK-DAG: %[[RETURN_ALLOCA_INT_8:.*]] = add i64 %[[RETURN_ALLOCA_INT]], 8
CHECK-DAG: %[[RETURN_ALLOCA_8:.*]] = inttoptr i64 %[[RETURN_ALLOCA_INT_8]] to ptr
CHECK-DAG: store i64 124, ptr %[[RETURN_ALLOCA]]
CHECK-DAG: store i64 123, ptr %[[RETURN_ALLOCA_8]]
CHECK-DAG: %[[TO_RETURN:.*]] = load [16 x i8], ptr %[[RETURN_ALLOCA]]
CHECK-DAG: ret [16 x i8] %[[TO_RETURN]]
CHECK: }
CHECK-i386: define i32 @local_cabi_primitives_on_stack(i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[G:.*]], i32 %[[H:.*]]) [[IGN:.*]] {
CHECK-i386: %[[T1:.*]] = add i32 {{.*}}, %[[G]]
CHECK-i386: %[[T2:.*]] = add i32 %[[T1]], %[[H]]
CHECK-i386: ret i32 %[[T2]]
CHECK-i386: }
CHECK: define i64 @local_call_cabi_return_small_aggregate() [[IGN:.*]] {
CHECK-DAG: %[[RETURN_ALLOCA:.*]] = alloca [16 x i8]
CHECK-DAG: %[[RETURN_ALLOCA_INT:.*]] = ptrtoint ptr %[[RETURN_ALLOCA]] to i64
CHECK-DAG: %[[RETURN_VALUE:.*]] = call [16 x i8] @local_cabi_return_small_aggregate()
CHECK-DAG: store [16 x i8] %[[RETURN_VALUE]], ptr %[[RETURN_ALLOCA]]
CHECK-DAG: %[[RETURN_ALLOCA_INT_8:.*]] = add i64 %[[RETURN_ALLOCA_INT]], 8
CHECK-DAG: %[[RETURN_ALLOCA_8:.*]] = inttoptr i64 %[[RETURN_ALLOCA_INT_8]] to ptr
CHECK-DAG: %[[TO_RETURN:.*]] = load i64, ptr %[[RETURN_ALLOCA_8]]
CHECK: }
CHECK-i386: define i32 @local_call_cabi_primitives_on_stack() [[IGN:.*]] {
CHECK-i386: %[[CALL:.*]] = call i32 @local_cabi_primitives_on_stack(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8)
CHECK-i386: %[[RET:.*]] = add i32 %[[CALL]], {{.*}}
CHECK-i386: ret i32 %[[RET]]
CHECK-i386: }
CHECK: define [64 x i8] @local_cabi_return_big_aggregate() [[IGN:.*]] {
CHECK-DAG: %[[RETURN_ALLOCA:.*]] = alloca [64 x i8]
CHECK-DAG: %[[RETURN_ALLOCA_INT:.*]] = ptrtoint ptr %[[RETURN_ALLOCA]] to i64
CHECK-DAG: %[[RETURN_ALLOCA_INT_16:.*]] = add i64 %[[RETURN_ALLOCA_INT]], 16
CHECK-DAG: %[[RETURN_ALLOCA_16:.*]] = inttoptr i64 %[[RETURN_ALLOCA_INT_16]] to ptr
CHECK-DAG: store i64 123, ptr %[[RETURN_ALLOCA_16]]
CHECK-DAG: %[[TO_RETURN:.*]] = load [64 x i8], ptr %[[RETURN_ALLOCA]]
CHECK-DAG: ret [64 x i8] %[[TO_RETURN]]
CHECK: }
; cabi_aggregate_on_registers
CHECK: define i64 @local_call_cabi_return_big_aggregate() [[IGN:.*]] {
CHECK-DAG: %[[RETURN_ALLOCA:.*]] = alloca [64 x i8]
CHECK-DAG: %[[RETURN_ALLOCA_INT:.*]] = ptrtoint ptr %[[RETURN_ALLOCA]] to i64
CHECK-DAG: %[[RETURN_VALUE:.*]] = call [64 x i8] @local_cabi_return_big_aggregate()
CHECK-DAG: store [64 x i8] %[[RETURN_VALUE]], ptr %[[RETURN_ALLOCA]]
CHECK-DAG: %[[RETURN_ALLOCA_INT_16:.*]] = add i64 %[[RETURN_ALLOCA_INT]], 16
CHECK-DAG: %[[RETURN_ALLOCA_16:.*]] = inttoptr i64 %[[RETURN_ALLOCA_INT_16]] to ptr
CHECK-DAG: %[[TO_RETURN:.*]] = load i64, ptr %[[RETURN_ALLOCA_16]]
CHECK: }
CHECK-x86_64: define i64 @local_cabi_aggregate_on_registers(i64 %[[ARG1:.*]]) [[IGN:.*]] {
CHECK-x86_64-DAG: %[[FIELD1_PTR:.*]] = inttoptr i64 %[[ARG1]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[FIELD1_PTR]]
CHECK-x86_64-DAG: %[[FIELD2_ADDR:.*]] = add i64 %[[ARG1]], 8
CHECK-x86_64-DAG: %[[FIELD2_PTR:.*]] = inttoptr i64 %[[FIELD2_ADDR]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[FIELD2_PTR]], align 8
CHECK-x86_64: }
CHECK-x86_64: define i64 @local_call_cabi_aggregate_on_registers() [[IGN:.*]] {
CHECK-x86_64-DAG: %[[STACK:.*]] = alloca [16 x i8]
CHECK-x86_64-DAG: %[[STACK_INT:.*]] = ptrtoint ptr %[[STACK]] to i64
CHECK-x86_64-DAG: store i64 1, ptr %[[STACK]]
CHECK-x86_64-DAG: %[[STACK_INT_8:.*]] = add i64 %[[STACK_INT]], 8
CHECK-x86_64-DAG: %[[STACK_8:.*]] = inttoptr i64 %[[STACK_INT_8]] to ptr
CHECK-x86_64-DAG: store i64 2, ptr %[[STACK_8]]
CHECK-x86_64-DAG: = call i64 @local_cabi_aggregate_on_registers(i64 %[[STACK_INT]])
CHECK-x86_64: }
CHECK-i386: define i32 @local_cabi_aggregate_on_registers(i32 %[[PTR:.*]]) [[IGN:.*]] {
CHECK-i386: %[[A_PTR:.*]] = inttoptr i32 %[[PTR]] to ptr
CHECK-i386: %[[A:.*]] = load i32, ptr %[[A_PTR]]
CHECK-i386: %[[T1:.*]] = add i32 {{.*}}, %[[A]]
CHECK-i386: %[[B_OFF:.*]] = add i32 %[[PTR]], 4
CHECK-i386: %[[B_PTR:.*]] = inttoptr i32 %[[B_OFF]] to ptr
CHECK-i386: %[[B:.*]] = load i32, ptr %[[B_PTR]]
CHECK-i386: %[[T2:.*]] = add i32 %[[T1]], %[[B]]
CHECK-i386: ret i32 %[[T2]]
CHECK-i386: }
CHECK-i386: define i32 @local_call_cabi_aggregate_on_registers() [[IGN:.*]] {
CHECK-i386: %[[SLOT:.*]] = alloca [8 x i8]
CHECK-i386: %[[SLOT_INT:.*]] = ptrtoint ptr %[[SLOT]] to i32
CHECK-i386: %[[B_OFF:.*]] = add i32 %[[SLOT_INT]], 4
CHECK-i386: %[[B_PTR:.*]] = inttoptr i32 %[[B_OFF]] to ptr
CHECK-i386: store i32 2, ptr %[[B_PTR]]
CHECK-i386: %[[A_PTR:.*]] = inttoptr i32 %[[SLOT_INT]] to ptr
CHECK-i386: store i32 1, ptr %[[A_PTR]]
CHECK-i386: %[[CALL:.*]] = call i32 @local_cabi_aggregate_on_registers(i32 %[[SLOT_INT]])
CHECK-i386: %[[RET:.*]] = add i32 %[[CALL]], {{.*}}
CHECK-i386: ret i32 %[[RET]]
CHECK-i386: }
; cabi_aggregate_on_stack
CHECK-x86_64: define i64 @local_cabi_aggregate_on_stack(i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[STACK_ARG:.*]]) [[IGN:.*]] {
CHECK-x86_64-DAG: %[[FIELD1_PTR:.*]] = inttoptr i64 %[[STACK_ARG]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[FIELD1_PTR]]
CHECK-x86_64-DAG: %[[FIELD2_ADDR:.*]] = add i64 %[[STACK_ARG]], 8
CHECK-x86_64-DAG: %[[FIELD2_PTR:.*]] = inttoptr i64 %[[FIELD2_ADDR]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[FIELD2_PTR]]
CHECK-x86_64: }
CHECK-x86_64: define i64 @local_call_cabi_aggregate_on_stack() [[IGN:.*]] {
CHECK-x86_64-DAG: %[[STACK:.*]] = alloca [16 x i8]
CHECK-x86_64-DAG: %[[STACK_INT:.*]] = ptrtoint ptr %[[STACK]] to i64
CHECK-x86_64-DAG: store i64 1, ptr %[[STACK]]
CHECK-x86_64-DAG: %[[STACK_INT_8:.*]] = add i64 %[[STACK_INT]], 8
CHECK-x86_64-DAG: %[[STACK_8:.*]] = inttoptr i64 %[[STACK_INT_8]] to ptr
CHECK-x86_64-DAG: store i64 2, ptr %[[STACK_8]]
CHECK-x86_64-DAG: = call i64 @local_cabi_aggregate_on_stack(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 %[[STACK_INT]])
CHECK-x86_64: }
CHECK-i386: define i32 @local_cabi_aggregate_on_stack(i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[PTR:.*]]) [[IGN:.*]] {
CHECK-i386: %[[A_PTR:.*]] = inttoptr i32 %[[PTR]] to ptr
CHECK-i386: %[[A:.*]] = load i32, ptr %[[A_PTR]]
CHECK-i386: %[[T1:.*]] = add i32 {{.*}}, %[[A]]
CHECK-i386: %[[B_OFF:.*]] = add i32 %[[PTR]], 4
CHECK-i386: %[[B_PTR:.*]] = inttoptr i32 %[[B_OFF]] to ptr
CHECK-i386: %[[B:.*]] = load i32, ptr %[[B_PTR]]
CHECK-i386: %[[T2:.*]] = add i32 %[[T1]], %[[B]]
CHECK-i386: ret i32 %[[T2]]
CHECK-i386: }
CHECK-i386: define i32 @local_call_cabi_aggregate_on_stack() [[IGN:.*]] {
CHECK-i386: %[[SLOT:.*]] = alloca [8 x i8]
CHECK-i386: %[[SLOT_INT:.*]] = ptrtoint ptr %[[SLOT]] to i32
CHECK-i386: %[[B_OFF:.*]] = add i32 %[[SLOT_INT]], 4
CHECK-i386: %[[B_PTR:.*]] = inttoptr i32 %[[B_OFF]] to ptr
CHECK-i386: store i32 2, ptr %[[B_PTR]]
CHECK-i386: %[[A_PTR:.*]] = inttoptr i32 %[[SLOT_INT]] to ptr
CHECK-i386: store i32 1, ptr %[[A_PTR]]
CHECK-i386: %[[CALL:.*]] = call i32 @local_cabi_aggregate_on_stack(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 %[[SLOT_INT]])
CHECK-i386: %[[RET:.*]] = add i32 %[[CALL]], {{.*}}
CHECK-i386: ret i32 %[[RET]]
CHECK-i386: }
; cabi_aggregate_on_stack_and_registers
CHECK-x86_64: define i64 @local_cabi_aggregate_on_stack_and_registers(i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[IGN:.*]], i64 %[[STACK_ARG:.*]]) [[IGN:.*]] {
CHECK-x86_64-DAG: %[[FIELD1_PTR:.*]] = inttoptr i64 %[[STACK_ARG]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[FIELD1_PTR]]
CHECK-x86_64-DAG: %[[FIELD2_ADDR:.*]] = add i64 %[[STACK_ARG]], 8
CHECK-x86_64-DAG: %[[FIELD2_PTR:.*]] = inttoptr i64 %[[FIELD2_ADDR]] to ptr
CHECK-x86_64-DAG: load i64, ptr %[[FIELD2_PTR]]
CHECK-x86_64: }
CHECK-x86_64: define i64 @local_call_cabi_aggregate_on_stack_and_registers() [[IGN:.*]] {
CHECK-x86_64-DAG: %[[STACK:.*]] = alloca [16 x i8]
CHECK-x86_64-DAG: %[[STACK_INT:.*]] = ptrtoint ptr %[[STACK]] to i64
CHECK-x86_64-DAG: store i64 1, ptr %[[STACK]]
CHECK-x86_64-DAG: %[[STACK_INT_8:.*]] = add i64 %[[STACK_INT]], 8
CHECK-x86_64-DAG: %[[STACK_8:.*]] = inttoptr i64 %[[STACK_INT_8]] to ptr
CHECK-x86_64-DAG: store i64 2, ptr %[[STACK_8]]
CHECK-x86_64-DAG: = call i64 @local_cabi_aggregate_on_stack_and_registers(i64 1, i64 2, i64 3, i64 4, i64 5, i64 %[[STACK_INT]])
CHECK-x86_64: }
CHECK-i386: define i32 @local_cabi_aggregate_on_stack_and_registers(i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[IGN:.*]], i32 %[[PTR:.*]]) [[IGN:.*]] {
CHECK-i386: %[[A_PTR:.*]] = inttoptr i32 %[[PTR]] to ptr
CHECK-i386: %[[A:.*]] = load i32, ptr %[[A_PTR]]
CHECK-i386: %[[T1:.*]] = add i32 {{.*}}, %[[A]]
CHECK-i386: %[[B_OFF:.*]] = add i32 %[[PTR]], 4
CHECK-i386: %[[B_PTR:.*]] = inttoptr i32 %[[B_OFF]] to ptr
CHECK-i386: %[[B:.*]] = load i32, ptr %[[B_PTR]]
CHECK-i386: %[[T2:.*]] = add i32 %[[T1]], %[[B]]
CHECK-i386: ret i32 %[[T2]]
CHECK-i386: }
CHECK-i386: define i32 @local_call_cabi_aggregate_on_stack_and_registers() [[IGN:.*]] {
CHECK-i386: %[[SLOT:.*]] = alloca [8 x i8]
CHECK-i386: %[[SLOT_INT:.*]] = ptrtoint ptr %[[SLOT]] to i32
CHECK-i386: %[[B_OFF:.*]] = add i32 %[[SLOT_INT]], 4
CHECK-i386: %[[B_PTR:.*]] = inttoptr i32 %[[B_OFF]] to ptr
CHECK-i386: store i32 2, ptr %[[B_PTR]]
CHECK-i386: %[[A_PTR:.*]] = inttoptr i32 %[[SLOT_INT]] to ptr
CHECK-i386: store i32 1, ptr %[[A_PTR]]
CHECK-i386: %[[CALL:.*]] = call i32 @local_cabi_aggregate_on_stack_and_registers(i32 1, i32 2, i32 3, i32 4, i32 5, i32 %[[SLOT_INT]])
CHECK-i386: %[[RET:.*]] = add i32 %[[CALL]], {{.*}}
CHECK-i386: ret i32 %[[RET]]
CHECK-i386: }
; raw_return_small_aggregate
CHECK-x86_64: define <{ i64, i64 }> @local_raw_return_small_aggregate() [[IGN:.*]] {
CHECK-x86_64-DAG: %[[RESULT:.*]] = call <{ i64, i64 }> @struct_initializer(i64 124, i64 123)
CHECK-x86_64-DAG: ret <{ i64, i64 }> %[[RESULT]]
CHECK-x86_64: }
CHECK-x86_64: define i64 @local_call_raw_return_small_aggregate() [[IGN:.*]] {
CHECK-x86_64: %[[RESULT:.*]] = call <{ i64, i64 }> @local_raw_return_small_aggregate()
CHECK-x86_64-DAG: call i64 @OpaqueExtractvalue(<{ i64, i64 }> %[[RESULT]], i64 1)
CHECK-x86_64: }
; cabi_return_small_aggregate
CHECK-x86_64: define [16 x i8] @local_cabi_return_small_aggregate() [[IGN:.*]] {
CHECK-x86_64-DAG: %[[RETURN_ALLOCA:.*]] = alloca [16 x i8]
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_INT:.*]] = ptrtoint ptr %[[RETURN_ALLOCA]] to i64
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_INT_8:.*]] = add i64 %[[RETURN_ALLOCA_INT]], 8
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_8:.*]] = inttoptr i64 %[[RETURN_ALLOCA_INT_8]] to ptr
CHECK-x86_64-DAG: store i64 124, ptr %[[RETURN_ALLOCA]]
CHECK-x86_64-DAG: store i64 123, ptr %[[RETURN_ALLOCA_8]]
CHECK-x86_64-DAG: %[[TO_RETURN:.*]] = load [16 x i8], ptr %[[RETURN_ALLOCA]]
CHECK-x86_64-DAG: ret [16 x i8] %[[TO_RETURN]]
CHECK-x86_64: }
CHECK-x86_64: define i64 @local_call_cabi_return_small_aggregate() [[IGN:.*]] {
CHECK-x86_64-DAG: %[[RETURN_ALLOCA:.*]] = alloca [16 x i8]
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_INT:.*]] = ptrtoint ptr %[[RETURN_ALLOCA]] to i64
CHECK-x86_64-DAG: %[[RETURN_VALUE:.*]] = call [16 x i8] @local_cabi_return_small_aggregate()
CHECK-x86_64-DAG: store [16 x i8] %[[RETURN_VALUE]], ptr %[[RETURN_ALLOCA]]
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_INT_8:.*]] = add i64 %[[RETURN_ALLOCA_INT]], 8
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_8:.*]] = inttoptr i64 %[[RETURN_ALLOCA_INT_8]] to ptr
CHECK-x86_64-DAG: %[[TO_RETURN:.*]] = load i64, ptr %[[RETURN_ALLOCA_8]]
CHECK-x86_64: }
CHECK-i386: define [8 x i8] @local_cabi_return_small_aggregate() [[IGN:.*]] {
CHECK-i386: %[[SLOT:.*]] = alloca [8 x i8]
CHECK-i386: %[[SLOT_INT:.*]] = ptrtoint ptr %[[SLOT]] to i32
CHECK-i386: %[[SLOT_PTR:.*]] = inttoptr i32 %[[SLOT_INT]] to ptr
CHECK-i386: %[[BASE:.*]] = load i32, ptr %[[SLOT_PTR]]
CHECK-i386-DAG: store i32 124, ptr {{.*}}
CHECK-i386-DAG: %[[OFF:.*]] = add i32 %[[BASE]], 4
CHECK-i386-DAG: store i32 123, ptr {{.*}}
CHECK-i386: %[[RV:.*]] = load [8 x i8], ptr %[[SLOT]]
CHECK-i386: ret [8 x i8] %[[RV]]
CHECK-i386: }
CHECK-i386: define i32 @local_call_cabi_return_small_aggregate() [[IGN:.*]] {
CHECK-i386: %[[SLOT:.*]] = alloca [8 x i8]
CHECK-i386: %[[RV:.*]] = call [8 x i8] @local_cabi_return_small_aggregate()
CHECK-i386: store [8 x i8] %[[RV]], ptr %[[SLOT]]
CHECK-i386: %[[SLOT_INT:.*]] = ptrtoint ptr %[[SLOT]] to i32
CHECK-i386: %[[SLOT_PTR:.*]] = inttoptr i32 %[[SLOT_INT]] to ptr
CHECK-i386: %[[B:.*]] = load i32, ptr %[[SLOT_PTR]]
CHECK-i386: %[[RET:.*]] = add i32 {{.*}}%[[B]]
CHECK-i386: ret i32 %[[RET]]
CHECK-i386: }
; cabi_return_big_aggregate
CHECK-x86_64: define [64 x i8] @local_cabi_return_big_aggregate() [[IGN:.*]] {
CHECK-x86_64-DAG: %[[RETURN_ALLOCA:.*]] = alloca [64 x i8]
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_INT:.*]] = ptrtoint ptr %[[RETURN_ALLOCA]] to i64
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_INT_16:.*]] = add i64 %[[RETURN_ALLOCA_INT]], 16
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_16:.*]] = inttoptr i64 %[[RETURN_ALLOCA_INT_16]] to ptr
CHECK-x86_64-DAG: store i64 123, ptr %[[RETURN_ALLOCA_16]]
CHECK-x86_64-DAG: %[[TO_RETURN:.*]] = load [64 x i8], ptr %[[RETURN_ALLOCA]]
CHECK-x86_64-DAG: ret [64 x i8] %[[TO_RETURN]]
CHECK-x86_64: }
CHECK-x86_64: define i64 @local_call_cabi_return_big_aggregate() [[IGN:.*]] {
CHECK-x86_64-DAG: %[[RETURN_ALLOCA:.*]] = alloca [64 x i8]
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_INT:.*]] = ptrtoint ptr %[[RETURN_ALLOCA]] to i64
CHECK-x86_64-DAG: %[[RETURN_VALUE:.*]] = call [64 x i8] @local_cabi_return_big_aggregate()
CHECK-x86_64-DAG: store [64 x i8] %[[RETURN_VALUE]], ptr %[[RETURN_ALLOCA]]
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_INT_16:.*]] = add i64 %[[RETURN_ALLOCA_INT]], 16
CHECK-x86_64-DAG: %[[RETURN_ALLOCA_16:.*]] = inttoptr i64 %[[RETURN_ALLOCA_INT_16]] to ptr
CHECK-x86_64-DAG: %[[TO_RETURN:.*]] = load i64, ptr %[[RETURN_ALLOCA_16]]
CHECK-x86_64: }
CHECK-i386: define [28 x i8] @local_cabi_return_big_aggregate() [[IGN:.*]] {
CHECK-i386: %[[SLOT:.*]] = alloca [28 x i8]
CHECK-i386: %[[SLOT_INT:.*]] = ptrtoint ptr %[[SLOT]] to i32
CHECK-i386: %[[SLOT_PTR:.*]] = inttoptr i32 %[[SLOT_INT]] to ptr
CHECK-i386: %[[BASE:.*]] = load i32, ptr %[[SLOT_PTR]]
CHECK-i386: %[[OFF:.*]] = add i32 %[[BASE]], 8
CHECK-i386: store i32 123, ptr {{.*}}
CHECK-i386: %[[RV:.*]] = load [28 x i8], ptr %[[SLOT]]
CHECK-i386: ret [28 x i8] %[[RV]]
CHECK-i386: }
CHECK-i386: define i32 @local_call_cabi_return_big_aggregate() [[IGN:.*]] {
CHECK-i386: %[[SLOT:.*]] = alloca [28 x i8]
CHECK-i386: %[[RV:.*]] = call [28 x i8] @local_cabi_return_big_aggregate()
CHECK-i386: store [28 x i8] %[[RV]], ptr %[[SLOT]]
CHECK-i386: %[[SLOT_INT:.*]] = ptrtoint ptr %[[SLOT]] to i32
CHECK-i386: %[[OFF:.*]] = add i32 %[[SLOT_INT]], 4
CHECK-i386: %[[SLOT_PTR:.*]] = inttoptr i32 %[[OFF]] to ptr
CHECK-i386: %[[D:.*]] = load i32, ptr %[[SLOT_PTR]]
CHECK-i386: %[[RET:.*]] = add i32 {{.*}}%[[D]]
CHECK-i386: ret i32 %[[RET]]
CHECK-i386: }
@@ -0,0 +1,274 @@
#
# This file is distributed under the MIT License. See LICENSE.md for details.
#
---
Architecture: x86
Functions:
- Name: cabi_primitives_on_registers
Prototype:
Kind: DefinedType
Definition: "/TypeDefinitions/100004-CABIFunctionDefinition"
- Name: cabi_primitives_on_stack
Prototype:
Kind: DefinedType
Definition: "/TypeDefinitions/100005-CABIFunctionDefinition"
- Name: cabi_aggregate_on_registers
Prototype:
Kind: DefinedType
Definition: "/TypeDefinitions/100006-CABIFunctionDefinition"
- Name: cabi_aggregate_on_stack
Prototype:
Kind: DefinedType
Definition: "/TypeDefinitions/100007-CABIFunctionDefinition"
- Name: cabi_aggregate_on_stack_and_registers
Prototype:
Kind: DefinedType
Definition: "/TypeDefinitions/100008-CABIFunctionDefinition"
- Name: cabi_return_small_aggregate
Prototype:
Kind: DefinedType
Definition: "/TypeDefinitions/100010-CABIFunctionDefinition"
- Name: cabi_return_big_aggregate
Prototype:
Kind: DefinedType
Definition: "/TypeDefinitions/100012-CABIFunctionDefinition"
TypeDefinitions:
- Kind: StructDefinition
ID: 100003
Size: 8
Fields:
- Offset: 0
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Offset: 4
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Kind: CABIFunctionDefinition
ID: 100004
ABI: SystemV_x86
ReturnType:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
Arguments:
- Index: 0
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 1
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Kind: CABIFunctionDefinition
ID: 100005
ABI: SystemV_x86
ReturnType:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
Arguments:
- Index: 0
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 1
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 2
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 3
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 4
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 5
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 6
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 7
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Kind: CABIFunctionDefinition
ID: 100006
ABI: SystemV_x86
ReturnType:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
Arguments:
- Index: 0
Type:
Kind: DefinedType
Definition: "/TypeDefinitions/100003-StructDefinition"
- Kind: CABIFunctionDefinition
ID: 100007
ABI: SystemV_x86
ReturnType:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
Arguments:
- Index: 0
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 1
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 2
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 3
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 4
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 5
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 6
Type:
Kind: DefinedType
Definition: "/TypeDefinitions/100003-StructDefinition"
- Kind: CABIFunctionDefinition
ID: 100008
ABI: SystemV_x86
ReturnType:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
Arguments:
- Index: 0
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 1
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 2
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 3
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 4
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Index: 5
Type:
Kind: DefinedType
Definition: "/TypeDefinitions/100003-StructDefinition"
- Kind: StructDefinition
ID: 100009
Size: 8
Fields:
- Offset: 0
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Offset: 4
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Kind: CABIFunctionDefinition
ID: 100010
ABI: SystemV_x86
ReturnType:
Kind: DefinedType
Definition: "/TypeDefinitions/100009-StructDefinition"
Arguments: []
- Kind: StructDefinition
ID: 100011
Size: 28
Fields:
- Offset: 0
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Offset: 4
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Offset: 8
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Offset: 12
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Offset: 16
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Offset: 20
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Offset: 24
Type:
Kind: PrimitiveType
PrimitiveKind: Generic
Size: 4
- Kind: CABIFunctionDefinition
ID: 100012
ABI: SystemV_x86
ReturnType:
Kind: DefinedType
Definition: "/TypeDefinitions/100011-StructDefinition"
Arguments: []