Add an alternative implementation of CIE and FDE emission that outputs them

in the same order as the one in CodeGen.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130471 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2011-04-29 02:42:28 +00:00
parent bcffb1fbb8
commit 9099813bd5
2 changed files with 59 additions and 0 deletions

View File

@ -282,6 +282,7 @@ namespace llvm {
// This emits the frame info section.
//
static void Emit(MCStreamer &streamer);
static void EmitDarwin(MCStreamer &streamer);
static void EmitAdvanceLoc(MCStreamer &Streamer, uint64_t AddrDelta);
static void EncodeAdvanceLoc(uint64_t AddrDelta, raw_ostream &OS,
const TargetAsmInfo &AsmInfo);

View File

@ -824,9 +824,67 @@ namespace llvm {
};
}
// This is an implementation of CIE and FDE emission that is bug by bug
// compatible with the one in CodeGen. It is useful during the transition
// to make it easy to compare the outputs, but should probably be removed
// afterwards.
void MCDwarfFrameEmitter::EmitDarwin(MCStreamer &streamer) {
FrameEmitterImpl Emitter;
DenseMap<const MCSymbol*, const MCSymbol*> Personalities;
const MCSymbol *aCIE = NULL;
const MCDwarfFrameInfo *aFrame = NULL;
for (unsigned i = 0, n = streamer.getNumFrameInfos(); i < n; ++i) {
const MCDwarfFrameInfo &frame = streamer.getFrameInfo(i);
if (!frame.Personality)
continue;
if (Personalities.count(frame.Personality))
continue;
const MCSymbol *cieStart = &Emitter.EmitCIE(streamer, frame.Personality,
frame.PersonalityEncoding,
frame.Lsda,
frame.LsdaEncoding);
aCIE = cieStart;
aFrame = &frame;
Personalities[frame.Personality] = cieStart;
}
if (Personalities.empty()) {
const MCDwarfFrameInfo &frame = streamer.getFrameInfo(0);
aCIE = &Emitter.EmitCIE(streamer, frame.Personality,
frame.PersonalityEncoding, frame.Lsda,
frame.LsdaEncoding);
aFrame = &frame;
}
MCSymbol *fdeEnd = NULL;
for (unsigned i = 0, n = streamer.getNumFrameInfos(); i < n; ++i) {
const MCDwarfFrameInfo &frame = streamer.getFrameInfo(i);
const MCSymbol *cieStart = Personalities[frame.Personality];
if (!cieStart)
cieStart = aCIE;
fdeEnd = Emitter.EmitFDE(streamer, *cieStart, frame);
if (i != n - 1)
streamer.EmitLabel(fdeEnd);
}
const MCContext &context = streamer.getContext();
const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
streamer.EmitValueToAlignment(asmInfo.getPointerSize());
if (fdeEnd)
streamer.EmitLabel(fdeEnd);
}
void MCDwarfFrameEmitter::Emit(MCStreamer &streamer) {
const MCContext &context = streamer.getContext();
const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
if (!asmInfo.isFunctionEHFrameSymbolPrivate()) {
EmitDarwin(streamer);
return;
}
MCSymbol *fdeEnd = NULL;
DenseMap<CIEKey, const MCSymbol*> CIEStarts;
FrameEmitterImpl Emitter;