From 9a593ee7d2455d65d4bab038174b00dde5714289 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Tue, 16 Feb 2016 21:49:26 +0000 Subject: [PATCH] [codeview] Bail on a DBG_VALUE register operand with no register This apparently comes up when the register allocator decides that a variable will become undef along a certain path. Also improve the error message we emit when we can't map from LLVM register number to CV register number. llvm-svn: 261016 --- llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 12 +++++++----- llvm/lib/MC/MCRegisterInfo.cpp | 4 +++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 5cbc859..9749d1c 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -594,11 +594,13 @@ void CodeViewDebug::collectVariableInfo(const DISubprogram *SP) { if (DIExpr && DIExpr->getNumElements() > 0) continue; - // Bail if the value is not indirect in memory or in a register. In these - // cases, operand 0 will not be a register. - // FIXME: CodeView does not have an obvious representation for a variable - // that has been optimized to be a constant. - if (!DVInst->getOperand(0).isReg()) + // Bail if operand 0 is not a valid register. This means the variable is a + // simple constant, or is described by a complex expression. + // FIXME: Find a way to represent constant variables, since they are + // relatively common. + unsigned Reg = + DVInst->getOperand(0).isReg() ? DVInst->getOperand(0).getReg() : 0; + if (Reg == 0) continue; // Handle the two cases we can handle: indirect in memory and in register. diff --git a/llvm/lib/MC/MCRegisterInfo.cpp b/llvm/lib/MC/MCRegisterInfo.cpp index 7af81fc..c76bb646 100644 --- a/llvm/lib/MC/MCRegisterInfo.cpp +++ b/llvm/lib/MC/MCRegisterInfo.cpp @@ -86,8 +86,10 @@ int MCRegisterInfo::getSEHRegNum(unsigned RegNum) const { } int MCRegisterInfo::getCodeViewRegNum(unsigned RegNum) const { + if (L2CVRegs.empty()) + report_fatal_error("target does not implement codeview register mapping"); const DenseMap::const_iterator I = L2CVRegs.find(RegNum); if (I == L2CVRegs.end()) - report_fatal_error("target does not implement codeview register mapping"); + report_fatal_error("unknown codeview register"); return I->second; } -- 2.7.4