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 | 7e6e8951afd3c0adfb4f578186d9ea24a765b851 (patch) | |
tree | bc829546ab9e67626f31d8101f9c42c4e6a51dc8 /llvm/lib | |
parent | d2144a9fb8c11a76f2c5e2c84571c6ea971490d9 (diff) | |
download | bcm5719-llvm-7e6e8951afd3c0adfb4f578186d9ea24a765b851.tar.gz bcm5719-llvm-7e6e8951afd3c0adfb4f578186d9ea24a765b851.zip |
Implement the Win64 EH prolog instruction methods on the base MCStreamer.
I had to change the API slightly to avoid overloading issues.
llvm-svn: 131666
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 20 | ||||
-rw-r--r-- | llvm/lib/MC/MCStreamer.cpp | 50 |
2 files changed, 43 insertions, 27 deletions
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 6be02988777..e24a3c44ffd 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/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/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp index fc09369ae2b..fcc338991f1 100644 --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/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() { |