forked from OSchip/llvm-project
Some skeleton code to emit the compact unwind. If the information is unable to
be emitted in a compact way, we then default to emitting a CIE and FDE. llvm-svn: 133676
This commit is contained in:
parent
5476205b9b
commit
e8fc92ad46
|
@ -507,6 +507,12 @@ namespace {
|
|||
SectionStart(sectionStart) {
|
||||
}
|
||||
|
||||
/// EmitCompactUnwind - Emit the unwind information in a compact way. If
|
||||
/// we're successful, return 'true'. Otherwise, return 'false' and it will
|
||||
/// emit the normal CIE and FDE.
|
||||
bool EmitCompactUnwind(MCStreamer &streamer,
|
||||
const MCDwarfFrameInfo &frame);
|
||||
|
||||
const MCSymbol &EmitCIE(MCStreamer &streamer,
|
||||
const MCSymbol *personality,
|
||||
unsigned personalityEncoding,
|
||||
|
@ -620,6 +626,55 @@ void FrameEmitterImpl::EmitCFIInstructions(MCStreamer &streamer,
|
|||
}
|
||||
}
|
||||
|
||||
/// EmitCompactUnwind - Emit the unwind information in a compact way. If we're
|
||||
/// successful, return 'true'. Otherwise, return 'false' and it will emit the
|
||||
/// normal CIE and FDE.
|
||||
bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
|
||||
const MCDwarfFrameInfo &Frame) {
|
||||
#if 1
|
||||
return false;
|
||||
#else
|
||||
MCContext &Context = Streamer.getContext();
|
||||
const TargetAsmInfo &TAI = Context.getTargetAsmInfo();
|
||||
Streamer.SwitchSection(TAI.getCompactUnwindSection());
|
||||
|
||||
unsigned FDEEncoding = TAI.getFDEEncoding(UsingCFI);
|
||||
unsigned Size = getSizeForEncoding(Streamer, FDEEncoding);
|
||||
|
||||
// range-start range-length compact-unwind-enc personality-func lsda
|
||||
// _foo LfooEnd-_foo 0x00000023 0 0
|
||||
// _bar LbarEnd-_bar 0x00000025 __gxx_personality except_tab1
|
||||
//
|
||||
// .section __LD,__compact_unwind,regular,debug
|
||||
//
|
||||
// # compact unwind for _foo
|
||||
// .quad _foo
|
||||
// .set L1,LfooEnd-_foo
|
||||
// .long L1
|
||||
// .long 0x01010001
|
||||
// .quad 0
|
||||
// .quad 0
|
||||
//
|
||||
// # compact unwind for _bar
|
||||
// .quad _bar
|
||||
// .set L2,LbarEnd-_bar
|
||||
// .long L2
|
||||
// .long 0x01020011
|
||||
// .quad __gxx_personality
|
||||
// .quad except_tab1
|
||||
|
||||
// Range Start
|
||||
EmitSymbol(Streamer, *Frame.Begin, FDEEncoding);
|
||||
|
||||
// Range Length
|
||||
const MCExpr *Range = MakeStartMinusEndExpr(Streamer, *Frame.Begin,
|
||||
*Frame.End, 0);
|
||||
Streamer.EmitAbsValue(Range, Size);
|
||||
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
|
||||
const MCSymbol *personality,
|
||||
unsigned personalityEncoding,
|
||||
|
@ -846,7 +901,8 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &streamer,
|
|||
MCContext &context = streamer.getContext();
|
||||
const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
|
||||
const MCSection §ion = isEH ?
|
||||
*asmInfo.getEHFrameSection() : *asmInfo.getDwarfFrameSection();
|
||||
*asmInfo.getEHFrameSection() :
|
||||
*asmInfo.getDwarfFrameSection();
|
||||
streamer.SwitchSection(§ion);
|
||||
MCSymbol *SectionStart = context.CreateTempSymbol();
|
||||
streamer.EmitLabel(SectionStart);
|
||||
|
@ -861,11 +917,17 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &streamer,
|
|||
CIEKey key(frame.Personality, frame.PersonalityEncoding,
|
||||
frame.LsdaEncoding);
|
||||
const MCSymbol *&cieStart = isEH ? CIEStarts[key] : DummyDebugKey;
|
||||
if (isEH && asmInfo.getSupportsCompactUnwindInfo() &&
|
||||
Emitter.EmitCompactUnwind(streamer, frame))
|
||||
continue;
|
||||
|
||||
if (!cieStart)
|
||||
cieStart = &Emitter.EmitCIE(streamer, frame.Personality,
|
||||
frame.PersonalityEncoding, frame.Lsda,
|
||||
frame.LsdaEncoding);
|
||||
|
||||
fdeEnd = Emitter.EmitFDE(streamer, *cieStart, frame);
|
||||
|
||||
if (i != n - 1)
|
||||
streamer.EmitLabel(fdeEnd);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue