aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-08-05 11:57:33 +0100
committergingerBill <bill@gingerbill.org>2022-08-05 11:57:33 +0100
commit576914aee1565618d8448a2bbc3cbef0c4acc4d1 (patch)
tree4331a096e8f6f487ffec6216f73b0d7352dd2c13 /src
parent8171f8209a2deadc286ef7165d4a5b174ff82303 (diff)
Make `unreachable()` a built-in compiler-level procedure
Diffstat (limited to 'src')
-rw-r--r--src/check_builtin.cpp1
-rw-r--r--src/check_stmt.cpp13
-rw-r--r--src/checker_builtin_procs.hpp6
-rw-r--r--src/llvm_backend_proc.cpp5
4 files changed, 19 insertions, 6 deletions
diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp
index 8108604ba..8f8f7f9e2 100644
--- a/src/check_builtin.cpp
+++ b/src/check_builtin.cpp
@@ -3569,6 +3569,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
operand->mode = Addressing_NoValue;
break;
+ case BuiltinProc_unreachable:
case BuiltinProc_trap:
case BuiltinProc_debug_trap:
operand->mode = Addressing_NoValue;
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp
index a6f6f1a7d..451325324 100644
--- a/src/check_stmt.cpp
+++ b/src/check_stmt.cpp
@@ -1,8 +1,5 @@
-bool is_diverging_stmt(Ast *stmt) {
- if (stmt->kind != Ast_ExprStmt) {
- return false;
- }
- Ast *expr = unparen_expr(stmt->ExprStmt.expr);
+bool is_diverging_expr(Ast *expr) {
+ expr = unparen_expr(expr);
if (expr->kind != Ast_CallExpr) {
return false;
}
@@ -26,6 +23,12 @@ bool is_diverging_stmt(Ast *stmt) {
t = base_type(t);
return t != nullptr && t->kind == Type_Proc && t->Proc.diverging;
}
+bool is_diverging_stmt(Ast *stmt) {
+ if (stmt->kind != Ast_ExprStmt) {
+ return false;
+ }
+ return is_diverging_expr(stmt->ExprStmt.expr);
+}
bool contains_deferred_call(Ast *node) {
if (node->viral_state_flags & ViralStateFlag_ContainsDeferredProcedure) {
diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp
index 3ea6fcdd5..8dd021255 100644
--- a/src/checker_builtin_procs.hpp
+++ b/src/checker_builtin_procs.hpp
@@ -40,6 +40,8 @@ enum BuiltinProcId {
BuiltinProc_hadamard_product,
BuiltinProc_matrix_flatten,
+ BuiltinProc_unreachable,
+
BuiltinProc_DIRECTIVE, // NOTE(bill): This is used for specialized hash-prefixed procedures
// "Intrinsics"
@@ -330,6 +332,8 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
{STR_LIT("hadamard_product"), 2, false, Expr_Expr, BuiltinProcPkg_builtin},
{STR_LIT("matrix_flatten"), 1, false, Expr_Expr, BuiltinProcPkg_builtin},
+ {STR_LIT("unreachable"), 0, false, Expr_Expr, BuiltinProcPkg_builtin, /*diverging*/true},
+
{STR_LIT(""), 0, true, Expr_Expr, BuiltinProcPkg_builtin}, // DIRECTIVE
@@ -341,7 +345,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
{STR_LIT("alloca"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics},
{STR_LIT("cpu_relax"), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
- {STR_LIT("trap"), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics, /*diverging*/true},
+ {STR_LIT("trap"), 0, false, Expr_Expr, BuiltinProcPkg_intrinsics, /*diverging*/true},
{STR_LIT("debug_trap"), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics, /*diverging*/false},
{STR_LIT("read_cycle_counter"), 0, false, Expr_Expr, BuiltinProcPkg_intrinsics},
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index 0b0c0794b..a026356a2 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -1851,6 +1851,11 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv,
return lb_emit_matrix_flatten(p, m, tv.type);
}
+ case BuiltinProc_unreachable:
+ LLVMBuildUnreachable(p->builder);
+ return {};
+
+
// "Intrinsics"
case BuiltinProc_alloca: