aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-04-18 11:22:31 +0100
committergingerBill <bill@gingerbill.org>2024-04-18 11:22:31 +0100
commitece78d22d2b549116a0884d3578972b8f389f983 (patch)
tree9d6b8c38235ea44b174d9d8a37ea72c8db504978 /src
parent5c52f3cf2fee63f860914d062555ed87c1dba9d8 (diff)
Add `-no-type-assert` and `ODIN_NO_TYPE_ASSERT`
Diffstat (limited to 'src')
-rw-r--r--src/build_settings.cpp1
-rw-r--r--src/checker.cpp1
-rw-r--r--src/llvm_backend_expr.cpp4
-rw-r--r--src/llvm_backend_utility.cpp72
-rw-r--r--src/main.cpp9
5 files changed, 51 insertions, 36 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index 106ae8a28..b806adcd6 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -382,6 +382,7 @@ struct BuildContext {
bool keep_temp_files;
bool ignore_unknown_attributes;
bool no_bounds_check;
+ bool no_type_assert;
bool no_dynamic_literals;
bool no_output_files;
bool no_crt;
diff --git a/src/checker.cpp b/src/checker.cpp
index e82836b2a..b7fe2b903 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -1112,6 +1112,7 @@ gb_internal void init_universal(void) {
add_global_bool_constant("ODIN_DISABLE_ASSERT", bc->ODIN_DISABLE_ASSERT);
add_global_bool_constant("ODIN_DEFAULT_TO_NIL_ALLOCATOR", bc->ODIN_DEFAULT_TO_NIL_ALLOCATOR);
add_global_bool_constant("ODIN_NO_BOUNDS_CHECK", build_context.no_bounds_check);
+ add_global_bool_constant("ODIN_NO_TYPE_ASSERT", build_context.no_type_assert);
add_global_bool_constant("ODIN_DEFAULT_TO_PANIC_ALLOCATOR", bc->ODIN_DEFAULT_TO_PANIC_ALLOCATOR);
add_global_bool_constant("ODIN_NO_DYNAMIC_LITERALS", bc->no_dynamic_literals);
add_global_bool_constant("ODIN_NO_CRT", bc->no_crt);
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index ad28f2e5e..edd5daeca 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -3116,7 +3116,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
Type *dst_type = type;
- if ((p->state_flags & StateFlag_no_type_assert) == 0) {
+ if (!build_context.no_type_assert && (p->state_flags & StateFlag_no_type_assert) == 0) {
lbValue src_tag = {};
lbValue dst_tag = {};
if (is_type_union_maybe_pointer(src_type)) {
@@ -3156,7 +3156,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
v = lb_emit_load(p, v);
}
lbValue data_ptr = lb_emit_struct_ev(p, v, 0);
- if ((p->state_flags & StateFlag_no_type_assert) == 0) {
+ if (!build_context.no_type_assert && (p->state_flags & StateFlag_no_type_assert) == 0) {
GB_ASSERT(!build_context.no_rtti);
lbValue any_id = lb_emit_struct_ev(p, v, 1);
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index 0d1db2cbf..2dd7fbc38 100644
--- a/src/llvm_backend_utility.cpp
+++ b/src/llvm_backend_utility.cpp
@@ -728,29 +728,31 @@ gb_internal lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type
lb_start_block(p, end_block);
if (!is_tuple) {
- GB_ASSERT((p->state_flags & StateFlag_no_type_assert) == 0);
- // NOTE(bill): Panic on invalid conversion
- Type *dst_type = tuple->Tuple.variables[0]->type;
-
- isize arg_count = 7;
- if (build_context.no_rtti) {
- arg_count = 4;
- }
+ if (!build_context.no_type_assert) {
+ GB_ASSERT((p->state_flags & StateFlag_no_type_assert) == 0);
+ // NOTE(bill): Panic on invalid conversion
+ Type *dst_type = tuple->Tuple.variables[0]->type;
+
+ isize arg_count = 7;
+ if (build_context.no_rtti) {
+ arg_count = 4;
+ }
- lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1));
- auto args = array_make<lbValue>(permanent_allocator(), arg_count);
- args[0] = ok;
+ lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1));
+ auto args = array_make<lbValue>(permanent_allocator(), arg_count);
+ args[0] = ok;
- args[1] = lb_const_string(m, get_file_path_string(pos.file_id));
- args[2] = lb_const_int(m, t_i32, pos.line);
- args[3] = lb_const_int(m, t_i32, pos.column);
+ args[1] = lb_const_string(m, get_file_path_string(pos.file_id));
+ args[2] = lb_const_int(m, t_i32, pos.line);
+ args[3] = lb_const_int(m, t_i32, pos.column);
- if (!build_context.no_rtti) {
- args[4] = lb_typeid(m, src_type);
- args[5] = lb_typeid(m, dst_type);
- args[6] = lb_emit_conv(p, value_, t_rawptr);
+ if (!build_context.no_rtti) {
+ args[4] = lb_typeid(m, src_type);
+ args[5] = lb_typeid(m, dst_type);
+ args[6] = lb_emit_conv(p, value_, t_rawptr);
+ }
+ lb_emit_runtime_call(p, "type_assertion_check2", args);
}
- lb_emit_runtime_call(p, "type_assertion_check2", args);
return lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 0));
}
@@ -806,25 +808,27 @@ gb_internal lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *ty
if (!is_tuple) {
// NOTE(bill): Panic on invalid conversion
- lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1));
+ if (!build_context.no_type_assert) {
+ lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1));
- isize arg_count = 7;
- if (build_context.no_rtti) {
- arg_count = 4;
- }
- auto args = array_make<lbValue>(permanent_allocator(), arg_count);
- args[0] = ok;
+ isize arg_count = 7;
+ if (build_context.no_rtti) {
+ arg_count = 4;
+ }
+ auto args = array_make<lbValue>(permanent_allocator(), arg_count);
+ args[0] = ok;
- args[1] = lb_const_string(m, get_file_path_string(pos.file_id));
- args[2] = lb_const_int(m, t_i32, pos.line);
- args[3] = lb_const_int(m, t_i32, pos.column);
+ args[1] = lb_const_string(m, get_file_path_string(pos.file_id));
+ args[2] = lb_const_int(m, t_i32, pos.line);
+ args[3] = lb_const_int(m, t_i32, pos.column);
- if (!build_context.no_rtti) {
- args[4] = any_typeid;
- args[5] = dst_typeid;
- args[6] = lb_emit_struct_ev(p, value, 0);
+ if (!build_context.no_rtti) {
+ args[4] = any_typeid;
+ args[5] = dst_typeid;
+ args[6] = lb_emit_struct_ev(p, value, 0);
+ }
+ lb_emit_runtime_call(p, "type_assertion_check2", args);
}
- lb_emit_runtime_call(p, "type_assertion_check2", args);
return lb_addr(lb_emit_struct_ep(p, v.addr, 0));
}
diff --git a/src/main.cpp b/src/main.cpp
index 063b6c8b3..53103ce3a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -243,6 +243,7 @@ enum BuildFlagKind {
BuildFlag_Debug,
BuildFlag_DisableAssert,
BuildFlag_NoBoundsCheck,
+ BuildFlag_NoTypeAssert,
BuildFlag_NoDynamicLiterals,
BuildFlag_NoCRT,
BuildFlag_NoEntryPoint,
@@ -436,6 +437,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
add_flag(&build_flags, BuildFlag_Debug, str_lit("debug"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_DisableAssert, str_lit("disable-assert"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None, Command__does_check);
+ add_flag(&build_flags, BuildFlag_NoTypeAssert, str_lit("no-type-assert"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_NoThreadLocal, str_lit("no-thread-local"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_NoDynamicLiterals, str_lit("no-dynamic-literals"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None, Command__does_build);
@@ -1013,6 +1015,9 @@ gb_internal bool parse_build_flags(Array<String> args) {
case BuildFlag_NoBoundsCheck:
build_context.no_bounds_check = true;
break;
+ case BuildFlag_NoTypeAssert:
+ build_context.no_type_assert = true;
+ break;
case BuildFlag_NoDynamicLiterals:
build_context.no_dynamic_literals = true;
break;
@@ -1850,6 +1855,10 @@ gb_internal void print_show_help(String const arg0, String const &command) {
print_usage_line(2, "Disables bounds checking program wide.");
print_usage_line(0, "");
+ print_usage_line(1, "-no-type-assert");
+ print_usage_line(2, "Disables type assertion checking program wide.");
+ print_usage_line(0, "");
+
print_usage_line(1, "-no-crt");
print_usage_line(2, "Disables automatic linking with the C Run Time.");
print_usage_line(0, "");