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:
Bill Wendling 2011-06-23 01:06:23 +00:00
parent 5476205b9b
commit e8fc92ad46
1 changed files with 63 additions and 1 deletions

View File

@ -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 &section = isEH ?
*asmInfo.getEHFrameSection() : *asmInfo.getDwarfFrameSection();
*asmInfo.getEHFrameSection() :
*asmInfo.getDwarfFrameSection();
streamer.SwitchSection(&section);
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);
}