From f0841b025939d7de3027f7e3548451263b44a34f Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Sun, 12 Aug 2018 14:46:07 +0100 Subject: [PATCH] [llvm, DWARF. CFI] Emit DW_CFA_restore_extended when register # exceeds 64. The DW_CFA_restore operation has only 6 bits for the register number, emit a DW_CFA_restore_extended when we exceed this. --- llvm/lib/MC/MCDwarf.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index 0461c2564cc..e6d3751e583 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -1421,8 +1421,12 @@ void FrameEmitterImpl::EmitCFIInstruction(const MCCFIInstruction &Instr) { unsigned Reg = Instr.getRegister(); if (!IsEH) Reg = MRI->getDwarfRegNumFromDwarfEHRegNum(Reg); - Streamer.EmitIntValue(dwarf::DW_CFA_restore | Reg, 1); - return; + if (Reg < 64) { + Streamer.EmitIntValue(dwarf::DW_CFA_restore | Reg, 1); + } else { + Streamer.EmitIntValue(dwarf::DW_CFA_restore_extended, 1); + Streamer.EmitULEB128IntValue(Reg); + } return; } case MCCFIInstruction::OpGnuArgsSize: Streamer.EmitIntValue(dwarf::DW_CFA_GNU_args_size, 1);