diff options
| author | gingerBill <bill@gingerbill.org> | 2023-09-22 14:39:51 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-09-22 14:39:51 +0100 |
| commit | 082324d7b97e521f5d8dada40629da4e689197c9 (patch) | |
| tree | 6a7e993cd7a7d9428732db3568ae755b73d428c9 /src/llvm_backend_general.cpp | |
| parent | 5e99289d7afd34cf785b15f727ed2f2d61aa6ffc (diff) | |
Begin work on making the type info table be constantly initialized
Diffstat (limited to 'src/llvm_backend_general.cpp')
| -rw-r--r-- | src/llvm_backend_general.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index ccc0f2a54..0f0df7ca5 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -278,6 +278,13 @@ gb_internal lbValue lb_zero(lbModule *m, Type *t) { v.type = t; return v; } +gb_internal LLVMValueRef llvm_const_extract_value(lbModule *m, LLVMValueRef agg, unsigned index) { + LLVMValueRef res = agg; + GB_ASSERT(LLVMIsConstant(res)); + res = LLVMBuildExtractValue(m->const_dummy_builder, res, index, ""); + GB_ASSERT(LLVMIsConstant(res)); + return res; +} gb_internal LLVMValueRef llvm_const_extract_value(lbModule *m, LLVMValueRef agg, unsigned *indices, isize count) { // return LLVMConstExtractValue(value, indices, count); @@ -290,6 +297,19 @@ gb_internal LLVMValueRef llvm_const_extract_value(lbModule *m, LLVMValueRef agg, return res; } +gb_internal LLVMValueRef llvm_const_insert_value(lbModule *m, LLVMValueRef agg, LLVMValueRef val, unsigned index) { + GB_ASSERT(LLVMIsConstant(agg)); + GB_ASSERT(LLVMIsConstant(val)); + + LLVMValueRef extracted_value = val; + LLVMValueRef nested = llvm_const_extract_value(m, agg, index); + GB_ASSERT(LLVMIsConstant(nested)); + extracted_value = LLVMBuildInsertValue(m->const_dummy_builder, nested, extracted_value, index, ""); + GB_ASSERT(LLVMIsConstant(extracted_value)); + return extracted_value; +} + + gb_internal LLVMValueRef llvm_const_insert_value(lbModule *m, LLVMValueRef agg, LLVMValueRef val, unsigned *indices, isize count) { GB_ASSERT(LLVMIsConstant(agg)); GB_ASSERT(LLVMIsConstant(val)); @@ -1919,14 +1939,14 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { case Type_Array: { m->internal_type_level += 1; - LLVMTypeRef t = LLVMArrayType(lb_type(m, type->Array.elem), cast(unsigned)type->Array.count); + LLVMTypeRef t = llvm_array_type(lb_type(m, type->Array.elem), type->Array.count); m->internal_type_level -= 1; return t; } case Type_EnumeratedArray: { m->internal_type_level += 1; - LLVMTypeRef t = LLVMArrayType(lb_type(m, type->EnumeratedArray.elem), cast(unsigned)type->EnumeratedArray.count); + LLVMTypeRef t = llvm_array_type(lb_type(m, type->EnumeratedArray.elem), type->EnumeratedArray.count); m->internal_type_level -= 1; return t; } @@ -2160,7 +2180,7 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { m->internal_type_level -= 1; LLVMTypeRef elem = lb_type(m, type->Matrix.elem); - LLVMTypeRef t = LLVMArrayType(elem, cast(unsigned)elem_count); + LLVMTypeRef t = llvm_array_type(elem, elem_count); m->internal_type_level += 1; return t; |