Fixes syscall intrinsic on macOS they use a slightly different section + register for the id

This commit is contained in:
Platin21
2022-01-05 16:49:58 +01:00
parent 00ff1fbca2
commit 7a14acaa01
+39 -18
View File
@@ -2058,26 +2058,47 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv,
break; break;
case TargetArch_arm64: case TargetArch_arm64:
{ {
GB_ASSERT(arg_count <= 7); GB_ASSERT(arg_count <= 7);
char asm_string[] = "svc #0"; if(build_context.metrics.os == TargetOs_darwin) {
gbString constraints = gb_string_make(heap_allocator(), "={x0}"); char asm_string[] = "svc #0x80";
for (unsigned i = 0; i < arg_count; i++) { gbString constraints = gb_string_make(heap_allocator(), "={x0}");
constraints = gb_string_appendc(constraints, ",{"); for (unsigned i = 0; i < arg_count; i++) {
static char const *regs[] = { constraints = gb_string_appendc(constraints, ",{");
"x8", static char const *regs[] = {
"x0", "x16",
"x1", "x0",
"x2", "x1",
"x3", "x2",
"x4", "x3",
"x5", "x4",
}; "x5",
constraints = gb_string_appendc(constraints, regs[i]); };
constraints = gb_string_appendc(constraints, "}"); constraints = gb_string_appendc(constraints, regs[i]);
} constraints = gb_string_appendc(constraints, "}");
}
inline_asm = llvm_get_inline_asm(func_type, make_string_c(asm_string), make_string_c(constraints)); inline_asm = llvm_get_inline_asm(func_type, make_string_c(asm_string), make_string_c(constraints));
} else {
char asm_string[] = "svc #0";
gbString constraints = gb_string_make(heap_allocator(), "={x0}");
for (unsigned i = 0; i < arg_count; i++) {
constraints = gb_string_appendc(constraints, ",{");
static char const *regs[] = {
"x8",
"x0",
"x1",
"x2",
"x3",
"x4",
"x5",
};
constraints = gb_string_appendc(constraints, regs[i]);
constraints = gb_string_appendc(constraints, "}");
}
inline_asm = llvm_get_inline_asm(func_type, make_string_c(asm_string), make_string_c(constraints));
}
} }
break; break;
default: default: