summaryrefslogtreecommitdiffstats
path: root/llvm/lib
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
commit7e6e8951afd3c0adfb4f578186d9ea24a765b851 (patch)
treebc829546ab9e67626f31d8101f9c42c4e6a51dc8 /llvm/lib
parentd2144a9fb8c11a76f2c5e2c84571c6ea971490d9 (diff)
downloadbcm5719-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.cpp20
-rw-r--r--llvm/lib/MC/MCStreamer.cpp50
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() {
OpenPOWER on IntegriCloud