mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Round up the size of byval arguments to MinAlign
Otherwise we can end up with an argument frame size that is not a multiple of stack slot size, which is very awkward. This fixes PR20547, which was a bug in x86_64 Sys V vararg handling. However, it's much easier to test this with x86 callee-cleanup functions, which previously ended in "retl $6" instead of "retl $8". This does affect behavior of all backends, but it presumably fixes the same bug in all of them. llvm-svn: 214980
This commit is contained in:
parent
dcded783d2
commit
e340c78d47
@ -52,6 +52,7 @@ void CCState::HandleByVal(unsigned ValNo, MVT ValVT,
|
||||
Align = MinAlign;
|
||||
MF.getFrameInfo()->ensureMaxAlignment(Align);
|
||||
TM.getSubtargetImpl()->getTargetLowering()->HandleByVal(this, Size, Align);
|
||||
Size = unsigned(RoundUpToAlignment(Size, MinAlign));
|
||||
unsigned Offset = AllocateStack(Size, Align);
|
||||
addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo));
|
||||
}
|
||||
|
28
test/CodeGen/X86/byval-callee-cleanup.ll
Normal file
28
test/CodeGen/X86/byval-callee-cleanup.ll
Normal file
@ -0,0 +1,28 @@
|
||||
; RUN: llc < %s -march=x86 | FileCheck %s
|
||||
|
||||
; Previously we would forget to align to stack slot alignment after placing a
|
||||
; byval argument. Subsequent arguments would align themselves, but if it was
|
||||
; the last argument, the argument size would not be a multiple of stack slot
|
||||
; size. This resulted in retl $6 in callee-cleanup functions, as well as subtle
|
||||
; varargs bugs.
|
||||
|
||||
%struct.Six = type { [6 x i8] }
|
||||
|
||||
define x86_stdcallcc void @f(%struct.Six* byval %a) {
|
||||
ret void
|
||||
}
|
||||
; CHECK-LABEL: _f@8:
|
||||
; CHECK: retl $8
|
||||
|
||||
define x86_thiscallcc void @g(i8* %this, %struct.Six* byval %a) {
|
||||
ret void
|
||||
}
|
||||
; CHECK-LABEL: _g:
|
||||
; CHECK: retl $8
|
||||
|
||||
define x86_fastcallcc void @h(i32 inreg %x, i32 inreg %y, %struct.Six* byval %a) {
|
||||
ret void
|
||||
}
|
||||
; FIXME: This should be @h@8.
|
||||
; CHECK-LABEL: @h@16:
|
||||
; CHECK: retl $8
|
Loading…
x
Reference in New Issue
Block a user