summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2018-11-03 00:41:52 +0000
committerReid Kleckner <rnk@google.com>2018-11-03 00:41:52 +0000
commit2bcb288ade6df8f12157c36157ecfdc879fd95e1 (patch)
treef9196dba9c60bad4a2090c2d91fa44f2ad01fb55 /llvm/lib/CodeGen
parent5253cccbd5fbc6db3d3bf278c40302f9f222c6e7 (diff)
downloadbcm5719-llvm-2bcb288ade6df8f12157c36157ecfdc879fd95e1.tar.gz
bcm5719-llvm-2bcb288ade6df8f12157c36157ecfdc879fd95e1.zip
[codeview] Let the X86 backend tell us the VFRAME offset adjustment
Use MachineFrameInfo's OffsetAdjustment field to pass this information from the target to CodeViewDebug.cpp. The X86 backend doesn't use it for any other purpose. This fixes PR38857 in the case where there is a non-aligned quantity of CSRs and a non-aligned quantity of locals. llvm-svn: 346062
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp11
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h3
2 files changed, 6 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
index 9b2b3477be7..01d018fdde3 100644
--- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
@@ -1339,6 +1339,7 @@ void CodeViewDebug::beginFunctionImpl(const MachineFunction *MF) {
// instruction (AArch64), this will be zero.
CurFn->CSRSize = MFI.getCVBytesOfCalleeSavedRegisters();
CurFn->FrameSize = MFI.getStackSize();
+ CurFn->OffsetAdjustment = MFI.getOffsetAdjustment();
CurFn->HasStackRealignment = TRI->needsStackRealignment(*MF);
// For this function S_FRAMEPROC record, figure out which codeview register
@@ -2599,16 +2600,10 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
// 32-bit x86 call sequences often use PUSH instructions, which disrupt
// ESP-relative offsets. Use the virtual frame pointer, VFRAME or $T0,
- // instead. In simple cases, $T0 will be the CFA.
+ // instead. In frames without stack realignment, $T0 will be the CFA.
if (RegisterId(Reg) == RegisterId::ESP) {
Reg = unsigned(RegisterId::VFRAME);
- Offset -= FI.FrameSize;
-
- // If the frame requires realignment, VFRAME will be ESP after it is
- // aligned. We have to remove the ESP adjustments made to push CSRs and
- // EBP. EBP is not included in CSRSize.
- if (FI.HasStackRealignment)
- Offset += FI.CSRSize + 4;
+ Offset += FI.OffsetAdjustment;
}
// If we can use the chosen frame pointer for the frame and this isn't a
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h
index b6fbdc1373f..ef0f0c3635e 100644
--- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h
+++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h
@@ -153,6 +153,9 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {
/// Number of bytes pushed to save CSRs.
unsigned CSRSize = 0;
+ /// Adjustment to apply on x86 when using the VFRAME frame pointer.
+ int OffsetAdjustment = 0;
+
/// Two-bit value indicating which register is the designated frame pointer
/// register for local variables. Included in S_FRAMEPROC.
codeview::EncodedFramePtrReg EncodedLocalFramePtrReg =
OpenPOWER on IntegriCloud