diff --git a/lib/irgen.ml b/lib/irgen.ml index 8898146..d516afc 100644 --- a/lib/irgen.ml +++ b/lib/irgen.ml @@ -320,6 +320,16 @@ let rec build_expr expr (vars : variable StringMap.t) var_types the_module build list; llist | SStringLit s -> L.build_global_stringptr s "str" builder + | SIndex (list_expr, index_expr) -> + let list_val = build_expr list_expr vars var_types the_module builder in + let index_val = build_expr index_expr vars var_types the_module builder in + let elem_ptr = L.build_gep list_val [| index_val |] "elem_ptr" builder in + + (match fst expr with + | RInt | RFloat | RBool | RChar | REnumType _ -> + L.build_load elem_ptr "elem_val" builder + | RUserType _ -> elem_ptr + | _ -> failwith "Unsupported list type for indexing") | e -> raise (Failure (Printf.sprintf "expr not implemented: %s" (Utils.string_of_sexpr e))) diff --git a/test/ir/test_list.ml b/test/ir/test_list.ml index 98c632e..2773e80 100644 --- a/test/ir/test_list.ml +++ b/test/ir/test_list.ml @@ -98,6 +98,31 @@ let tests = in (* _write_to_file actual "actual.out"; *) assert_equal expected actual ~printer) + ; ("local_int_list_index" + >:: fun _ -> + let sast = get_sast "fun function() -> int {let a := [1, 2]; return a[0];}" in + let mdl = Irgen.translate sast in + let actual = L.string_of_llmodule mdl in + let expected = + "; ModuleID = 'Fly'\n\ + source_filename = \"Fly\"\n\n\ + define i32 @function() {\n\ + entry:\n\ + \ %list = alloca i32, i32 2, align 4\n\ + \ %index = getelementptr inbounds i32, i32* %list, i32 0\n\ + \ store i32 1, i32* %index, align 4\n\ + \ %index1 = getelementptr inbounds i32, i32* %list, i32 1\n\ + \ store i32 2, i32* %index1, align 4\n\ + \ %a = alloca i32*, align 8\n\ + \ store i32* %list, i32** %a, align 8\n\ + \ %a2 = load i32*, i32** %a, align 8\n\ + \ %elem_ptr = getelementptr i32, i32* %a2, i32 0\n\ + \ %elem_val = load i32, i32* %elem_ptr, align 4\n\ + \ ret i32 %elem_val\n\ + }\n" + in + (* _write_to_file actual "actual.out"; *) + assert_equal expected actual ~printer) ] ;;