diff options
author | Charles Davis <cdavis@mines.edu> | 2011-05-19 19:35:55 +0000 |
---|---|---|
committer | Charles Davis <cdavis@mines.edu> | 2011-05-19 19:35:55 +0000 |
commit | c3b162857a587c9877e903f038471b882b213232 (patch) | |
tree | 10073987eebdd8504721fbb230051bf2644c7720 /lib/MC/MCStreamer.cpp | |
parent | 097f9a94f660f99ea2aad62da301e8409af391a7 (diff) | |
download | llvm-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.cpp | 50 |
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() { |