<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 10, 2015, at 3:33 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Tue, Feb 10, 2015 at 3:18 PM, Adrian Prantl <span dir="ltr" class=""><<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br class="">
Date: Tue Feb 10 17:18:28 2015<br class="">
New Revision: 228764<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=228764&view=rev" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=228764&view=rev</a><br class="">
Log:<br class="">
Debug Info: Support variables that are described by more than one MMI<br class="">
table entry. This happens when SROA splits up an alloca and the resulting<br class="">
allocas cannot be lowered to SSA values because their address is passed<br class="">
to a function.<br class=""></blockquote><div class=""><br class="">Forgot to git add the test case, perhaps? (& given the description, I hope the test case can be a bit cleaner/simpler than the reduced reproductions we were looking at earlier, but I realize that might not be the case)<br class=""></div></div></div></div></div></blockquote><div><br class=""></div>Yes & yes (a bit). Thanks for noticing!</div><div>-- adrian<br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br class="">
Fixes PR22502.<br class="">
<br class="">
Modified:<br class="">
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br class="">
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br class="">
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h<br class="">
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp<br class="">
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=228764&r1=228763&r2=228764&view=diff" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=228764&r1=228763&r2=228764&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)<br class="">
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Tue Feb 10 17:18:28 2015<br class="">
@@ -516,15 +516,21 @@ DwarfCompileUnit::constructVariableDIEIm<br class="">
   }<br class="">
<br class="">
   // .. else use frame index.<br class="">
-  int FI = DV.getFrameIndex();<br class="">
-  if (FI != ~0) {<br class="">
+  if (DV.getFrameIndex().back() == ~0)<br class="">
+    return VariableDie;<br class="">
+<br class="">
+  auto Expr = DV.getExpression().begin();<br class="">
+  DIELoc *Loc = new (DIEValueAllocator) DIELoc();<br class="">
+  DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);<br class="">
+  for (auto FI : DV.getFrameIndex()) {<br class="">
     unsigned FrameReg = 0;<br class="">
     const TargetFrameLowering *TFI =<br class="">
         Asm->TM.getSubtargetImpl()->getFrameLowering();<br class="">
     int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);<br class="">
-    MachineLocation Location(FrameReg, Offset);<br class="">
-    addVariableAddress(DV, *VariableDie, Location);<br class="">
+    DwarfExpr.AddMachineRegIndirect(FrameReg, Offset);<br class="">
+    DwarfExpr.AddExpression(*(Expr++));<br class="">
   }<br class="">
+  addBlock(*VariableDie, dwarf::DW_AT_location, Loc);<br class="">
<br class="">
   return VariableDie;<br class="">
 }<br class="">
@@ -767,7 +773,8 @@ void DwarfCompileUnit::addComplexAddress<br class="">
                                          const MachineLocation &Location) {<br class="">
   DIELoc *Loc = new (DIEValueAllocator) DIELoc();<br class="">
   DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);<br class="">
-  DIExpression Expr = DV.getExpression();<br class="">
+  assert(DV.getExpression().size() == 1);<br class="">
+  DIExpression Expr = DV.getExpression().back();<br class="">
   bool ValidReg;<br class="">
   if (Location.getOffset()) {<br class="">
     ValidReg = DwarfExpr.AddMachineRegIndirect(Location.getReg(),<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=228764&r1=228763&r2=228764&view=diff" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=228764&r1=228763&r2=228764&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)<br class="">
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Feb 10 17:18:28 2015<br class="">
@@ -783,10 +783,9 @@ void DwarfDebug::collectVariableInfoFrom<br class="">
     DIVariable DV(VI.Var);<br class="">
     DIExpression Expr(VI.Expr);<br class="">
     ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());<br class="">
-    ConcreteVariables.push_back(make_unique<DbgVariable>(DV, Expr, this));<br class="">
-    DbgVariable *RegVar = ConcreteVariables.back().get();<br class="">
-    RegVar->setFrameIndex(VI.Slot);<br class="">
-    InfoHolder.addScopeVariable(Scope, RegVar);<br class="">
+    auto RegVar = make_unique<DbgVariable>(DV, Expr, this, VI.Slot);<br class="">
+    if (InfoHolder.addScopeVariable(Scope, RegVar.get()))<br class="">
+      ConcreteVariables.push_back(std::move(RegVar));<br class="">
   }<br class="">
 }<br class="">
