|
@@ -550,10 +550,10 @@ namespace lbAbiAmd64SysV {
|
|
|
if (is_mem_cls(cls, attribute_kind)) {
|
|
|
LLVMAttributeRef attribute = nullptr;
|
|
|
if (attribute_kind == Amd64TypeAttribute_ByVal) {
|
|
|
- if (!is_calling_convention_odin(calling_convention)) {
|
|
|
+ // if (!is_calling_convention_odin(calling_convention)) {
|
|
|
return lb_arg_type_indirect_byval(c, type);
|
|
|
- }
|
|
|
- attribute = nullptr;
|
|
|
+ // }
|
|
|
+ // attribute = nullptr;
|
|
|
} else if (attribute_kind == Amd64TypeAttribute_StructRect) {
|
|
|
attribute = lb_create_enum_attribute_with_type(c, "sret", type);
|
|
|
}
|
|
@@ -982,13 +982,13 @@ namespace lbAbiArm64 {
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
- unsigned is_homogenous_aggregate_small_enough(LLVMTypeRef *base_type_, unsigned member_count_) {
|
|
|
- return (member_count_ <= 4);
|
|
|
- }
|
|
|
+
|
|
|
+ unsigned is_homogenous_aggregate_small_enough(LLVMTypeRef base_type, unsigned member_count) {
|
|
|
+ return (member_count <= 4);
|
|
|
+ }
|
|
|
|
|
|
lbArgType compute_return_type(LLVMContextRef c, LLVMTypeRef type, bool return_is_defined) {
|
|
|
- LLVMTypeRef homo_base_type = {};
|
|
|
+ LLVMTypeRef homo_base_type = nullptr;
|
|
|
unsigned homo_member_count = 0;
|
|
|
|
|
|
if (!return_is_defined) {
|
|
@@ -996,16 +996,16 @@ namespace lbAbiArm64 {
|
|
|
} else if (is_register(type)) {
|
|
|
return non_struct(c, type);
|
|
|
} else if (is_homogenous_aggregate(c, type, &homo_base_type, &homo_member_count)) {
|
|
|
- if(is_homogenous_aggregate_small_enough(&homo_base_type, homo_member_count)) {
|
|
|
- return lb_arg_type_direct(type, LLVMArrayType(homo_base_type, homo_member_count), nullptr, nullptr);
|
|
|
- } else {
|
|
|
- //TODO(Platin): do i need to create stuff that can handle the diffrent return type?
|
|
|
- // else this needs a fix in llvm_backend_proc as we would need to cast it to the correct array type
|
|
|
-
|
|
|
- //LLVMTypeRef array_type = LLVMArrayType(homo_base_type, homo_member_count);
|
|
|
- LLVMAttributeRef attr = lb_create_enum_attribute_with_type(c, "sret", type);
|
|
|
- return lb_arg_type_indirect(type, attr);
|
|
|
- }
|
|
|
+ if (is_homogenous_aggregate_small_enough(homo_base_type, homo_member_count)) {
|
|
|
+ return lb_arg_type_direct(type, LLVMArrayType(homo_base_type, homo_member_count), nullptr, nullptr);
|
|
|
+ } else {
|
|
|
+ //TODO(Platin): do i need to create stuff that can handle the diffrent return type?
|
|
|
+ // else this needs a fix in llvm_backend_proc as we would need to cast it to the correct array type
|
|
|
+
|
|
|
+ //LLVMTypeRef array_type = LLVMArrayType(homo_base_type, homo_member_count);
|
|
|
+ LLVMAttributeRef attr = lb_create_enum_attribute_with_type(c, "sret", type);
|
|
|
+ return lb_arg_type_indirect(type, attr);
|
|
|
+ }
|
|
|
} else {
|
|
|
i64 size = lb_sizeof(type);
|
|
|
if (size <= 16) {
|