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:
Bill Wendling 2013-04-10 21:42:06 +00:00
parent 7c19abeba6
commit 2d1df6be87
3 changed files with 21 additions and 7 deletions

View File

@ -46,10 +46,15 @@ protected:
unsigned FDEEncoding; unsigned FDEEncoding;
unsigned FDECFIEncoding; unsigned FDECFIEncoding;
unsigned TTypeEncoding; unsigned TTypeEncoding;
// Section flags for eh_frame
/// Section flags for eh_frame
unsigned EHSectionType; unsigned EHSectionType;
unsigned EHSectionFlags; unsigned EHSectionFlags;
/// CompactUnwindDwarfEHFrameOnly - Compact unwind encoding indicating that we
/// should emit only an EH frame.
unsigned CompactUnwindDwarfEHFrameOnly;
/// TextSection - Section directive for standard text. /// TextSection - Section directive for standard text.
/// ///
const MCSection *TextSection; const MCSection *TextSection;
@ -201,6 +206,10 @@ public:
} }
unsigned getTTypeEncoding() const { return TTypeEncoding; } unsigned getTTypeEncoding() const { return TTypeEncoding; }
unsigned getCompactUnwindDwarfEHFrameOnly() const {
return CompactUnwindDwarfEHFrameOnly;
}
const MCSection *getTextSection() const { return TextSection; } const MCSection *getTextSection() const { return TextSection; }
const MCSection *getDataSection() const { return DataSection; } const MCSection *getDataSection() const { return DataSection; }
const MCSection *getBSSSection() const { return BSSSection; } const MCSection *getBSSSection() const { return BSSSection; }

View File

@ -1168,10 +1168,10 @@ bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
// .quad except_tab1 // .quad except_tab1
uint32_t Encoding = Frame.CompactUnwindEncoding; uint32_t Encoding = Frame.CompactUnwindEncoding;
if (!Encoding) return false; bool DwarfEHFrameOnly = (Encoding == MOFI->getCompactUnwindDwarfEHFrameOnly());
// The encoding needs to know we have an LSDA. // The encoding needs to know we have an LSDA.
if (Frame.Lsda) if (!DwarfEHFrameOnly && Frame.Lsda)
Encoding |= 0x40000000; Encoding |= 0x40000000;
Streamer.SwitchSection(MOFI->getCompactUnwindSection()); Streamer.SwitchSection(MOFI->getCompactUnwindSection());
@ -1194,11 +1194,10 @@ bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
Twine::utohexstr(Encoding)); Twine::utohexstr(Encoding));
Streamer.EmitIntValue(Encoding, Size); Streamer.EmitIntValue(Encoding, Size);
// Personality Function // Personality Function
Size = getSizeForEncoding(Streamer, dwarf::DW_EH_PE_absptr); Size = getSizeForEncoding(Streamer, dwarf::DW_EH_PE_absptr);
if (VerboseAsm) Streamer.AddComment("Personality Function"); if (VerboseAsm) Streamer.AddComment("Personality Function");
if (Frame.Personality) if (!DwarfEHFrameOnly && Frame.Personality)
Streamer.EmitSymbolValue(Frame.Personality, Size); Streamer.EmitSymbolValue(Frame.Personality, Size);
else else
Streamer.EmitIntValue(0, Size); // No personality fn Streamer.EmitIntValue(0, Size); // No personality fn
@ -1206,7 +1205,7 @@ bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
// LSDA // LSDA
Size = getSizeForEncoding(Streamer, Frame.LsdaEncoding); Size = getSizeForEncoding(Streamer, Frame.LsdaEncoding);
if (VerboseAsm) Streamer.AddComment("LSDA"); if (VerboseAsm) Streamer.AddComment("LSDA");
if (Frame.Lsda) if (!DwarfEHFrameOnly && Frame.Lsda)
Streamer.EmitSymbolValue(Frame.Lsda, Size); Streamer.EmitSymbolValue(Frame.Lsda, Size);
else else
Streamer.EmitIntValue(0, Size); // No LSDA Streamer.EmitIntValue(0, Size); // No LSDA

View File

@ -145,12 +145,16 @@ void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0, LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
SectionKind::getReadOnlyWithRel()); SectionKind::getReadOnlyWithRel());
if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) {
CompactUnwindSection = CompactUnwindSection =
Ctx->getMachOSection("__LD", "__compact_unwind", Ctx->getMachOSection("__LD", "__compact_unwind",
MCSectionMachO::S_ATTR_DEBUG, MCSectionMachO::S_ATTR_DEBUG,
SectionKind::getReadOnly()); SectionKind::getReadOnly());
if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86)
CompactUnwindDwarfEHFrameOnly = 0x04000000;
}
// Debug Information. // Debug Information.
DwarfAccelNamesSection = DwarfAccelNamesSection =
Ctx->getMachOSection("__DWARF", "__apple_names", Ctx->getMachOSection("__DWARF", "__apple_names",
@ -629,6 +633,8 @@ void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding = PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding =
TTypeEncoding = dwarf::DW_EH_PE_absptr; TTypeEncoding = dwarf::DW_EH_PE_absptr;
CompactUnwindDwarfEHFrameOnly = 0;
EHFrameSection = 0; // Created on demand. EHFrameSection = 0; // Created on demand.
CompactUnwindSection = 0; // Used only by selected targets. CompactUnwindSection = 0; // Used only by selected targets.
DwarfAccelNamesSection = 0; // Used only by selected targets. DwarfAccelNamesSection = 0; // Used only by selected targets.