]> granicus.if.org Git - clang/commitdiff
x86_64 ABI: Account for sret parameters consuming an integer register.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 22 May 2009 17:33:44 +0000 (17:33 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 22 May 2009 17:33:44 +0000 (17:33 +0000)
 - PR4242.

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

lib/CodeGen/CGCall.cpp
test/CodeGen/x86_64-arguments.c

index 356caa3f90e935e9a1c7aef3c74cf6f0b4c66fe0..ce98f8c25699a3aae29c091d500cf1f02b571689 100644 (file)
@@ -1055,6 +1055,11 @@ void X86_64ABIInfo::computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
 
   // Keep track of the number of assigned registers.
   unsigned freeIntRegs = 6, freeSSERegs = 8;
+  
+  // If the return value is indirect, then the hidden argument is consuming one
+  // integer register.
+  if (FI.getReturnInfo().isIndirect())
+    --freeIntRegs;
 
   // AMD64-ABI 3.2.3p3: Once arguments are classified, the registers
   // get assigned (in left-to-right order) for passing as follows...
index b28e064d358927655469fb616717ffd994033022..3b4f5ff68fdf1679ac90e5836c70eb5e4c460688 100644 (file)
@@ -61,4 +61,12 @@ struct s12 { int a __attribute__((aligned(16))); };
 struct s12 f12_0(void) {}
 void f12_1(struct s12 a0) {}
 
+// Check that sret parameter is accounted for when checking available integer
+// registers.
+// RUN: grep 'define void @f13(.struct.s13_0. noalias sret .agg.result, i32 .a, i32 .b, i32 .c, i32 .d, .struct.s13_1. byval .e, i32 .f)' %t &&
+
+struct s13_0 { long long f0[3]; };
+struct s13_0 f13(int a, int b, int c, int d, 
+                 struct s13_1 { long long f0[2]; } e, int f) {}
+
 // RUN: true