Browse Source

Wrap all `LLVMGetElementType` uses

gingerBill 3 years ago
parent
commit
812823cad8

+ 8 - 8
src/llvm_abi.cpp

@@ -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 - 0
src/llvm_backend.hpp

@@ -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 - 0
src/llvm_backend_general.cpp

@@ -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) {

+ 0 - 5
src/llvm_backend_type.cpp

@@ -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
src/llvm_backend_utility.cpp

@@ -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;