summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-11-06 03:02:51 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-11-06 03:02:51 +0000
commit46be4352288a0b94d3ed91264d14ab6becc97da6 (patch)
tree7549dfbabe1562fd12cd1880dabdbf3c9f2d19ef /llvm/lib/MC
parent472954fa6380104e0cf8b3ea20192cf10977e704 (diff)
downloadbcm5719-llvm-46be4352288a0b94d3ed91264d14ab6becc97da6.tar.gz
bcm5719-llvm-46be4352288a0b94d3ed91264d14ab6becc97da6.zip
Simplify the alignment handling in FDE emission.
llvm-svn: 252271
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r--llvm/lib/MC/MCDwarf.cpp31
1 files changed, 15 insertions, 16 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index b7beb57ac76..85680c01644 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -1015,7 +1015,8 @@ public:
unsigned personalityEncoding, const MCSymbol *lsda,
bool IsSignalFrame, unsigned lsdaEncoding,
bool IsSimple);
- MCSymbol *EmitFDE(const MCSymbol &cieStart, const MCDwarfFrameInfo &frame);
+ void EmitFDE(const MCSymbol &cieStart, const MCDwarfFrameInfo &frame,
+ bool LastInSection);
void EmitCFIInstructions(ArrayRef<MCCFIInstruction> Instrs,
MCSymbol *BaseLabel);
void EmitCFIInstruction(const MCCFIInstruction &Instr);
@@ -1368,8 +1369,9 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality,
return *sectionStart;
}
-MCSymbol *FrameEmitterImpl::EmitFDE(const MCSymbol &cieStart,
- const MCDwarfFrameInfo &frame) {
+void FrameEmitterImpl::EmitFDE(const MCSymbol &cieStart,
+ const MCDwarfFrameInfo &frame,
+ bool LastInSection) {
MCContext &context = Streamer.getContext();
MCSymbol *fdeStart = context.createTempSymbol();
MCSymbol *fdeEnd = context.createTempSymbol();
@@ -1426,9 +1428,13 @@ MCSymbol *FrameEmitterImpl::EmitFDE(const MCSymbol &cieStart,
EmitCFIInstructions(frame.Instructions, frame.Begin);
// Padding
- Streamer.EmitValueToAlignment(PCSize);
+ // The size of a .eh_frame section has to be a multiple of the alignment
+ // since a null CIE is interpreted as the end. Old systems overaligned
+ // .eh_frame, so we do too and account for it in the last FDE.
+ unsigned Align = LastInSection ? asmInfo->getPointerSize() : PCSize;
+ Streamer.EmitValueToAlignment(Align);
- return fdeEnd;
+ Streamer.EmitLabel(fdeEnd);
}
namespace {
@@ -1519,22 +1525,19 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
Streamer.EmitLabel(SectionStart);
Emitter.setSectionStart(SectionStart);
- MCSymbol *FDEEnd = nullptr;
DenseMap<CIEKey, const MCSymbol *> CIEStarts;
const MCSymbol *DummyDebugKey = nullptr;
bool CanOmitDwarf = MOFI->getOmitDwarfIfHaveCompactUnwind();
- for (const MCDwarfFrameInfo &Frame : FrameArray) {
+ for (auto I = FrameArray.begin(), E = FrameArray.end(); I != E;) {
+ const MCDwarfFrameInfo &Frame = *I;
+ ++I;
if (CanOmitDwarf && Frame.CompactUnwindEncoding !=
MOFI->getCompactUnwindDwarfEHFrameOnly())
// Don't generate an EH frame if we don't need one. I.e., it's taken care
// of by the compact unwind encoding.
continue;
- // Close the previous FDE.
- if (FDEEnd)
- Streamer.EmitLabel(FDEEnd);
-
CIEKey Key(Frame.Personality, Frame.PersonalityEncoding,
Frame.LsdaEncoding, Frame.IsSignalFrame, Frame.IsSimple);
const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;
@@ -1543,12 +1546,8 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
Frame.Lsda, Frame.IsSignalFrame,
Frame.LsdaEncoding, Frame.IsSimple);
- FDEEnd = Emitter.EmitFDE(*CIEStart, Frame);
+ Emitter.EmitFDE(*CIEStart, Frame, I == E);
}
-
- Streamer.EmitValueToAlignment(Context.getAsmInfo()->getPointerSize());
- if (FDEEnd)
- Streamer.EmitLabel(FDEEnd);
}
void MCDwarfFrameEmitter::EmitAdvanceLoc(MCObjectStreamer &Streamer,
OpenPOWER on IntegriCloud