aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 324473be3..7a3596070 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -9871,7 +9871,7 @@ lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type, TokenPos p
Type *dst_type = tuple->Tuple.variables[0]->type;
lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1));
- auto args = array_make<lbValue>(permanent_allocator(), 6);
+ auto args = array_make<lbValue>(permanent_allocator(), 7);
args[0] = ok;
args[1] = lb_const_string(m, pos.file);
@@ -9880,7 +9880,8 @@ lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type, TokenPos p
args[4] = lb_typeid(m, src_type);
args[5] = lb_typeid(m, dst_type);
- lb_emit_runtime_call(p, "type_assertion_check", args);
+ args[6] = lb_emit_conv(p, value_, t_rawptr);
+ lb_emit_runtime_call(p, "type_assertion_check2", args);
}
return lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 0));
@@ -9932,7 +9933,7 @@ lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *type, TokenPos
// NOTE(bill): Panic on invalid conversion
lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1));
- auto args = array_make<lbValue>(permanent_allocator(), 6);
+ auto args = array_make<lbValue>(permanent_allocator(), 7);
args[0] = ok;
args[1] = lb_const_string(m, pos.file);
@@ -9941,7 +9942,8 @@ lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *type, TokenPos
args[4] = any_typeid;
args[5] = dst_typeid;
- lb_emit_runtime_call(p, "type_assertion_check", args);
+ args[6] = lb_emit_struct_ev(p, value, 0);;
+ lb_emit_runtime_call(p, "type_assertion_check2", args);
return lb_addr(lb_emit_struct_ep(p, v.addr, 0));
}
@@ -10446,14 +10448,38 @@ lbValue lb_gen_map_header(lbProcedure *p, lbValue map_val_ptr, Type *map_type) {
}
lbValue lb_const_hash(lbModule *m, lbValue key, Type *key_type) {
+ if (true) {
+ return {};
+ }
+
lbValue hashed_key = {};
+
if (lb_is_const(key)) {
u64 hash = 0xcbf29ce484222325;
- if (is_type_string(key_type)) {
+ if (is_type_cstring(key_type)) {
size_t length = 0;
char const *text = LLVMGetAsString(key.value, &length);
hash = fnv64a(text, cast(isize)length);
+ } else if (is_type_string(key_type)) {
+ unsigned data_indices[] = {0};
+ unsigned len_indices[] = {1};
+ LLVMValueRef data = LLVMConstExtractValue(key.value, data_indices, gb_count_of(data_indices));
+ LLVMValueRef len = LLVMConstExtractValue(key.value, len_indices, gb_count_of(len_indices));
+ isize length = LLVMConstIntGetSExtValue(len);
+ char const *text = nullptr;
+ if (length != 0) {
+ if (LLVMGetConstOpcode(data) != LLVMGetElementPtr) {
+ return {};
+ }
+ // TODO(bill): THIS IS BROKEN! THIS NEEDS FIXING :P
+
+ size_t ulength = 0;
+ text = LLVMGetAsString(data, &ulength);
+ gb_printf_err("%td %td %s\n", length, ulength, text);
+ length = gb_min(length, cast(isize)ulength);
+ }
+ hash = fnv64a(text, cast(isize)length);
} else {
return {};
}