|
@@ -271,110 +271,6 @@ i64 lb_alignof(LLVMTypeRef type) {
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-#if 0
|
|
|
-Type *lb_abi_to_odin_type(lbModule *m, LLVMTypeRef type, bool is_return, u32 level = 0) {
|
|
|
- Type **found = map_get(&m->llvm_types, hash_pointer(type));
|
|
|
- if (found) {
|
|
|
- return *found;
|
|
|
- }
|
|
|
- GB_ASSERT_MSG(level < 64, "%s %d", LLVMPrintTypeToString(type), is_return);
|
|
|
-
|
|
|
- LLVMTypeKind kind = LLVMGetTypeKind(type);
|
|
|
- switch (kind) {
|
|
|
- case LLVMVoidTypeKind:
|
|
|
- return nullptr;
|
|
|
- case LLVMIntegerTypeKind:
|
|
|
- {
|
|
|
- unsigned w = LLVMGetIntTypeWidth(type);
|
|
|
- if (w == 1) {
|
|
|
- return t_llvm_bool;
|
|
|
- }
|
|
|
- unsigned bytes = (w + 7)/8;
|
|
|
- switch (bytes) {
|
|
|
- case 1: return t_u8;
|
|
|
- case 2: return t_u16;
|
|
|
- case 4: return t_u32;
|
|
|
- case 8: return t_u64;
|
|
|
- case 16: return t_u128;
|
|
|
- }
|
|
|
- GB_PANIC("Unhandled integer type");
|
|
|
- }
|
|
|
- case LLVMFloatTypeKind:
|
|
|
- return t_f32;
|
|
|
- case LLVMDoubleTypeKind:
|
|
|
- return t_f64;
|
|
|
- case LLVMPointerTypeKind:
|
|
|
- {
|
|
|
- LLVMTypeRef elem = LLVMGetElementType(type);
|
|
|
- if (lb_is_type_kind(elem, LLVMFunctionTypeKind)) {
|
|
|
- unsigned param_count = LLVMCountParamTypes(elem);
|
|
|
- LLVMTypeRef *params = gb_alloc_array(heap_allocator(), LLVMTypeRef, param_count);
|
|
|
- defer (gb_free(heap_allocator(), params));
|
|
|
- LLVMGetParamTypes(elem, params);
|
|
|
-
|
|
|
- Type **param_types = gb_alloc_array(heap_allocator(), Type *, param_count);
|
|
|
- defer (gb_free(heap_allocator(), param_types));
|
|
|
-
|
|
|
- for (unsigned i = 0; i < param_count; i++) {
|
|
|
- param_types[i] = lb_abi_to_odin_type(m, params[i], false, level+1);
|
|
|
- }
|
|
|
-
|
|
|
- LLVMTypeRef ret = LLVMGetReturnType(elem);
|
|
|
- Type *ret_type = lb_abi_to_odin_type(m, ret, true, level+1);
|
|
|
-
|
|
|
- bool is_c_vararg = !!LLVMIsFunctionVarArg(elem);
|
|
|
- return alloc_type_proc_from_types(param_types, param_count, ret_type, is_c_vararg);
|
|
|
- }
|
|
|
- return alloc_type_pointer(lb_abi_to_odin_type(m, elem, false, level+1));
|
|
|
- }
|
|
|
- case LLVMFunctionTypeKind:
|
|
|
- GB_PANIC("LLVMFunctionTypeKind should not be seen on its own");
|
|
|
- break;
|
|
|
-
|
|
|
- case LLVMStructTypeKind:
|
|
|
- {
|
|
|
- unsigned field_count = LLVMCountStructElementTypes(type);
|
|
|
- Type **fields = gb_alloc_array(heap_allocator(), Type *, field_count);
|
|
|
- for (unsigned i = 0; i < field_count; i++) {
|
|
|
- LLVMTypeRef field_type = LLVMStructGetTypeAtIndex(type, i);
|
|
|
- if (lb_is_type_kind(field_type, LLVMPointerTypeKind) && level > 0) {
|
|
|
- fields[i] = t_rawptr;
|
|
|
- } else {
|
|
|
- fields[i] = lb_abi_to_odin_type(m, field_type, false, level+1);
|
|
|
- }
|
|
|
- }
|
|
|
- if (is_return) {
|
|
|
- return alloc_type_tuple_from_field_types(fields, field_count, !!LLVMIsPackedStruct(type), false);
|
|
|
- } else {
|
|
|
- return alloc_type_struct_from_field_types(fields, field_count, !!LLVMIsPackedStruct(type));
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case LLVMArrayTypeKind:
|
|
|
- {
|
|
|
-
|
|
|
- i64 count = LLVMGetArrayLength(type);
|
|
|
- Type *elem = lb_abi_to_odin_type(m, LLVMGetElementType(type), false, level+1);
|
|
|
- return alloc_type_array(elem, count);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case LLVMX86_MMXTypeKind:
|
|
|
- return t_vector_x86_mmx;
|
|
|
- case LLVMVectorTypeKind:
|
|
|
- {
|
|
|
- i64 count = LLVMGetVectorSize(type);
|
|
|
- Type *elem = lb_abi_to_odin_type(m, LLVMGetElementType(type), false, level+1);
|
|
|
- return alloc_type_simd_vector(count, elem);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- GB_PANIC("Unhandled type for lb_abi_to_odin_type -> %s", LLVMPrintTypeToString(type));
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
|
|
|
#define LB_ABI_INFO(name) lbFunctionType *name(LLVMContextRef c, LLVMTypeRef *arg_types, unsigned arg_count, LLVMTypeRef return_type, bool return_is_defined, ProcCallingConvention calling_convention)
|
|
|
typedef LB_ABI_INFO(lbAbiInfoType);
|