diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ba8d99cf0..a22a9291e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,6 +52,11 @@ jobs: cd test python3.exe src/tester.py ..\build\${{ matrix.build_type }}\c3c.exe test_suite/ + - name: Compile run stdlib tests + run: | + cd test + ..\build\${{ matrix.build_type }}\c3c.exe compile-test stdlib\conv_tests.c3 -g1 --safe + - name: upload artifacts uses: actions/upload-artifact@v3 with: diff --git a/lib/std/libc.c3 b/lib/std/libc.c3 index f8e2775d3..d6e91a6e9 100644 --- a/lib/std/libc.c3 +++ b/lib/std/libc.c3 @@ -64,9 +64,14 @@ extern fn void srand(uint seed); define JmpBuf = CInt[$$JMP_BUF_SIZE]; -extern fn CInt setjmp(JmpBuf* buffer); extern fn void longjmp(JmpBuf* buffer, CInt value); - +$if (env::OS_TYPE == OsType.WIN32): +// TODO win32 aarch64 +extern fn CInt _setjmp(void* frameptr, JmpBuf* buffer); +macro CInt setjmp(JmpBuf* buffer) = _setjmp($$frameaddress(), buffer); +$else: +extern fn CInt setjmp(JmpBuf* buffer); +$endif; // MB functions omitted // string diff --git a/src/compiler/enums.h b/src/compiler/enums.h index 7f08d1700..d899c475c 100644 --- a/src/compiler/enums.h +++ b/src/compiler/enums.h @@ -841,6 +841,7 @@ typedef enum BUILTIN_FLOOR, BUILTIN_FMA, BUILTIN_FMULADD, + BUILTIN_FRAMEADDRESS, BUILTIN_FSHL, BUILTIN_FSHR, BUILTIN_GET_ROUNDING_MODE, diff --git a/src/compiler/llvm_codegen.c b/src/compiler/llvm_codegen.c index d9954154a..70032454a 100644 --- a/src/compiler/llvm_codegen.c +++ b/src/compiler/llvm_codegen.c @@ -637,6 +637,7 @@ static void llvm_codegen_setup() intrinsic_id.floor = lookup_intrinsic("llvm.floor"); intrinsic_id.flt_rounds = lookup_intrinsic("llvm.flt.rounds"); intrinsic_id.fma = lookup_intrinsic("llvm.fma"); + intrinsic_id.frameaddress = lookup_intrinsic("llvm.frameaddress"); intrinsic_id.fshl = lookup_intrinsic("llvm.fshl"); intrinsic_id.fshr = lookup_intrinsic("llvm.fshr"); intrinsic_id.lifetime_end = lookup_intrinsic("llvm.lifetime.end"); diff --git a/src/compiler/llvm_codegen_builtins.c b/src/compiler/llvm_codegen_builtins.c index 24dd44bfd..169dc0431 100644 --- a/src/compiler/llvm_codegen_builtins.c +++ b/src/compiler/llvm_codegen_builtins.c @@ -449,6 +449,14 @@ void llvm_emit_builtin_call(GenContext *c, BEValue *result_value, Expr *expr) case BUILTIN_SHUFFLEVECTOR: llvm_emit_shufflevector(c, result_value, expr); return; + case BUILTIN_FRAMEADDRESS: + { + LLVMTypeRef type[2] = { llvm_get_type(c, type_voidptr), llvm_get_type(c, type_int) }; + LLVMValueRef value = LLVMConstNull(type[1]); + value = llvm_emit_call_intrinsic(c, intrinsic_id.frameaddress, type, 1, &value, 1); + llvm_value_set(result_value, value, expr->type); + return; + } case BUILTIN_REVERSE: llvm_emit_reverse(c, result_value, expr); return; diff --git a/src/compiler/llvm_codegen_internal.h b/src/compiler/llvm_codegen_internal.h index d90766a59..9f2477cab 100644 --- a/src/compiler/llvm_codegen_internal.h +++ b/src/compiler/llvm_codegen_internal.h @@ -134,6 +134,7 @@ typedef struct unsigned floor; unsigned flt_rounds; unsigned fma; + unsigned frameaddress; unsigned fshl; unsigned fshr; unsigned lifetime_end; diff --git a/src/compiler/sema_builtins.c b/src/compiler/sema_builtins.c index fac69bc08..9773212dc 100644 --- a/src/compiler/sema_builtins.c +++ b/src/compiler/sema_builtins.c @@ -284,6 +284,9 @@ bool sema_expr_analyse_builtin_call(SemaContext *context, Expr *expr) case BUILTIN_GET_ROUNDING_MODE: rtype = type_int; break; + case BUILTIN_FRAMEADDRESS: + rtype = type_voidptr; + break; case BUILTIN_SET_ROUNDING_MODE: if (!sema_check_builtin_args(args, (BuiltinArg[]) { BA_INTEGER }, @@ -551,6 +554,7 @@ static inline unsigned builtin_expected_args(BuiltinFunction func) case BUILTIN_SYSCLOCK: case BUILTIN_TRAP: case BUILTIN_UNREACHABLE: + case BUILTIN_FRAMEADDRESS: return 0; case BUILTIN_ABS: case BUILTIN_BITREVERSE: diff --git a/src/compiler/symtab.c b/src/compiler/symtab.c index 06516f450..b3ef2a6d1 100644 --- a/src/compiler/symtab.c +++ b/src/compiler/symtab.c @@ -203,6 +203,7 @@ void symtab_init(uint32_t capacity) builtin_list[BUILTIN_FLOOR] = KW_DEF("floor"); builtin_list[BUILTIN_FMA] = KW_DEF("fma"); builtin_list[BUILTIN_FMULADD] = KW_DEF("fmuladd"); + builtin_list[BUILTIN_FRAMEADDRESS] = KW_DEF("frameaddress"); builtin_list[BUILTIN_FSHL] = KW_DEF("fshl"); builtin_list[BUILTIN_FSHR] = KW_DEF("fshr"); builtin_list[BUILTIN_GET_ROUNDING_MODE] = KW_DEF("get_rounding_mode");