diff options
Diffstat (limited to 'llvm/lib')
28 files changed, 321 insertions, 442 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index faba9f17c5f..4eb289afc18 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -614,8 +614,8 @@ static void emitKill(const MachineInstr *MI, AsmPrinter &AP) {  /// of DBG_VALUE, returning true if it was able to do so.  A false return  /// means the target will need to handle MI in EmitInstruction.  static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) { -  // This code handles only the 4-operand target-independent form. -  if (MI->getNumOperands() != 4) +  // This code handles only the 3-operand target-independent form. +  if (MI->getNumOperands() != 3)      return false;    SmallString<128> Str; @@ -629,11 +629,9 @@ static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) {        OS << Name << ":";    }    OS << V.getName(); - -  DIExpression Expr = MI->getDebugExpression(); -  if (Expr.isVariablePiece()) -    OS << " [piece offset=" << Expr.getPieceOffset() -       << " size=" << Expr.getPieceSize() << "]"; +  if (V.isVariablePiece()) +    OS << " [piece offset=" << V.getPieceOffset() +       << " size="<<V.getPieceSize()<<"]";    OS << " <- ";    // The second operand is only an offset if it's an immediate. diff --git a/llvm/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp b/llvm/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp index a258d621a6a..998c396924b 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp @@ -27,7 +27,7 @@ namespace llvm {  // In the other case, returns 0.  static unsigned isDescribedByReg(const MachineInstr &MI) {    assert(MI.isDebugValue()); -  assert(MI.getNumOperands() == 4); +  assert(MI.getNumOperands() == 3);    // If location of variable is described using a register (directly or    // indirecltly), this register is always a first operand.    return MI.getOperand(0).isReg() ? MI.getOperand(0).getReg() : 0; @@ -37,7 +37,7 @@ void DbgValueHistoryMap::startInstrRange(const MDNode *Var,                                           const MachineInstr &MI) {    // Instruction range should start with a DBG_VALUE instruction for the    // variable. -  assert(MI.isDebugValue() && "not a DBG_VALUE"); +  assert(MI.isDebugValue() && getEntireVariable(MI.getDebugVariable()) == Var);    auto &Ranges = VarInstrRanges[Var];    if (!Ranges.empty() && Ranges.back().second == nullptr &&        Ranges.back().first->isIdenticalTo(&MI)) { @@ -193,7 +193,7 @@ void calculateDbgValueHistory(const MachineFunction *MF,        // Use the base variable (without any DW_OP_piece expressions)        // as index into History. The full variables including the        // piece expressions are attached to the MI. -      DIVariable Var = MI.getDebugVariable(); +      DIVariable Var = getEntireVariable(MI.getDebugVariable());        if (unsigned PrevReg = Result.getRegisterForVar(Var))          dropRegDescribedVar(RegVars, PrevReg, Var); diff --git a/llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h b/llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h index 6cca985cfce..6af049ad683 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h +++ b/llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h @@ -26,30 +26,25 @@ class DebugLocEntry {  public:    /// A single location or constant.    struct Value { -    Value(const MDNode *Var, const MDNode *Expr, int64_t i) -        : Variable(Var), Expression(Expr), EntryKind(E_Integer) { +    Value(const MDNode *Var, int64_t i) +      : Variable(Var), EntryKind(E_Integer) {        Constant.Int = i;      } -    Value(const MDNode *Var, const MDNode *Expr, const ConstantFP *CFP) -        : Variable(Var), Expression(Expr), EntryKind(E_ConstantFP) { +    Value(const MDNode *Var, const ConstantFP *CFP) +      : Variable(Var), EntryKind(E_ConstantFP) {        Constant.CFP = CFP;      } -    Value(const MDNode *Var, const MDNode *Expr, const ConstantInt *CIP) -        : Variable(Var), Expression(Expr), EntryKind(E_ConstantInt) { +    Value(const MDNode *Var, const ConstantInt *CIP) +      : Variable(Var), EntryKind(E_ConstantInt) {        Constant.CIP = CIP;      } -    Value(const MDNode *Var, const MDNode *Expr, MachineLocation Loc) -        : Variable(Var), Expression(Expr), EntryKind(E_Location), Loc(Loc) { -      assert(DIVariable(Var).Verify()); -      assert(DIExpression(Expr).Verify()); +    Value(const MDNode *Var, MachineLocation Loc) +      : Variable(Var), EntryKind(E_Location), Loc(Loc) {      }      // The variable to which this location entry corresponds.      const MDNode *Variable; -    // Any complex address location expression for this Value. -    const MDNode *Expression; -      // Type of entry that this represents.      enum EntryType { E_Location, E_Integer, E_ConstantFP, E_ConstantInt };      enum EntryType EntryKind; @@ -74,8 +69,7 @@ public:      MachineLocation getLoc() const { return Loc; }      const MDNode *getVariableNode() const { return Variable; }      DIVariable getVariable() const { return DIVariable(Variable); } -    bool isVariablePiece() const { return getExpression().isVariablePiece(); } -    DIExpression getExpression() const { return DIExpression(Expression); } +    bool isVariablePiece() const { return getVariable().isVariablePiece(); }      friend bool operator==(const Value &, const Value &);      friend bool operator<(const Value &, const Value &);    }; @@ -96,13 +90,11 @@ public:    // list of values.    // Return true if the merge was successful.    bool MergeValues(const DebugLocEntry &Next) { -    if (Begin == Next.Begin) { -      DIExpression Expr(Values[0].Expression); +    if (Begin == Next.Begin && Values.size() > 0 && Next.Values.size() > 0) {        DIVariable Var(Values[0].Variable); -      DIExpression NextExpr(Next.Values[0].Expression);        DIVariable NextVar(Next.Values[0].Variable); -      if (Var == NextVar && Expr.isVariablePiece() && -          NextExpr.isVariablePiece()) { +      if (Var.getName() == NextVar.getName() && +          Var.isVariablePiece() && NextVar.isVariablePiece()) {          addValues(Next.Values);          End = Next.End;          return true; @@ -141,10 +133,8 @@ public:      std::sort(Values.begin(), Values.end());      Values.erase(std::unique(Values.begin(), Values.end(),                               [](const Value &A, const Value &B) { -                   return A.getVariable() == B.getVariable() && -                          A.getExpression() == B.getExpression(); -                 }), -                 Values.end()); +                               return A.getVariable() == B.getVariable(); +                               }), Values.end());    }  }; @@ -154,10 +144,7 @@ inline bool operator==(const DebugLocEntry::Value &A,    if (A.EntryKind != B.EntryKind)      return false; -  if (A.Expression != B.Expression) -    return false; - -  if (A.Variable != B.Variable) +  if (A.getVariable() != B.getVariable())      return false;    switch (A.EntryKind) { @@ -176,8 +163,7 @@ inline bool operator==(const DebugLocEntry::Value &A,  /// Compare two pieces based on their offset.  inline bool operator<(const DebugLocEntry::Value &A,                        const DebugLocEntry::Value &B) { -  return A.getExpression().getPieceOffset() < -         B.getExpression().getPieceOffset(); +  return A.getVariable().getPieceOffset() < B.getVariable().getPieceOffset();  }  } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index c54fc989569..4745974a3d2 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -901,7 +901,7 @@ void DwarfDebug::collectDeadVariables() {          for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {            DIVariable DV(Variables.getElement(vi));            assert(DV.isVariable()); -          DbgVariable NewVar(DV, DIExpression(nullptr), this); +          DbgVariable NewVar(DV, this);            auto VariableDie = SPCU->constructVariableDIE(NewVar);            SPCU->applyVariableAttributes(NewVar, *VariableDie);            SPDIE->addChild(std::move(VariableDie)); @@ -1121,7 +1121,7 @@ DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV) {  void DwarfDebug::createAbstractVariable(const DIVariable &Var,                                          LexicalScope *Scope) { -  auto AbsDbgVariable = make_unique<DbgVariable>(Var, DIExpression(), this); +  auto AbsDbgVariable = make_unique<DbgVariable>(Var, this);    addScopeVariable(Scope, AbsDbgVariable.get());    AbstractVariables[Var] = std::move(AbsDbgVariable);  } @@ -1177,7 +1177,6 @@ void DwarfDebug::collectVariableInfoFromMMITable(        continue;      Processed.insert(VI.Var);      DIVariable DV(VI.Var); -    DIExpression Expr(VI.Expr);      LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);      // If variable scope is not found then skip this variable. @@ -1185,7 +1184,7 @@ void DwarfDebug::collectVariableInfoFromMMITable(        continue;      ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode()); -    ConcreteVariables.push_back(make_unique<DbgVariable>(DV, Expr, this)); +    ConcreteVariables.push_back(make_unique<DbgVariable>(DV, this));      DbgVariable *RegVar = ConcreteVariables.back().get();      RegVar->setFrameIndex(VI.Slot);      addScopeVariable(Scope, RegVar); @@ -1194,10 +1193,9 @@ void DwarfDebug::collectVariableInfoFromMMITable(  // Get .debug_loc entry for the instruction range starting at MI.  static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) { -  const MDNode *Expr = MI->getDebugExpression();    const MDNode *Var = MI->getDebugVariable(); -  assert(MI->getNumOperands() == 4); +  assert(MI->getNumOperands() == 3);    if (MI->getOperand(0).isReg()) {      MachineLocation MLoc;      // If the second operand is an immediate, this is a @@ -1206,20 +1204,20 @@ static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {        MLoc.set(MI->getOperand(0).getReg());      else        MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm()); -    return DebugLocEntry::Value(Var, Expr, MLoc); +    return DebugLocEntry::Value(Var, MLoc);    }    if (MI->getOperand(0).isImm()) -    return DebugLocEntry::Value(Var, Expr, MI->getOperand(0).getImm()); +    return DebugLocEntry::Value(Var, MI->getOperand(0).getImm());    if (MI->getOperand(0).isFPImm()) -    return DebugLocEntry::Value(Var, Expr, MI->getOperand(0).getFPImm()); +    return DebugLocEntry::Value(Var, MI->getOperand(0).getFPImm());    if (MI->getOperand(0).isCImm()) -    return DebugLocEntry::Value(Var, Expr, MI->getOperand(0).getCImm()); +    return DebugLocEntry::Value(Var, MI->getOperand(0).getCImm()); -  llvm_unreachable("Unexpected 4-operand DBG_VALUE instruction!"); +  llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");  }  /// Determine whether two variable pieces overlap. -static bool piecesOverlap(DIExpression P1, DIExpression P2) { +static bool piecesOverlap(DIVariable P1, DIVariable P2) {    if (!P1.isVariablePiece() || !P2.isVariablePiece())      return true;    unsigned l1 = P1.getPieceOffset(); @@ -1270,11 +1268,11 @@ DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,      }      // If this piece overlaps with any open ranges, truncate them. -    DIExpression DIExpr = Begin->getDebugExpression(); +    DIVariable DIVar = Begin->getDebugVariable();      auto Last = std::remove_if(OpenRanges.begin(), OpenRanges.end(),                                 [&](DebugLocEntry::Value R) { -      return piecesOverlap(DIExpr, R.getExpression()); -    }); +                                 return piecesOverlap(DIVar, R.getVariable()); +                               });      OpenRanges.erase(Last, OpenRanges.end());      const MCSymbol *StartLabel = getLabelBeforeInsn(Begin); @@ -1296,7 +1294,7 @@ DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,      bool couldMerge = false;      // If this is a piece, it may belong to the current DebugLocEntry. -    if (DIExpr.isVariablePiece()) { +    if (DIVar.isVariablePiece()) {        // Add this value to the list of open ranges.        OpenRanges.push_back(Value); @@ -1322,14 +1320,10 @@ DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,      if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry))        DebugLoc.pop_back(); -    DEBUG({ -      dbgs() << CurEntry->getValues().size() << " Values:\n"; -      for (auto Value : CurEntry->getValues()) { -        Value.getVariable()->dump(); -        Value.getExpression()->dump(); -      } -      dbgs() << "-----\n"; -    }); +    DEBUG(dbgs() << "Values:\n"; +          for (auto Value : CurEntry->getValues()) +            Value.getVariable()->dump(); +          dbgs() << "-----\n");    }  } @@ -1364,7 +1358,7 @@ DwarfDebug::collectVariableInfo(SmallPtrSetImpl<const MDNode *> &Processed) {      if (!Scope)        continue; -    Processed.insert(DV); +    Processed.insert(getEntireVariable(DV));      const MachineInstr *MInsn = Ranges.front().first;      assert(MInsn->isDebugValue() && "History must begin with debug value");      ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode()); @@ -1398,8 +1392,7 @@ DwarfDebug::collectVariableInfo(SmallPtrSetImpl<const MDNode *> &Processed) {        continue;      if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) {        ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode()); -      DIExpression NoExpr; -      ConcreteVariables.push_back(make_unique<DbgVariable>(DV, NoExpr, this)); +      ConcreteVariables.push_back(make_unique<DbgVariable>(DV, this));        addScopeVariable(Scope, ConcreteVariables.back().get());      }    } @@ -1587,17 +1580,18 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {      // The first mention of a function argument gets the FunctionBeginSym      // label, so arguments are visible when breaking at function entry. -    DIVariable DIVar(Ranges.front().first->getDebugVariable()); -    if (DIVar.isVariable() && DIVar.getTag() == dwarf::DW_TAG_arg_variable && -        getDISubprogram(DIVar.getContext()).describes(MF->getFunction())) { -      LabelsBeforeInsn[Ranges.front().first] = FunctionBeginSym; -      if (Ranges.front().first->getDebugExpression().isVariablePiece()) { +    DIVariable DV(Ranges.front().first->getDebugVariable()); +    if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable && +        getDISubprogram(DV.getContext()).describes(MF->getFunction())) { +      if (!DV.isVariablePiece()) +        LabelsBeforeInsn[Ranges.front().first] = FunctionBeginSym; +      else {          // Mark all non-overlapping initial pieces.          for (auto I = Ranges.begin(); I != Ranges.end(); ++I) { -          DIExpression Piece = I->first->getDebugExpression(); +          DIVariable Piece = I->first->getDebugVariable();            if (std::all_of(Ranges.begin(), I, -                          [&](DbgValueHistoryMap::InstrRange Pred) { -                return !piecesOverlap(Piece, Pred.first->getDebugExpression()); +                          [&](DbgValueHistoryMap::InstrRange Pred){ +                return !piecesOverlap(Piece, Pred.first->getDebugVariable());                }))              LabelsBeforeInsn[I->first] = FunctionBeginSym;            else @@ -2095,9 +2089,9 @@ void DwarfDebug::emitLocPieces(ByteStreamer &Streamer,    unsigned Offset = 0;    for (auto Piece : Values) { -    DIExpression Expr = Piece.getExpression(); -    unsigned PieceOffset = Expr.getPieceOffset(); -    unsigned PieceSize = Expr.getPieceSize(); +    DIVariable Var = Piece.getVariable(); +    unsigned PieceOffset = Var.getPieceOffset(); +    unsigned PieceSize = Var.getPieceSize();      assert(Offset <= PieceOffset && "overlapping or duplicate pieces");      if (Offset < PieceOffset) {        // The DWARF spec seriously mandates pieces with no locations for gaps. @@ -2108,9 +2102,8 @@ void DwarfDebug::emitLocPieces(ByteStreamer &Streamer,      Offset += PieceSize;      const unsigned SizeOfByte = 8; -#ifndef NDEBUG -    DIVariable Var = Piece.getVariable();      assert(!Var.isIndirect() && "indirect address for piece"); +#ifndef NDEBUG      unsigned VarSize = Var.getSizeInBits(Map);      assert(PieceSize+PieceOffset <= VarSize/SizeOfByte             && "piece is larger than or outside of variable"); @@ -2156,25 +2149,24 @@ void DwarfDebug::emitDebugLocValue(ByteStreamer &Streamer,      }    } else if (Value.isLocation()) {      MachineLocation Loc = Value.getLoc(); -    DIExpression Expr = Value.getExpression(); -    if (!Expr) +    if (!DV.hasComplexAddress())        // Regular entry.        Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());      else {        // Complex address entry. -      unsigned N = Expr.getNumElements(); +      unsigned N = DV.getNumAddrElements();        unsigned i = 0; -      if (N >= 2 && Expr.getElement(0) == dwarf::DW_OP_plus) { +      if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {          if (Loc.getOffset()) {            i = 2;            Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());            Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");            Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst"); -          Streamer.EmitSLEB128(Expr.getElement(1)); +          Streamer.EmitSLEB128(DV.getAddrElement(1));          } else {            // If first address element is OpPlus then emit            // DW_OP_breg + Offset instead of DW_OP_reg + Offset. -          MachineLocation TLoc(Loc.getReg(), Expr.getElement(1)); +          MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));            Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());            i = 2;          } @@ -2184,14 +2176,14 @@ void DwarfDebug::emitDebugLocValue(ByteStreamer &Streamer,        // Emit remaining complex address elements.        for (; i < N; ++i) { -        uint64_t Element = Expr.getElement(i); -        if (Element == dwarf::DW_OP_plus) { +        uint64_t Element = DV.getAddrElement(i); +        if (Element == DIBuilder::OpPlus) {            Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst"); -          Streamer.EmitULEB128(Expr.getElement(++i)); -        } else if (Element == dwarf::DW_OP_deref) { +          Streamer.EmitULEB128(DV.getAddrElement(++i)); +        } else if (Element == DIBuilder::OpDeref) {            if (!Loc.isReg())              Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref"); -        } else if (Element == dwarf::DW_OP_piece) { +        } else if (Element == DIBuilder::OpPiece) {            i += 3;            // handled in emitDebugLocEntry.          } else diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 1432ecd58ae..80f81853ddd 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -70,7 +70,6 @@ public:  /// \brief This class is used to track local variable information.  class DbgVariable {    DIVariable Var;             // Variable Descriptor. -  DIExpression Expr;          // Complex address location expression.    DIE *TheDIE;                // Variable DIE.    unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries.    const MachineInstr *MInsn;  // DBG_VALUE instruction of the variable. @@ -79,22 +78,18 @@ class DbgVariable {  public:    /// Construct a DbgVariable from a DIVariable. -  DbgVariable(DIVariable V, DIExpression E, DwarfDebug *DD) -      : Var(V), Expr(E), TheDIE(nullptr), DotDebugLocOffset(~0U), -        MInsn(nullptr), FrameIndex(~0), DD(DD) { -    assert(Var.Verify() && Expr.Verify()); -  } +  DbgVariable(DIVariable V, DwarfDebug *DD) +      : Var(V), TheDIE(nullptr), DotDebugLocOffset(~0U), MInsn(nullptr), +        FrameIndex(~0), DD(DD) {}    /// Construct a DbgVariable from a DEBUG_VALUE.    /// AbstractVar may be NULL.    DbgVariable(const MachineInstr *DbgValue, DwarfDebug *DD) -      : Var(DbgValue->getDebugVariable()), Expr(DbgValue->getDebugExpression()), -        TheDIE(nullptr), DotDebugLocOffset(~0U), MInsn(DbgValue), -        FrameIndex(~0), DD(DD) {} +      : Var(DbgValue->getDebugVariable()), TheDIE(nullptr), +        DotDebugLocOffset(~0U), MInsn(DbgValue), FrameIndex(~0), DD(DD) {}    // Accessors.    DIVariable getVariable() const { return Var; } -  DIExpression getExpression() const { return Expr; }    void setDIE(DIE &D) { TheDIE = &D; }    DIE *getDIE() const { return TheDIE; }    void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; } @@ -129,14 +124,14 @@ public:    bool variableHasComplexAddress() const {      assert(Var.isVariable() && "Invalid complex DbgVariable!"); -    return Expr.getNumElements() > 0; +    return Var.hasComplexAddress();    }    bool isBlockByrefVariable() const;    unsigned getNumAddrElements() const {      assert(Var.isVariable() && "Invalid complex DbgVariable!"); -    return Expr.getNumElements(); +    return Var.getNumAddrElements();    } -  uint64_t getAddrElement(unsigned i) const { return Expr.getElement(i); } +  uint64_t getAddrElement(unsigned i) const { return Var.getAddrElement(i); }    DIType getType() const;  private: diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index b19b576cdf3..806b0e76fc6 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -607,20 +607,16 @@ void DwarfUnit::addComplexAddress(const DbgVariable &DV, DIE &Die,    unsigned N = DV.getNumAddrElements();    unsigned i = 0;    if (Location.isReg()) { -    if (N >= 2 && DV.getAddrElement(0) == dwarf::DW_OP_plus) { -      assert(!DV.getVariable().isIndirect() && -             "double indirection not handled"); +    if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {        // If first address element is OpPlus then emit        // DW_OP_breg + Offset instead of DW_OP_reg + Offset.        addRegisterOffset(*Loc, Location.getReg(), DV.getAddrElement(1));        i = 2; -    } else if (N >= 2 && DV.getAddrElement(0) == dwarf::DW_OP_deref) { -      assert(!DV.getVariable().isIndirect() && -             "double indirection not handled"); -      addRegisterOpPiece(*Loc, Location.getReg(), -                         DV.getExpression().getPieceSize(), -                         DV.getExpression().getPieceOffset()); -      i = 3; +    } else if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpDeref) { +        addRegisterOpPiece(*Loc, Location.getReg(), +                           DV.getVariable().getPieceSize(), +                           DV.getVariable().getPieceOffset()); +        i = 3;      } else        addRegisterOpPiece(*Loc, Location.getReg());    } else @@ -628,15 +624,15 @@ void DwarfUnit::addComplexAddress(const DbgVariable &DV, DIE &Die,    for (; i < N; ++i) {      uint64_t Element = DV.getAddrElement(i); -    if (Element == dwarf::DW_OP_plus) { +    if (Element == DIBuilder::OpPlus) {        addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);        addUInt(*Loc, dwarf::DW_FORM_udata, DV.getAddrElement(++i)); -    } else if (Element == dwarf::DW_OP_deref) { +    } else if (Element == DIBuilder::OpDeref) {        if (!Location.isReg())          addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); -    } else if (Element == dwarf::DW_OP_piece) { +    } else if (Element == DIBuilder::OpPiece) {        const unsigned SizeOfByte = 8;        unsigned PieceOffsetInBits = DV.getAddrElement(++i)*SizeOfByte;        unsigned PieceSizeInBits = DV.getAddrElement(++i)*SizeOfByte; @@ -1865,7 +1861,7 @@ std::unique_ptr<DIE> DwarfUnit::constructVariableDIEImpl(const DbgVariable &DV,    // Check if variable is described by a DBG_VALUE instruction.    if (const MachineInstr *DVInsn = DV.getMInsn()) { -    assert(DVInsn->getNumOperands() == 4); +    assert(DVInsn->getNumOperands() == 3);      if (DVInsn->getOperand(0).isReg()) {        const MachineOperand RegOp = DVInsn->getOperand(0);        // If the second operand is an immediate, this is an indirect value. diff --git a/llvm/lib/CodeGen/InlineSpiller.cpp b/llvm/lib/CodeGen/InlineSpiller.cpp index 4064d131239..c868cab6c15 100644 --- a/llvm/lib/CodeGen/InlineSpiller.cpp +++ b/llvm/lib/CodeGen/InlineSpiller.cpp @@ -1224,16 +1224,12 @@ void InlineSpiller::spillAroundUses(unsigned Reg) {        // Modify DBG_VALUE now that the value is in a spill slot.        bool IsIndirect = MI->isIndirectDebugValue();        uint64_t Offset = IsIndirect ? MI->getOperand(1).getImm() : 0; -      const MDNode *Var = MI->getDebugVariable(); -      const MDNode *Expr = MI->getDebugExpression(); +      const MDNode *MDPtr = MI->getOperand(2).getMetadata();        DebugLoc DL = MI->getDebugLoc();        DEBUG(dbgs() << "Modifying debug info due to spill:" << "\t" << *MI);        MachineBasicBlock *MBB = MI->getParent();        BuildMI(*MBB, MBB->erase(MI), DL, TII.get(TargetOpcode::DBG_VALUE)) -          .addFrameIndex(StackSlot) -          .addImm(Offset) -          .addMetadata(Var) -          .addMetadata(Expr); +          .addFrameIndex(StackSlot).addImm(Offset).addMetadata(MDPtr);        continue;      } diff --git a/llvm/lib/CodeGen/LiveDebugVariables.cpp b/llvm/lib/CodeGen/LiveDebugVariables.cpp index 72d0e138a3f..2790008b92c 100644 --- a/llvm/lib/CodeGen/LiveDebugVariables.cpp +++ b/llvm/lib/CodeGen/LiveDebugVariables.cpp @@ -110,8 +110,7 @@ public:  namespace {  class LDVImpl;  class UserValue { -  const MDNode *Variable;   ///< The debug info variable we are part of. -  const MDNode *Expression; ///< Any complex address expression. +  const MDNode *variable; ///< The debug info variable we are part of.    unsigned offset;        ///< Byte offset into variable.    bool IsIndirect;        ///< true if this is a register-indirect+offset value.    DebugLoc dl;            ///< The debug location for the variable. This is @@ -141,10 +140,11 @@ class UserValue {  public:    /// UserValue - Create a new UserValue. -  UserValue(const MDNode *var, const MDNode *expr, unsigned o, bool i, -            DebugLoc L, LocMap::Allocator &alloc) -      : Variable(var), Expression(expr), offset(o), IsIndirect(i), dl(L), -        leader(this), next(nullptr), locInts(alloc) {} +  UserValue(const MDNode *var, unsigned o, bool i, DebugLoc L, +            LocMap::Allocator &alloc) +    : variable(var), offset(o), IsIndirect(i), dl(L), leader(this), +      next(nullptr), locInts(alloc) +  {}    /// getLeader - Get the leader of this value's equivalence class.    UserValue *getLeader() { @@ -158,10 +158,8 @@ public:    UserValue *getNext() const { return next; }    /// match - Does this UserValue match the parameters? -  bool match(const MDNode *Var, const MDNode *Expr, unsigned Offset, -             bool indirect) const { -    return Var == Variable && Expr == Expression && Offset == offset && -           indirect == IsIndirect; +  bool match(const MDNode *Var, unsigned Offset, bool indirect) const { +    return Var == variable && Offset == offset && indirect == IsIndirect;    }    /// merge - Merge equivalence classes. @@ -309,8 +307,8 @@ class LDVImpl {    UVMap userVarMap;    /// getUserValue - Find or create a UserValue. -  UserValue *getUserValue(const MDNode *Var, const MDNode *Expr, -                          unsigned Offset, bool IsIndirect, DebugLoc DL); +  UserValue *getUserValue(const MDNode *Var, unsigned Offset, +                          bool IsIndirect, DebugLoc DL);    /// lookupVirtReg - Find the EC leader for VirtReg or null.    UserValue *lookupVirtReg(unsigned VirtReg); @@ -363,7 +361,7 @@ public:  } // namespace  void UserValue::print(raw_ostream &OS, const TargetMachine *TM) { -  DIVariable DV(Variable); +  DIVariable DV(variable);    OS << "!\"";    DV.printExtendedName(OS);    OS << "\"\t"; @@ -424,20 +422,19 @@ void UserValue::mapVirtRegs(LDVImpl *LDV) {        LDV->mapVirtReg(locations[i].getReg(), this);  } -UserValue *LDVImpl::getUserValue(const MDNode *Var, const MDNode *Expr, -                                 unsigned Offset, bool IsIndirect, -                                 DebugLoc DL) { +UserValue *LDVImpl::getUserValue(const MDNode *Var, unsigned Offset, +                                 bool IsIndirect, DebugLoc DL) {    UserValue *&Leader = userVarMap[Var];    if (Leader) {      UserValue *UV = Leader->getLeader();      Leader = UV;      for (; UV; UV = UV->getNext()) -      if (UV->match(Var, Expr, Offset, IsIndirect)) +      if (UV->match(Var, Offset, IsIndirect))          return UV;    }    userValues.push_back( -      make_unique<UserValue>(Var, Expr, Offset, IsIndirect, DL, allocator)); +      make_unique<UserValue>(Var, Offset, IsIndirect, DL, allocator));    UserValue *UV = userValues.back().get();    Leader = UserValue::merge(Leader, UV);    return UV; @@ -457,7 +454,7 @@ UserValue *LDVImpl::lookupVirtReg(unsigned VirtReg) {  bool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) {    // DBG_VALUE loc, offset, variable -  if (MI->getNumOperands() != 4 || +  if (MI->getNumOperands() != 3 ||        !(MI->getOperand(1).isReg() || MI->getOperand(1).isImm()) ||        !MI->getOperand(2).isMetadata()) {      DEBUG(dbgs() << "Can't handle " << *MI); @@ -467,11 +464,9 @@ bool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) {    // Get or create the UserValue for (variable,offset).    bool IsIndirect = MI->isIndirectDebugValue();    unsigned Offset = IsIndirect ? MI->getOperand(1).getImm() : 0; -  const MDNode *Var = MI->getDebugVariable(); -  const MDNode *Expr = MI->getDebugExpression(); +  const MDNode *Var = MI->getOperand(2).getMetadata();    //here. -  UserValue *UV = -      getUserValue(Var, Expr, Offset, IsIndirect, MI->getDebugLoc()); +  UserValue *UV = getUserValue(Var, Offset, IsIndirect, MI->getDebugLoc());    UV->addDef(Idx, MI->getOperand(0));    return true;  } @@ -956,13 +951,10 @@ void UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx,    if (Loc.isReg())      BuildMI(*MBB, I, findDebugLoc(), TII.get(TargetOpcode::DBG_VALUE), -            IsIndirect, Loc.getReg(), offset, Variable, Expression); +            IsIndirect, Loc.getReg(), offset, variable);    else      BuildMI(*MBB, I, findDebugLoc(), TII.get(TargetOpcode::DBG_VALUE)) -        .addOperand(Loc) -        .addImm(offset) -        .addMetadata(Variable) -        .addMetadata(Expression); +      .addOperand(Loc).addImm(offset).addMetadata(variable);  }  void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS, diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index d33d4a9d26a..493f5ee0977 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -1643,11 +1643,8 @@ void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM,      if (isDebugValue() && MO.isMetadata()) {        // Pretty print DBG_VALUE instructions.        const MDNode *MD = MO.getMetadata(); -      if (MD->getNumOperands() >= 2) -        if (const MDString *MDS = dyn_cast<MDString>(MD->getOperand(2))) -          OS << "!\"" << MDS->getString() << '\"'; -        else -          MO.print(OS, TM); +      if (const MDString *MDS = dyn_cast<MDString>(MD->getOperand(2))) +        OS << "!\"" << MDS->getString() << '\"';        else          MO.print(OS, TM);      } else if (TM && (isInsertSubreg() || isRegSequence()) && MO.isImm()) { @@ -1750,8 +1747,6 @@ void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM,          OS << " ]";        }      } -    if (isIndirectDebugValue()) -      OS << " indirect";    } else if (!debugLoc.isUnknown() && MF) {      if (!HaveSemi) OS << ";";      OS << " dbg:"; diff --git a/llvm/lib/CodeGen/RegAllocFast.cpp b/llvm/lib/CodeGen/RegAllocFast.cpp index 5efbb6306b6..6e7e2c7e8ca 100644 --- a/llvm/lib/CodeGen/RegAllocFast.cpp +++ b/llvm/lib/CodeGen/RegAllocFast.cpp @@ -299,8 +299,7 @@ void RAFast::spillVirtReg(MachineBasicBlock::iterator MI,        LiveDbgValueMap[LRI->VirtReg];      for (unsigned li = 0, le = LRIDbgValues.size(); li != le; ++li) {        MachineInstr *DBG = LRIDbgValues[li]; -      const MDNode *Var = DBG->getDebugVariable(); -      const MDNode *Expr = DBG->getDebugExpression(); +      const MDNode *MDPtr = DBG->getOperand(2).getMetadata();        bool IsIndirect = DBG->isIndirectDebugValue();        uint64_t Offset = IsIndirect ? DBG->getOperand(1).getImm() : 0;        DebugLoc DL; @@ -312,10 +311,7 @@ void RAFast::spillVirtReg(MachineBasicBlock::iterator MI,          DL = MI->getDebugLoc();        MachineInstr *NewDV =            BuildMI(*MBB, MI, DL, TII->get(TargetOpcode::DBG_VALUE)) -              .addFrameIndex(FI) -              .addImm(Offset) -              .addMetadata(Var) -              .addMetadata(Expr); +              .addFrameIndex(FI).addImm(Offset).addMetadata(MDPtr);        assert(NewDV->getParent() == MBB && "dangling parent pointer");        (void)NewDV;        DEBUG(dbgs() << "Inserting debug info due to spill:" << "\n" << *NewDV); @@ -867,16 +863,13 @@ void RAFast::AllocateBasicBlock() {                // Modify DBG_VALUE now that the value is in a spill slot.                bool IsIndirect = MI->isIndirectDebugValue();                uint64_t Offset = IsIndirect ? MI->getOperand(1).getImm() : 0; -              const MDNode *Var = MI->getDebugVariable(); -              const MDNode *Expr = MI->getDebugExpression(); +              const MDNode *MDPtr = +                MI->getOperand(MI->getNumOperands()-1).getMetadata();                DebugLoc DL = MI->getDebugLoc();                MachineBasicBlock *MBB = MI->getParent();                MachineInstr *NewDV = BuildMI(*MBB, MBB->erase(MI), DL,                                              TII->get(TargetOpcode::DBG_VALUE)) -                                        .addFrameIndex(SS) -                                        .addImm(Offset) -                                        .addMetadata(Var) -                                        .addMetadata(Expr); +                  .addFrameIndex(SS).addImm(Offset).addMetadata(MDPtr);                DEBUG(dbgs() << "Modifying debug info due to spill:"                             << "\t" << *NewDV);                // Scan NewDV operands from the beginning. diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp index 72390a94bfe..7b656bfe34e 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -1125,14 +1125,13 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) {          Op->setIsDebug(true);          BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,                  TII.get(TargetOpcode::DBG_VALUE), false, Op->getReg(), 0, -                DI->getVariable(), DI->getExpression()); +                DI->getVariable());        } else          BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,                  TII.get(TargetOpcode::DBG_VALUE))              .addOperand(*Op)              .addImm(0) -            .addMetadata(DI->getVariable()) -            .addMetadata(DI->getExpression()); +            .addMetadata(DI->getVariable());      } else {        // We can't yet handle anything else here because it would require        // generating code, thus altering codegen because of debug info. @@ -1151,32 +1150,28 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) {        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)            .addReg(0U)            .addImm(DI->getOffset()) -          .addMetadata(DI->getVariable()) -          .addMetadata(DI->getExpression()); +          .addMetadata(DI->getVariable());      } else if (const auto *CI = dyn_cast<ConstantInt>(V)) {        if (CI->getBitWidth() > 64)          BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)              .addCImm(CI)              .addImm(DI->getOffset()) -            .addMetadata(DI->getVariable()) -            .addMetadata(DI->getExpression()); +            .addMetadata(DI->getVariable());        else          BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)              .addImm(CI->getZExtValue())              .addImm(DI->getOffset()) -            .addMetadata(DI->getVariable()) -            .addMetadata(DI->getExpression()); +            .addMetadata(DI->getVariable());      } else if (const auto *CF = dyn_cast<ConstantFP>(V)) {        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)            .addFPImm(CF)            .addImm(DI->getOffset()) -          .addMetadata(DI->getVariable()) -          .addMetadata(DI->getExpression()); +          .addMetadata(DI->getVariable());      } else if (unsigned Reg = lookUpRegForValue(V)) {        // FIXME: This does not handle register-indirect values at offset 0.        bool IsIndirect = DI->getOffset() != 0;        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, IsIndirect, Reg, -              DI->getOffset(), DI->getVariable(), DI->getExpression()); +              DI->getOffset(), DI->getVariable());      } else {        // We can't yet handle anything else here because it would require        // generating code, thus altering codegen because of debug info. @@ -2186,4 +2181,4 @@ CmpInst::Predicate FastISel::optimizeCmpPredicate(const CmpInst *CI) const {    }    return Predicate; -} +}
\ No newline at end of file diff --git a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp index d1fcbe54f26..c06612dcfa2 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp @@ -197,7 +197,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,                  StaticAllocaMap.find(AI);                if (SI != StaticAllocaMap.end()) { // Check for VLAs.                  int FI = SI->second; -                MMI.setVariableDbgInfo(DI->getVariable(), DI->getExpression(), +                MMI.setVariableDbgInfo(DI->getVariable(),                                         FI, DI->getDebugLoc());                }              } diff --git a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp index 32d5ddca615..4d6de12161c 100644 --- a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -649,18 +649,14 @@ MachineInstr *  InstrEmitter::EmitDbgValue(SDDbgValue *SD,                             DenseMap<SDValue, unsigned> &VRBaseMap) {    uint64_t Offset = SD->getOffset(); -  MDNode *Var = SD->getVariable(); -  MDNode *Expr = SD->getExpression(); +  MDNode* MDPtr = SD->getMDPtr();    DebugLoc DL = SD->getDebugLoc();    if (SD->getKind() == SDDbgValue::FRAMEIX) {      // Stack address; this needs to be lowered in target-dependent fashion.      // EmitTargetCodeForFrameDebugValue is responsible for allocation.      return BuildMI(*MF, DL, TII->get(TargetOpcode::DBG_VALUE)) -        .addFrameIndex(SD->getFrameIx()) -        .addImm(Offset) -        .addMetadata(Var) -        .addMetadata(Expr); +        .addFrameIndex(SD->getFrameIx()).addImm(Offset).addMetadata(MDPtr);    }    // Otherwise, we're going to create an instruction here.    const MCInstrDesc &II = TII->get(TargetOpcode::DBG_VALUE); @@ -706,8 +702,7 @@ InstrEmitter::EmitDbgValue(SDDbgValue *SD,      MIB.addReg(0U, RegState::Debug);    } -  MIB.addMetadata(Var); -  MIB.addMetadata(Expr); +  MIB.addMetadata(MDPtr);    return &*MIB;  } diff --git a/llvm/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h b/llvm/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h index c8bb3d8831c..307808e3578 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h +++ b/llvm/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h @@ -44,8 +44,7 @@ private:      const Value *Const;     // valid for constants      unsigned FrameIx;       // valid for stack objects    } u; -  MDNode *Var; -  MDNode *Expr; +  MDNode *mdPtr;    bool IsIndirect;    uint64_t Offset;    DebugLoc DL; @@ -53,29 +52,29 @@ private:    bool Invalid;  public:    // Constructor for non-constants. -  SDDbgValue(MDNode *Var, MDNode *Expr, SDNode *N, unsigned R, bool indir, -             uint64_t off, DebugLoc dl, unsigned O) -      : Var(Var), Expr(Expr), IsIndirect(indir), Offset(off), DL(dl), Order(O), -        Invalid(false) { +  SDDbgValue(MDNode *mdP, SDNode *N, unsigned R, +	     bool indir, uint64_t off, DebugLoc dl, +             unsigned O) : mdPtr(mdP), IsIndirect(indir), +			   Offset(off), DL(dl), Order(O), +                           Invalid(false) {      kind = SDNODE;      u.s.Node = N;      u.s.ResNo = R;    }    // Constructor for constants. -  SDDbgValue(MDNode *Var, MDNode *Expr, const Value *C, uint64_t off, -             DebugLoc dl, unsigned O) -      : Var(Var), Expr(Expr), IsIndirect(false), Offset(off), DL(dl), Order(O), -        Invalid(false) { +  SDDbgValue(MDNode *mdP, const Value *C, uint64_t off, DebugLoc dl, +             unsigned O) :  +    mdPtr(mdP), IsIndirect(false), Offset(off), DL(dl), Order(O), +    Invalid(false) {      kind = CONST;      u.Const = C;    }    // Constructor for frame indices. -  SDDbgValue(MDNode *Var, MDNode *Expr, unsigned FI, uint64_t off, DebugLoc dl, -             unsigned O) -      : Var(Var), Expr(Expr), IsIndirect(false), Offset(off), DL(dl), Order(O), -        Invalid(false) { +  SDDbgValue(MDNode *mdP, unsigned FI, uint64_t off, DebugLoc dl, unsigned O) :  +    mdPtr(mdP), IsIndirect(false), Offset(off), DL(dl), Order(O), +    Invalid(false) {      kind = FRAMEIX;      u.FrameIx = FI;    } @@ -83,11 +82,8 @@ public:    // Returns the kind.    DbgValueKind getKind() { return kind; } -  // Returns the MDNode pointer for the variable. -  MDNode *getVariable() { return Var; } - -  // Returns the MDNode pointer for the expression. -  MDNode *getExpression() { return Expr; } +  // Returns the MDNode pointer. +  MDNode *getMDPtr() { return mdPtr; }    // Returns the SDNode* for a register ref    SDNode *getSDNode() { assert (kind==SDNODE); return u.s.Node; } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 2322ce0104c..e2ead476fae 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5764,24 +5764,26 @@ SDNode *SelectionDAG::getNodeIfExists(unsigned Opcode, SDVTList VTList,  /// getDbgValue - Creates a SDDbgValue node.  ///  /// SDNode -SDDbgValue *SelectionDAG::getDbgValue(MDNode *Var, MDNode *Expr, SDNode *N, -                                      unsigned R, bool IsIndirect, uint64_t Off, -                                      DebugLoc DL, unsigned O) { -  return new (Allocator) SDDbgValue(Var, Expr, N, R, IsIndirect, Off, DL, O); +SDDbgValue * +SelectionDAG::getDbgValue(MDNode *MDPtr, SDNode *N, unsigned R, +			  bool IsIndirect, uint64_t Off, +                          DebugLoc DL, unsigned O) { +  return new (Allocator) SDDbgValue(MDPtr, N, R, IsIndirect, Off, DL, O);  }  /// Constant -SDDbgValue *SelectionDAG::getConstantDbgValue(MDNode *Var, MDNode *Expr, -                                              const Value *C, uint64_t Off, -                                              DebugLoc DL, unsigned O) { -  return new (Allocator) SDDbgValue(Var, Expr, C, Off, DL, O); +SDDbgValue * +SelectionDAG::getConstantDbgValue(MDNode *MDPtr, const Value *C, +				  uint64_t Off, +				  DebugLoc DL, unsigned O) { +  return new (Allocator) SDDbgValue(MDPtr, C, Off, DL, O);  }  /// FrameIndex -SDDbgValue *SelectionDAG::getFrameIndexDbgValue(MDNode *Var, MDNode *Expr, -                                                unsigned FI, uint64_t Off, -                                                DebugLoc DL, unsigned O) { -  return new (Allocator) SDDbgValue(Var, Expr, FI, Off, DL, O); +SDDbgValue * +SelectionDAG::getFrameIndexDbgValue(MDNode *MDPtr, unsigned FI, uint64_t Off, +				    DebugLoc DL, unsigned O) { +  return new (Allocator) SDDbgValue(MDPtr, FI, Off, DL, O);  }  namespace { @@ -6187,10 +6189,10 @@ void SelectionDAG::TransferDbgValues(SDValue From, SDValue To) {         I != E; ++I) {      SDDbgValue *Dbg = *I;      if (Dbg->getKind() == SDDbgValue::SDNODE) { -      SDDbgValue *Clone = -          getDbgValue(Dbg->getVariable(), Dbg->getExpression(), ToNode, -                      To.getResNo(), Dbg->isIndirect(), Dbg->getOffset(), -                      Dbg->getDebugLoc(), Dbg->getOrder()); +      SDDbgValue *Clone = getDbgValue(Dbg->getMDPtr(), ToNode, To.getResNo(), +				      Dbg->isIndirect(), +                                      Dbg->getOffset(), Dbg->getDebugLoc(), +                                      Dbg->getOrder());        ClonedDVs.push_back(Clone);      }    } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 9bd5dfea0a6..6a8cd2eb3b1 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -993,16 +993,15 @@ void SelectionDAGBuilder::resolveDanglingDebugInfo(const Value *V,      DebugLoc dl = DDI.getdl();      unsigned DbgSDNodeOrder = DDI.getSDNodeOrder();      MDNode *Variable = DI->getVariable(); -    MDNode *Expr = DI->getExpression();      uint64_t Offset = DI->getOffset();      // A dbg.value for an alloca is always indirect.      bool IsIndirect = isa<AllocaInst>(V) || Offset != 0;      SDDbgValue *SDV;      if (Val.getNode()) { -      if (!EmitFuncArgumentDbgValue(V, Variable, Expr, Offset, IsIndirect, -                                    Val)) { -        SDV = DAG.getDbgValue(Variable, Expr, Val.getNode(), Val.getResNo(), -                              IsIndirect, Offset, dl, DbgSDNodeOrder); +      if (!EmitFuncArgumentDbgValue(V, Variable, Offset, IsIndirect, Val)) { +        SDV = DAG.getDbgValue(Variable, Val.getNode(), +                              Val.getResNo(), IsIndirect, +			      Offset, dl, DbgSDNodeOrder);          DAG.AddDbgValue(SDV, Val.getNode(), false);        }      } else @@ -4604,11 +4603,10 @@ static unsigned getTruncatedArgReg(const SDValue &N) {  /// EmitFuncArgumentDbgValue - If the DbgValueInst is a dbg_value of a function  /// argument, create the corresponding DBG_VALUE machine instruction for it now.  /// At the end of instruction selection, they will be inserted to the entry BB. -bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(const Value *V, -                                                   MDNode *Variable, -                                                   MDNode *Expr, int64_t Offset, -                                                   bool IsIndirect, -                                                   const SDValue &N) { +bool +SelectionDAGBuilder::EmitFuncArgumentDbgValue(const Value *V, MDNode *Variable, +                                              int64_t Offset, bool IsIndirect, +                                              const SDValue &N) {    const Argument *Arg = dyn_cast<Argument>(V);    if (!Arg)      return false; @@ -4660,16 +4658,14 @@ bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(const Value *V,      return false;    if (Op->isReg()) -    FuncInfo.ArgDbgValues.push_back( -        BuildMI(MF, getCurDebugLoc(), TII->get(TargetOpcode::DBG_VALUE), -                IsIndirect, Op->getReg(), Offset, Variable, Expr)); +    FuncInfo.ArgDbgValues.push_back(BuildMI(MF, getCurDebugLoc(), +                                            TII->get(TargetOpcode::DBG_VALUE), +                                            IsIndirect, +                                            Op->getReg(), Offset, Variable));    else      FuncInfo.ArgDbgValues.push_back( -        BuildMI(MF, getCurDebugLoc(), TII->get(TargetOpcode::DBG_VALUE)) -            .addOperand(*Op) -            .addImm(Offset) -            .addMetadata(Variable) -            .addMetadata(Expr)); +      BuildMI(MF, getCurDebugLoc(), TII->get(TargetOpcode::DBG_VALUE)) +          .addOperand(*Op).addImm(Offset).addMetadata(Variable));    return true;  } @@ -4789,7 +4785,6 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    case Intrinsic::dbg_declare: {      const DbgDeclareInst &DI = cast<DbgDeclareInst>(I);      MDNode *Variable = DI.getVariable(); -    MDNode *Expression = DI.getExpression();      const Value *Address = DI.getAddress();      DIVariable DIVar(Variable);      assert((!DIVar || DIVar.isVariable()) && @@ -4825,16 +4820,16 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {          FrameIndexSDNode *FINode = dyn_cast<FrameIndexSDNode>(N.getNode());          if (FINode)            // Byval parameter.  We have a frame index at this point. -          SDV = DAG.getFrameIndexDbgValue( -              Variable, Expression, FINode->getIndex(), 0, dl, SDNodeOrder); +          SDV = DAG.getFrameIndexDbgValue(Variable, FINode->getIndex(), +					  0, dl, SDNodeOrder);          else {            // Address is an argument, so try to emit its dbg value using            // virtual register info from the FuncInfo.ValueMap. -          EmitFuncArgumentDbgValue(Address, Variable, Expression, 0, false, N); +          EmitFuncArgumentDbgValue(Address, Variable, 0, false, N);            return nullptr;          }        } else if (AI) -        SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(), +        SDV = DAG.getDbgValue(Variable, N.getNode(), N.getResNo(),                                true, 0, dl, SDNodeOrder);        else {          // Can't do anything with other non-AI cases yet. @@ -4847,8 +4842,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      } else {        // If Address is an argument then try to emit its dbg value using        // virtual register info from the FuncInfo.ValueMap. -      if (!EmitFuncArgumentDbgValue(Address, Variable, Expression, 0, false, -                                    N)) { +      if (!EmitFuncArgumentDbgValue(Address, Variable, 0, false, N)) {          // If variable is pinned by a alloca in dominating bb then          // use StaticAllocaMap.          if (const AllocaInst *AI = dyn_cast<AllocaInst>(Address)) { @@ -4856,7 +4850,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {              DenseMap<const AllocaInst*, int>::iterator SI =                FuncInfo.StaticAllocaMap.find(AI);              if (SI != FuncInfo.StaticAllocaMap.end()) { -              SDV = DAG.getFrameIndexDbgValue(Variable, Expression, SI->second, +              SDV = DAG.getFrameIndexDbgValue(Variable, SI->second,                                                0, dl, SDNodeOrder);                DAG.AddDbgValue(SDV, nullptr, false);                return nullptr; @@ -4877,7 +4871,6 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        return nullptr;      MDNode *Variable = DI.getVariable(); -    MDNode *Expression = DI.getExpression();      uint64_t Offset = DI.getOffset();      const Value *V = DI.getValue();      if (!V) @@ -4885,8 +4878,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDDbgValue *SDV;      if (isa<ConstantInt>(V) || isa<ConstantFP>(V) || isa<UndefValue>(V)) { -      SDV = DAG.getConstantDbgValue(Variable, Expression, V, Offset, dl, -                                    SDNodeOrder); +      SDV = DAG.getConstantDbgValue(Variable, V, Offset, dl, SDNodeOrder);        DAG.AddDbgValue(SDV, nullptr, false);      } else {        // Do not use getValue() in here; we don't want to generate code at @@ -4898,10 +4890,10 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        if (N.getNode()) {          // A dbg.value for an alloca is always indirect.          bool IsIndirect = isa<AllocaInst>(V) || Offset != 0; -        if (!EmitFuncArgumentDbgValue(V, Variable, Expression, Offset, -                                      IsIndirect, N)) { -          SDV = DAG.getDbgValue(Variable, Expression, N.getNode(), N.getResNo(), -                                IsIndirect, Offset, dl, SDNodeOrder); +        if (!EmitFuncArgumentDbgValue(V, Variable, Offset, IsIndirect, N)) { +          SDV = DAG.getDbgValue(Variable, N.getNode(), +                                N.getResNo(), IsIndirect, +				Offset, dl, SDNodeOrder);            DAG.AddDbgValue(SDV, N.getNode(), false);          }        } else if (!V->use_empty() ) { diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h index 6ecddc1608a..45dd55412d2 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h @@ -791,7 +791,7 @@ private:    /// EmitFuncArgumentDbgValue - If V is an function argument then create    /// corresponding DBG_VALUE machine instruction for it now. At the end of    /// instruction selection, they will be inserted to the entry BB. -  bool EmitFuncArgumentDbgValue(const Value *V, MDNode *Variable, MDNode *Expr, +  bool EmitFuncArgumentDbgValue(const Value *V, MDNode *Variable,                                  int64_t Offset, bool IsIndirect,                                  const SDValue &N);  }; diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index df2c6b8de0b..4ef3e6f94f5 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -486,14 +486,15 @@ bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) {                         "- add if needed");        MachineInstr *Def = RegInfo->getVRegDef(LDI->second);        MachineBasicBlock::iterator InsertPos = Def; -      const MDNode *Variable = MI->getDebugVariable(); -      const MDNode *Expr = MI->getDebugExpression(); +      const MDNode *Variable = +        MI->getOperand(MI->getNumOperands()-1).getMetadata();        bool IsIndirect = MI->isIndirectDebugValue();        unsigned Offset = IsIndirect ? MI->getOperand(1).getImm() : 0;        // Def is never a terminator here, so it is ok to increment InsertPos.        BuildMI(*EntryMBB, ++InsertPos, MI->getDebugLoc(), -              TII.get(TargetOpcode::DBG_VALUE), IsIndirect, LDI->second, Offset, -              Variable, Expr); +              TII.get(TargetOpcode::DBG_VALUE), +              IsIndirect, +              LDI->second, Offset, Variable);        // If this vreg is directly copied into an exported register then        // that COPY instructions also need DBG_VALUE, if it is the only @@ -512,9 +513,11 @@ bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) {        }        if (CopyUseMI) {          MachineInstr *NewMI = -            BuildMI(*MF, CopyUseMI->getDebugLoc(), -                    TII.get(TargetOpcode::DBG_VALUE), IsIndirect, -                    CopyUseMI->getOperand(0).getReg(), Offset, Variable, Expr); +          BuildMI(*MF, CopyUseMI->getDebugLoc(), +                  TII.get(TargetOpcode::DBG_VALUE), +                  IsIndirect, +                  CopyUseMI->getOperand(0).getReg(), +                  Offset, Variable);          MachineBasicBlock::iterator Pos = CopyUseMI;          EntryMBB->insertAfter(Pos, NewMI);        } diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index b4f327bab5c..bbb8462652c 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -17,7 +17,6 @@  #include "llvm/IR/Constants.h"  #include "llvm/IR/DebugInfo.h"  #include "llvm/IR/DiagnosticInfo.h" -#include "llvm/IR/DIBuilder.h"  #include "llvm/IR/Function.h"  #include "llvm/IR/IRBuilder.h"  #include "llvm/IR/Instruction.h" @@ -107,20 +106,6 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {      }      break;    } -  case 'd': { -    if (Name.startswith("dbg.declare") && F->arg_size() == 2) { -      F->setName(Name + ".old"); -      NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::dbg_declare); -      return true; -    } -    if (Name.startswith("dbg.value") && F->arg_size() == 3) { -      F->setName(Name + ".old"); -      NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::dbg_value); -      return true; -    } -    break; -  } -    case 'o':      // We only need to change the name to match the mangling including the      // address space. @@ -254,22 +239,6 @@ bool llvm::UpgradeGlobalVariable(GlobalVariable *GV) {    return false;  } -static MDNode *getNodeField(const MDNode *DbgNode, unsigned Elt) { -  if (!DbgNode || Elt >= DbgNode->getNumOperands()) -    return nullptr; -  return dyn_cast_or_null<MDNode>(DbgNode->getOperand(Elt)); -} - -static DIExpression getExpression(Value *VarOperand, Function *F) { -  // Old-style DIVariables have an optional expression as the 8th element. -  DIExpression Expr(getNodeField(cast<MDNode>(VarOperand), 8)); -  if (!Expr) { -    DIBuilder DIB(*F->getParent()); -    Expr = DIB.createExpression(); -  } -  return Expr; -} -  // UpgradeIntrinsicCall - Upgrade a call to an old intrinsic to be a call the  // upgraded intrinsic. All argument and return casting must be provided in  // order to seamlessly integrate with existing context. @@ -433,32 +402,12 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {    }    std::string Name = CI->getName().str(); -  if (!Name.empty()) -    CI->setName(Name + ".old"); +  CI->setName(Name + ".old");    switch (NewFn->getIntrinsicID()) {    default:      llvm_unreachable("Unknown function for CallInst upgrade."); -  // Upgrade debug intrinsics to use an additional DIExpression argument. -  case Intrinsic::dbg_declare: { -    auto NewCI = -        Builder.CreateCall3(NewFn, CI->getArgOperand(0), CI->getArgOperand(1), -                            getExpression(CI->getArgOperand(1), F), Name); -    NewCI->setDebugLoc(CI->getDebugLoc()); -    CI->replaceAllUsesWith(NewCI); -    CI->eraseFromParent(); -    return; -  } -  case Intrinsic::dbg_value: { -    auto NewCI = Builder.CreateCall4( -        NewFn, CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), -        getExpression(CI->getArgOperand(2), F), Name); -    NewCI->setDebugLoc(CI->getDebugLoc()); -    CI->replaceAllUsesWith(NewCI); -    CI->eraseFromParent(); -    return; -  }    case Intrinsic::ctlz:    case Intrinsic::cttz:      assert(CI->getNumArgOperands() == 1 && diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index 1ab52523d73..a5c09b60c4f 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -1042,28 +1042,50 @@ DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,    return RetVar;  } -/// createExpression - Create a new descriptor for the specified -/// variable which has a complex address expression for its address. -/// @param Addr        An array of complex address operations. -DIExpression DIBuilder::createExpression(ArrayRef<Value *> Addr) { -  SmallVector<llvm::Value *, 16> Elts; -  Elts.push_back(GetTagConstant(VMContext, DW_TAG_expression)); -  Elts.insert(Elts.end(), Addr.begin(), Addr.end()); -  return DIExpression(MDNode::get(VMContext, Elts)); +/// createComplexVariable - Create a new descriptor for the specified variable +/// which has a complex address expression for its address. +DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope, +                                            StringRef Name, DIFile F, +                                            unsigned LineNo, +                                            DITypeRef Ty, +                                            ArrayRef<Value *> Addr, +                                            unsigned ArgNo) { +  assert(Addr.size() > 0 && "complex address is empty"); +  Value *Elts[] = { +    GetTagConstant(VMContext, Tag), +    getNonCompileUnitScope(Scope), +    MDString::get(VMContext, Name), +    F, +    ConstantInt::get(Type::getInt32Ty(VMContext), +                     (LineNo | (ArgNo << 24))), +    Ty, +    Constant::getNullValue(Type::getInt32Ty(VMContext)), +    Constant::getNullValue(Type::getInt32Ty(VMContext)), +    MDNode::get(VMContext, Addr) +  }; +  return DIVariable(MDNode::get(VMContext, Elts));  }  /// createVariablePiece - Create a descriptor to describe one part  /// of aggregate variable that is fragmented across multiple Values. -DIExpression DIBuilder::createPieceExpression(unsigned OffsetInBytes, -                                              unsigned SizeInBytes) { +DIVariable DIBuilder::createVariablePiece(DIVariable Variable, +                                          unsigned OffsetInBytes, +                                          unsigned SizeInBytes) {    assert(SizeInBytes > 0 && "zero-size piece");    Value *Addr[] = { -      GetTagConstant(VMContext, DW_TAG_expression), -      ConstantInt::get(Type::getInt64Ty(VMContext), dwarf::DW_OP_piece), -      ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBytes), -      ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBytes)}; +    ConstantInt::get(Type::getInt32Ty(VMContext), OpPiece), +    ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBytes), +    ConstantInt::get(Type::getInt32Ty(VMContext), SizeInBytes) +  }; + +  assert((Variable->getNumOperands() == 8 || Variable.isVariablePiece()) && +         "variable already has a complex address"); +  SmallVector<Value *, 9> Elts; +  for (unsigned i = 0; i < 8; ++i) +    Elts.push_back(Variable->getOperand(i)); -  return DIExpression(MDNode::get(VMContext, Addr)); +  Elts.push_back(MDNode::get(VMContext, Addr)); +  return DIVariable(MDNode::get(VMContext, Elts));  }  /// createFunction - Create a new descriptor for the specified function. @@ -1270,7 +1292,6 @@ DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,  /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.  Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, -                                      DIExpression Expr,                                        Instruction *InsertBefore) {    assert(Storage && "no storage passed to dbg.declare");    assert(VarInfo.isVariable() && @@ -1278,13 +1299,12 @@ Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,    if (!DeclareFn)      DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); -  Value *Args[] = {MDNode::get(Storage->getContext(), Storage), VarInfo, Expr}; +  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };    return CallInst::Create(DeclareFn, Args, "", InsertBefore);  }  /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.  Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, -                                      DIExpression Expr,                                        BasicBlock *InsertAtEnd) {    assert(Storage && "no storage passed to dbg.declare");    assert(VarInfo.isVariable() && @@ -1292,7 +1312,7 @@ Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,    if (!DeclareFn)      DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); -  Value *Args[] = {MDNode::get(Storage->getContext(), Storage), VarInfo, Expr}; +  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };    // If this block already has a terminator then insert this intrinsic    // before the terminator. @@ -1305,7 +1325,6 @@ Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,  /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.  Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,                                                  DIVariable VarInfo, -                                                DIExpression Expr,                                                  Instruction *InsertBefore) {    assert(V && "no value passed to dbg.value");    assert(VarInfo.isVariable() && @@ -1313,16 +1332,15 @@ Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,    if (!ValueFn)      ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); -  Value *Args[] = {MDNode::get(V->getContext(), V), -                   ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), -                   VarInfo, Expr}; +  Value *Args[] = { MDNode::get(V->getContext(), V), +                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), +                    VarInfo };    return CallInst::Create(ValueFn, Args, "", InsertBefore);  }  /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.  Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,                                                  DIVariable VarInfo, -                                                DIExpression Expr,                                                  BasicBlock *InsertAtEnd) {    assert(V && "no value passed to dbg.value");    assert(VarInfo.isVariable() && @@ -1330,8 +1348,8 @@ Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,    if (!ValueFn)      ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); -  Value *Args[] = {MDNode::get(V->getContext(), V), -                   ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), -                   VarInfo, Expr}; +  Value *Args[] = { MDNode::get(V->getContext(), V), +                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), +                    VarInfo };    return CallInst::Create(ValueFn, Args, "", InsertAtEnd);  } diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp index 4e36a8df3e1..4274d82d158 100644 --- a/llvm/lib/IR/DebugInfo.cpp +++ b/llvm/lib/IR/DebugInfo.cpp @@ -49,7 +49,7 @@ bool DIDescriptor::Verify() const {            DIObjCProperty(DbgNode).Verify() ||            DITemplateTypeParameter(DbgNode).Verify() ||            DITemplateValueParameter(DbgNode).Verify() || -          DIImportedEntity(DbgNode).Verify() || DIExpression(DbgNode).Verify()); +          DIImportedEntity(DbgNode).Verify());  }  static Value *getField(const MDNode *DbgNode, unsigned Elt) { @@ -138,9 +138,33 @@ void DIDescriptor::replaceFunctionField(unsigned Elt, Function *F) {    }  } +uint64_t DIVariable::getAddrElement(unsigned Idx) const { +  DIDescriptor ComplexExpr = getDescriptorField(8); +  if (Idx < ComplexExpr->getNumOperands()) +    if (auto *CI = dyn_cast_or_null<ConstantInt>(ComplexExpr->getOperand(Idx))) +      return CI->getZExtValue(); + +  assert(false && "non-existing complex address element requested"); +  return 0; +} +  /// getInlinedAt - If this variable is inlined then return inline location.  MDNode *DIVariable::getInlinedAt() const { return getNodeField(DbgNode, 7); } +bool DIVariable::isVariablePiece() const { +  return hasComplexAddress() && getAddrElement(0) == DIBuilder::OpPiece; +} + +uint64_t DIVariable::getPieceOffset() const { +  assert(isVariablePiece()); +  return getAddrElement(1); +} + +uint64_t DIVariable::getPieceSize() const { +  assert(isVariablePiece()); +  return getAddrElement(2); +} +  /// Return the size reported by the variable's type.  unsigned DIVariable::getSizeInBits(const DITypeIdentifierMap &Map) {    DIType Ty = getType().resolve(Map); @@ -154,29 +178,8 @@ unsigned DIVariable::getSizeInBits(const DITypeIdentifierMap &Map) {    return Ty.getSizeInBits();  } -uint64_t DIExpression::getElement(unsigned Idx) const { -  unsigned I = Idx + 1; -  if (I < DbgNode->getNumOperands()) -    if (auto *CI = dyn_cast_or_null<ConstantInt>(DbgNode->getOperand(I))) -      return CI->getZExtValue(); - -  assert(false && "non-existing complex address element requested"); -  return 0; -} - -bool DIExpression::isVariablePiece() const { -  return getNumElements() && getElement(0) == dwarf::DW_OP_piece; -} -uint64_t DIExpression::getPieceOffset() const { -  assert(isVariablePiece()); -  return getElement(1); -} -uint64_t DIExpression::getPieceSize() const { -  assert(isVariablePiece()); -  return getElement(2); -}  //===----------------------------------------------------------------------===//  // Predicates @@ -354,12 +357,6 @@ bool DIDescriptor::isImportedEntity() const {                       getTag() == dwarf::DW_TAG_imported_declaration);  } -/// \brief Return true if the specified tag is DW_TAG_imported_module or -/// DW_TAG_imported_declaration. -bool DIDescriptor::isExpression() const { -  return DbgNode && (getTag() == dwarf::DW_TAG_expression); -} -  //===----------------------------------------------------------------------===//  // Simple Descriptor Constructors and other Methods  //===----------------------------------------------------------------------===// @@ -599,16 +596,14 @@ bool DIVariable::Verify() const {    if (!fieldIsTypeRef(DbgNode, 5))      return false; -  // Variable without an inline location. -  if (DbgNode->getNumOperands() == 7) +  // Variable without a complex expression. +  if (DbgNode->getNumOperands() == 8)      return true; -  return DbgNode->getNumOperands() == 8; +  // Make sure the complex expression is an MDNode. +  return (DbgNode->getNumOperands() == 9 && fieldIsMDNode(DbgNode, 8));  } -/// Verify - Verify that a variable descriptor is well formed. -bool DIExpression::Verify() const { return isExpression(); } -  /// Verify - Verify that a location descriptor is well formed.  bool DILocation::Verify() const {    if (!DbgNode) @@ -941,6 +936,19 @@ DIVariable llvm::cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext) {    return DIVariable(MDNode::get(VMContext, Elts));  } + +/// getEntireVariable - Remove OpPiece exprs from the variable. +DIVariable llvm::getEntireVariable(DIVariable DV) { +  if (!DV.isVariablePiece()) +    return DV; + +  SmallVector<Value *, 8> Elts; +  for (unsigned i = 0; i < 8; ++i) +    Elts.push_back(DV->getOperand(i)); + +  return DIVariable(MDNode::get(DV->getContext(), Elts)); +} +  /// getDISubprogram - Find subprogram that is enclosing this scope.  DISubprogram llvm::getDISubprogram(const MDNode *Scope) {    DIDescriptor D(Scope); @@ -1285,8 +1293,6 @@ void DIDescriptor::print(raw_ostream &OS) const {      DINameSpace(DbgNode).printInternal(OS);    } else if (this->isScope()) {      DIScope(DbgNode).printInternal(OS); -  } else if (this->isExpression()) { -    DIExpression(DbgNode).printInternal(OS);    }  } @@ -1436,28 +1442,10 @@ void DIVariable::printInternal(raw_ostream &OS) const {      OS << " [" << Res << ']';    OS << " [line " << getLineNumber() << ']'; -} -void DIExpression::printInternal(raw_ostream &OS) const { -  for (unsigned I = 0; I < getNumElements(); ++I) { -    uint64_t OpCode = getElement(I); -    OS << " [" << OperationEncodingString(OpCode); -    switch (OpCode) { -    case DW_OP_plus: { -      OS << " " << getElement(++I); -      break; -    } -    case DW_OP_piece: { -      unsigned Offset = getElement(++I); -      unsigned Size = getElement(++I); -      OS << " offset=" << Offset << ", size= " << Size; -      break; -    } -    default: -      break; -    } -    OS << "]"; -  } +  if (isVariablePiece()) +    OS << " [piece, size " << getPieceSize() +       << ", offset " << getPieceOffset() << ']';  }  void DIObjCProperty::printInternal(raw_ostream &OS) const { diff --git a/llvm/lib/Support/Dwarf.cpp b/llvm/lib/Support/Dwarf.cpp index 8f2013778ac..5237ac22025 100644 --- a/llvm/lib/Support/Dwarf.cpp +++ b/llvm/lib/Support/Dwarf.cpp @@ -82,8 +82,6 @@ const char *llvm::dwarf::TagString(unsigned Tag) {    case DW_TAG_hi_user:                   return "DW_TAG_hi_user";    case DW_TAG_auto_variable:             return "DW_TAG_auto_variable";    case DW_TAG_arg_variable:              return "DW_TAG_arg_variable"; -  case DW_TAG_expression: -    return "DW_TAG_expression";    case DW_TAG_rvalue_reference_type:     return "DW_TAG_rvalue_reference_type";    case DW_TAG_template_alias:            return "DW_TAG_template_alias";    case DW_TAG_coarray_type:              return "DW_TAG_coarray_type"; diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index f984eb1ad15..2f633c21787 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -1444,15 +1444,16 @@ bool AArch64InstrInfo::shouldScheduleAdjacent(MachineInstr *First,    }  } -MachineInstr *AArch64InstrInfo::emitFrameIndexDebugValue( -    MachineFunction &MF, int FrameIx, uint64_t Offset, const MDNode *Var, -    const MDNode *Expr, DebugLoc DL) const { +MachineInstr *AArch64InstrInfo::emitFrameIndexDebugValue(MachineFunction &MF, +                                                         int FrameIx, +                                                         uint64_t Offset, +                                                         const MDNode *MDPtr, +                                                         DebugLoc DL) const {    MachineInstrBuilder MIB = BuildMI(MF, DL, get(AArch64::DBG_VALUE))                                  .addFrameIndex(FrameIx)                                  .addImm(0)                                  .addImm(Offset) -                                .addMetadata(Var) -                                .addMetadata(Expr); +                                .addMetadata(MDPtr);    return &*MIB;  } diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.h b/llvm/lib/Target/AArch64/AArch64InstrInfo.h index 64fc9fd56b8..cdb25bebd94 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.h +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.h @@ -107,8 +107,8 @@ public:                                MachineInstr *Second) const override;    MachineInstr *emitFrameIndexDebugValue(MachineFunction &MF, int FrameIx, -                                         uint64_t Offset, const MDNode *Var, -                                         const MDNode *Expr, DebugLoc DL) const; +                                         uint64_t Offset, const MDNode *MDPtr, +                                         DebugLoc DL) const;    void copyPhysRegTuple(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,                          DebugLoc DL, unsigned DestReg, unsigned SrcReg,                          bool KillSrc, unsigned Opcode, diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index 70eec08cce2..828e251e753 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -2249,10 +2249,8 @@ bool X86FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {      const MCInstrDesc &II = TII.get(TargetOpcode::DBG_VALUE);      // FIXME may need to add RegState::Debug to any registers produced,      // although ESP/EBP should be the only ones at the moment. -    addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II), AM) -        .addImm(0) -        .addMetadata(DI->getVariable()) -        .addMetadata(DI->getExpression()); +    addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II), AM). +      addImm(0).addMetadata(DI->getVariable());      return true;    }    case Intrinsic::trap: { diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index 6c01826a064..ada44cd5d28 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/lib/Transforms/Scalar/SROA.cpp @@ -891,8 +891,8 @@ public:          continue;        }        Instruction *DbgVal = -          DIB.insertDbgValueIntrinsic(Arg, 0, DIVariable(DVI->getVariable()), -                                      DIExpression(DVI->getExpression()), Inst); +        DIB.insertDbgValueIntrinsic(Arg, 0, DIVariable(DVI->getVariable()), +                                     Inst);        DbgVal->setDebugLoc(DVI->getDebugLoc());      }    } diff --git a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp index c6d6ec73761..eb8d2a6f73f 100644 --- a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -1124,9 +1124,9 @@ public:        } else {          continue;        } -      Instruction *DbgVal = DIB->insertDbgValueIntrinsic( -          Arg, 0, DIVariable(DVI->getVariable()), -          DIExpression(DVI->getExpression()), Inst); +      Instruction *DbgVal = +        DIB->insertDbgValueIntrinsic(Arg, 0, DIVariable(DVI->getVariable()), +                                     Inst);        DbgVal->setDebugLoc(DVI->getDebugLoc());      }    } diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 69c9346c027..e4ce699ecb4 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -993,7 +993,6 @@ static bool LdStHasDebugValue(DIVariable &DIVar, Instruction *I) {  bool llvm::ConvertDebugDeclareToDebugValue(DbgDeclareInst *DDI,                                             StoreInst *SI, DIBuilder &Builder) {    DIVariable DIVar(DDI->getVariable()); -  DIExpression DIExpr(DDI->getExpression());    assert((!DIVar || DIVar.isVariable()) &&           "Variable in DbgDeclareInst should be either null or a DIVariable.");    if (!DIVar) @@ -1011,10 +1010,9 @@ bool llvm::ConvertDebugDeclareToDebugValue(DbgDeclareInst *DDI,    if (SExtInst *SExt = dyn_cast<SExtInst>(SI->getOperand(0)))      ExtendedArg = dyn_cast<Argument>(SExt->getOperand(0));    if (ExtendedArg) -    DbgVal = Builder.insertDbgValueIntrinsic(ExtendedArg, 0, DIVar, DIExpr, SI); +    DbgVal = Builder.insertDbgValueIntrinsic(ExtendedArg, 0, DIVar, SI);    else -    DbgVal = Builder.insertDbgValueIntrinsic(SI->getOperand(0), 0, DIVar, -                                             DIExpr, SI); +    DbgVal = Builder.insertDbgValueIntrinsic(SI->getOperand(0), 0, DIVar, SI);    DbgVal->setDebugLoc(DDI->getDebugLoc());    return true;  } @@ -1024,7 +1022,6 @@ bool llvm::ConvertDebugDeclareToDebugValue(DbgDeclareInst *DDI,  bool llvm::ConvertDebugDeclareToDebugValue(DbgDeclareInst *DDI,                                             LoadInst *LI, DIBuilder &Builder) {    DIVariable DIVar(DDI->getVariable()); -  DIExpression DIExpr(DDI->getExpression());    assert((!DIVar || DIVar.isVariable()) &&           "Variable in DbgDeclareInst should be either null or a DIVariable.");    if (!DIVar) @@ -1034,7 +1031,8 @@ bool llvm::ConvertDebugDeclareToDebugValue(DbgDeclareInst *DDI,      return true;    Instruction *DbgVal = -      Builder.insertDbgValueIntrinsic(LI->getOperand(0), 0, DIVar, DIExpr, LI); +    Builder.insertDbgValueIntrinsic(LI->getOperand(0), 0, +                                    DIVar, LI);    DbgVal->setDebugLoc(DDI->getDebugLoc());    return true;  } @@ -1077,11 +1075,11 @@ bool llvm::LowerDbgDeclare(Function &F) {  	  // This is a call by-value or some other instruction that  	  // takes a pointer to the variable. Insert a *value*  	  // intrinsic that describes the alloca. -          auto DbgVal = DIB.insertDbgValueIntrinsic( -              AI, 0, DIVariable(DDI->getVariable()), -              DIExpression(DDI->getExpression()), CI); -          DbgVal->setDebugLoc(DDI->getDebugLoc()); -        } +	  auto DbgVal = +	    DIB.insertDbgValueIntrinsic(AI, 0, +					DIVariable(DDI->getVariable()), CI); +	  DbgVal->setDebugLoc(DDI->getDebugLoc()); +	}        DDI->eraseFromParent();      }    } @@ -1105,7 +1103,6 @@ bool llvm::replaceDbgDeclareForAlloca(AllocaInst *AI, Value *NewAllocaAddress,    if (!DDI)      return false;    DIVariable DIVar(DDI->getVariable()); -  DIExpression DIExpr(DDI->getExpression());    assert((!DIVar || DIVar.isVariable()) &&           "Variable in DbgDeclareInst should be either null or a DIVariable.");    if (!DIVar) @@ -1116,19 +1113,23 @@ bool llvm::replaceDbgDeclareForAlloca(AllocaInst *AI, Value *NewAllocaAddress,    // will take a value storing address of the memory for variable, not    // alloca itself.    Type *Int64Ty = Type::getInt64Ty(AI->getContext()); -  SmallVector<Value *, 4> NewDIExpr; -  if (DIExpr) { -    for (unsigned i = 0, n = DIExpr.getNumElements(); i < n; ++i) { -      NewDIExpr.push_back(ConstantInt::get(Int64Ty, DIExpr.getElement(i))); +  SmallVector<Value*, 4> NewDIVarAddress; +  if (DIVar.hasComplexAddress()) { +    for (unsigned i = 0, n = DIVar.getNumAddrElements(); i < n; ++i) { +      NewDIVarAddress.push_back( +          ConstantInt::get(Int64Ty, DIVar.getAddrElement(i)));      }    } -  NewDIExpr.push_back(ConstantInt::get(Int64Ty, dwarf::DW_OP_deref)); +  NewDIVarAddress.push_back(ConstantInt::get(Int64Ty, DIBuilder::OpDeref)); +  DIVariable NewDIVar = Builder.createComplexVariable( +      DIVar.getTag(), DIVar.getContext(), DIVar.getName(), +      DIVar.getFile(), DIVar.getLineNumber(), DIVar.getType(), +      NewDIVarAddress, DIVar.getArgNumber());    // Insert llvm.dbg.declare in the same basic block as the original alloca,    // and remove old llvm.dbg.declare.    BasicBlock *BB = AI->getParent(); -  Builder.insertDeclare(NewAllocaAddress, DIVar, -                        Builder.createExpression(NewDIExpr), BB); +  Builder.insertDeclare(NewAllocaAddress, NewDIVar, BB);    DDI->eraseFromParent();    return true;  }  | 

