aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Davis <cdavis@mines.edu>2011-05-27 01:42:17 +0000
committerCharles Davis <cdavis@mines.edu>2011-05-27 01:42:17 +0000
commitc2d3022aa6104a21f4368c522ccbf9a4d282b7c6 (patch)
tree8fb2650b0cac44c0c99bf9fe2ecfe06b1cdc6d50
parent1a24bf0cf92fa801fa9399b017485be15621c031 (diff)
downloadexternal_llvm-c2d3022aa6104a21f4368c522ccbf9a4d282b7c6.zip
external_llvm-c2d3022aa6104a21f4368c522ccbf9a4d282b7c6.tar.gz
external_llvm-c2d3022aa6104a21f4368c522ccbf9a4d282b7c6.tar.bz2
Fix inverted conditional in SaveReg and SaveXMM. Err when the frame pointer is
already defined, and err when the PushMachFrame operation isn't the first operation (if specified at all). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132173 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/MCStreamer.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp
index 9957a76..88293f5 100644
--- a/lib/MC/MCStreamer.cpp
+++ b/lib/MC/MCStreamer.cpp
@@ -389,9 +389,11 @@ void MCStreamer::EmitWin64EHPushReg(unsigned Register) {
void MCStreamer::EmitWin64EHSetFrame(unsigned Register, unsigned Offset) {
EnsureValidW64UnwindInfo();
+ MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
+ if (CurFrame->LastFrameInst >= 0)
+ report_fatal_error("Frame register and offset already specified!");
if (Offset & 0x0F)
report_fatal_error("Misaligned frame pointer offset!");
- MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
MCWin64EHInstruction Inst(Win64EH::UOP_SetFPReg, Register, Offset);
CurFrame->LastFrameInst = CurFrame->Instructions.size();
CurFrame->Instructions.push_back(Inst);
@@ -412,7 +414,7 @@ void MCStreamer::EmitWin64EHSaveReg(unsigned Register, unsigned Offset) {
report_fatal_error("Misaligned saved register offset!");
MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
MCWin64EHInstruction Inst(
- Offset > 512*1024-8 ? Win64EH::UOP_SaveNonVol : Win64EH::UOP_SaveNonVolBig,
+ Offset > 512*1024-8 ? Win64EH::UOP_SaveNonVolBig : Win64EH::UOP_SaveNonVol,
Register, Offset);
CurFrame->Instructions.push_back(Inst);
}
@@ -423,7 +425,7 @@ void MCStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) {
report_fatal_error("Misaligned saved vector register offset!");
MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
MCWin64EHInstruction Inst(
- Offset > 512*1024-16 ? Win64EH::UOP_SaveXMM128 : Win64EH::UOP_SaveXMM128Big,
+ Offset > 512*1024-16 ? Win64EH::UOP_SaveXMM128Big : Win64EH::UOP_SaveXMM128,
Register, Offset);
CurFrame->Instructions.push_back(Inst);
}
@@ -431,6 +433,8 @@ void MCStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) {
void MCStreamer::EmitWin64EHPushFrame(bool Code) {
EnsureValidW64UnwindInfo();
MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
+ if (CurFrame->Instructions.size() > 0)
+ report_fatal_error("If present, PushMachFrame must be the first UOP");
MCWin64EHInstruction Inst(Win64EH::UOP_PushMachFrame, Code);
CurFrame->Instructions.push_back(Inst);
}