r217147 - [mips] Zero-sized structs cannot be ignored in MipsABIInfo::classifyReturnType() for O32

Daniel Sanders daniel.sanders at imgtec.com
Thu Sep 4 06:28:14 PDT 2014


Author: dsanders
Date: Thu Sep  4 08:28:14 2014
New Revision: 217147

URL: http://llvm.org/viewvc/llvm-project?rev=217147&view=rev
Log:
[mips] Zero-sized structs cannot be ignored in MipsABIInfo::classifyReturnType() for O32

Summary:
They are returned indirectly which causes the other arguments to move to
the next argument slot.

With this, utils/ABITest does not discover any failing cases in the first
500 attempts on big/little endian for O32. Previously some of these failed.
Also tested N32/N64 little endian (big endian has other known issues) with
no issues.

Reviewers: atanasyan

Reviewed By: atanasyan

Subscribers: atanasyan, cfe-commits

Differential Revision: http://reviews.llvm.org/D4811

Added:
    cfe/trunk/test/CodeGen/mips-zero-sized-struct.c
Modified:
    cfe/trunk/lib/CodeGen/TargetInfo.cpp

Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=217147&r1=217146&r2=217147&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Thu Sep  4 08:28:14 2014
@@ -5548,7 +5548,12 @@ MipsABIInfo::returnAggregateInRegs(QualT
 ABIArgInfo MipsABIInfo::classifyReturnType(QualType RetTy) const {
   uint64_t Size = getContext().getTypeSize(RetTy);
 
-  if (RetTy->isVoidType() || Size == 0)
+  if (RetTy->isVoidType())
+    return ABIArgInfo::getIgnore();
+
+  // O32 doesn't treat zero-sized structs differently from other structs.
+  // However, N32/N64 ignores zero sized return values.
+  if (!IsO32 && Size == 0)
     return ABIArgInfo::getIgnore();
 
   if (isAggregateTypeForABI(RetTy) || RetTy->isVectorType()) {

Added: cfe/trunk/test/CodeGen/mips-zero-sized-struct.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mips-zero-sized-struct.c?rev=217147&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/mips-zero-sized-struct.c (added)
+++ cfe/trunk/test/CodeGen/mips-zero-sized-struct.c Thu Sep  4 08:28:14 2014
@@ -0,0 +1,16 @@
+// RUN: %clang -target mips-unknown-linux-gnu -S -emit-llvm -o - %s | FileCheck -check-prefix=O32 %s
+// RUN: %clang -target mipsel-unknown-linux-gnu -S -emit-llvm -o - %s | FileCheck -check-prefix=O32 %s
+// RUN: %clang -target mips64-unknown-linux-gnu -S -emit-llvm -o - %s -mabi=n32 | FileCheck -check-prefix=N32 %s
+// RUN: %clang -target mips64el-unknown-linux-gnu -S -emit-llvm -o - %s -mabi=n32 | FileCheck -check-prefix=N32 %s
+// RUN: %clang -target mips64-unknown-linux-gnu -S -emit-llvm -o - %s | FileCheck -check-prefix=N64 %s
+// RUN: %clang -target mips64el-unknown-linux-gnu -S -emit-llvm -o - %s | FileCheck -check-prefix=N64 %s
+
+// O32: define void @fn28(%struct.T2* noalias sret %agg.result, i8 signext %arg0)
+// N32: define void @fn28(i8 signext %arg0)
+// N64: define void @fn28(i8 signext %arg0)
+
+typedef struct T2 {  } T2;
+T2 T2_retval;
+T2 fn28(char arg0) {
+  return T2_retval;
+}





More information about the cfe-commits mailing list