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 | |
parent | 097f9a94f660f99ea2aad62da301e8409af391a7 (diff) |
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')
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 20 | ||||
-rw-r--r-- | lib/MC/MCStreamer.cpp | 50 |
2 files changed, 43 insertions, 27 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 6be0298877..e24a3c44ff 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -215,11 +215,11 @@ public: virtual void EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, bool Except); virtual void EmitWin64EHHandlerData(); - virtual void EmitWin64EHPushReg(int64_t Register); - virtual void EmitWin64EHSetFrame(int64_t Register, int64_t Offset); - virtual void EmitWin64EHAllocStack(int64_t Size); - virtual void EmitWin64EHSaveReg(int64_t Register, int64_t Offset); - virtual void EmitWin64EHSaveXMM(int64_t Register, int64_t Offset); + virtual void EmitWin64EHPushReg(unsigned Register); + virtual void EmitWin64EHSetFrame(unsigned Register, unsigned Offset); + virtual void EmitWin64EHAllocStack(unsigned Size); + virtual void EmitWin64EHSaveReg(unsigned Register, unsigned Offset); + virtual void EmitWin64EHSaveXMM(unsigned Register, unsigned Offset); virtual void EmitWin64EHPushFrame(bool Code); virtual void EmitWin64EHEndProlog(); @@ -965,27 +965,27 @@ void MCAsmStreamer::EmitWin64EHHandlerData() { EmitEOL(); } -void MCAsmStreamer::EmitWin64EHPushReg(int64_t Register) { +void MCAsmStreamer::EmitWin64EHPushReg(unsigned Register) { OS << "\t.seh_pushreg " << Register; EmitEOL(); } -void MCAsmStreamer::EmitWin64EHSetFrame(int64_t Register, int64_t Offset) { +void MCAsmStreamer::EmitWin64EHSetFrame(unsigned Register, unsigned Offset) { OS << "\t.seh_setframe " << Register << ", " << Offset; EmitEOL(); } -void MCAsmStreamer::EmitWin64EHAllocStack(int64_t Size) { +void MCAsmStreamer::EmitWin64EHAllocStack(unsigned Size) { OS << "\t.seh_stackalloc " << Size; EmitEOL(); } -void MCAsmStreamer::EmitWin64EHSaveReg(int64_t Register, int64_t Offset) { +void MCAsmStreamer::EmitWin64EHSaveReg(unsigned Register, unsigned Offset) { OS << "\t.seh_savereg " << Register << ", " << Offset; EmitEOL(); } -void MCAsmStreamer::EmitWin64EHSaveXMM(int64_t Register, int64_t Offset) { +void MCAsmStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) { OS << "\t.seh_savexmm " << Register << ", " << Offset; EmitEOL(); } 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() { |