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.

llvm-svn: 309493
This commit is contained in:
Saleem Abdulrasool 2017-07-29 20:03:02 +00:00
parent fc85067f30
commit 29199f5260
1 changed files with 26 additions and 30 deletions

View File

@ -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<MCCFIInstruction> 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<unsigned>(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<MCCFIInstruction> &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);
}