summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorAlexander Richardson <arichardson.kde@gmail.com>2018-11-13 10:54:49 +0000
committerAlexander Richardson <arichardson.kde@gmail.com>2018-11-13 10:54:49 +0000
commitdbfa6e616c15d7d6be4946194bd252bbd07d051e (patch)
tree0373193722de20ed0fada96807a704f67e9e824f /llvm/lib
parent4eb93907f782d9a0cd83fbc32c36d515523cfa4a (diff)
downloadbcm5719-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.cpp7
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:
OpenPOWER on IntegriCloud