]> granicus.if.org Git - clang/commitdiff
Don't try to use inreg with 0 sized structs. Thanks to Eli for reporting the
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 23 Oct 2012 02:04:01 +0000 (02:04 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 23 Oct 2012 02:04:01 +0000 (02:04 +0000)
regression.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166461 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TargetInfo.cpp
test/CodeGenCXX/regparm.cpp

index a9e11cb9542146b14898809fe1e2be486cf5e115..6a929a17ccde407c28ec8fefd43d5884343dee36 100644 (file)
@@ -810,6 +810,10 @@ bool X86_32ABIInfo::shouldUseInReg(QualType Ty, unsigned &FreeRegs) const {
     return false;
 
   unsigned SizeInRegs = (getContext().getTypeSize(Ty) + 31) / 32;
+
+  if (SizeInRegs == 0)
+    return false;
+
   if (SizeInRegs > FreeRegs) {
     FreeRegs = 0;
     return false;
index 07e9aa046ef53fe4e0335d3fd58a5d1fbe22dcca..2196c798bf3e63f540d88bea6634ac6e309ffb8a 100644 (file)
@@ -21,7 +21,18 @@ struct S2 {
 };
 
 void __attribute__((regparm(3))) foo3(struct S2 a, int b);
-// declare void @_Z4foo12S1i(i32 inreg, i32 inreg) optsize
+// CHECK: declare void @_Z4foo32S2i(i32 inreg, i32 inreg)
 void bar3(struct S2 a, int b) {
   foo3(a, b);
 }
+
+struct S3 {
+  struct {
+    struct {} b[0];
+  } a;
+};
+__attribute((regparm(2))) void foo4(S3 a, int b);
+// CHECK: declare void @_Z4foo42S3i(%struct.S3* byval align 4, i32 inreg)
+void bar3(S3 a, int b) {
+  foo4(a, b);
+}