mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Revert "Reapply D70800: Fix AArch64 AAPCS frame record chain"
This reverts commit 9936455204fd6ab72715cc9d67385ddc93e072ed. That commit caused failed assertions e.g. like this: $ cat alloca.c a; b() { float c; d(); a = __builtin_alloca(d); c = e(); f(a); return c; } $ clang -target aarch64-linux-gnu -c alloca.c -O2 clang: ../lib/Target/AArch64/AArch64InstrInfo.cpp:3446: void llvm::emitFrameOffset(llvm::MachineBasicBlock&, llvm::MachineBasicBlock::iterator, const llvm::DebugLoc&, unsigned int, unsigned int, llvm::StackOffset, const llvm::TargetInstrInfo*, llvm::MachineInstr::MIFlag, bool, bool, bool*): Assertion `(DestReg != AArch64::SP || Bytes % 16 == 0) && "SP increment/decrement not 16-byte aligned"' failed.
This commit is contained in:
parent
8dd24026c0
commit
edc5aafa50
@ -1024,6 +1024,10 @@ static bool needsWinCFI(const MachineFunction &MF) {
|
|||||||
F.needsUnwindTableEntry();
|
F.needsUnwindTableEntry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isTargetDarwin(const MachineFunction &MF) {
|
||||||
|
return MF.getSubtarget<AArch64Subtarget>().isTargetDarwin();
|
||||||
|
}
|
||||||
|
|
||||||
static bool isTargetWindows(const MachineFunction &MF) {
|
static bool isTargetWindows(const MachineFunction &MF) {
|
||||||
return MF.getSubtarget<AArch64Subtarget>().isTargetWindows();
|
return MF.getSubtarget<AArch64Subtarget>().isTargetWindows();
|
||||||
}
|
}
|
||||||
@ -1181,7 +1185,7 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
|
|||||||
// For funclets the FP belongs to the containing function.
|
// For funclets the FP belongs to the containing function.
|
||||||
if (!IsFunclet && HasFP) {
|
if (!IsFunclet && HasFP) {
|
||||||
// Only set up FP if we actually need to.
|
// Only set up FP if we actually need to.
|
||||||
int64_t FPOffset = AFI->getCalleeSaveBaseToFrameRecordOffset();
|
int64_t FPOffset = isTargetDarwin(MF) ? (AFI->getCalleeSavedStackSize() - 16) : 0;
|
||||||
|
|
||||||
if (CombineSPBump)
|
if (CombineSPBump)
|
||||||
FPOffset += AFI->getLocalStackSize();
|
FPOffset += AFI->getLocalStackSize();
|
||||||
@ -1405,6 +1409,11 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (needsFrameMoves) {
|
if (needsFrameMoves) {
|
||||||
|
const DataLayout &TD = MF.getDataLayout();
|
||||||
|
const int StackGrowth = isTargetDarwin(MF)
|
||||||
|
? (2 * -TD.getPointerSize(0))
|
||||||
|
: -AFI->getCalleeSavedStackSize();
|
||||||
|
Register FramePtr = RegInfo->getFrameRegister(MF);
|
||||||
// An example of the prologue:
|
// An example of the prologue:
|
||||||
//
|
//
|
||||||
// .globl __foo
|
// .globl __foo
|
||||||
@ -1472,15 +1481,10 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
|
|||||||
// .cfi_offset w28, -32
|
// .cfi_offset w28, -32
|
||||||
|
|
||||||
if (HasFP) {
|
if (HasFP) {
|
||||||
const int OffsetToFirstCalleeSaveFromFP =
|
|
||||||
AFI->getCalleeSaveBaseToFrameRecordOffset() -
|
|
||||||
AFI->getCalleeSavedStackSize();
|
|
||||||
Register FramePtr = RegInfo->getFrameRegister(MF);
|
|
||||||
|
|
||||||
// Define the current CFA rule to use the provided FP.
|
// Define the current CFA rule to use the provided FP.
|
||||||
unsigned Reg = RegInfo->getDwarfRegNum(FramePtr, true);
|
unsigned Reg = RegInfo->getDwarfRegNum(FramePtr, true);
|
||||||
unsigned CFIIndex = MF.addFrameInst(
|
unsigned CFIIndex = MF.addFrameInst(
|
||||||
MCCFIInstruction::cfiDefCfa(nullptr, Reg, FixedObject - OffsetToFirstCalleeSaveFromFP));
|
MCCFIInstruction::cfiDefCfa(nullptr, Reg, FixedObject - StackGrowth));
|
||||||
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
|
||||||
.addCFIIndex(CFIIndex)
|
.addCFIIndex(CFIIndex)
|
||||||
.setMIFlags(MachineInstr::FrameSetup);
|
.setMIFlags(MachineInstr::FrameSetup);
|
||||||
@ -1771,8 +1775,10 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
|
|||||||
// non-post-indexed loads for the restores if we aren't actually going to
|
// non-post-indexed loads for the restores if we aren't actually going to
|
||||||
// be able to save any instructions.
|
// be able to save any instructions.
|
||||||
if (!IsFunclet && (MFI.hasVarSizedObjects() || AFI->isStackRealigned())) {
|
if (!IsFunclet && (MFI.hasVarSizedObjects() || AFI->isStackRealigned())) {
|
||||||
|
int64_t OffsetToFrameRecord =
|
||||||
|
isTargetDarwin(MF) ? (-(int64_t)AFI->getCalleeSavedStackSize() + 16) : 0;
|
||||||
emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::FP,
|
emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::FP,
|
||||||
{-AFI->getCalleeSaveBaseToFrameRecordOffset(), MVT::i8},
|
{OffsetToFrameRecord, MVT::i8},
|
||||||
TII, MachineInstr::FrameDestroy, false, NeedsWinCFI);
|
TII, MachineInstr::FrameDestroy, false, NeedsWinCFI);
|
||||||
} else if (NumBytes)
|
} else if (NumBytes)
|
||||||
emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::SP,
|
emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::SP,
|
||||||
@ -1833,11 +1839,11 @@ static StackOffset getFPOffset(const MachineFunction &MF, int64_t ObjectOffset)
|
|||||||
const auto &Subtarget = MF.getSubtarget<AArch64Subtarget>();
|
const auto &Subtarget = MF.getSubtarget<AArch64Subtarget>();
|
||||||
bool IsWin64 =
|
bool IsWin64 =
|
||||||
Subtarget.isCallingConvWin64(MF.getFunction().getCallingConv());
|
Subtarget.isCallingConvWin64(MF.getFunction().getCallingConv());
|
||||||
|
|
||||||
unsigned FixedObject =
|
unsigned FixedObject =
|
||||||
getFixedObjectSize(MF, AFI, IsWin64, /*IsFunclet=*/false);
|
getFixedObjectSize(MF, AFI, IsWin64, /*IsFunclet=*/false);
|
||||||
int64_t CalleeSaveSize = AFI->getCalleeSavedStackSize(MF.getFrameInfo());
|
unsigned FPAdjust = isTargetDarwin(MF)
|
||||||
int64_t FPAdjust =
|
? 16 : AFI->getCalleeSavedStackSize(MF.getFrameInfo());
|
||||||
CalleeSaveSize - AFI->getCalleeSaveBaseToFrameRecordOffset();
|
|
||||||
return {ObjectOffset + FixedObject + FPAdjust, MVT::i8};
|
return {ObjectOffset + FixedObject + FPAdjust, MVT::i8};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2225,14 +2231,6 @@ static void computeCalleeSaveRegisterPairs(
|
|||||||
(RPI.isScalable() && RPI.Offset >= -256 && RPI.Offset <= 255)) &&
|
(RPI.isScalable() && RPI.Offset >= -256 && RPI.Offset <= 255)) &&
|
||||||
"Offset out of bounds for LDP/STP immediate");
|
"Offset out of bounds for LDP/STP immediate");
|
||||||
|
|
||||||
// Save the offset to frame record so that the FP register can point to the
|
|
||||||
// innermost frame record (spilled FP and LR registers).
|
|
||||||
if (NeedsFrameRecord && ((!IsWindows && RPI.Reg1 == AArch64::LR &&
|
|
||||||
RPI.Reg2 == AArch64::FP) ||
|
|
||||||
(IsWindows && RPI.Reg1 == AArch64::FP &&
|
|
||||||
RPI.Reg2 == AArch64::LR)))
|
|
||||||
AFI->setCalleeSaveBaseToFrameRecordOffset(Offset);
|
|
||||||
|
|
||||||
RegPairs.push_back(RPI);
|
RegPairs.push_back(RPI);
|
||||||
if (RPI.isPaired())
|
if (RPI.isPaired())
|
||||||
++i;
|
++i;
|
||||||
|
@ -135,10 +135,6 @@ class AArch64FunctionInfo final : public MachineFunctionInfo {
|
|||||||
/// e.g. Tail Call, Thunk, or Function if none apply.
|
/// e.g. Tail Call, Thunk, or Function if none apply.
|
||||||
Optional<std::string> OutliningStyle;
|
Optional<std::string> OutliningStyle;
|
||||||
|
|
||||||
// Offset from SP-after-callee-saved-spills (i.e. SP-at-entry minus
|
|
||||||
// CalleeSavedStackSize) to the address of the frame record.
|
|
||||||
int CalleeSaveBaseToFrameRecordOffset = 0;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AArch64FunctionInfo() = default;
|
AArch64FunctionInfo() = default;
|
||||||
|
|
||||||
@ -342,13 +338,6 @@ public:
|
|||||||
TaggedBasePointerOffset = Offset;
|
TaggedBasePointerOffset = Offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getCalleeSaveBaseToFrameRecordOffset() const {
|
|
||||||
return CalleeSaveBaseToFrameRecordOffset;
|
|
||||||
}
|
|
||||||
void setCalleeSaveBaseToFrameRecordOffset(int Offset) {
|
|
||||||
CalleeSaveBaseToFrameRecordOffset = Offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Hold the lists of LOHs.
|
// Hold the lists of LOHs.
|
||||||
MILOHContainer LOHContainerSet;
|
MILOHContainer LOHContainerSet;
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -disable-post-ra --frame-pointer=all < %s | FileCheck %s
|
|
||||||
|
|
||||||
; The purpose of this test is to verify that frame pointer (x29)
|
|
||||||
; is correctly setup in the presence of callee-saved floating
|
|
||||||
; point registers. The frame pointer should point to the frame
|
|
||||||
; record, which is located 16 bytes above the end of the CSR
|
|
||||||
; space when a single FP CSR is in use.
|
|
||||||
define void @test1(i32) #26 {
|
|
||||||
entry:
|
|
||||||
call void asm sideeffect "nop", "~{d8}"() #26
|
|
||||||
ret void
|
|
||||||
}
|
|
||||||
; CHECK-LABEL: test1:
|
|
||||||
; CHECK: str d8, [sp, #-32]!
|
|
||||||
; CHECK-NEXT: stp x29, x30, [sp, #16]
|
|
||||||
; CHECK-NEXT: add x29, sp, #16
|
|
||||||
; CHECK: nop
|
|
||||||
; CHECK: ldp x29, x30, [sp, #16]
|
|
||||||
; CHECK-NEXT: ldr d8, [sp], #32
|
|
||||||
; CHECK-NEXT: ret
|
|
||||||
|
|
||||||
attributes #26 = { nounwind }
|
|
@ -1,29 +0,0 @@
|
|||||||
# RUN: llc -mtriple=aarch64-linux-gnu -start-before prologepilog %s -o - | FileCheck %s
|
|
||||||
|
|
||||||
---
|
|
||||||
name: TestFrameRecordLocation
|
|
||||||
tracksRegLiveness: true
|
|
||||||
frameInfo:
|
|
||||||
isFrameAddressTaken: true
|
|
||||||
body: |
|
|
||||||
bb.0:
|
|
||||||
$d8 = IMPLICIT_DEF
|
|
||||||
$d9 = IMPLICIT_DEF
|
|
||||||
$x19 = IMPLICIT_DEF
|
|
||||||
RET_ReallyLR
|
|
||||||
|
|
||||||
# CHECK-LABEL: TestFrameRecordLocation
|
|
||||||
|
|
||||||
# CHECK: stp d9, d8, [sp, #-48]!
|
|
||||||
# CHECK: stp x29, x30, [sp, #16]
|
|
||||||
# CHECK: str x19, [sp, #32]
|
|
||||||
|
|
||||||
# CHECK: add x29, sp, #16
|
|
||||||
|
|
||||||
# CHECK: .cfi_def_cfa w29, 32
|
|
||||||
# CHECK: .cfi_offset w19, -16
|
|
||||||
# CHECK: .cfi_offset w30, -24
|
|
||||||
# CHECK: .cfi_offset w29, -32
|
|
||||||
# CHECK: .cfi_offset b8, -40
|
|
||||||
# CHECK: .cfi_offset b9, -48
|
|
||||||
...
|
|
Loading…
x
Reference in New Issue
Block a user