mun_codegen 0.4.0

LLVM IR code generation for Mun
---
source: crates/mun_codegen/src/test.rs
assertion_line: 1080
expression: "\n    struct(gc) Foo { a: i32, b: i32 };\n\n    pub fn foo() {\n        let a = Foo { a: 3, b: 4 };\n        a.b += 3;\n        let b = a;\n    }\n    "
---
; == FILE IR (mod) =====================================
; ModuleID = 'mod'
source_filename = "mod"

%DispatchTable = type { i8** (i8*, i8*)* }
%Foo = type { i32, i32 }

@allocatorHandle = external global i8*
@dispatchTable = external global %DispatchTable
@global_type_lookup_table = external global [2 x i64*]

define void @foo() {
body:
  %b = alloca %Foo**, align 8
  %a = alloca %Foo**, align 8
  %new_ptr = load i8** (i8*, i8*)*, i8** (i8*, i8*)** getelementptr inbounds (%DispatchTable, %DispatchTable* @dispatchTable, i32 0, i32 0), align 8
  %Foo_ptr = load i64*, i64** getelementptr inbounds ([2 x i64*], [2 x i64*]* @global_type_lookup_table, i64 0, i64 0), align 8
  %type_info_ptr_to_i8_ptr = bitcast i64* %Foo_ptr to i8*
  %allocator_handle = load i8*, i8** @allocatorHandle, align 8
  %ref = call i8** %new_ptr(i8* %type_info_ptr_to_i8_ptr, i8* %allocator_handle)
  %"ref<Foo>" = bitcast i8** %ref to %Foo**
  %"ref<Foo>->data" = load %Foo*, %Foo** %"ref<Foo>", align 8
  store %Foo { i32 3, i32 4 }, %Foo* %"ref<Foo>->data", align 4
  store %Foo** %"ref<Foo>", %Foo*** %a, align 8
  %"a->data" = load %Foo**, %Foo*** %a, align 8
  %deref = load %Foo*, %Foo** %"a->data", align 8
  %"Foo->b" = getelementptr inbounds %Foo, %Foo* %deref, i32 0, i32 1
  %Foo.b = load i32, i32* %"Foo->b", align 4
  %add = add i32 %Foo.b, 3
  %"a->data1" = load %Foo**, %Foo*** %a, align 8
  %deref2 = load %Foo*, %Foo** %"a->data1", align 8
  %"Foo->b3" = getelementptr inbounds %Foo, %Foo* %deref2, i32 0, i32 1
  store i32 %add, i32* %"Foo->b3", align 4
  %a4 = load %Foo**, %Foo*** %a, align 8
  store %Foo** %a4, %Foo*** %b, align 8
  ret void
}

; == GROUP IR (mod) ====================================
; ModuleID = 'group_name'
source_filename = "group_name"

%DispatchTable = type { i8** (i8*, i8*)* }

@dispatchTable = global %DispatchTable zeroinitializer
@global_type_lookup_table = global [2 x i64*] zeroinitializer
@allocatorHandle = unnamed_addr global i8* null