diff options
author | Charles Davis <cdavis@mines.edu> | 2011-05-22 04:15:07 +0000 |
---|---|---|
committer | Charles Davis <cdavis@mines.edu> | 2011-05-22 04:15:07 +0000 |
commit | 38ea9eecd7c810e11f96c8306b241f9db88fc62f (patch) | |
tree | 8d4409866e32dd64a0c491676229e9a5ded79e54 | |
parent | 3185f5c35322cbd10040ab20f265042d477efe62 (diff) | |
download | external_llvm-38ea9eecd7c810e11f96c8306b241f9db88fc62f.zip external_llvm-38ea9eecd7c810e11f96c8306b241f9db88fc62f.tar.gz external_llvm-38ea9eecd7c810e11f96c8306b241f9db88fc62f.tar.bz2 |
Implement emission of all Win64 exception tables. Make the COFF streamer emit
these tables.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131833 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/MC/MCStreamer.h | 9 | ||||
-rw-r--r-- | lib/MC/MCStreamer.cpp | 7 | ||||
-rw-r--r-- | lib/MC/MCWin64EH.cpp | 17 | ||||
-rw-r--r-- | lib/MC/WinCOFFStreamer.cpp | 1 |
4 files changed, 33 insertions, 1 deletions
diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index bfcb460..c12caf0 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -81,6 +81,7 @@ namespace llvm { void EmitFrames(bool usingCFI); MCWin64EHUnwindInfo *getCurrentW64UnwindInfo(){return CurrentW64UnwindInfo;} + void EmitW64Tables(); public: virtual ~MCStreamer(); @@ -95,6 +96,14 @@ namespace llvm { return FrameInfos[i]; } + unsigned getNumW64UnwindInfos() { + return W64UnwindInfos.size(); + } + + MCWin64EHUnwindInfo &getW64UnwindInfo(unsigned i) { + return W64UnwindInfos[i]; + } + /// @name Assembly File Formatting. /// @{ diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 164325e..f268f9e 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -506,3 +506,10 @@ void MCStreamer::EmitFrames(bool usingCFI) { if (EmitDebugFrame) MCDwarfFrameEmitter::Emit(*this, usingCFI, false); } + +void MCStreamer::EmitW64Tables() { + if (!getNumW64UnwindInfos()) + return; + + MCWin64EHUnwindEmitter::Emit(*this); +} diff --git a/lib/MC/MCWin64EH.cpp b/lib/MC/MCWin64EH.cpp index 9884f66..fc39450 100644 --- a/lib/MC/MCWin64EH.cpp +++ b/lib/MC/MCWin64EH.cpp @@ -110,7 +110,7 @@ static void EmitUnwindCode(MCStreamer &streamer, MCWin64EHInstruction &inst) { } static void EmitRuntimeFunction(MCStreamer &streamer, - MCWin64EHUnwindInfo *info) { + const MCWin64EHUnwindInfo *info) { MCContext &context = streamer.getContext(); streamer.EmitValue(MCSymbolRefExpr::Create(info->Begin, context), 4); @@ -185,5 +185,20 @@ void MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer, llvm::EmitUnwindInfo(streamer, info); } +void MCWin64EHUnwindEmitter::Emit(MCStreamer &streamer) { + MCContext &context = streamer.getContext(); + // Emit the unwind info structs first. + const TargetAsmInfo &asmInfo = context.getTargetAsmInfo(); + const MCSection *xdataSect = asmInfo.getWin64EHTableSection(); + streamer.SwitchSection(xdataSect); + for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) + llvm::EmitUnwindInfo(streamer, &streamer.getW64UnwindInfo(i)); + // Now emit RUNTIME_FUNCTION entries. + const MCSection *pdataSect = asmInfo.getWin64EHFuncTableSection(); + streamer.SwitchSection(pdataSect); + for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) + EmitRuntimeFunction(streamer, &streamer.getW64UnwindInfo(i)); +} + } // End of namespace llvm diff --git a/lib/MC/WinCOFFStreamer.cpp b/lib/MC/WinCOFFStreamer.cpp index 8b0cfcb..6c36c12 100644 --- a/lib/MC/WinCOFFStreamer.cpp +++ b/lib/MC/WinCOFFStreamer.cpp @@ -388,6 +388,7 @@ void WinCOFFStreamer::EmitWin64EHHandlerData() { } void WinCOFFStreamer::Finish() { + EmitW64Tables(); MCObjectStreamer::Finish(); } |