From bc4ee245efc20a41997aa0120c10ae268dbda825 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sat, 29 Jul 2017 20:03:02 +0000 Subject: [PATCH] MC: simplify internal function call parameter Rather than passing along most of the parameters, pass a reference to the MCDWARFrameInfo instead. This makes it easier to pass additional information about the frame to the checks. We need to keep the extra constructor for the Key around to allow the construction of the null and tombstone keys. NFC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309493 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCDwarf.cpp | 56 +++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 30 deletions(-) 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); }