[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
This commit is contained in:
Reid Kleckner 2016-02-16 21:49:26 +00:00
parent b9542a8754
commit 4b86dc7a52
2 changed files with 10 additions and 6 deletions

View File

@ -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.

View File

@ -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;
}