summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/MCStreamer.cpp
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
commit9dcee31aabd7bf94396e46d010d2afcbd608fe6d (patch)
tree3c7e50d39b49556617c57489f537edd3fa97b7d6 /llvm/lib/MC/MCStreamer.cpp
parent7c430c0ec22fc1aee30f2bcfca19cc84a08c2fc8 (diff)
downloadbcm5719-llvm-9dcee31aabd7bf94396e46d010d2afcbd608fe6d.tar.gz
bcm5719-llvm-9dcee31aabd7bf94396e46d010d2afcbd608fe6d.zip
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). llvm-svn: 132173
Diffstat (limited to 'llvm/lib/MC/MCStreamer.cpp')
-rw-r--r--llvm/lib/MC/MCStreamer.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp
index 9957a76ba38..88293f561ae 100644
--- a/llvm/lib/MC/MCStreamer.cpp
+++ b/llvm/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);
}
OpenPOWER on IntegriCloud