<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=228764&r1=228763&r2=228764&view=diff" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=228764&r1=228763&r2=228764&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)<br class="">
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Feb 10 17:18:28 2015<br class="">
@@ -67,41 +67,66 @@ public:<br class="">
<br class="">
 //===----------------------------------------------------------------------===//<br class="">
 /// \brief This class is used to track local variable information.<br class="">
+///<br class="">
+/// - Variables whose location changes over time have a DotDebugLocOffset and the<br class="">
+///   other fields are not used.<br class="">
+///<br class="">
+/// - Variables that are described by multiple MMI table entries have multiple<br class="">
+///   expressions and frame indices.<br class="">
 class DbgVariable {<br class="">
-  DIVariable Var;             // Variable Descriptor.<br class="">
-  DIExpression Expr;          // Complex address location expression.<br class="">
-  DIE *TheDIE;                // Variable DIE.<br class="">
-  unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries.<br class="">
-  const MachineInstr *MInsn;  // DBG_VALUE instruction of the variable.<br class="">
-  int FrameIndex;<br class="">
+  DIVariable Var;             /// Variable Descriptor.<br class="">
+  SmallVector<DIExpression, 1> Expr; /// Complex address location expression.<br class="">
+  DIE *TheDIE;                /// Variable DIE.<br class="">
+  unsigned DotDebugLocOffset; /// Offset in DotDebugLocEntries.<br class="">
+  const MachineInstr *MInsn;  /// DBG_VALUE instruction of the variable.<br class="">
+  SmallVector<int, 1> FrameIndex; /// Frame index of the variable.<br class="">
   DwarfDebug *DD;<br class="">
<br class="">
 public:<br class="">
   /// Construct a DbgVariable from a DIVariable.<br class="">
-  DbgVariable(DIVariable V, DIExpression E, DwarfDebug *DD)<br class="">
-      : Var(V), Expr(E), TheDIE(nullptr), DotDebugLocOffset(~0U),<br class="">
-        MInsn(nullptr), FrameIndex(~0), DD(DD) {<br class="">
-    assert(Var.Verify() && Expr.Verify());<br class="">
+    DbgVariable(DIVariable V, DIExpression E, DwarfDebug *DD, int FI = ~0)<br class="">
+    : Var(V), Expr(1, E), TheDIE(nullptr), DotDebugLocOffset(~0U),<br class="">
+      MInsn(nullptr), DD(DD) {<br class="">
+    FrameIndex.push_back(FI);<br class="">
+    assert(Var.Verify() && E.Verify());<br class="">
   }<br class="">
<br class="">
   /// Construct a DbgVariable from a DEBUG_VALUE.<br class="">
   /// AbstractVar may be NULL.<br class="">
   DbgVariable(const MachineInstr *DbgValue, DwarfDebug *DD)<br class="">
-      : Var(DbgValue->getDebugVariable()), Expr(DbgValue->getDebugExpression()),<br class="">
-        TheDIE(nullptr), DotDebugLocOffset(~0U), MInsn(DbgValue),<br class="">
-        FrameIndex(~0), DD(DD) {}<br class="">
+    : Var(DbgValue->getDebugVariable()), Expr(1, DbgValue->getDebugExpression()),<br class="">
+        TheDIE(nullptr), DotDebugLocOffset(~0U), MInsn(DbgValue), DD(DD) {<br class="">
+    FrameIndex.push_back(~0);<br class="">
+  }<br class="">
<br class="">
   // Accessors.<br class="">
   DIVariable getVariable() const { return Var; }<br class="">
-  DIExpression getExpression() const { return Expr; }<br class="">
+  const ArrayRef<DIExpression> getExpression() const { return Expr; }<br class="">
   void setDIE(DIE &D) { TheDIE = &D; }<br class="">
   DIE *getDIE() const { return TheDIE; }<br class="">
   void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; }<br class="">
   unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; }<br class="">
   StringRef getName() const { return Var.getName(); }<br class="">
   const MachineInstr *getMInsn() const { return MInsn; }<br class="">
