mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-27 08:26:23 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@133676 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
533c9ac021
commit
e3cd13f0e2
@ -507,6 +507,12 @@ namespace {
|
|||||||
SectionStart(sectionStart) {
|
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 &EmitCIE(MCStreamer &streamer,
|
||||||
const MCSymbol *personality,
|
const MCSymbol *personality,
|
||||||
unsigned personalityEncoding,
|
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 &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
|
||||||
const MCSymbol *personality,
|
const MCSymbol *personality,
|
||||||
unsigned personalityEncoding,
|
unsigned personalityEncoding,
|
||||||
@ -846,7 +901,8 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &streamer,
|
|||||||
MCContext &context = streamer.getContext();
|
MCContext &context = streamer.getContext();
|
||||||
const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
|
const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
|
||||||
const MCSection §ion = isEH ?
|
const MCSection §ion = isEH ?
|
||||||
*asmInfo.getEHFrameSection() : *asmInfo.getDwarfFrameSection();
|
*asmInfo.getEHFrameSection() :
|
||||||
|
*asmInfo.getDwarfFrameSection();
|
||||||
streamer.SwitchSection(§ion);
|
streamer.SwitchSection(§ion);
|
||||||
MCSymbol *SectionStart = context.CreateTempSymbol();
|
MCSymbol *SectionStart = context.CreateTempSymbol();
|
||||||
streamer.EmitLabel(SectionStart);
|
streamer.EmitLabel(SectionStart);
|
||||||
@ -861,11 +917,17 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &streamer,
|
|||||||
CIEKey key(frame.Personality, frame.PersonalityEncoding,
|
CIEKey key(frame.Personality, frame.PersonalityEncoding,
|
||||||
frame.LsdaEncoding);
|
frame.LsdaEncoding);
|
||||||
const MCSymbol *&cieStart = isEH ? CIEStarts[key] : DummyDebugKey;
|
const MCSymbol *&cieStart = isEH ? CIEStarts[key] : DummyDebugKey;
|
||||||
|
if (isEH && asmInfo.getSupportsCompactUnwindInfo() &&
|
||||||
|
Emitter.EmitCompactUnwind(streamer, frame))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (!cieStart)
|
if (!cieStart)
|
||||||
cieStart = &Emitter.EmitCIE(streamer, frame.Personality,
|
cieStart = &Emitter.EmitCIE(streamer, frame.Personality,
|
||||||
frame.PersonalityEncoding, frame.Lsda,
|
frame.PersonalityEncoding, frame.Lsda,
|
||||||
frame.LsdaEncoding);
|
frame.LsdaEncoding);
|
||||||
|
|
||||||
fdeEnd = Emitter.EmitFDE(streamer, *cieStart, frame);
|
fdeEnd = Emitter.EmitFDE(streamer, *cieStart, frame);
|
||||||
|
|
||||||
if (i != n - 1)
|
if (i != n - 1)
|
||||||
streamer.EmitLabel(fdeEnd);
|
streamer.EmitLabel(fdeEnd);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user