forked from OSchip/llvm-project
Track the compact unwind encoding for when we are unable to generate compact unwind information.
Compact unwind has an encoding for when we're not able to generate compact unwind and must generate an EH frame instead. Track that, but still emit that CU encoding. llvm-svn: 179220
This commit is contained in:
parent
7c19abeba6
commit
2d1df6be87
|
@ -46,10 +46,15 @@ protected:
|
|||
unsigned FDEEncoding;
|
||||
unsigned FDECFIEncoding;
|
||||
unsigned TTypeEncoding;
|
||||
// Section flags for eh_frame
|
||||
|
||||
/// Section flags for eh_frame
|
||||
unsigned EHSectionType;
|
||||
unsigned EHSectionFlags;
|
||||
|
||||
/// CompactUnwindDwarfEHFrameOnly - Compact unwind encoding indicating that we
|
||||
/// should emit only an EH frame.
|
||||
unsigned CompactUnwindDwarfEHFrameOnly;
|
||||
|
||||
/// TextSection - Section directive for standard text.
|
||||
///
|
||||
const MCSection *TextSection;
|
||||
|
@ -201,6 +206,10 @@ public:
|
|||
}
|
||||
unsigned getTTypeEncoding() const { return TTypeEncoding; }
|
||||
|
||||
unsigned getCompactUnwindDwarfEHFrameOnly() const {
|
||||
return CompactUnwindDwarfEHFrameOnly;
|
||||
}
|
||||
|
||||
const MCSection *getTextSection() const { return TextSection; }
|
||||
const MCSection *getDataSection() const { return DataSection; }
|
||||
const MCSection *getBSSSection() const { return BSSSection; }
|
||||
|
|
|
@ -1168,10 +1168,10 @@ bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
|
|||
// .quad except_tab1
|
||||
|
||||
uint32_t Encoding = Frame.CompactUnwindEncoding;
|
||||
if (!Encoding) return false;
|
||||
bool DwarfEHFrameOnly = (Encoding == MOFI->getCompactUnwindDwarfEHFrameOnly());
|
||||
|
||||
// The encoding needs to know we have an LSDA.
|
||||
if (Frame.Lsda)
|
||||
if (!DwarfEHFrameOnly && Frame.Lsda)
|
||||
Encoding |= 0x40000000;
|
||||
|
||||
Streamer.SwitchSection(MOFI->getCompactUnwindSection());
|
||||
|
@ -1194,11 +1194,10 @@ bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
|
|||
Twine::utohexstr(Encoding));
|
||||
Streamer.EmitIntValue(Encoding, Size);
|
||||
|
||||
|
||||
// Personality Function
|
||||
Size = getSizeForEncoding(Streamer, dwarf::DW_EH_PE_absptr);
|
||||
if (VerboseAsm) Streamer.AddComment("Personality Function");
|
||||
if (Frame.Personality)
|
||||
if (!DwarfEHFrameOnly && Frame.Personality)
|
||||
Streamer.EmitSymbolValue(Frame.Personality, Size);
|
||||
else
|
||||
Streamer.EmitIntValue(0, Size); // No personality fn
|
||||
|
@ -1206,7 +1205,7 @@ bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
|
|||
// LSDA
|
||||
Size = getSizeForEncoding(Streamer, Frame.LsdaEncoding);
|
||||
if (VerboseAsm) Streamer.AddComment("LSDA");
|
||||
if (Frame.Lsda)
|
||||
if (!DwarfEHFrameOnly && Frame.Lsda)
|
||||
Streamer.EmitSymbolValue(Frame.Lsda, Size);
|
||||
else
|
||||
Streamer.EmitIntValue(0, Size); // No LSDA
|
||||
|
|
|
@ -145,12 +145,16 @@ void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
|
|||
LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
|
||||
SectionKind::getReadOnlyWithRel());
|
||||
|
||||
if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
|
||||
if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) {
|
||||
CompactUnwindSection =
|
||||
Ctx->getMachOSection("__LD", "__compact_unwind",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86)
|
||||
CompactUnwindDwarfEHFrameOnly = 0x04000000;
|
||||
}
|
||||
|
||||
// Debug Information.
|
||||
DwarfAccelNamesSection =
|
||||
Ctx->getMachOSection("__DWARF", "__apple_names",
|
||||
|
@ -629,6 +633,8 @@ void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
|
|||
PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding =
|
||||
TTypeEncoding = dwarf::DW_EH_PE_absptr;
|
||||
|
||||
CompactUnwindDwarfEHFrameOnly = 0;
|
||||
|
||||
EHFrameSection = 0; // Created on demand.
|
||||
CompactUnwindSection = 0; // Used only by selected targets.
|
||||
DwarfAccelNamesSection = 0; // Used only by selected targets.
|
||||
|
|
Loading…
Reference in New Issue