-  int getFrameIndex() const { return FrameIndex; }<br class="">
-  void setFrameIndex(int FI) { FrameIndex = FI; }<br class="">
+  const ArrayRef<int> getFrameIndex() const { return FrameIndex; }<br class="">
+<br class="">
+  void addMMIEntry(const DbgVariable &V) {<br class="">
+    assert(  DotDebugLocOffset == ~0U &&   !MInsn && "not an MMI entry");<br class="">
+    assert(V.DotDebugLocOffset == ~0U && !V.MInsn && "not an MMI entry");<br class="">
+    assert(V.Var == Var && "conflicting DIVariable");<br class="">
+<br class="">
+    if (V.getFrameIndex().back() != ~0) {<br class="">
+      auto E = V.getExpression();<br class="">
+      auto FI = V.getFrameIndex();<br class="">
+      Expr.append(E.begin(), E.end());<br class="">
+      FrameIndex.append(FI.begin(), FI.end());<br class="">
+    }<br class="">
+    assert(Expr.size() > 1<br class="">
+           ? std::all_of(Expr.begin(), Expr.end(),<br class="">
+                         [](DIExpression &E) { return E.isBitPiece(); })<br class="">
+           : (true && "conflicting locations for variable"));<br class="">
+  }<br class="">
+<br class="">
   // Translate tag to proper Dwarf tag.<br class="">
   dwarf::Tag getTag() const {<br class="">
     if (Var.getTag() == dwarf::DW_TAG_arg_variable)<br class="">
@@ -128,14 +153,11 @@ public:<br class="">
<br class="">
   bool variableHasComplexAddress() const {<br class="">
     assert(Var.isVariable() && "Invalid complex DbgVariable!");<br class="">
-    return Expr.getNumElements() > 0;<br class="">
+    assert(Expr.size() == 1 &&<br class="">
+           "variableHasComplexAddress() invoked on multi-FI variable");<br class="">
+    return Expr.back().getNumElements() > 0;<br class="">
   }<br class="">
   bool isBlockByrefVariable() const;<br class="">
-  unsigned getNumAddrElements() const {<br class="">
-    assert(Var.isVariable() && "Invalid complex DbgVariable!");<br class="">
-    return Expr.getNumElements();<br class="">
-  }<br class="">
-  uint64_t getAddrElement(unsigned i) const { return Expr.getElement(i); }<br class="">
   DIType getType() const;<br class="">
<br class="">
 private:<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp?rev=228764&r1=228763&r2=228764&view=diff" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp?rev=228764&r1=228763&r2=228764&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp (original)<br class="">
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp Tue Feb 10 17:18:28 2015<br class="">
@@ -146,7 +146,7 @@ void DwarfFile::emitStrings(const MCSect<br class="">
   StrPool.emit(*Asm, StrSection, OffsetSection);<br class="">
 }<br class="">
<br class="">
-void DwarfFile::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {<br class="">
+bool DwarfFile::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {<br class="">
   SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];<br class="">
   DIVariable DV = Var->getVariable();<br class="">
   // Variables with positive arg numbers are parameters.<br class="">
@@ -168,13 +168,17 @@ void DwarfFile::addScopeVariable(Lexical<br class="">
       // A later indexed parameter has been found, insert immediately before it.<br class="">
       if (CurNum > ArgNum)<br class="">
         break;<br class="">
-      assert(CurNum != ArgNum && "Duplicate argument");<br class="">
+      if (CurNum == ArgNum) {<br class="">
+        (*I)->addMMIEntry(*Var);<br class="">
+        return false;<br class="">
+      }<br class="">
       ++I;<br class="">
     }<br class="">
     Vars.insert(I, Var);<br class="">
-    return;<br class="">
+    return true;<br class="">
   }<br class="">
<br class="">
   Vars.push_back(Var);<br class="">
+  return true;<br class="">
 }<br class="">
 }<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h?rev=228764&r1=228763&r2=228764&view=diff" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h?rev=228764&r1=228763&r2=228764&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h (original)<br class="">
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h Tue Feb 10 17:18:28 2015<br class="">
@@ -95,7 +95,8 @@ public:<br class="">
   /// \brief Returns the string pool.<br class="">
   DwarfStringPool &getStringPool() { return StrPool; }<br class="">
<br class="">
-  void addScopeVariable(LexicalScope *LS, DbgVariable *Var);<br class="">
+  /// \returns false if the variable was merged with a previous one.<br class="">
+  bool addScopeVariable(LexicalScope *LS, DbgVariable *Var);<br class="">
<br class="">
   DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8>> &getScopeVariables() {<br class="">
     return ScopeVariables;<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@cs.uiuc.edu" class="">llvm-commits@cs.uiuc.edu</a><br class="">
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank" class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br class="">
</blockquote></div><br class=""></div></div>
</div></blockquote></div><br class=""></body></html>