summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/MC/MCDwarf.cpp56
1 files changed, 26 insertions, 30 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index 41ff9e14c82..a36ff4cb907 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/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<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);
}
OpenPOWER on IntegriCloud