aboutsummaryrefslogtreecommitdiff
path: root/lib/MC/MCAsmStreamer.cpp
diff options
context:
space:
mode:
authorCharles Davis <cdavis@mines.edu>2011-05-19 17:46:39 +0000
committerCharles Davis <cdavis@mines.edu>2011-05-19 17:46:39 +0000
commit440596ffe5bb77a202acb36d5eadd158976ff39a (patch)
treecbb72fd8800178e8645fc3cd25b91fbfdea7651e /lib/MC/MCAsmStreamer.cpp
parent6635b04a4357caf6544cd0a7dbc4c107e7907a88 (diff)
Turns out GAS does have Win64 EH directives. (It also supports WinCE EH.) Make
ours compatible with GAS. In retrospect, I should have emailed binutils about this earlier. Thanks to Kai Tietz for pointing out that GAS already had SEH directives. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131652 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCAsmStreamer.cpp')
-rw-r--r--lib/MC/MCAsmStreamer.cpp52
1 files changed, 31 insertions, 21 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index 36fa393c56..6be0298877 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -208,16 +208,18 @@ public:
virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset);
virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment);
- virtual void EmitWin64EHStartProc(MCSymbol *Symbol, MCSymbol *EHandler = 0);
+ virtual void EmitWin64EHStartProc(MCSymbol *Symbol);
virtual void EmitWin64EHEndProc();
virtual void EmitWin64EHStartChained();
virtual void EmitWin64EHEndChained();
- virtual void EmitWin64EHUnwindOnly();
- virtual void EmitWin64EHLsda(const MCSymbol *Sym, int64_t Size);
+ 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 EmitWin64EHPushFrame(bool Code);
virtual void EmitWin64EHEndProlog();
@@ -928,67 +930,75 @@ void MCAsmStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {
EmitEOL();
}
-void MCAsmStreamer::EmitWin64EHStartProc(MCSymbol *Symbol, MCSymbol *EHandler) {
- OS << ".w64_startproc " << *Symbol;
- if (EHandler)
- OS << ", " << *EHandler;
+void MCAsmStreamer::EmitWin64EHStartProc(MCSymbol *Symbol) {
+ OS << ".seh_proc " << *Symbol;
EmitEOL();
}
void MCAsmStreamer::EmitWin64EHEndProc() {
- OS << "\t.w64_endproc";
+ OS << "\t.seh_endproc";
EmitEOL();
}
void MCAsmStreamer::EmitWin64EHStartChained() {
- OS << "\t.w64_startchained";
+ OS << "\t.seh_startchained";
EmitEOL();
}
void MCAsmStreamer::EmitWin64EHEndChained() {
- OS << "\t.w64_endchained";
+ OS << "\t.seh_endchained";
EmitEOL();
}
-void MCAsmStreamer::EmitWin64EHUnwindOnly() {
- OS << "\t.w64_unwind_only";
+void MCAsmStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind,
+ bool Except) {
+ OS << "\t.seh_handler " << *Sym;
+ if (Unwind)
+ OS << ", @unwind";
+ if (Except)
+ OS << ", @except";
EmitEOL();
}
-void MCAsmStreamer::EmitWin64EHLsda(const MCSymbol *Sym, int64_t Size) {
- OS << "\t.w64_lsda " << *Sym << ", " << Size;
+void MCAsmStreamer::EmitWin64EHHandlerData() {
+ OS << "\t.seh_handlerdata";
EmitEOL();
}
void MCAsmStreamer::EmitWin64EHPushReg(int64_t Register) {
- OS << "\t.w64_pushreg " << Register;
+ OS << "\t.seh_pushreg " << Register;
EmitEOL();
}
void MCAsmStreamer::EmitWin64EHSetFrame(int64_t Register, int64_t Offset) {
- OS << "\t.w64_setframe " << Register << ", " << Offset;
+ OS << "\t.seh_setframe " << Register << ", " << Offset;
EmitEOL();
}
void MCAsmStreamer::EmitWin64EHAllocStack(int64_t Size) {
- OS << "\t.w64_allocstack " << Size;
+ OS << "\t.seh_stackalloc " << Size;
EmitEOL();
}
void MCAsmStreamer::EmitWin64EHSaveReg(int64_t Register, int64_t Offset) {
- OS << "\t.w64_savereg " << Register << ", " << Offset;
+ OS << "\t.seh_savereg " << Register << ", " << Offset;
+ EmitEOL();
+}
+
+void MCAsmStreamer::EmitWin64EHSaveXMM(int64_t Register, int64_t Offset) {
+ OS << "\t.seh_savexmm " << Register << ", " << Offset;
EmitEOL();
}
void MCAsmStreamer::EmitWin64EHPushFrame(bool Code) {
- OS << "\t.w64_pushframe";
+ OS << "\t.seh_pushframe";
if (Code)
- OS << " " << "code";
+ OS << " @code";
EmitEOL();
}
void MCAsmStreamer::EmitWin64EHEndProlog(void) {
- OS << "\t.w64_endprolog";
+ OS << "\t.seh_endprologue";
EmitEOL();
}