diff options
| author | Alexander Richardson <arichardson.kde@gmail.com> | 2018-11-13 10:54:49 +0000 |
|---|---|---|
| committer | Alexander Richardson <arichardson.kde@gmail.com> | 2018-11-13 10:54:49 +0000 |
| commit | dbfa6e616c15d7d6be4946194bd252bbd07d051e (patch) | |
| tree | 0373193722de20ed0fada96807a704f67e9e824f /llvm/lib | |
| parent | 4eb93907f782d9a0cd83fbc32c36d515523cfa4a (diff) | |
| download | bcm5719-llvm-dbfa6e616c15d7d6be4946194bd252bbd07d051e.tar.gz bcm5719-llvm-dbfa6e616c15d7d6be4946194bd252bbd07d051e.zip | |
Fix .cfi_restore with register numbers > 64
Summary:
DW_CFA_restore can only encode register numbers up to 64 (6 bits unsigned
int). For regsiter numbers > 64 we have to use DW_CFA_restore_extended
instead which uses a ULEB128 value.
I discovered this problem in the out-of-tree CHERI target since we use
DWARF register number 89 for our return capability register.
Reviewers: probinson, dblaikie, aprantl, espindola
Reviewed By: dblaikie
Subscribers: JohnReagan, emaste, JDevlieghere, llvm-commits
Differential Revision: https://reviews.llvm.org/D54420
llvm-svn: 346751
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index 7093446815f..66dfe7b7fa4 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -1418,7 +1418,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); + 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: |

