mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-13 08:56:04 +00:00
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
This commit is contained in:
parent
1a57e42f2a
commit
bc4ee245ef
@ -1034,10 +1034,7 @@ public:
|
|||||||
/// Emit the unwind information in a compact way.
|
/// Emit the unwind information in a compact way.
|
||||||
void EmitCompactUnwind(const MCDwarfFrameInfo &frame);
|
void EmitCompactUnwind(const MCDwarfFrameInfo &frame);
|
||||||
|
|
||||||
const MCSymbol &EmitCIE(const MCSymbol *personality,
|
const MCSymbol &EmitCIE(const MCDwarfFrameInfo &F);
|
||||||
unsigned personalityEncoding, const MCSymbol *lsda,
|
|
||||||
bool IsSignalFrame, unsigned lsdaEncoding,
|
|
||||||
bool IsSimple, unsigned RAReg);
|
|
||||||
void EmitFDE(const MCSymbol &cieStart, const MCDwarfFrameInfo &frame,
|
void EmitFDE(const MCSymbol &cieStart, const MCDwarfFrameInfo &frame,
|
||||||
bool LastInSection, const MCSymbol &SectionStart);
|
bool LastInSection, const MCSymbol &SectionStart);
|
||||||
void EmitCFIInstructions(ArrayRef<MCCFIInstruction> Instrs,
|
void EmitCFIInstructions(ArrayRef<MCCFIInstruction> Instrs,
|
||||||
@ -1273,12 +1270,7 @@ static unsigned getCIEVersion(bool IsEH, unsigned DwarfVersion) {
|
|||||||
llvm_unreachable("Unknown version");
|
llvm_unreachable("Unknown version");
|
||||||
}
|
}
|
||||||
|
|
||||||
const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality,
|
const MCSymbol &FrameEmitterImpl::EmitCIE(const MCDwarfFrameInfo &Frame) {
|
||||||
unsigned personalityEncoding,
|
|
||||||
const MCSymbol *lsda,
|
|
||||||
bool IsSignalFrame,
|
|
||||||
unsigned lsdaEncoding, bool IsSimple,
|
|
||||||
unsigned RAReg) {
|
|
||||||
MCContext &context = Streamer.getContext();
|
MCContext &context = Streamer.getContext();
|
||||||
const MCRegisterInfo *MRI = context.getRegisterInfo();
|
const MCRegisterInfo *MRI = context.getRegisterInfo();
|
||||||
const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
|
const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
|
||||||
@ -1305,12 +1297,12 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality,
|
|||||||
SmallString<8> Augmentation;
|
SmallString<8> Augmentation;
|
||||||
if (IsEH) {
|
if (IsEH) {
|
||||||
Augmentation += "z";
|
Augmentation += "z";
|
||||||
if (personality)
|
if (Frame.Personality)
|
||||||
Augmentation += "P";
|
Augmentation += "P";
|
||||||
if (lsda)
|
if (Frame.Lsda)
|
||||||
Augmentation += "L";
|
Augmentation += "L";
|
||||||
Augmentation += "R";
|
Augmentation += "R";
|
||||||
if (IsSignalFrame)
|
if (Frame.IsSignalFrame)
|
||||||
Augmentation += "S";
|
Augmentation += "S";
|
||||||
Streamer.EmitBytes(Augmentation);
|
Streamer.EmitBytes(Augmentation);
|
||||||
}
|
}
|
||||||
@ -1331,6 +1323,7 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality,
|
|||||||
Streamer.EmitSLEB128IntValue(getDataAlignmentFactor(Streamer));
|
Streamer.EmitSLEB128IntValue(getDataAlignmentFactor(Streamer));
|
||||||
|
|
||||||
// Return Address Register
|
// Return Address Register
|
||||||
|
unsigned RAReg = Frame.RAReg;
|
||||||
if (RAReg == static_cast<unsigned>(INT_MAX))
|
if (RAReg == static_cast<unsigned>(INT_MAX))
|
||||||
RAReg = MRI->getDwarfRegNum(MRI->getRARegister(), IsEH);
|
RAReg = MRI->getDwarfRegNum(MRI->getRARegister(), IsEH);
|
||||||
|
|
||||||
@ -1343,16 +1336,16 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Augmentation Data Length (optional)
|
// Augmentation Data Length (optional)
|
||||||
|
|
||||||
unsigned augmentationLength = 0;
|
unsigned augmentationLength = 0;
|
||||||
if (IsEH) {
|
if (IsEH) {
|
||||||
if (personality) {
|
if (Frame.Personality) {
|
||||||
// Personality Encoding
|
// Personality Encoding
|
||||||
augmentationLength += 1;
|
augmentationLength += 1;
|
||||||
// Personality
|
// Personality
|
||||||
augmentationLength += getSizeForEncoding(Streamer, personalityEncoding);
|
augmentationLength +=
|
||||||
|
getSizeForEncoding(Streamer, Frame.PersonalityEncoding);
|
||||||
}
|
}
|
||||||
if (lsda)
|
if (Frame.Lsda)
|
||||||
augmentationLength += 1;
|
augmentationLength += 1;
|
||||||
// Encoding of the FDE pointers
|
// Encoding of the FDE pointers
|
||||||
augmentationLength += 1;
|
augmentationLength += 1;
|
||||||
@ -1360,15 +1353,15 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality,
|
|||||||
Streamer.EmitULEB128IntValue(augmentationLength);
|
Streamer.EmitULEB128IntValue(augmentationLength);
|
||||||
|
|
||||||
// Augmentation Data (optional)
|
// Augmentation Data (optional)
|
||||||
if (personality) {
|
if (Frame.Personality) {
|
||||||
// Personality Encoding
|
// Personality Encoding
|
||||||
emitEncodingByte(Streamer, personalityEncoding);
|
emitEncodingByte(Streamer, Frame.PersonalityEncoding);
|
||||||
// Personality
|
// Personality
|
||||||
EmitPersonality(Streamer, *personality, personalityEncoding);
|
EmitPersonality(Streamer, *Frame.Personality, Frame.PersonalityEncoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lsda)
|
if (Frame.Lsda)
|
||||||
emitEncodingByte(Streamer, lsdaEncoding);
|
emitEncodingByte(Streamer, Frame.LsdaEncoding);
|
||||||
|
|
||||||
// Encoding of the FDE pointers
|
// Encoding of the FDE pointers
|
||||||
emitEncodingByte(Streamer, MOFI->getFDEEncoding());
|
emitEncodingByte(Streamer, MOFI->getFDEEncoding());
|
||||||
@ -1377,7 +1370,7 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality,
|
|||||||
// Initial Instructions
|
// Initial Instructions
|
||||||
|
|
||||||
const MCAsmInfo *MAI = context.getAsmInfo();
|
const MCAsmInfo *MAI = context.getAsmInfo();
|
||||||
if (!IsSimple) {
|
if (!Frame.IsSimple) {
|
||||||
const std::vector<MCCFIInstruction> &Instructions =
|
const std::vector<MCCFIInstruction> &Instructions =
|
||||||
MAI->getInitialFrameState();
|
MAI->getInitialFrameState();
|
||||||
EmitCFIInstructions(Instructions, nullptr);
|
EmitCFIInstructions(Instructions, nullptr);
|
||||||
@ -1473,12 +1466,18 @@ struct CIEKey {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CIEKey(const MCSymbol *Personality, unsigned PersonalityEncoding,
|
CIEKey(const MCSymbol *Personality, unsigned PersonalityEncoding,
|
||||||
unsigned LsdaEncoding, bool IsSignalFrame, bool IsSimple,
|
unsigned LSDAEncoding, bool IsSignalFrame, bool IsSimple,
|
||||||
unsigned RAReg)
|
unsigned RAReg)
|
||||||
: Personality(Personality), PersonalityEncoding(PersonalityEncoding),
|
: Personality(Personality), PersonalityEncoding(PersonalityEncoding),
|
||||||
LsdaEncoding(LsdaEncoding), IsSignalFrame(IsSignalFrame),
|
LsdaEncoding(LSDAEncoding), IsSignalFrame(IsSignalFrame),
|
||||||
IsSimple(IsSimple), RAReg(RAReg) {}
|
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;
|
const MCSymbol *Personality;
|
||||||
unsigned PersonalityEncoding;
|
unsigned PersonalityEncoding;
|
||||||
unsigned LsdaEncoding;
|
unsigned LsdaEncoding;
|
||||||
@ -1564,13 +1563,10 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
|
|||||||
// of by the compact unwind encoding.
|
// of by the compact unwind encoding.
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
CIEKey Key(Frame.Personality, Frame.PersonalityEncoding, Frame.LsdaEncoding,
|
CIEKey Key(Frame);
|
||||||
Frame.IsSignalFrame, Frame.IsSimple, Frame.RAReg);
|
|
||||||
const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;
|
const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;
|
||||||
if (!CIEStart)
|
if (!CIEStart)
|
||||||
CIEStart = &Emitter.EmitCIE(
|
CIEStart = &Emitter.EmitCIE(Frame);
|
||||||
Frame.Personality, Frame.PersonalityEncoding, Frame.Lsda,
|
|
||||||
Frame.IsSignalFrame, Frame.LsdaEncoding, Frame.IsSimple, Frame.RAReg);
|
|
||||||
|
|
||||||
Emitter.EmitFDE(*CIEStart, Frame, I == E, *SectionStart);
|
Emitter.EmitFDE(*CIEStart, Frame, I == E, *SectionStart);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user