Added $$sysclock() builtin.

This commit is contained in:
Christoffer Lerno
2022-08-10 01:24:16 +02:00
parent 3eee9ddc06
commit 9473adbc35
6 changed files with 12 additions and 0 deletions

View File

@@ -762,6 +762,7 @@ typedef enum
BUILTIN_MEMCOPY,
BUILTIN_MEMSET,
BUILTIN_SYSCALL,
BUILTIN_SYSCLOCK,
BUILTIN_NONE,
NUMBER_OF_BUILTINS = BUILTIN_NONE,
} BuiltinFunction;

View File

@@ -617,6 +617,8 @@ void llvm_codegen_setup()
intrinsic_id.umax = lookup_intrinsic("llvm.umax");
intrinsic_id.umin = lookup_intrinsic("llvm.umin");
intrinsic_id.readcyclecounter = lookup_intrinsic("llvm.readcyclecounter");
intrinsic_id.memset = lookup_intrinsic("llvm.memset");
intrinsic_id.memcpy = lookup_intrinsic("llvm.memcpy");

View File

@@ -4154,6 +4154,7 @@ static void llvm_emit_intrinsic_expr(GenContext *c, unsigned intrinsic, BEValue
{
call_args = 1;
call_type[0] = llvm_get_type(c, expr->type);
if (intrinsic == intrinsic_id.readcyclecounter) call_args = 0;
}
else if (intrinsic == intrinsic_id.memcpy)
{
@@ -4344,6 +4345,8 @@ unsigned llvm_get_intrinsic(BuiltinFunction func)
case BUILTIN_UNREACHABLE:
case BUILTIN_STACKTRACE:
UNREACHABLE
case BUILTIN_SYSCLOCK:
return intrinsic_id.readcyclecounter;
case BUILTIN_TRAP:
return intrinsic_id.trap;
case BUILTIN_CEIL:

View File

@@ -178,6 +178,7 @@ typedef struct
unsigned lifetime_end;
unsigned memcpy;
unsigned memset;
unsigned readcyclecounter;
} LLVMIntrinsics;
extern LLVMIntrinsics intrinsic_id;

View File

@@ -2293,6 +2293,7 @@ static inline unsigned builtin_expected_args(BuiltinFunction func)
case BUILTIN_UNREACHABLE:
case BUILTIN_TRAP:
case BUILTIN_STACKTRACE:
case BUILTIN_SYSCLOCK:
return 0;
case BUILTIN_SYSCALL:
case BUILTIN_CEIL:
@@ -2454,6 +2455,9 @@ static inline bool sema_expr_analyse_builtin_call(SemaContext *context, Expr *ex
case BUILTIN_TRAP:
rtype = type_void;
break;
case BUILTIN_SYSCLOCK:
rtype = type_ulong;
break;
case BUILTIN_SYSCALL:
if (arg_count > 7)
{

View File

@@ -177,6 +177,7 @@ void symtab_init(uint32_t capacity)
kw_mainstub = KW_DEF("_$mainstub");
builtin_list[BUILTIN_TRAP] = KW_DEF("trap");
builtin_list[BUILTIN_SYSCLOCK] = KW_DEF("sysclock");
builtin_list[BUILTIN_UNREACHABLE] = KW_DEF("unreachable");
builtin_list[BUILTIN_STACKTRACE] = KW_DEF("stacktrace");
builtin_list[BUILTIN_CEIL] = KW_DEF("ceil");