Wrap all LLVMGetElementType uses

This commit is contained in:
gingerBill
2022-08-09 21:17:32 +01:00
parent 0655260378
commit 812823cad8
5 changed files with 26 additions and 17 deletions
+8 -8
View File
@@ -223,7 +223,7 @@ i64 lb_sizeof(LLVMTypeRef type) {
break; break;
case LLVMArrayTypeKind: case LLVMArrayTypeKind:
{ {
LLVMTypeRef elem = LLVMGetElementType(type); LLVMTypeRef elem = OdinLLVMGetArrayElementType(type);
i64 elem_size = lb_sizeof(elem); i64 elem_size = lb_sizeof(elem);
i64 count = LLVMGetArrayLength(type); i64 count = LLVMGetArrayLength(type);
i64 size = count * elem_size; i64 size = count * elem_size;
@@ -235,7 +235,7 @@ i64 lb_sizeof(LLVMTypeRef type) {
return 8; return 8;
case LLVMVectorTypeKind: case LLVMVectorTypeKind:
{ {
LLVMTypeRef elem = LLVMGetElementType(type); LLVMTypeRef elem = OdinLLVMGetVectorElementType(type);
i64 elem_size = lb_sizeof(elem); i64 elem_size = lb_sizeof(elem);
i64 count = LLVMGetVectorSize(type); i64 count = LLVMGetVectorSize(type);
i64 size = count * elem_size; i64 size = count * elem_size;
@@ -283,14 +283,14 @@ i64 lb_alignof(LLVMTypeRef type) {
} }
break; break;
case LLVMArrayTypeKind: case LLVMArrayTypeKind:
return lb_alignof(LLVMGetElementType(type)); return lb_alignof(OdinLLVMGetArrayElementType(type));
case LLVMX86_MMXTypeKind: case LLVMX86_MMXTypeKind:
return 8; return 8;
case LLVMVectorTypeKind: case LLVMVectorTypeKind:
{ {
// TODO(bill): This appears to be correct but LLVM isn't necessarily "great" with regards to documentation // TODO(bill): This appears to be correct but LLVM isn't necessarily "great" with regards to documentation
LLVMTypeRef elem = LLVMGetElementType(type); LLVMTypeRef elem = OdinLLVMGetVectorElementType(type);
i64 elem_size = lb_sizeof(elem); i64 elem_size = lb_sizeof(elem);
i64 count = LLVMGetVectorSize(type); i64 count = LLVMGetVectorSize(type);
i64 size = count * elem_size; i64 size = count * elem_size;
@@ -793,7 +793,7 @@ namespace lbAbiAmd64SysV {
case LLVMArrayTypeKind: case LLVMArrayTypeKind:
{ {
i64 len = LLVMGetArrayLength(t); i64 len = LLVMGetArrayLength(t);
LLVMTypeRef elem = LLVMGetElementType(t); LLVMTypeRef elem = OdinLLVMGetArrayElementType(t);
i64 elem_sz = lb_sizeof(elem); i64 elem_sz = lb_sizeof(elem);
for (i64 i = 0; i < len; i++) { for (i64 i = 0; i < len; i++) {
classify_with(elem, cls, ix, off + i*elem_sz); classify_with(elem, cls, ix, off + i*elem_sz);
@@ -803,7 +803,7 @@ namespace lbAbiAmd64SysV {
case LLVMVectorTypeKind: case LLVMVectorTypeKind:
{ {
i64 len = LLVMGetVectorSize(t); i64 len = LLVMGetVectorSize(t);
LLVMTypeRef elem = LLVMGetElementType(t); LLVMTypeRef elem = OdinLLVMGetVectorElementType(t);
i64 elem_sz = lb_sizeof(elem); i64 elem_sz = lb_sizeof(elem);
LLVMTypeKind elem_kind = LLVMGetTypeKind(elem); LLVMTypeKind elem_kind = LLVMGetTypeKind(elem);
RegClass reg = RegClass_NoClass; RegClass reg = RegClass_NoClass;
@@ -913,7 +913,7 @@ namespace lbAbiArm64 {
if (len == 0) { if (len == 0) {
return false; return false;
} }
LLVMTypeRef elem = LLVMGetElementType(type); LLVMTypeRef elem = OdinLLVMGetArrayElementType(type);
LLVMTypeRef base_type = nullptr; LLVMTypeRef base_type = nullptr;
unsigned member_count = 0; unsigned member_count = 0;
if (is_homogenous_aggregate(c, elem, &base_type, &member_count)) { if (is_homogenous_aggregate(c, elem, &base_type, &member_count)) {
@@ -1129,7 +1129,7 @@ namespace lbAbiWasm {
} }
if (sz <= MAX_DIRECT_STRUCT_SIZE) { if (sz <= MAX_DIRECT_STRUCT_SIZE) {
if (kind == LLVMArrayTypeKind) { if (kind == LLVMArrayTypeKind) {
if (is_basic_register_type(LLVMGetElementType(type))) { if (is_basic_register_type(OdinLLVMGetArrayElementType(type))) {
return true; return true;
} }
} else if (kind == LLVMStructTypeKind) { } else if (kind == LLVMStructTypeKind) {
+3
View File
@@ -507,6 +507,9 @@ i64 lb_max_zero_init_size(void) {
return cast(i64)(4*build_context.word_size); return cast(i64)(4*build_context.word_size);
} }
LLVMTypeRef OdinLLVMGetArrayElementType(LLVMTypeRef type);
LLVMTypeRef OdinLLVMGetVectorElementType(LLVMTypeRef type);
#define LB_STARTUP_RUNTIME_PROC_NAME "__$startup_runtime" #define LB_STARTUP_RUNTIME_PROC_NAME "__$startup_runtime"
#define LB_STARTUP_TYPE_INFO_PROC_NAME "__$startup_type_info" #define LB_STARTUP_TYPE_INFO_PROC_NAME "__$startup_type_info"
#define LB_TYPE_INFO_DATA_NAME "__$type_info_data" #define LB_TYPE_INFO_DATA_NAME "__$type_info_data"
+11
View File
@@ -2293,6 +2293,17 @@ void lb_emit_if(lbProcedure *p, lbValue cond, lbBlock *true_block, lbBlock *fals
} }
gb_inline LLVMTypeRef OdinLLVMGetInternalElementType(LLVMTypeRef type) {
return LLVMGetElementType(type);
}
LLVMTypeRef OdinLLVMGetArrayElementType(LLVMTypeRef type) {
GB_ASSERT(lb_is_type_kind(type, LLVMArrayTypeKind));
return OdinLLVMGetInternalElementType(type);
}
LLVMTypeRef OdinLLVMGetVectorElementType(LLVMTypeRef type) {
GB_ASSERT(lb_is_type_kind(type, LLVMVectorTypeKind));
return OdinLLVMGetInternalElementType(type);
}
LLVMValueRef OdinLLVMBuildTransmute(lbProcedure *p, LLVMValueRef val, LLVMTypeRef dst_type) { LLVMValueRef OdinLLVMBuildTransmute(lbProcedure *p, LLVMValueRef val, LLVMTypeRef dst_type) {
-5
View File
@@ -130,11 +130,6 @@ lbValue lb_get_type_info_ptr(lbModule *m, Type *type) {
return res; return res;
} }
// NOTE: The use of this method needs to be eliminated for pointers.
LLVMTypeRef llvm_get_element_type(LLVMTypeRef type) {
return LLVMGetElementType(type);
}
LLVMTypeRef lb_get_procedure_raw_type(lbModule *m, Type *type) { LLVMTypeRef lb_get_procedure_raw_type(lbModule *m, Type *type) {
return lb_type_internal_for_procedures_raw(m, type); return lb_type_internal_for_procedures_raw(m, type);
} }
+4 -4
View File
@@ -1651,7 +1651,7 @@ LLVMValueRef llvm_vector_expand_to_power_of_two(lbProcedure *p, LLVMValueRef val
LLVMValueRef llvm_vector_reduce_add(lbProcedure *p, LLVMValueRef value) { LLVMValueRef llvm_vector_reduce_add(lbProcedure *p, LLVMValueRef value) {
LLVMTypeRef type = LLVMTypeOf(value); LLVMTypeRef type = LLVMTypeOf(value);
GB_ASSERT(LLVMGetTypeKind(type) == LLVMVectorTypeKind); GB_ASSERT(LLVMGetTypeKind(type) == LLVMVectorTypeKind);
LLVMTypeRef elem = LLVMGetElementType(type); LLVMTypeRef elem = OdinLLVMGetVectorElementType(type);
unsigned len = LLVMGetVectorSize(type); unsigned len = LLVMGetVectorSize(type);
if (len == 0) { if (len == 0) {
return LLVMConstNull(type); return LLVMConstNull(type);
@@ -1727,7 +1727,7 @@ LLVMValueRef llvm_vector_reduce_add(lbProcedure *p, LLVMValueRef value) {
LLVMValueRef llvm_vector_add(lbProcedure *p, LLVMValueRef a, LLVMValueRef b) { LLVMValueRef llvm_vector_add(lbProcedure *p, LLVMValueRef a, LLVMValueRef b) {
GB_ASSERT(LLVMTypeOf(a) == LLVMTypeOf(b)); GB_ASSERT(LLVMTypeOf(a) == LLVMTypeOf(b));
LLVMTypeRef elem = LLVMGetElementType(LLVMTypeOf(a)); LLVMTypeRef elem = OdinLLVMGetVectorElementType(LLVMTypeOf(a));
if (LLVMGetTypeKind(elem) == LLVMIntegerTypeKind) { if (LLVMGetTypeKind(elem) == LLVMIntegerTypeKind) {
return LLVMBuildAdd(p->builder, a, b, ""); return LLVMBuildAdd(p->builder, a, b, "");
@@ -1738,7 +1738,7 @@ LLVMValueRef llvm_vector_add(lbProcedure *p, LLVMValueRef a, LLVMValueRef b) {
LLVMValueRef llvm_vector_mul(lbProcedure *p, LLVMValueRef a, LLVMValueRef b) { LLVMValueRef llvm_vector_mul(lbProcedure *p, LLVMValueRef a, LLVMValueRef b) {
GB_ASSERT(LLVMTypeOf(a) == LLVMTypeOf(b)); GB_ASSERT(LLVMTypeOf(a) == LLVMTypeOf(b));
LLVMTypeRef elem = LLVMGetElementType(LLVMTypeOf(a)); LLVMTypeRef elem = OdinLLVMGetVectorElementType(LLVMTypeOf(a));
if (LLVMGetTypeKind(elem) == LLVMIntegerTypeKind) { if (LLVMGetTypeKind(elem) == LLVMIntegerTypeKind) {
return LLVMBuildMul(p->builder, a, b, ""); return LLVMBuildMul(p->builder, a, b, "");
@@ -1758,7 +1758,7 @@ LLVMValueRef llvm_vector_mul_add(lbProcedure *p, LLVMValueRef a, LLVMValueRef b,
GB_ASSERT(t == LLVMTypeOf(c)); GB_ASSERT(t == LLVMTypeOf(c));
GB_ASSERT(LLVMGetTypeKind(t) == LLVMVectorTypeKind); GB_ASSERT(LLVMGetTypeKind(t) == LLVMVectorTypeKind);
LLVMTypeRef elem = LLVMGetElementType(t); LLVMTypeRef elem = OdinLLVMGetVectorElementType(t);
bool is_possible = false; bool is_possible = false;