[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.h b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.h
index 90f8287..245d700 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.h
@@ -30,19 +30,12 @@
 
 /// Represents the location at which a variable is stored.
 struct DbgVariableLocation {
-  /// Offset relative to base register.
-  int64_t Offset;
-
   /// Base register.
   unsigned Register;
 
-  /// If false, Register is the location. If true,
-  /// Register+Offset point at the location.
-  unsigned InMemory : 1;
-
-  /// If false, the location holds the variable's value.
-  /// If true, the location holds the variable's address.
-  unsigned Deref : 1;
+  /// Chain of offsetted loads necessary to load the value if it lives in
+  /// memory. Every load except for the last is pointer-sized.
+  SmallVector<int64_t, 1> LoadChain;
 
   /// Present if the location is part of a larger variable.
   llvm::Optional<llvm::DIExpression::FragmentInfo> FragmentInfo;