From cc66254946ec86a2ec94ff9c8db96b05a364a94f Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Thu, 12 Jan 2012 01:10:09 +0000 Subject: [PATCH] Take into account the pointer to an aggregate that is passed as a hidden argument when Offset is initialized. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147986 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/TargetInfo.cpp | 8 ++++++-- test/CodeGen/mips64-padding-arg.c | 12 ++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 317cb44ce0..e9f88b7aaf 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -3248,8 +3248,12 @@ ABIArgInfo MipsABIInfo::classifyReturnType(QualType RetTy) const { } void MipsABIInfo::computeInfo(CGFunctionInfo &FI) const { - FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); - uint64_t Offset = 0; + ABIArgInfo &RetInfo = FI.getReturnInfo(); + RetInfo = classifyReturnType(FI.getReturnType()); + + // Check if a pointer to an aggregate is passed as a hidden argument. + uint64_t Offset = RetInfo.isIndirect() ? 8 : 0; + for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); it != ie; ++it) it->info = classifyArgumentType(it->type, Offset); diff --git a/test/CodeGen/mips64-padding-arg.c b/test/CodeGen/mips64-padding-arg.c index 3958807974..faafd5e63c 100644 --- a/test/CodeGen/mips64-padding-arg.c +++ b/test/CodeGen/mips64-padding-arg.c @@ -29,3 +29,15 @@ void foo3(int a0, long double a1) { foo4(1, 2, a0, a1); } +// Insert padding after hidden argument. +// +// CHECK: define void @foo5(%struct.S0* noalias nocapture sret %agg.result, i64, fp128 %a0) +// CHECK: call void @foo6(%struct.S0* sret %tmp, i32 1, i32 2, i64 undef, fp128 %a0) +// CHECK: declare void @foo6(%struct.S0* sret, i32, i32, i64, fp128) + +extern S0 foo6(int, int, long double); + +S0 foo5(long double a0) { + foo6(1, 2, a0); +} + -- 2.50.1