From f77ff258c159ea81c897dc99cbe72eebd3b2a31c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3fer=20Fannar=20Bj=C3=B6rnsson?= Date: Fri, 16 May 2025 13:35:27 -0400 Subject: [PATCH 1/2] naive list indexing with Mingyu --- lib/irgen.ml | 10 ++++++++++ test/ir/test_list.ml | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) 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..a38ce9d 100644 --- a/test/ir/test_list.ml +++ b/test/ir/test_list.ml @@ -98,6 +98,32 @@ 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\ + @str = private unnamed_addr constant [6 x i8] c\"hello\\00\", align 1\n\ + @str.1 = private unnamed_addr constant [6 x i8] c\"world\\00\", align 1\n\n\ + define void @function() {\n\ + entry:\n\ + \ %list = alloca i8*, i32 2, align 8\n\ + \ %index = getelementptr inbounds i8*, i8** %list, i32 0\n\ + \ store i8* getelementptr inbounds ([6 x i8], [6 x i8]* @str, i32 0, i32 \ + 0), i8** %index, align 8\n\ + \ %index1 = getelementptr inbounds i8*, i8** %list, i32 1\n\ + \ store i8* getelementptr inbounds ([6 x i8], [6 x i8]* @str.1, i32 0, i32 \ + 0), i8** %index1, align 8\n\ + \ %a = alloca i8**, align 8\n\ + \ store i8** %list, i8*** %a, align 8\n\ + \ ret void\n\ + }\n" + in + (* _write_to_file actual "actual.out"; *) + assert_equal expected actual ~printer) ] ;; From 848fd6842f973635563197b2d0db47f4318895d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3fer=20Fannar=20Bj=C3=B6rnsson?= Date: Fri, 16 May 2025 13:51:42 -0400 Subject: [PATCH 2/2] update test to pass --- test/ir/test_list.ml | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/test/ir/test_list.ml b/test/ir/test_list.ml index a38ce9d..2773e80 100644 --- a/test/ir/test_list.ml +++ b/test/ir/test_list.ml @@ -106,20 +106,19 @@ let tests = let expected = "; ModuleID = 'Fly'\n\ source_filename = \"Fly\"\n\n\ - @str = private unnamed_addr constant [6 x i8] c\"hello\\00\", align 1\n\ - @str.1 = private unnamed_addr constant [6 x i8] c\"world\\00\", align 1\n\n\ - define void @function() {\n\ + define i32 @function() {\n\ entry:\n\ - \ %list = alloca i8*, i32 2, align 8\n\ - \ %index = getelementptr inbounds i8*, i8** %list, i32 0\n\ - \ store i8* getelementptr inbounds ([6 x i8], [6 x i8]* @str, i32 0, i32 \ - 0), i8** %index, align 8\n\ - \ %index1 = getelementptr inbounds i8*, i8** %list, i32 1\n\ - \ store i8* getelementptr inbounds ([6 x i8], [6 x i8]* @str.1, i32 0, i32 \ - 0), i8** %index1, align 8\n\ - \ %a = alloca i8**, align 8\n\ - \ store i8** %list, i8*** %a, align 8\n\ - \ ret void\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"; *)