mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-17 21:35:07 +00:00
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
This commit is contained in:
parent
3185f5c353
commit
38ea9eecd7
@ -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.
|
||||
/// @{
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -388,6 +388,7 @@ void WinCOFFStreamer::EmitWin64EHHandlerData() {
|
||||
}
|
||||
|
||||
void WinCOFFStreamer::Finish() {
|
||||
EmitW64Tables();
|
||||
MCObjectStreamer::Finish();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user