mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-17 00:27:31 +00:00
Call generateCompactUnwindEncodings() right before we need to output the frame information.
There are more than one paths to where the frame information is emitted. Place the call to generateCompactUnwindEncodings() into the method which outputs the frame information, thus ensuring that the encoding is there for every path. This involved threading the MCAsmBackend object through to this method. <rdar://problem/13623355> llvm-svn: 190335
This commit is contained in:
parent
c162f49ca6
commit
9dc412015e
@ -23,6 +23,7 @@
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
class MCAsmBackend;
|
||||
class MCContext;
|
||||
class MCSection;
|
||||
class MCStreamer;
|
||||
@ -449,7 +450,8 @@ public:
|
||||
//
|
||||
// This emits the frame info section.
|
||||
//
|
||||
static void Emit(MCStreamer &streamer, bool usingCFI, bool isEH);
|
||||
static void Emit(MCStreamer &streamer, MCAsmBackend *MAB,
|
||||
bool usingCFI, bool isEH);
|
||||
static void EmitAdvanceLoc(MCStreamer &Streamer, uint64_t AddrDelta);
|
||||
static void EncodeAdvanceLoc(MCContext &Context, uint64_t AddrDelta,
|
||||
raw_ostream &OS);
|
||||
|
@ -104,7 +104,7 @@ protected:
|
||||
virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame);
|
||||
void RecordProcEnd(MCDwarfFrameInfo &Frame);
|
||||
virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame);
|
||||
void EmitFrames(bool usingCFI);
|
||||
void EmitFrames(MCAsmBackend *MAB, bool usingCFI);
|
||||
|
||||
MCWin64EHUnwindInfo *getCurrentW64UnwindInfo() {
|
||||
return CurrentW64UnwindInfo;
|
||||
@ -134,7 +134,7 @@ public:
|
||||
return *W64UnwindInfos[i];
|
||||
}
|
||||
|
||||
void generateCompactUnwindEncodings(MCAsmBackend &MAB);
|
||||
void generateCompactUnwindEncodings(MCAsmBackend *MAB);
|
||||
|
||||
/// @name Assembly File Formatting.
|
||||
/// @{
|
||||
|
@ -175,12 +175,11 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
|
||||
|
||||
// Create a code emitter if asked to show the encoding.
|
||||
MCCodeEmitter *MCE = 0;
|
||||
MCAsmBackend *MAB = 0;
|
||||
if (ShowMCEncoding) {
|
||||
if (ShowMCEncoding)
|
||||
MCE = getTarget().createMCCodeEmitter(MII, MRI, STI, *Context);
|
||||
MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(), TargetCPU);
|
||||
}
|
||||
|
||||
MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),
|
||||
TargetCPU);
|
||||
MCStreamer *S = getTarget().createAsmStreamer(*Context, Out,
|
||||
getVerboseAsm(),
|
||||
hasMCUseLoc(),
|
||||
|
@ -1421,8 +1421,9 @@ void MCAsmStreamer::FinishImpl() {
|
||||
MCGenDwarfInfo::Emit(this, LineSectionSymbol);
|
||||
|
||||
if (!UseCFI)
|
||||
EmitFrames(false);
|
||||
EmitFrames(AsmBackend.get(), false);
|
||||
}
|
||||
|
||||
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
|
||||
formatted_raw_ostream &OS,
|
||||
bool isVerboseAsm, bool useLoc,
|
||||
|
@ -1415,9 +1415,10 @@ namespace llvm {
|
||||
};
|
||||
}
|
||||
|
||||
void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer,
|
||||
bool UsingCFI,
|
||||
bool IsEH) {
|
||||
void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer, MCAsmBackend *MAB,
|
||||
bool UsingCFI, bool IsEH) {
|
||||
Streamer.generateCompactUnwindEncodings(MAB);
|
||||
|
||||
MCContext &Context = Streamer.getContext();
|
||||
const MCObjectFileInfo *MOFI = Context.getObjectFileInfo();
|
||||
FrameEmitterImpl Emitter(UsingCFI, IsEH);
|
||||
|
@ -528,7 +528,7 @@ void MCELFStreamer::EmitBundleUnlock() {
|
||||
}
|
||||
|
||||
void MCELFStreamer::FinishImpl() {
|
||||
EmitFrames(true);
|
||||
EmitFrames(NULL, true);
|
||||
|
||||
for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(),
|
||||
e = LocalCommons.end();
|
||||
|
@ -396,8 +396,7 @@ void MCMachOStreamer::EmitInstToData(const MCInst &Inst) {
|
||||
}
|
||||
|
||||
void MCMachOStreamer::FinishImpl() {
|
||||
generateCompactUnwindEncodings(getAssembler().getBackend());
|
||||
EmitFrames(true);
|
||||
EmitFrames(&getAssembler().getBackend(), true);
|
||||
|
||||
// We have to set the fragment atom associations so we can relax properly for
|
||||
// Mach-O.
|
||||
|
@ -73,12 +73,12 @@ raw_ostream &MCStreamer::GetCommentOS() {
|
||||
return nulls();
|
||||
}
|
||||
|
||||
void MCStreamer::generateCompactUnwindEncodings(MCAsmBackend &MAB) {
|
||||
void MCStreamer::generateCompactUnwindEncodings(MCAsmBackend *MAB) {
|
||||
if (!MAB) return;
|
||||
for (std::vector<MCDwarfFrameInfo>::iterator I = FrameInfos.begin(),
|
||||
E = FrameInfos.end(); I != E; ++I)
|
||||
if (!I->CompactUnwindEncoding)
|
||||
I->CompactUnwindEncoding =
|
||||
MAB.generateCompactUnwindEncoding(I->Instructions);
|
||||
I->CompactUnwindEncoding =
|
||||
MAB->generateCompactUnwindEncoding(I->Instructions);
|
||||
}
|
||||
|
||||
void MCStreamer::EmitDwarfSetLineAddr(int64_t LineDelta,
|
||||
@ -604,15 +604,15 @@ void MCStreamer::EmitRawText(const Twine &T) {
|
||||
EmitRawText(Str.str());
|
||||
}
|
||||
|
||||
void MCStreamer::EmitFrames(bool usingCFI) {
|
||||
void MCStreamer::EmitFrames(MCAsmBackend *MAB, bool usingCFI) {
|
||||
if (!getNumFrameInfos())
|
||||
return;
|
||||
|
||||
if (EmitEHFrame)
|
||||
MCDwarfFrameEmitter::Emit(*this, usingCFI, true);
|
||||
MCDwarfFrameEmitter::Emit(*this, MAB, usingCFI, true);
|
||||
|
||||
if (EmitDebugFrame)
|
||||
MCDwarfFrameEmitter::Emit(*this, usingCFI, false);
|
||||
MCDwarfFrameEmitter::Emit(*this, MAB, usingCFI, false);
|
||||
}
|
||||
|
||||
void MCStreamer::EmitW64Tables() {
|
||||
|
Loading…
Reference in New Issue
Block a user