aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-03-24 15:51:17 +0000
committergingerBill <bill@gingerbill.org>2020-03-24 15:51:17 +0000
commitb7893082ce138f5670d52b6c267d0a6599694166 (patch)
treefcfc142893a3e6e46134fbcb670137ad29692aaf /src/llvm_backend.cpp
parent6bfe9b66562f05fe262c08f7b71eb9fdaa5c11cc (diff)
Allow map indices to be referenced `&m[key]` and return a valid pointer if it exists otherwise `nil`
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 2e36a9b99..47c55f769 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -107,7 +107,19 @@ lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
}
switch (addr.kind) {
- case lbAddr_Map:
+ case lbAddr_Map: {
+ Type *map_type = base_type(addr.map.type);
+ lbValue h = lb_gen_map_header(p, addr.addr, map_type);
+ lbValue key = lb_gen_map_key(p, addr.map.key, map_type->Map.key);
+
+ auto args = array_make<lbValue>(heap_allocator(), 2);
+ args[0] = h;
+ args[1] = key;
+
+ lbValue ptr = lb_emit_runtime_call(p, "__dynamic_map_get", args);
+
+ return lb_emit_conv(p, ptr, alloc_type_pointer(map_type->Map.value));
+ }
case lbAddr_BitField: {
lbValue v = lb_addr_load(p, addr);
return lb_address_from_load_or_generate_local(p, v);