summaryrefslogtreecommitdiff
path: root/lib/MC/MCStreamer.cpp
diff options
context:
space:
mode:
authorCharles Davis <cdavis@mines.edu>2011-05-19 19:35:55 +0000
committerCharles Davis <cdavis@mines.edu>2011-05-19 19:35:55 +0000
commitc3b162857a587c9877e903f038471b882b213232 (patch)
tree10073987eebdd8504721fbb230051bf2644c7720 /lib/MC/MCStreamer.cpp
parent097f9a94f660f99ea2aad62da301e8409af391a7 (diff)
downloadllvm-c3b162857a587c9877e903f038471b882b213232.tar.gz
llvm-c3b162857a587c9877e903f038471b882b213232.tar.bz2
llvm-c3b162857a587c9877e903f038471b882b213232.tar.xz
Implement the Win64 EH prolog instruction methods on the base MCStreamer.
I had to change the API slightly to avoid overloading issues. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131666 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCStreamer.cpp')
-rw-r--r--lib/MC/MCStreamer.cpp50
1 files changed, 33 insertions, 17 deletions
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp
index fc09369ae2..fcc338991f 100644
--- a/lib/MC/MCStreamer.cpp
+++ b/lib/MC/MCStreamer.cpp
@@ -378,34 +378,50 @@ void MCStreamer::EmitWin64EHHandlerData() {
abort();
}
-void MCStreamer::EmitWin64EHPushReg(int64_t Register) {
- errs() << "Not implemented yet\n";
- abort();
+void MCStreamer::EmitWin64EHPushReg(unsigned Register) {
+ EnsureValidW64UnwindInfo();
+ MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
+ MCWin64EHInstruction Inst(Win64EH::UOP_PushNonVol, Register);
+ CurFrame->Instructions.push_back(Inst);
}
-void MCStreamer::EmitWin64EHSetFrame(int64_t Register, int64_t Offset) {
- errs() << "Not implemented yet\n";
- abort();
+void MCStreamer::EmitWin64EHSetFrame(unsigned Register, unsigned Offset) {
+ EnsureValidW64UnwindInfo();
+ MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
+ MCWin64EHInstruction Inst(Win64EH::UOP_SetFPReg, Register, Offset);
+ CurFrame->Instructions.push_back(Inst);
}
-void MCStreamer::EmitWin64EHAllocStack(int64_t Size) {
- errs() << "Not implemented yet\n";
- abort();
+void MCStreamer::EmitWin64EHAllocStack(unsigned Size) {
+ EnsureValidW64UnwindInfo();
+ MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
+ MCWin64EHInstruction Inst(Size);
+ CurFrame->Instructions.push_back(Inst);
}
-void MCStreamer::EmitWin64EHSaveReg(int64_t Register, int64_t Offset) {
- errs() << "Not implemented yet\n";
- abort();
+void MCStreamer::EmitWin64EHSaveReg(unsigned Register, unsigned Offset) {
+ EnsureValidW64UnwindInfo();
+ MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
+ MCWin64EHInstruction Inst(
+ Offset > 0xFFFF ? Win64EH::UOP_SaveNonVol : Win64EH::UOP_SaveNonVolBig,
+ Register, Offset);
+ CurFrame->Instructions.push_back(Inst);
}
-void MCStreamer::EmitWin64EHSaveXMM(int64_t Register, int64_t Offset) {
- errs() << "Not implemented yet\n";
- abort();
+void MCStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) {
+ EnsureValidW64UnwindInfo();
+ MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
+ MCWin64EHInstruction Inst(
+ Offset > 0xFFFF ? Win64EH::UOP_SaveXMM128 : Win64EH::UOP_SaveXMM128Big,
+ Register, Offset);
+ CurFrame->Instructions.push_back(Inst);
}
void MCStreamer::EmitWin64EHPushFrame(bool Code) {
- errs() << "Not implemented yet\n";
- abort();
+ EnsureValidW64UnwindInfo();
+ MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
+ MCWin64EHInstruction Inst(Win64EH::UOP_PushMachFrame, Code);
+ CurFrame->Instructions.push_back(Inst);
}
void MCStreamer::EmitWin64EHEndProlog() {