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