OSDN Git Service

[codeview] Bail on a DBG_VALUE register operand with no register
authorReid Kleckner <rnk@google.com>
Tue, 16 Feb 2016 21:49:26 +0000 (21:49 +0000)
committerReid Kleckner <rnk@google.com>
Tue, 16 Feb 2016 21:49:26 +0000 (21:49 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261016 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
lib/MC/MCRegisterInfo.cpp

index 5cbc859..9749d1c 100644 (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.
index 7af81fc..c76bb64 100644 (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;
 }