summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/MCDwarf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/MC/MCDwarf.cpp')
-rw-r--r--llvm/lib/MC/MCDwarf.cpp22
1 files changed, 12 insertions, 10 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index a2beee32f2c..a038e0aa951 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -1037,7 +1037,7 @@ public:
const MCSymbol &EmitCIE(const MCSymbol *personality,
unsigned personalityEncoding, const MCSymbol *lsda,
bool IsSignalFrame, unsigned lsdaEncoding,
- bool IsSimple);
+ bool IsSimple, unsigned RAReg);
void EmitFDE(const MCSymbol &cieStart, const MCDwarfFrameInfo &frame,
bool LastInSection, const MCSymbol &SectionStart);
void EmitCFIInstructions(ArrayRef<MCCFIInstruction> Instrs,
@@ -1277,8 +1277,8 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality,
unsigned personalityEncoding,
const MCSymbol *lsda,
bool IsSignalFrame,
- unsigned lsdaEncoding,
- bool IsSimple) {
+ unsigned lsdaEncoding, bool IsSimple,
+ unsigned RAReg) {
MCContext &context = Streamer.getContext();
const MCRegisterInfo *MRI = context.getRegisterInfo();
const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
@@ -1331,13 +1331,15 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(const MCSymbol *personality,
Streamer.EmitSLEB128IntValue(getDataAlignmentFactor(Streamer));
// Return Address Register
+ if (RAReg == static_cast<unsigned>(INT_MAX))
+ RAReg = MRI->getDwarfRegNum(MRI->getRARegister(), IsEH);
+
if (CIEVersion == 1) {
- assert(MRI->getRARegister() <= 255 &&
+ assert(RAReg <= 255 &&
"DWARF 2 encodes return_address_register in one byte");
- Streamer.EmitIntValue(MRI->getDwarfRegNum(MRI->getRARegister(), IsEH), 1);
+ Streamer.EmitIntValue(RAReg, 1);
} else {
- Streamer.EmitULEB128IntValue(
- MRI->getDwarfRegNum(MRI->getRARegister(), IsEH));
+ Streamer.EmitULEB128IntValue(RAReg);
}
// Augmentation Data Length (optional)
@@ -1563,9 +1565,9 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
Frame.LsdaEncoding, Frame.IsSignalFrame, Frame.IsSimple);
const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;
if (!CIEStart)
- CIEStart = &Emitter.EmitCIE(Frame.Personality, Frame.PersonalityEncoding,
- Frame.Lsda, Frame.IsSignalFrame,
- Frame.LsdaEncoding, Frame.IsSimple);
+ CIEStart = &Emitter.EmitCIE(
+ Frame.Personality, Frame.PersonalityEncoding, Frame.Lsda,
+ Frame.IsSignalFrame, Frame.LsdaEncoding, Frame.IsSimple, Frame.RAReg);
Emitter.EmitFDE(*CIEStart, Frame, I == E, *SectionStart);
}
OpenPOWER on IntegriCloud