[codeview] Generalize DIExpression parsing to handle load chains

Summary:
Hopefully this also clarifies exactly when and why we're rewriting
certiain S_LOCALs using reference types: We're using the reference type
to stand in for a zero-offset load.

Reviewers: inglorion

Subscribers: llvm-commits, hiraditya

Differential Revision: https://reviews.llvm.org/D37309

llvm-svn: 312247
diff --git a/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
index ee8b38f..de3bc91 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
@@ -34,8 +34,6 @@
   if (!Instruction.getOperand(0).isReg())
     return None;
   Location.Register = Instruction.getOperand(0).getReg();
-  Location.InMemory = Instruction.getOperand(1).isImm();
-  Location.Deref = false;
   Location.FragmentInfo.reset();
   // We only handle expressions generated by DIExpression::appendOffset,
   // which doesn't require a full stack machine.
@@ -67,7 +65,8 @@
       Location.FragmentInfo = {Op->getArg(1), Op->getArg(0)};
       break;
     case dwarf::DW_OP_deref:
-      Location.Deref = true;
+      Location.LoadChain.push_back(Offset);
+      Offset = 0;
       break;
     default:
       return None;
@@ -75,7 +74,12 @@
     ++Op;
   }
 
-  Location.Offset = Offset;
+  // Do one final implicit DW_OP_deref if this was an indirect DBG_VALUE
+  // instruction.
+  // FIXME: Replace these with DIExpression.
+  if (Instruction.isIndirectDebugValue())
+    Location.LoadChain.push_back(Offset);
+
   return Location;
 }