diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 41ff9e14c82..a36ff4cb907 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -1034,10 +1034,7 @@ public: /// Emit the unwind information in a compact way. void EmitCompactUnwind(const MCDwarfFrameInfo &frame); - const MCSymbol &EmitCIE(const MCSymbol *personality, - unsigned personalityEncoding, const MCSymbol *lsda, - bool IsSignalFrame, unsigned lsdaEncoding, - bool IsSimple, unsigned RAReg); + const MCSymbol &EmitCIE(const MCDwarfFrameInfo &F); void EmitFDE(const MCSymbol &cieStart, const MCDwarfFrameInfo &frame, bool LastInSection, const MCSymbol &SectionStart); void EmitCFIInstructions(ArrayRef Instrs, @@ -1273,12 +1270,7 @@ static unsigned getCIEVersion(bool IsEH, unsigned DwarfVersion) { llvm_unreachable("Unknown version"); } -const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality, - unsigned personalityEncoding, - const MCSymbol *lsda, - bool IsSignalFrame, - unsigned lsdaEncoding, bool IsSimple, - unsigned RAReg) { +const MCSymbol &FrameEmitterImpl::EmitCIE(const MCDwarfFrameInfo &Frame) { MCContext &context = Streamer.getContext(); const MCRegisterInfo *MRI = context.getRegisterInfo(); const MCObjectFileInfo *MOFI = context.getObjectFileInfo(); @@ -1305,12 +1297,12 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality, SmallString<8> Augmentation; if (IsEH) { Augmentation += "z"; - if (personality) + if (Frame.Personality) Augmentation += "P"; - if (lsda) + if (Frame.Lsda) Augmentation += "L"; Augmentation += "R"; - if (IsSignalFrame) + if (Frame.IsSignalFrame) Augmentation += "S"; Streamer.EmitBytes(Augmentation); } @@ -1331,6 +1323,7 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality, Streamer.EmitSLEB128IntValue(getDataAlignmentFactor(Streamer)); // Return Address Register + unsigned RAReg = Frame.RAReg; if (RAReg == static_cast(INT_MAX)) RAReg = MRI->getDwarfRegNum(MRI->getRARegister(), IsEH); @@ -1343,16 +1336,16 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality, } // Augmentation Data Length (optional) - unsigned augmentationLength = 0; if (IsEH) { - if (personality) { + if (Frame.Personality) { // Personality Encoding augmentationLength += 1; // Personality - augmentationLength += getSizeForEncoding(Streamer, personalityEncoding); + augmentationLength += + getSizeForEncoding(Streamer, Frame.PersonalityEncoding); } - if (lsda) + if (Frame.Lsda) augmentationLength += 1; // Encoding of the FDE pointers augmentationLength += 1; @@ -1360,15 +1353,15 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality, Streamer.EmitULEB128IntValue(augmentationLength); // Augmentation Data (optional) - if (personality) { + if (Frame.Personality) { // Personality Encoding - emitEncodingByte(Streamer, personalityEncoding); + emitEncodingByte(Streamer, Frame.PersonalityEncoding); // Personality - EmitPersonality(Streamer, *personality, personalityEncoding); + EmitPersonality(Streamer, *Frame.Personality, Frame.PersonalityEncoding); } - if (lsda) - emitEncodingByte(Streamer, lsdaEncoding); + if (Frame.Lsda) + emitEncodingByte(Streamer, Frame.LsdaEncoding); // Encoding of the FDE pointers emitEncodingByte(Streamer, MOFI->getFDEEncoding()); @@ -1377,7 +1370,7 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality, // Initial Instructions const MCAsmInfo *MAI = context.getAsmInfo(); - if (!IsSimple) { + if (!Frame.IsSimple) { const std::vector &Instructions = MAI->getInitialFrameState(); EmitCFIInstructions(Instructions, nullptr); @@ -1473,12 +1466,18 @@ struct CIEKey { } CIEKey(const MCSymbol *Personality, unsigned PersonalityEncoding, - unsigned LsdaEncoding, bool IsSignalFrame, bool IsSimple, + unsigned LSDAEncoding, bool IsSignalFrame, bool IsSimple, unsigned RAReg) : Personality(Personality), PersonalityEncoding(PersonalityEncoding), - LsdaEncoding(LsdaEncoding), IsSignalFrame(IsSignalFrame), + LsdaEncoding(LSDAEncoding), IsSignalFrame(IsSignalFrame), IsSimple(IsSimple), RAReg(RAReg) {} + explicit CIEKey(const MCDwarfFrameInfo &Frame) + : Personality(Frame.Personality), + PersonalityEncoding(Frame.PersonalityEncoding), + LsdaEncoding(Frame.LsdaEncoding), IsSignalFrame(Frame.IsSignalFrame), + IsSimple(Frame.IsSimple), RAReg(Frame.RAReg) {} + const MCSymbol *Personality; unsigned PersonalityEncoding; unsigned LsdaEncoding; @@ -1564,13 +1563,10 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB, // of by the compact unwind encoding. continue; - CIEKey Key(Frame.Personality, Frame.PersonalityEncoding, Frame.LsdaEncoding, - Frame.IsSignalFrame, Frame.IsSimple, Frame.RAReg); + CIEKey Key(Frame); const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey; if (!CIEStart) - CIEStart = &Emitter.EmitCIE( - Frame.Personality, Frame.PersonalityEncoding, Frame.Lsda, - Frame.IsSignalFrame, Frame.LsdaEncoding, Frame.IsSimple, Frame.RAReg); + CIEStart = &Emitter.EmitCIE(Frame); Emitter.EmitFDE(*CIEStart, Frame, I == E, *SectionStart); }