diff options
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 12 | ||||
-rw-r--r-- | 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 5cbc8592fdf..9749d1cff35 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 7af81fc7913..c76bb646c12 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<unsigned, int>::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; } |