[llvm] r240733 - AsmPrinter: Convert DIE::Values to a linked list

David Blaikie dblaikie at gmail.com
Thu Jun 25 17:09:19 PDT 2015


On Thu, Jun 25, 2015 at 5:07 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> On Thu, Jun 25, 2015 at 4:46 PM, Duncan P. N. Exon Smith <
> dexonsmith at apple.com> wrote:
>
>> Author: dexonsmith
>> Date: Thu Jun 25 18:46:41 2015
>> New Revision: 240733
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=240733&view=rev
>> Log:
>> AsmPrinter: Convert DIE::Values to a linked list
>>
>> Change `DIE::Values` to a singly linked list, where each node is
>> allocated on a `BumpPtrAllocator`.  In order to support `push_back()`,
>> the list is circular, and points at the tail element instead of the
>> head.  I abstracted the core list logic out to `IntrusiveBackList` so
>> that it can be reused for `DIE::Children`, which also cares about
>> `push_back()`.
>>
>> This drops llc memory usage from 799 MB down to 735 MB, about 8%.
>>
>
> Just looking at the core of this change - where exactly are the memory
> savings:
>
> -  SmallVector<DIEValue, 12> Values;
> +  DIEValueList Values;
>
> Is it just that most DIEs don't have that many values? If we had a lower
> small vector size I would imagine it'd be smaller than a linked list -
> paying a pointer in every value compared to paying one pointer and one size
> to point to all the values? (with any DIE with more than two values that
> would be efficient - more than 3 and we could have buffer pointer + size +
> capacity and still be winning, no?) Do most DIEs have fewer attributes?
> Most I can think of have more than 3...
>
> Presumably I've missed something about how this is a win over alternatives.
>

I guess it's the bump pointer allocation performance wins (might be worth
documenting those to, to help justify the change so someone coming back to
this doesn't decide to change it back for greater memory wins but hurting
compile time) that wouldn't be practical to get with a vector-like scheme?


>
>
>>
>> (I'm looking at `llc` memory usage on `verify-uselistorder.lto.opt.bc`;
>> see r236629 for details.)
>>
>> Modified:
>>     llvm/trunk/include/llvm/ADT/iterator.h
>>     llvm/trunk/include/llvm/CodeGen/DIE.h
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.h
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
>>     llvm/trunk/tools/dsymutil/DwarfLinker.cpp
>>     llvm/trunk/unittests/CodeGen/DIEHashTest.cpp
>>
>> Modified: llvm/trunk/include/llvm/ADT/iterator.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/iterator.h?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ADT/iterator.h (original)
>> +++ llvm/trunk/include/llvm/ADT/iterator.h Thu Jun 25 18:46:41 2015
>> @@ -162,6 +162,8 @@ protected:
>>            int>::type = 0)
>>        : I(std::forward<U &&>(u)) {}
>>
>> +  const WrappedIteratorT &wrapped() const { return I; }
>> +
>>  public:
>>    typedef DifferenceTypeT difference_type;
>>
>>
>> Modified: llvm/trunk/include/llvm/CodeGen/DIE.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DIE.h?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/CodeGen/DIE.h (original)
>> +++ llvm/trunk/include/llvm/CodeGen/DIE.h Thu Jun 25 18:46:41 2015
>> @@ -15,6 +15,8 @@
>>  #define LLVM_LIB_CODEGEN_ASMPRINTER_DIE_H
>>
>>  #include "llvm/ADT/FoldingSet.h"
>> +#include "llvm/ADT/PointerIntPair.h"
>> +#include "llvm/ADT/STLExtras.h"
>>  #include "llvm/ADT/SmallVector.h"
>>  #include "llvm/CodeGen/DwarfStringPoolEntry.h"
>>  #include "llvm/Support/Dwarf.h"
>> @@ -448,6 +450,162 @@ public:
>>  #endif
>>  };
>>
>> +struct IntrusiveBackListNode {
>> +  PointerIntPair<IntrusiveBackListNode *, 1> Next;
>> +  IntrusiveBackListNode() : Next(this, true) {}
>> +
>> +  IntrusiveBackListNode *getNext() const {
>> +    return Next.getInt() ? nullptr : Next.getPointer();
>> +  }
>> +};
>> +
>> +struct IntrusiveBackListBase {
>> +  typedef IntrusiveBackListNode Node;
>> +  Node *Last = nullptr;
>> +
>> +  bool empty() const { return !Last; }
>> +  void push_back(Node &N) {
>> +    assert(N.Next.getPointer() == &N && "Expected unlinked node");
>> +    assert(N.Next.getInt() == true && "Expected unlinked node");
>> +
>> +    if (Last) {
>> +      N.Next = Last->Next;
>> +      Last->Next.setPointerAndInt(&N, false);
>> +    }
>> +    Last = &N;
>> +  }
>> +};
>> +
>> +template <class T> class IntrusiveBackList : IntrusiveBackListBase {
>> +public:
>> +  using IntrusiveBackListBase::empty;
>> +  void push_back(T &N) { IntrusiveBackListBase::push_back(N); }
>> +  T &back() { return *static_cast<T *>(Last); }
>> +  const T &back() const { return *static_cast<T *>(Last); }
>> +
>> +  class const_iterator;
>> +  class iterator
>> +      : public iterator_facade_base<iterator, std::forward_iterator_tag,
>> T> {
>> +    friend class const_iterator;
>> +    Node *N = nullptr;
>> +
>> +  public:
>> +    iterator() = default;
>> +    explicit iterator(T *N) : N(N) {}
>> +
>> +    iterator &operator++() {
>> +      N = N->getNext();
>> +      return *this;
>> +    }
>> +
>> +    explicit operator bool() const { return N; }
>> +    T &operator*() const { return *static_cast<T *>(N); }
>> +
>> +    bool operator==(const iterator &X) const { return N == X.N; }
>> +    bool operator!=(const iterator &X) const { return N != X.N; }
>> +  };
>> +
>> +  class const_iterator
>> +      : public iterator_facade_base<const_iterator,
>> std::forward_iterator_tag,
>> +                                    const T> {
>> +    const Node *N = nullptr;
>> +
>> +  public:
>> +    const_iterator() = default;
>> +    const_iterator(iterator X) : N(X.N) {}
>> +    explicit const_iterator(const T *N) : N(N) {}
>> +
>> +    const_iterator &operator++() {
>> +      N = N->getNext();
>> +      return *this;
>> +    }
>> +
>> +    explicit operator bool() const { return N; }
>> +    const T &operator*() const { return *static_cast<const T *>(N); }
>> +
>> +    bool operator==(const const_iterator &X) const { return N == X.N; }
>> +    bool operator!=(const const_iterator &X) const { return N != X.N; }
>> +  };
>> +
>> +  iterator begin() {
>> +    return Last ? iterator(static_cast<T *>(Last->Next.getPointer())) :
>> end();
>> +  }
>> +  const_iterator begin() const {
>> +    return const_cast<IntrusiveBackList *>(this)->begin();
>> +  }
>> +  iterator end() { return iterator(); }
>> +  const_iterator end() const { return const_iterator(); }
>> +
>> +  static iterator toIterator(T &N) { return iterator(&N); }
>> +  static const_iterator toIterator(const T &N) { return
>> const_iterator(&N); }
>> +};
>> +
>> +/// A list of DIE values.
>> +///
>> +/// This is a singly-linked list, but instead of reversing the order of
>> +/// insertion, we keep a pointer to the back of the list so we can push
>> in
>> +/// order.
>> +class DIEValueList {
>> +  struct Node : IntrusiveBackListNode {
>> +    DIEValue V;
>> +    explicit Node(DIEValue V) : V(V) {}
>> +  };
>> +
>> +  typedef IntrusiveBackList<Node> ListTy;
>> +  ListTy List;
>> +
>> +public:
>> +  bool empty() const { return List.empty(); }
>> +
>> +  class const_iterator;
>> +  class iterator
>> +      : public iterator_adaptor_base<iterator, ListTy::iterator,
>> +                                     std::forward_iterator_tag,
>> DIEValue> {
>> +    friend class const_iterator;
>> +    typedef iterator_adaptor_base<iterator, ListTy::iterator,
>> +                                  std::forward_iterator_tag,
>> +                                  DIEValue> iterator_adaptor;
>> +
>> +  public:
>> +    iterator() = default;
>> +    explicit iterator(ListTy::iterator X) : iterator_adaptor(X) {}
>> +
>> +    explicit operator bool() const { return bool(wrapped()); }
>> +    DIEValue &operator*() const { return wrapped()->V; }
>> +  };
>> +
>> +  class const_iterator
>> +      : public iterator_adaptor_base<const_iterator,
>> ListTy::const_iterator,
>> +                                     std::forward_iterator_tag,
>> +                                     const DIEValue> {
>> +    typedef iterator_adaptor_base<const_iterator, ListTy::const_iterator,
>> +                                  std::forward_iterator_tag,
>> +                                  const DIEValue> iterator_adaptor;
>> +
>> +  public:
>> +    const_iterator() = default;
>> +    const_iterator(DIEValueList::iterator X) :
>> iterator_adaptor(X.wrapped()) {}
>> +    explicit const_iterator(ListTy::const_iterator X) :
>> iterator_adaptor(X) {}
>> +
>> +    explicit operator bool() const { return bool(wrapped()); }
>> +    const DIEValue &operator*() const { return wrapped()->V; }
>> +  };
>> +
>> +  iterator insert(BumpPtrAllocator &Alloc, DIEValue V) {
>> +    List.push_back(*new (Alloc) Node(V));
>> +    return iterator(ListTy::toIterator(List.back()));
>> +  }
>> +  template <class... Ts>
>> +  iterator emplace(BumpPtrAllocator &Alloc, Ts &&... Args) {
>> +    return insert(Alloc, DIEValue(std::forward<Ts>(Args)...));
>> +  }
>> +
>> +  iterator begin() { return iterator(List.begin()); }
>> +  iterator end() { return iterator(List.end()); }
>> +  const_iterator begin() const { return const_iterator(List.begin()); }
>> +  const_iterator end() const { return const_iterator(List.end()); }
>> +};
>> +
>>
>>  //===--------------------------------------------------------------------===//
>>  /// DIE - A structured debug information entry.  Has an abbreviation
>> which
>>  /// describes its organization.
>> @@ -481,7 +639,7 @@ protected:
>>
>>    /// Attribute values.
>>    ///
>> -  SmallVector<DIEValue, 12> Values;
>> +  DIEValueList Values;
>>
>>  protected:
>>    DIE() : Offset(0), Size(0), Parent(nullptr) {}
>> @@ -504,19 +662,20 @@ public:
>>      return llvm::make_range(Children.begin(), Children.end());
>>    }
>>
>> -  typedef SmallVectorImpl<DIEValue>::const_iterator value_iterator;
>> +  typedef DIEValueList::iterator value_iterator;
>>    typedef iterator_range<value_iterator> value_range;
>>
>> -  value_iterator values_begin() const { return Values.begin(); }
>> -  value_iterator values_end() const { return Values.end(); }
>> -  value_range values() const {
>> -    return llvm::make_range(values_begin(), values_end());
>> +  value_range values() {
>> +    return llvm::make_range(Values.begin(), Values.end());
>>    }
>>
>> -  void setValue(unsigned I, DIEValue New) {
>> -    assert(I < Values.size());
>> -    Values[I] = New;
>> +  typedef DIEValueList::const_iterator const_value_iterator;
>> +  typedef iterator_range<const_value_iterator> const_value_range;
>> +
>> +  const_value_range values() const {
>> +    return llvm::make_range(Values.begin(), Values.end());
>>    }
>> +
>>    DIE *getParent() const { return Parent; }
>>
>>    /// Generate the abbreviation for this DIE.
>> @@ -539,10 +698,13 @@ public:
>>
>>    /// addValue - Add a value and attributes to a DIE.
>>    ///
>> -  void addValue(DIEValue Value) { Values.push_back(Value); }
>> +  value_iterator addValue(BumpPtrAllocator &Alloc, DIEValue Value) {
>> +    return Values.insert(Alloc, Value);
>> +  }
>>    template <class T>
>> -  void addValue(dwarf::Attribute Attribute, dwarf::Form Form, T &&Value)
>> {
>> -    Values.emplace_back(Attribute, Form, std::forward<T>(Value));
>> +  value_iterator addValue(BumpPtrAllocator &Alloc, dwarf::Attribute
>> Attribute,
>> +                          dwarf::Form Form, T &&Value) {
>> +    return Values.emplace(Alloc, Attribute, Form,
>> std::forward<T>(Value));
>>    }
>>
>>    /// addChild - Add a child to the DIE.
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Thu Jun 25 18:46:41 2015
>> @@ -165,18 +165,17 @@ void DIE::print(raw_ostream &O, unsigned
>>    }
>>
>>    IndentCount += 2;
>> -  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
>> +  unsigned I = 0;
>> +  for (const auto &V : Values) {
>>      O << Indent;
>>
>>      if (!isBlock)
>> -      O << dwarf::AttributeString(Values[i].getAttribute());
>> +      O << dwarf::AttributeString(V.getAttribute());
>>      else
>> -      O << "Blk[" << i << "]";
>> +      O << "Blk[" << I++ << "]";
>>
>> -    O <<  "  "
>> -      << dwarf::FormEncodingString(Values[i].getForm())
>> -      << " ";
>> -    Values[i].print(O);
>> +    O << "  " << dwarf::FormEncodingString(V.getForm()) << " ";
>> +    V.print(O);
>>      O << "\n";
>>    }
>>    IndentCount -= 2;
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp Thu Jun 25 18:46:41 2015
>> @@ -263,7 +263,7 @@ void DIEHash::hashDIEEntry(dwarf::Attrib
>>
>>  // Hash all of the values in a block like set of values. This assumes
>> that
>>  // all of the data is going to be added as integers.
>> -void DIEHash::hashBlockData(const DIE::value_range &Values) {
>> +void DIEHash::hashBlockData(const DIE::const_value_range &Values) {
>>    for (const auto &V : Values)
>>      Hash.update((uint64_t)V.getDIEInteger().getValue());
>>  }
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.h?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.h Thu Jun 25 18:46:41 2015
>> @@ -128,7 +128,7 @@ private:
>>
>>    /// \brief Hashes the data in a block like DIEValue, e.g.
>> DW_FORM_block or
>>    /// DW_FORM_exprloc.
>> -  void hashBlockData(const DIE::value_range &Values);
>> +  void hashBlockData(const DIE::const_value_range &Values);
>>
>>    /// \brief Hashes the contents pointed to in the .debug_loc section.
>>    void hashLocList(const DIELocList &LocList);
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Thu Jun 25
>> 18:46:41 2015
>> @@ -42,7 +42,8 @@ void DwarfCompileUnit::addLabelAddress(D
>>      DD->addArangeLabel(SymbolCU(this, Label));
>>
>>    unsigned idx = DD->getAddressPool().getIndex(Label);
>> -  Die.addValue(Attribute, dwarf::DW_FORM_GNU_addr_index,
>> DIEInteger(idx));
>> +  Die.addValue(DIEValueAllocator, Attribute,
>> dwarf::DW_FORM_GNU_addr_index,
>> +               DIEInteger(idx));
>>  }
>>
>>  void DwarfCompileUnit::addLocalLabelAddress(DIE &Die,
>> @@ -52,9 +53,11 @@ void DwarfCompileUnit::addLocalLabelAddr
>>      DD->addArangeLabel(SymbolCU(this, Label));
>>
>>    if (Label)
>> -    Die.addValue(Attribute, dwarf::DW_FORM_addr, DIELabel(Label));
>> +    Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_addr,
>> +                 DIELabel(Label));
>>    else
>> -    Die.addValue(Attribute, dwarf::DW_FORM_addr, DIEInteger(0));
>> +    Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_addr,
>> +                 DIEInteger(0));
>>  }
>>
>>  unsigned DwarfCompileUnit::getOrCreateSourceID(StringRef FileName,
>> @@ -225,16 +228,15 @@ void DwarfCompileUnit::addRange(RangeSpa
>>    CURanges.back().setEnd(Range.getEnd());
>>  }
>>
>> -void DwarfCompileUnit::addSectionLabel(DIE &Die, dwarf::Attribute
>> Attribute,
>> -                                       const MCSymbol *Label,
>> -                                       const MCSymbol *Sec) {
>> +DIE::value_iterator
>> +DwarfCompileUnit::addSectionLabel(DIE &Die, dwarf::Attribute Attribute,
>> +                                  const MCSymbol *Label, const MCSymbol
>> *Sec) {
>>    if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
>> -    addLabel(Die, Attribute,
>> -             DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
>> -                                        : dwarf::DW_FORM_data4,
>> -             Label);
>> -  else
>> -    addSectionDelta(Die, Attribute, Label, Sec);
>> +    return addLabel(Die, Attribute,
>> +                    DD->getDwarfVersion() >= 4 ?
>> dwarf::DW_FORM_sec_offset
>> +                                               : dwarf::DW_FORM_data4,
>> +                    Label);
>> +  return addSectionDelta(Die, Attribute, Label, Sec);
>>  }
>>
>>  void DwarfCompileUnit::initStmtList() {
>> @@ -242,20 +244,19 @@ void DwarfCompileUnit::initStmtList() {
>>    MCSymbol *LineTableStartSym =
>>        Asm->OutStreamer->getDwarfLineTableSymbol(getUniqueID());
>>
>> -  stmtListIndex = std::distance(UnitDie.values_begin(),
>> UnitDie.values_end());
>> -
>>    // DW_AT_stmt_list is a offset of line number information for this
>>    // compile unit in debug_line section. For split dwarf this is
>>    // left in the skeleton CU and so not included.
>>    // The line table entries are not always emitted in assembly, so it
>>    // is not okay to use line_table_start here.
>>    const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
>> -  addSectionLabel(UnitDie, dwarf::DW_AT_stmt_list, LineTableStartSym,
>> -                  TLOF.getDwarfLineSection()->getBeginSymbol());
>> +  StmtListValue =
>> +      addSectionLabel(UnitDie, dwarf::DW_AT_stmt_list, LineTableStartSym,
>> +                      TLOF.getDwarfLineSection()->getBeginSymbol());
>>  }
>>
>>  void DwarfCompileUnit::applyStmtList(DIE &D) {
>> -  D.addValue(UnitDie.values_begin()[stmtListIndex]);
>> +  D.addValue(DIEValueAllocator, *StmtListValue);
>>  }
>>
>>  void DwarfCompileUnit::attachLowHighPC(DIE &D, const MCSymbol *Begin,
>> @@ -361,11 +362,13 @@ void DwarfCompileUnit::constructScopeDIE
>>    FinalChildren.push_back(std::move(ScopeDIE));
>>  }
>>
>> -void DwarfCompileUnit::addSectionDelta(DIE &Die, dwarf::Attribute
>> Attribute,
>> -                                       const MCSymbol *Hi, const
>> MCSymbol *Lo) {
>> -  Die.addValue(Attribute, DD->getDwarfVersion() >= 4 ?
>> dwarf::DW_FORM_sec_offset
>> -                                                     :
>> dwarf::DW_FORM_data4,
>> -               new (DIEValueAllocator) DIEDelta(Hi, Lo));
>> +DIE::value_iterator
>> +DwarfCompileUnit::addSectionDelta(DIE &Die, dwarf::Attribute Attribute,
>> +                                  const MCSymbol *Hi, const MCSymbol
>> *Lo) {
>> +  return Die.addValue(DIEValueAllocator, Attribute,
>> +                      DD->getDwarfVersion() >= 4 ?
>> dwarf::DW_FORM_sec_offset
>> +                                                 : dwarf::DW_FORM_data4,
>> +                      new (DIEValueAllocator) DIEDelta(Hi, Lo));
>>  }
>>
>>  void DwarfCompileUnit::addScopeRangeList(DIE &ScopeDIE,
>> @@ -781,7 +784,7 @@ void DwarfCompileUnit::addLocationList(D
>>                                         unsigned Index) {
>>    dwarf::Form Form = DD->getDwarfVersion() >= 4 ?
>> dwarf::DW_FORM_sec_offset
>>                                                  : dwarf::DW_FORM_data4;
>> -  Die.addValue(Attribute, Form, DIELocList(Index));
>> +  Die.addValue(DIEValueAllocator, Attribute, Form, DIELocList(Index));
>>  }
>>
>>  void DwarfCompileUnit::applyVariableAttributes(const DbgVariable &Var,
>> @@ -798,7 +801,7 @@ void DwarfCompileUnit::applyVariableAttr
>>  /// Add a Dwarf expression attribute data and value.
>>  void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form,
>>                                 const MCExpr *Expr) {
>> -  Die.addValue((dwarf::Attribute)0, Form, DIEExpr(Expr));
>> +  Die.addValue(DIEValueAllocator, (dwarf::Attribute)0, Form,
>> DIEExpr(Expr));
>>  }
>>
>>  void DwarfCompileUnit::applySubprogramAttributesToDefinition(
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h Thu Jun 25
>> 18:46:41 2015
>> @@ -31,7 +31,7 @@ class LexicalScope;
>>  class DwarfCompileUnit : public DwarfUnit {
>>    /// The attribute index of DW_AT_stmt_list in the compile unit DIE,
>> avoiding
>>    /// the need to search for it in applyStmtList.
>> -  unsigned stmtListIndex;
>> +  DIE::value_iterator StmtListValue;
>>
>>    /// Skeleton unit associated with this unit.
>>    DwarfCompileUnit *Skeleton;
>> @@ -92,8 +92,8 @@ public:
>>                              const MCSymbol *Label);
>>
>>    /// addSectionDelta - Add a label delta attribute data and value.
>> -  void addSectionDelta(DIE &Die, dwarf::Attribute Attribute, const
>> MCSymbol *Hi,
>> -                       const MCSymbol *Lo);
>> +  DIE::value_iterator addSectionDelta(DIE &Die, dwarf::Attribute
>> Attribute,
>> +                                      const MCSymbol *Hi, const MCSymbol
>> *Lo);
>>
>>    DwarfCompileUnit &getCU() override { return *this; }
>>
>> @@ -106,8 +106,9 @@ public:
>>
>>    /// addSectionLabel - Add a Dwarf section label attribute data and
>> value.
>>    ///
>> -  void addSectionLabel(DIE &Die, dwarf::Attribute Attribute,
>> -                       const MCSymbol *Label, const MCSymbol *Sec);
>> +  DIE::value_iterator addSectionLabel(DIE &Die, dwarf::Attribute
>> Attribute,
>> +                                      const MCSymbol *Label,
>> +                                      const MCSymbol *Sec);
>>
>>    /// \brief Find DIE for the given subprogram and attach appropriate
>>    /// DW_AT_low_pc and DW_AT_high_pc attributes. If there are global
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Thu Jun 25 18:46:41
>> 2015
>> @@ -184,16 +184,18 @@ void DwarfUnit::insertDIE(const DINode *
>>
>>  void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
>>    if (DD->getDwarfVersion() >= 4)
>> -    Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEInteger(1));
>> +    Die.addValue(DIEValueAllocator, Attribute,
>> dwarf::DW_FORM_flag_present,
>> +                 DIEInteger(1));
>>    else
>> -    Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEInteger(1));
>> +    Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_flag,
>> +                 DIEInteger(1));
>>  }
>>
>>  void DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
>>                          Optional<dwarf::Form> Form, uint64_t Integer) {
>>    if (!Form)
>>      Form = DIEInteger::BestForm(false, Integer);
>> -  Die.addValue(Attribute, *Form, DIEInteger(Integer));
>> +  Die.addValue(DIEValueAllocator, Attribute, *Form, DIEInteger(Integer));
>>  }
>>
>>  void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
>> @@ -204,7 +206,7 @@ void DwarfUnit::addSInt(DIE &Die, dwarf:
>>                          Optional<dwarf::Form> Form, int64_t Integer) {
>>    if (!Form)
>>      Form = DIEInteger::BestForm(true, Integer);
>> -  Die.addValue(Attribute, *Form, DIEInteger(Integer));
>> +  Die.addValue(DIEValueAllocator, Attribute, *Form, DIEInteger(Integer));
>>  }
>>
>>  void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
>> @@ -214,14 +216,15 @@ void DwarfUnit::addSInt(DIELoc &Die, Opt
>>
>>  void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
>>                            StringRef String) {
>> -  Die.addValue(Attribute,
>> +  Die.addValue(DIEValueAllocator, Attribute,
>>                 isDwoUnit() ? dwarf::DW_FORM_GNU_str_index :
>> dwarf::DW_FORM_strp,
>>                 DIEString(DU->getStringPool().getEntry(*Asm, String)));
>>  }
>>
>> -void DwarfUnit::addLabel(DIE &Die, dwarf::Attribute Attribute,
>> dwarf::Form Form,
>> -                         const MCSymbol *Label) {
>> -  Die.addValue(Attribute, Form, DIELabel(Label));
>> +DIE::value_iterator DwarfUnit::addLabel(DIE &Die, dwarf::Attribute
>> Attribute,
>> +                                        dwarf::Form Form,
>> +                                        const MCSymbol *Label) {
>> +  return Die.addValue(DIEValueAllocator, Attribute, Form,
>> DIELabel(Label));
>>  }
>>
>>  void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol
>> *Label) {
>> @@ -254,7 +257,7 @@ void DwarfUnit::addOpAddress(DIELoc &Die
>>
>>  void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
>>                                const MCSymbol *Hi, const MCSymbol *Lo) {
>> -  Die.addValue(Attribute, dwarf::DW_FORM_data4,
>> +  Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_data4,
>>                 new (DIEValueAllocator) DIEDelta(Hi, Lo));
>>  }
>>
>> @@ -269,8 +272,8 @@ void DwarfUnit::addDIETypeSignature(DIE
>>    // and think this is a full definition.
>>    addFlag(Die, dwarf::DW_AT_declaration);
>>
>> -  Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
>> -               DIETypeSignature(Type));
>> +  Die.addValue(DIEValueAllocator, dwarf::DW_AT_signature,
>> +               dwarf::DW_FORM_ref_sig8, DIETypeSignature(Type));
>>  }
>>
>>  void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
>> @@ -282,7 +285,7 @@ void DwarfUnit::addDIEEntry(DIE &Die, dw
>>      DieCU = &getUnitDie();
>>    if (!EntryCU)
>>      EntryCU = &getUnitDie();
>> -  Die.addValue(Attribute,
>> +  Die.addValue(DIEValueAllocator, Attribute,
>>                 EntryCU == DieCU ? dwarf::DW_FORM_ref4 :
>> dwarf::DW_FORM_ref_addr,
>>                 Entry);
>>  }
>> @@ -299,14 +302,15 @@ DIE &DwarfUnit::createAndAddDIE(unsigned
>>  void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc
>> *Loc) {
>>    Loc->ComputeSize(Asm);
>>    DIELocs.push_back(Loc); // Memoize so we can call the destructor later
>> on.
>> -  Die.addValue(Attribute, Loc->BestForm(DD->getDwarfVersion()), Loc);
>> +  Die.addValue(DIEValueAllocator, Attribute,
>> +               Loc->BestForm(DD->getDwarfVersion()), Loc);
>>  }
>>
>>  void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
>>                           DIEBlock *Block) {
>>    Block->ComputeSize(Asm);
>>    DIEBlocks.push_back(Block); // Memoize so we can call the destructor
>> later on.
>> -  Die.addValue(Attribute, Block->BestForm(), Block);
>> +  Die.addValue(DIEValueAllocator, Attribute, Block->BestForm(), Block);
>>  }
>>
>>  void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File,
>> @@ -1386,8 +1390,8 @@ void DwarfUnit::constructMemberDIE(DIE &
>>    // Objective-C properties.
>>    if (DINode *PNode = DT->getObjCProperty())
>>      if (DIE *PDie = getDIE(PNode))
>> -      MemberDie.addValue(dwarf::DW_AT_APPLE_property,
>> dwarf::DW_FORM_ref4,
>> -                         DIEEntry(*PDie));
>> +      MemberDie.addValue(DIEValueAllocator, dwarf::DW_AT_APPLE_property,
>> +                         dwarf::DW_FORM_ref4, DIEEntry(*PDie));
>>
>>    if (DT->isArtificial())
>>      addFlag(MemberDie, dwarf::DW_AT_artificial);
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h Thu Jun 25 18:46:41 2015
>> @@ -73,6 +73,9 @@ protected:
>>    /// MDNode for the compile unit.
>>    const DICompileUnit *CUNode;
>>
>> +  // All DIEValues are allocated through this allocator.
>> +  BumpPtrAllocator DIEValueAllocator;
>> +
>>    /// Unit debug information entry.
>>    DIE UnitDie;
>>
>> @@ -104,9 +107,6 @@ protected:
>>    /// corresponds to the MDNode mapped with the subprogram DIE.
>>    DenseMap<DIE *, const DINode *> ContainingTypeMap;
>>
>> -  // All DIEValues are allocated through this allocator.
>> -  BumpPtrAllocator DIEValueAllocator;
>> -
>>    /// The section this unit will be emitted in.
>>    MCSection *Section;
>>
>> @@ -206,8 +206,8 @@ public:
>>    void addString(DIE &Die, dwarf::Attribute Attribute, StringRef Str);
>>
>>    /// \brief Add a Dwarf label attribute data and value.
>> -  void addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form,
>> -                const MCSymbol *Label);
>> +  DIE::value_iterator addLabel(DIE &Die, dwarf::Attribute Attribute,
>> +                               dwarf::Form Form, const MCSymbol *Label);
>>
>>    void addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label);
>>
>>
>> Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)
>> +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Thu Jun 25 18:46:41 2015
>> @@ -60,33 +60,23 @@ using HalfOpenIntervalMap =
>>
>>  typedef HalfOpenIntervalMap<uint64_t, int64_t> FunctionIntervals;
>>
>> -// FIXME: Delete this structure once DIE::Values has a stable iterator
>> we can
>> -// use instead.
>> +// FIXME: Delete this structure.
>>  struct PatchLocation {
>> -  DIE *Die;
>> -  unsigned Index;
>> +  DIE::value_iterator I;
>>
>> -  PatchLocation() : Die(nullptr), Index(0) {}
>> -  PatchLocation(DIE &Die, unsigned Index) : Die(&Die), Index(Index) {}
>> -  PatchLocation(DIE &Die)
>> -      : Die(&Die), Index(std::distance(Die.values_begin(),
>> Die.values_end())) {}
>> +  PatchLocation() = default;
>> +  PatchLocation(DIE::value_iterator I) : I(I) {}
>>
>>    void set(uint64_t New) const {
>> -    assert(Die);
>> -    assert((signed)Index <
>> -           std::distance(Die->values_begin(), Die->values_end()));
>> -    const auto &Old = Die->values_begin()[Index];
>> +    assert(I);
>> +    const auto &Old = *I;
>>      assert(Old.getType() == DIEValue::isInteger);
>> -    Die->setValue(Index,
>> -                  DIEValue(Old.getAttribute(), Old.getForm(),
>> DIEInteger(New)));
>> +    *I = DIEValue(Old.getAttribute(), Old.getForm(), DIEInteger(New));
>>    }
>>
>>    uint64_t get() const {
>> -    assert(Die);
>> -    assert((signed)Index <
>> -           std::distance(Die->values_begin(), Die->values_end()));
>> -    assert(Die->values_begin()[Index].getType() == DIEValue::isInteger);
>> -    return Die->values_begin()[Index].getDIEInteger().getValue();
>> +    assert(I);
>> +    return I->getDIEInteger().getValue();
>>    }
>>  };
>>
>> @@ -1837,7 +1827,7 @@ unsigned DwarfLinker::cloneStringAttribu
>>    // Switch everything to out of line strings.
>>    const char *String = *Val.getAsCString(&U);
>>    unsigned Offset = StringPool.getStringOffset(String);
>> -  Die.addValue(dwarf::Attribute(AttrSpec.Attr), dwarf::DW_FORM_strp,
>> +  Die.addValue(DIEAlloc, dwarf::Attribute(AttrSpec.Attr),
>> dwarf::DW_FORM_strp,
>>                 DIEInteger(Offset));
>>    return 4;
>>  }
>> @@ -1887,18 +1877,21 @@ unsigned DwarfLinker::cloneDieReferenceA
>>        uint32_t NewRefOffset =
>>            RefUnit->getStartOffset() + NewRefDie->getOffset();
>>        Attr = NewRefOffset;
>> +      Die.addValue(DIEAlloc, dwarf::Attribute(AttrSpec.Attr),
>> +                   dwarf::DW_FORM_ref_addr, DIEInteger(Attr));
>>      } else {
>>        // A forward reference. Note and fixup later.
>>        Attr = 0xBADDEF;
>> -      Unit.noteForwardReference(NewRefDie, RefUnit, PatchLocation(Die));
>> +      Unit.noteForwardReference(
>> +          NewRefDie, RefUnit,
>> +          Die.addValue(DIEAlloc, dwarf::Attribute(AttrSpec.Attr),
>> +                       dwarf::DW_FORM_ref_addr, DIEInteger(Attr)));
>>      }
>> -    Die.addValue(dwarf::Attribute(AttrSpec.Attr),
>> dwarf::DW_FORM_ref_addr,
>> -                 DIEInteger(Attr));
>>      return AttrSize;
>>    }
>>
>> -  Die.addValue(dwarf::Attribute(AttrSpec.Attr),
>> dwarf::Form(AttrSpec.Form),
>> -               DIEEntry(*NewRefDie));
>> +  Die.addValue(DIEAlloc, dwarf::Attribute(AttrSpec.Attr),
>> +               dwarf::Form(AttrSpec.Form), DIEEntry(*NewRefDie));
>>    return AttrSize;
>>  }
>>
>> @@ -1930,8 +1923,8 @@ unsigned DwarfLinker::cloneBlockAttribut
>>                       dwarf::Form(AttrSpec.Form), Block);
>>    ArrayRef<uint8_t> Bytes = *Val.getAsBlock();
>>    for (auto Byte : Bytes)
>> -    Attr->addValue(static_cast<dwarf::Attribute>(0),
>> dwarf::DW_FORM_data1,
>> -                   DIEInteger(Byte));
>> +    Attr->addValue(DIEAlloc, static_cast<dwarf::Attribute>(0),
>> +                   dwarf::DW_FORM_data1, DIEInteger(Byte));
>>    // FIXME: If DIEBlock and DIELoc just reuses the Size field of
>>    // the DIE class, this if could be replaced by
>>    // Attr->setSize(Bytes.size()).
>> @@ -1941,7 +1934,7 @@ unsigned DwarfLinker::cloneBlockAttribut
>>      else
>>        Block->ComputeSize(&Streamer->getAsmPrinter());
>>    }
>> -  Die.addValue(Value);
>> +  Die.addValue(DIEAlloc, Value);
>>    return AttrSize;
>>  }
>>
>> @@ -1975,7 +1968,7 @@ unsigned DwarfLinker::cloneAddressAttrib
>>        Addr = (Info.OrigHighPc ? Info.OrigHighPc : Addr) + Info.PCOffset;
>>    }
>>
>> -  Die.addValue(static_cast<dwarf::Attribute>(AttrSpec.Attr),
>> +  Die.addValue(DIEAlloc, static_cast<dwarf::Attribute>(AttrSpec.Attr),
>>                 static_cast<dwarf::Form>(AttrSpec.Form),
>> DIEInteger(Addr));
>>    return Unit.getOrigUnit().getAddressByteSize();
>>  }
>> @@ -2004,20 +1997,20 @@ unsigned DwarfLinker::cloneScalarAttribu
>>                    &Unit.getOrigUnit(), &InputDIE);
>>      return 0;
>>    }
>> -  DIEInteger Attr(Value);
>> +  PatchLocation Patch =
>> +      Die.addValue(DIEAlloc, dwarf::Attribute(AttrSpec.Attr),
>> +                   dwarf::Form(AttrSpec.Form), DIEInteger(Value));
>>    if (AttrSpec.Attr == dwarf::DW_AT_ranges)
>> -    Unit.noteRangeAttribute(Die, PatchLocation(Die));
>> +    Unit.noteRangeAttribute(Die, Patch);
>>    // A more generic way to check for location attributes would be
>>    // nice, but it's very unlikely that any other attribute needs a
>>    // location list.
>>    else if (AttrSpec.Attr == dwarf::DW_AT_location ||
>>             AttrSpec.Attr == dwarf::DW_AT_frame_base)
>> -    Unit.noteLocationAttribute(PatchLocation(Die), Info.PCOffset);
>> +    Unit.noteLocationAttribute(Patch, Info.PCOffset);
>>    else if (AttrSpec.Attr == dwarf::DW_AT_declaration && Value)
>>      Info.IsDeclaration = true;
>>
>> -  Die.addValue(dwarf::Attribute(AttrSpec.Attr),
>> dwarf::Form(AttrSpec.Form),
>> -               Attr);
>>    return AttrSize;
>>  }
>>
>> @@ -2367,8 +2360,7 @@ static void insertLineSequence(std::vect
>>  static void patchStmtList(DIE &Die, DIEInteger Offset) {
>>    for (auto &V : Die.values())
>>      if (V.getAttribute() == dwarf::DW_AT_stmt_list) {
>> -      Die.setValue(&V - Die.values_begin(),
>> -                   DIEValue(V.getAttribute(), V.getForm(), Offset));
>> +      V = DIEValue(V.getAttribute(), V.getForm(), Offset);
>>        return;
>>      }
>>
>>
>> Modified: llvm/trunk/unittests/CodeGen/DIEHashTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/DIEHashTest.cpp?rev=240733&r1=240732&r2=240733&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/unittests/CodeGen/DIEHashTest.cpp (original)
>> +++ llvm/trunk/unittests/CodeGen/DIEHashTest.cpp Thu Jun 25 18:46:41 2015
>> @@ -22,6 +22,10 @@ namespace {
>>
>>  // Test fixture
>>  class DIEHashTest : public testing::Test {
>> +public:
>> +  BumpPtrAllocator Alloc;
>> +
>> +private:
>>    StringMap<DwarfStringPoolEntry> Pool;
>>
>>  public:
>> @@ -36,7 +40,7 @@ TEST_F(DIEHashTest, Data1) {
>>    DIEHash Hash;
>>    DIE Die(dwarf::DW_TAG_base_type);
>>    DIEInteger Size(4);
>> -  Die.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Size);
>> +  Die.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Size);
>>    uint64_t MD5Res = Hash.computeTypeSignature(Die);
>>    ASSERT_EQ(0x1AFE116E83701108ULL, MD5Res);
>>  }
>> @@ -45,11 +49,11 @@ TEST_F(DIEHashTest, Data1) {
>>  TEST_F(DIEHashTest, TrivialType) {
>>    DIE Unnamed(dwarf::DW_TAG_structure_type);
>>    DIEInteger One(1);
>> -  Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> One);
>>
>>    // Line and file number are ignored.
>> -  Unnamed.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> -  Unnamed.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One);
>> +  Unnamed.addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1,
>> One);
>> +  Unnamed.addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1,
>> One);
>>    uint64_t MD5Res = DIEHash().computeTypeSignature(Unnamed);
>>
>>    // The exact same hash GCC produces for this DIE.
>> @@ -61,8 +65,8 @@ TEST_F(DIEHashTest, NamedType) {
>>    DIE Foo(dwarf::DW_TAG_structure_type);
>>    DIEInteger One(1);
>>    DIEString FooStr = getString("foo");
>> -  Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> -  Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>>
>>    uint64_t MD5Res = DIEHash().computeTypeSignature(Foo);
>>
>> @@ -77,15 +81,16 @@ TEST_F(DIEHashTest, NamespacedType) {
>>    auto Space = make_unique<DIE>(dwarf::DW_TAG_namespace);
>>    DIEInteger One(1);
>>    DIEString SpaceStr = getString("space");
>> -  Space->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, SpaceStr);
>> +  Space->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp,
>> SpaceStr);
>>    // DW_AT_declaration is ignored.
>> -  Space->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present,
>> One);
>> +  Space->addValue(Alloc, dwarf::DW_AT_declaration,
>> dwarf::DW_FORM_flag_present,
>> +                  One);
>>    // sibling?
>>
>>    auto Foo = make_unique<DIE>(dwarf::DW_TAG_structure_type);
>>    DIEString FooStr = getString("foo");
>> -  Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> -  Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  Foo->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +  Foo->addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> One);
>>
>>    DIE &N = *Foo;
>>    Space->addChild(std::move(Foo));
>> @@ -101,24 +106,24 @@ TEST_F(DIEHashTest, NamespacedType) {
>>  TEST_F(DIEHashTest, TypeWithMember) {
>>    DIE Unnamed(dwarf::DW_TAG_structure_type);
>>    DIEInteger Four(4);
>> -  Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four);
>> +  Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Four);
>>
>>    DIE Int(dwarf::DW_TAG_base_type);
>>    DIEString IntStr = getString("int");
>> -  Int.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr);
>> -  Int.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four);
>> +  Int.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr);
>> +  Int.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Four);
>>    DIEInteger Five(5);
>> -  Int.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five);
>> +  Int.addValue(Alloc, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five);
>>
>>    DIEEntry IntRef(Int);
>>
>>    auto Member = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString MemberStr = getString("member");
>> -  Member->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemberStr);
>> +  Member->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp,
>> MemberStr);
>>    DIEInteger Zero(0);
>> -  Member->addValue(dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> -                   Zero);
>> -  Member->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef);
>> +  Member->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> +                   dwarf::DW_FORM_data1, Zero);
>> +  Member->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> IntRef);
>>
>>    Unnamed.addChild(std::move(Member));
>>
>> @@ -131,34 +136,34 @@ TEST_F(DIEHashTest, TypeWithMember) {
>>  TEST_F(DIEHashTest, ReusedType) {
>>    DIE Unnamed(dwarf::DW_TAG_structure_type);
>>    DIEInteger Eight(8);
>> -  Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> +  Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>>
>>    DIEInteger Four(4);
>>    DIE Int(dwarf::DW_TAG_base_type);
>>    DIEString IntStr = getString("int");
>> -  Int.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr);
>> -  Int.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four);
>> +  Int.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr);
>> +  Int.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Four);
>>    DIEInteger Five(5);
>> -  Int.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five);
>> +  Int.addValue(Alloc, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five);
>>
>>    DIEEntry IntRef(Int);
>>
>>    auto Mem1 = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString Mem1Str = getString("mem1");
>> -  Mem1->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem1Str);
>> +  Mem1->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem1Str);
>>    DIEInteger Zero(0);
>> -  Mem1->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> +  Mem1->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>>                   Zero);
>> -  Mem1->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef);
>> +  Mem1->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef);
>>
>>    Unnamed.addChild(std::move(Mem1));
>>
>>    auto Mem2 = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString Mem2Str = getString("mem2");
>> -  Mem2->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem2Str);
>> -  Mem2->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> +  Mem2->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem2Str);
>> +  Mem2->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>>                   Four);
>> -  Mem2->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef);
>> +  Mem2->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef);
>>
>>    Unnamed.addChild(std::move(Mem2));
>>
>> @@ -171,15 +176,15 @@ TEST_F(DIEHashTest, ReusedType) {
>>  TEST_F(DIEHashTest, RecursiveType) {
>>    DIE Foo(dwarf::DW_TAG_structure_type);
>>    DIEInteger One(1);
>> -  Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>>    DIEString FooStr = getString("foo");
>> -  Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>    auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString MemStr = getString("mem");
>> -  Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>>    DIEEntry FooRef(Foo);
>> -  Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef);
>>    // DW_AT_external and DW_AT_declaration are ignored anyway, so skip
>> them.
>>
>>    Foo.addChild(std::move(Mem));
>> @@ -193,23 +198,24 @@ TEST_F(DIEHashTest, RecursiveType) {
>>  TEST_F(DIEHashTest, Pointer) {
>>    DIE Foo(dwarf::DW_TAG_structure_type);
>>    DIEInteger Eight(8);
>> -  Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>>    DIEString FooStr = getString("foo");
>> -  Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>    auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString MemStr = getString("mem");
>> -  Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>>    DIEInteger Zero(0);
>> -  Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> Zero);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> +                Zero);
>>
>>    DIE FooPtr(dwarf::DW_TAG_pointer_type);
>> -  FooPtr.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> +  FooPtr.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>>    DIEEntry FooRef(Foo);
>> -  FooPtr.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef);
>> +  FooPtr.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRef);
>>
>>    DIEEntry FooPtrRef(FooPtr);
>> -  Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooPtrRef);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> FooPtrRef);
>>
>>    Foo.addChild(std::move(Mem));
>>
>> @@ -222,27 +228,29 @@ TEST_F(DIEHashTest, Pointer) {
>>  TEST_F(DIEHashTest, Reference) {
>>    DIE Foo(dwarf::DW_TAG_structure_type);
>>    DIEInteger Eight(8);
>> -  Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>>    DIEString FooStr = getString("foo");
>> -  Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>    auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString MemStr = getString("mem");
>> -  Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>>    DIEInteger Zero(0);
>> -  Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> Zero);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> +                Zero);
>>
>>    DIE FooRef(dwarf::DW_TAG_reference_type);
>> -  FooRef.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> +  FooRef.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>>    DIEEntry FooEntry(Foo);
>> -  FooRef.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry);
>> +  FooRef.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> FooEntry);
>>
>>    DIE FooRefConst(dwarf::DW_TAG_const_type);
>>    DIEEntry FooRefRef(FooRef);
>> -  FooRefConst.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> FooRefRef);
>> +  FooRefConst.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> +                       FooRefRef);
>>
>>    DIEEntry FooRefConstRef(FooRefConst);
>> -  Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> FooRefConstRef);
>>
>>    Foo.addChild(std::move(Mem));
>>
>> @@ -255,27 +263,29 @@ TEST_F(DIEHashTest, Reference) {
>>  TEST_F(DIEHashTest, RValueReference) {
>>    DIE Foo(dwarf::DW_TAG_structure_type);
>>    DIEInteger Eight(8);
>> -  Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>>    DIEString FooStr = getString("foo");
>> -  Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>    auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString MemStr = getString("mem");
>> -  Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>>    DIEInteger Zero(0);
>> -  Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> Zero);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> +                Zero);
>>
>>    DIE FooRef(dwarf::DW_TAG_rvalue_reference_type);
>> -  FooRef.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> +  FooRef.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>>    DIEEntry FooEntry(Foo);
>> -  FooRef.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry);
>> +  FooRef.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> FooEntry);
>>
>>    DIE FooRefConst(dwarf::DW_TAG_const_type);
>>    DIEEntry FooRefRef(FooRef);
>> -  FooRefConst.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> FooRefRef);
>> +  FooRefConst.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> +                       FooRefRef);
>>
>>    DIEEntry FooRefConstRef(FooRefConst);
>> -  Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> FooRefConstRef);
>>
>>    Foo.addChild(std::move(Mem));
>>
>> @@ -288,24 +298,25 @@ TEST_F(DIEHashTest, RValueReference) {
>>  TEST_F(DIEHashTest, PtrToMember) {
>>    DIE Foo(dwarf::DW_TAG_structure_type);
>>    DIEInteger Eight(8);
>> -  Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>>    DIEString FooStr = getString("foo");
>> -  Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>    auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString MemStr = getString("mem");
>> -  Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>>    DIEInteger Zero(0);
>> -  Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> Zero);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> +                Zero);
>>
>>    DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type);
>>    DIEEntry FooEntry(Foo);
>> -  PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooEntry);
>> -  PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
>> +  PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> FooEntry);
>> +  PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type,
>> dwarf::DW_FORM_ref4,
>>                         FooEntry);
>>
>>    DIEEntry PtrToFooMemRef(PtrToFooMem);
>> -  Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> PtrToFooMemRef);
>>
>>    Foo.addChild(std::move(Mem));
>>
>> @@ -329,27 +340,30 @@ TEST_F(DIEHashTest, PtrToMemberDeclDefMa
>>    uint64_t MD5ResDecl;
>>    {
>>      DIE Bar(dwarf::DW_TAG_structure_type);
>> -    Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> -    Bar.addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present,
>> One);
>> +    Bar.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> +    Bar.addValue(Alloc, dwarf::DW_AT_declaration,
>> dwarf::DW_FORM_flag_present,
>> +                 One);
>>
>>      DIE Foo(dwarf::DW_TAG_structure_type);
>> -    Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> -    Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +    Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>> +    Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>      auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>> -    Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> -    Mem->addValue(dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> -                  Zero);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> +                  dwarf::DW_FORM_data1, Zero);
>>
>>      DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type);
>>      DIEEntry BarEntry(Bar);
>> -    PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> BarEntry);
>> +    PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> +                         BarEntry);
>>      DIEEntry FooEntry(Foo);
>> -    PtrToFooMem.addValue(dwarf::DW_AT_containing_type,
>> dwarf::DW_FORM_ref4,
>> -                         FooEntry);
>> +    PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type,
>> +                         dwarf::DW_FORM_ref4, FooEntry);
>>
>>      DIEEntry PtrToFooMemRef(PtrToFooMem);
>> -    Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> PtrToFooMemRef);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> +                  PtrToFooMemRef);
>>
>>      Foo.addChild(std::move(Mem));
>>
>> @@ -358,27 +372,29 @@ TEST_F(DIEHashTest, PtrToMemberDeclDefMa
>>    uint64_t MD5ResDef;
>>    {
>>      DIE Bar(dwarf::DW_TAG_structure_type);
>> -    Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> -    Bar.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +    Bar.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> +    Bar.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> One);
>>
>>      DIE Foo(dwarf::DW_TAG_structure_type);
>> -    Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> -    Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +    Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>> +    Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>      auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>> -    Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> -    Mem->addValue(dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> -                  Zero);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> +                  dwarf::DW_FORM_data1, Zero);
>>
>>      DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type);
>>      DIEEntry BarEntry(Bar);
>> -    PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> BarEntry);
>> +    PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> +                         BarEntry);
>>      DIEEntry FooEntry(Foo);
>> -    PtrToFooMem.addValue(dwarf::DW_AT_containing_type,
>> dwarf::DW_FORM_ref4,
>> -                         FooEntry);
>> +    PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type,
>> +                         dwarf::DW_FORM_ref4, FooEntry);
>>
>>      DIEEntry PtrToFooMemRef(PtrToFooMem);
>> -    Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> PtrToFooMemRef);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> +                  PtrToFooMemRef);
>>
>>      Foo.addChild(std::move(Mem));
>>
>> @@ -402,26 +418,29 @@ TEST_F(DIEHashTest, PtrToMemberDeclDefMi
>>    uint64_t MD5ResDecl;
>>    {
>>      DIE Bar(dwarf::DW_TAG_structure_type);
>> -    Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> -    Bar.addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present,
>> One);
>> +    Bar.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> +    Bar.addValue(Alloc, dwarf::DW_AT_declaration,
>> dwarf::DW_FORM_flag_present,
>> +                 One);
>>
>>      DIE Foo(dwarf::DW_TAG_structure_type);
>> -    Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> -    Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +    Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>> +    Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>      auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>> -    Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> -    Mem->addValue(dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> -                  Zero);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> +                  dwarf::DW_FORM_data1, Zero);
>>
>>      DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type);
>>      DIEEntry BarEntry(Bar);
>> -    PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> BarEntry);
>> -    PtrToFooMem.addValue(dwarf::DW_AT_containing_type,
>> dwarf::DW_FORM_ref4,
>> +    PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>>                           BarEntry);
>> +    PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type,
>> +                         dwarf::DW_FORM_ref4, BarEntry);
>>
>>      DIEEntry PtrToFooMemRef(PtrToFooMem);
>> -    Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> PtrToFooMemRef);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> +                  PtrToFooMemRef);
>>
>>      Foo.addChild(std::move(Mem));
>>
>> @@ -430,26 +449,28 @@ TEST_F(DIEHashTest, PtrToMemberDeclDefMi
>>    uint64_t MD5ResDef;
>>    {
>>      DIE Bar(dwarf::DW_TAG_structure_type);
>> -    Bar.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> -    Bar.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +    Bar.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> +    Bar.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> One);
>>
>>      DIE Foo(dwarf::DW_TAG_structure_type);
>> -    Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> -    Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +    Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>> +    Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>      auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>> -    Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> -    Mem->addValue(dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> -                  Zero);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> +                  dwarf::DW_FORM_data1, Zero);
>>
>>      DIE PtrToFooMem(dwarf::DW_TAG_ptr_to_member_type);
>>      DIEEntry BarEntry(Bar);
>> -    PtrToFooMem.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> BarEntry);
>> -    PtrToFooMem.addValue(dwarf::DW_AT_containing_type,
>> dwarf::DW_FORM_ref4,
>> +    PtrToFooMem.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>>                           BarEntry);
>> +    PtrToFooMem.addValue(Alloc, dwarf::DW_AT_containing_type,
>> +                         dwarf::DW_FORM_ref4, BarEntry);
>>
>>      DIEEntry PtrToFooMemRef(PtrToFooMem);
>> -    Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> PtrToFooMemRef);
>> +    Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> +                  PtrToFooMemRef);
>>
>>      Foo.addChild(std::move(Mem));
>>
>> @@ -473,23 +494,26 @@ TEST_F(DIEHashTest, RefUnnamedType) {
>>    DIEString MemStr = getString("mem");
>>
>>    DIE Unnamed(dwarf::DW_TAG_structure_type);
>> -  Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> One);
>>
>>    DIE Foo(dwarf::DW_TAG_structure_type);
>> -  Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> -  Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>> +  Foo.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>>
>>    auto Mem = make_unique<DIE>(dwarf::DW_TAG_member);
>> -  Mem->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> -  Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> Zero);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_data_member_location,
>> dwarf::DW_FORM_data1,
>> +                Zero);
>>
>>    DIE UnnamedPtr(dwarf::DW_TAG_pointer_type);
>> -  UnnamedPtr.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Eight);
>> +  UnnamedPtr.addValue(Alloc, dwarf::DW_AT_byte_size,
>> dwarf::DW_FORM_data1,
>> +                      Eight);
>>    DIEEntry UnnamedRef(Unnamed);
>> -  UnnamedPtr.addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> UnnamedRef);
>> +  UnnamedPtr.addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> +                      UnnamedRef);
>>
>>    DIEEntry UnnamedPtrRef(UnnamedPtr);
>> -  Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, UnnamedPtrRef);
>> +  Mem->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> UnnamedPtrRef);
>>
>>    Foo.addChild(std::move(Mem));
>>
>> @@ -502,12 +526,12 @@ TEST_F(DIEHashTest, RefUnnamedType) {
>>  TEST_F(DIEHashTest, NestedType) {
>>    DIE Unnamed(dwarf::DW_TAG_structure_type);
>>    DIEInteger One(1);
>> -  Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> One);
>>
>>    auto Foo = make_unique<DIE>(dwarf::DW_TAG_structure_type);
>>    DIEString FooStr = getString("foo");
>> -  Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> -  Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  Foo->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> +  Foo->addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> One);
>>
>>    Unnamed.addChild(std::move(Foo));
>>
>> @@ -521,11 +545,11 @@ TEST_F(DIEHashTest, NestedType) {
>>  TEST_F(DIEHashTest, MemberFunc) {
>>    DIE Unnamed(dwarf::DW_TAG_structure_type);
>>    DIEInteger One(1);
>> -  Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  Unnamed.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> One);
>>
>>    auto Func = make_unique<DIE>(dwarf::DW_TAG_subprogram);
>>    DIEString FuncStr = getString("func");
>> -  Func->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr);
>> +  Func->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr);
>>
>>    Unnamed.addChild(std::move(Func));
>>
>> @@ -542,21 +566,24 @@ TEST_F(DIEHashTest, MemberFuncFlag) {
>>    DIE A(dwarf::DW_TAG_structure_type);
>>    DIEInteger One(1);
>>    DIEString AStr = getString("A");
>> -  A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr);
>> -  A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> -  A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> -  A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One);
>> +  A.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr);
>> +  A.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  A.addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> +  A.addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One);
>>
>>    auto Func = make_unique<DIE>(dwarf::DW_TAG_subprogram);
>>    DIEString FuncStr = getString("func");
>>    DIEString FuncLinkage = getString("_ZN1A4funcEv");
>>    DIEInteger Two(2);
>> -  Func->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present,
>> One);
>> -  Func->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr);
>> -  Func->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> -  Func->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two);
>> -  Func->addValue(dwarf::DW_AT_linkage_name, dwarf::DW_FORM_strp,
>> FuncLinkage);
>> -  Func->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present,
>> One);
>> +  Func->addValue(Alloc, dwarf::DW_AT_external,
>> dwarf::DW_FORM_flag_present,
>> +                 One);
>> +  Func->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr);
>> +  Func->addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1,
>> One);
>> +  Func->addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1,
>> Two);
>> +  Func->addValue(Alloc, dwarf::DW_AT_linkage_name, dwarf::DW_FORM_strp,
>> +                 FuncLinkage);
>> +  Func->addValue(Alloc, dwarf::DW_AT_declaration,
>> dwarf::DW_FORM_flag_present,
>> +                 One);
>>
>>    A.addChild(std::move(Func));
>>
>> @@ -575,35 +602,36 @@ TEST_F(DIEHashTest, MemberSdata) {
>>    DIE A(dwarf::DW_TAG_structure_type);
>>    DIEInteger One(1);
>>    DIEString AStr = getString("A");
>> -  A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr);
>> -  A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> -  A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> -  A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One);
>> +  A.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr);
>> +  A.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  A.addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> +  A.addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One);
>>
>>    DIEInteger Four(4);
>>    DIEInteger Five(5);
>>    DIEString FStr = getString("int");
>>    DIE IntTyDIE(dwarf::DW_TAG_base_type);
>> -  IntTyDIE.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Four);
>> -  IntTyDIE.addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Five);
>> -  IntTyDIE.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FStr);
>> +  IntTyDIE.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Four);
>> +  IntTyDIE.addValue(Alloc, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
>> Five);
>> +  IntTyDIE.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, FStr);
>>
>>    DIEEntry IntTy(IntTyDIE);
>>    auto PITyDIE = make_unique<DIE>(dwarf::DW_TAG_const_type);
>> -  PITyDIE->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntTy);
>> +  PITyDIE->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> IntTy);
>>
>>    DIEEntry PITy(*PITyDIE);
>>    auto PI = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString PIStr = getString("PI");
>>    DIEInteger Two(2);
>>    DIEInteger NegThree(-3);
>> -  PI->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr);
>> -  PI->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> -  PI->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two);
>> -  PI->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy);
>> -  PI->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One);
>> -  PI->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present,
>> One);
>> -  PI->addValue(dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, NegThree);
>> +  PI->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr);
>> +  PI->addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> +  PI->addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two);
>> +  PI->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy);
>> +  PI->addValue(Alloc, dwarf::DW_AT_external,
>> dwarf::DW_FORM_flag_present, One);
>> +  PI->addValue(Alloc, dwarf::DW_AT_declaration,
>> dwarf::DW_FORM_flag_present,
>> +               One);
>> +  PI->addValue(Alloc, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
>> NegThree);
>>
>>    A.addChild(std::move(PI));
>>
>> @@ -620,32 +648,35 @@ TEST_F(DIEHashTest, MemberBlock) {
>>    DIE A(dwarf::DW_TAG_structure_type);
>>    DIEInteger One(1);
>>    DIEString AStr = getString("A");
>> -  A.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr);
>> -  A.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> -  A.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> -  A.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One);
>> +  A.addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, AStr);
>> +  A.addValue(Alloc, dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>> +  A.addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> +  A.addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, One);
>>
>>    DIEInteger Four(4);
>>    DIEString FStr = getString("float");
>>    auto FloatTyDIE = make_unique<DIE>(dwarf::DW_TAG_base_type);
>> -  FloatTyDIE->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1,
>> Four);
>> -  FloatTyDIE->addValue(dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
>> Four);
>> -  FloatTyDIE->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FStr);
>> +  FloatTyDIE->addValue(Alloc, dwarf::DW_AT_byte_size,
>> dwarf::DW_FORM_data1,
>> +                       Four);
>> +  FloatTyDIE->addValue(Alloc, dwarf::DW_AT_encoding,
>> dwarf::DW_FORM_data1,
>> +                       Four);
>> +  FloatTyDIE->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp,
>> FStr);
>>
>>    DIEEntry FloatTy(*FloatTyDIE);
>>    auto PITyDIE = make_unique<DIE>(dwarf::DW_TAG_const_type);
>> -  PITyDIE->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FloatTy);
>> +  PITyDIE->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4,
>> FloatTy);
>>
>>    DIEEntry PITy(*PITyDIE);
>>    auto PI = make_unique<DIE>(dwarf::DW_TAG_member);
>>    DIEString PIStr = getString("PI");
>>    DIEInteger Two(2);
>> -  PI->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr);
>> -  PI->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> -  PI->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two);
>> -  PI->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy);
>> -  PI->addValue(dwarf::DW_AT_external, dwarf::DW_FORM_flag_present, One);
>> -  PI->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present,
>> One);
>> +  PI->addValue(Alloc, dwarf::DW_AT_name, dwarf::DW_FORM_strp, PIStr);
>> +  PI->addValue(Alloc, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> +  PI->addValue(Alloc, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, Two);
>> +  PI->addValue(Alloc, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PITy);
>> +  PI->addValue(Alloc, dwarf::DW_AT_external,
>> dwarf::DW_FORM_flag_present, One);
>> +  PI->addValue(Alloc, dwarf::DW_AT_declaration,
>> dwarf::DW_FORM_flag_present,
>> +               One);
>>
>>    DIEBlock PIBlock;
>>    DIEInteger Blk1(0xc3);
>> @@ -653,12 +684,13 @@ TEST_F(DIEHashTest, MemberBlock) {
>>    DIEInteger Blk3(0x48);
>>    DIEInteger Blk4(0x40);
>>
>> -  PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk1);
>> -  PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk2);
>> -  PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk3);
>> -  PIBlock.addValue((dwarf::Attribute)0, dwarf::DW_FORM_data1, Blk4);
>> +  PIBlock.addValue(Alloc, (dwarf::Attribute)0, dwarf::DW_FORM_data1,
>> Blk1);
>> +  PIBlock.addValue(Alloc, (dwarf::Attribute)0, dwarf::DW_FORM_data1,
>> Blk2);
>> +  PIBlock.addValue(Alloc, (dwarf::Attribute)0, dwarf::DW_FORM_data1,
>> Blk3);
>> +  PIBlock.addValue(Alloc, (dwarf::Attribute)0, dwarf::DW_FORM_data1,
>> Blk4);
>>
>> -  PI->addValue(dwarf::DW_AT_const_value, dwarf::DW_FORM_block1,
>> &PIBlock);
>> +  PI->addValue(Alloc, dwarf::DW_AT_const_value, dwarf::DW_FORM_block1,
>> +               &PIBlock);
>>
>>    A.addChild(std::move(PI));
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150625/376f4c98/attachment.html>


More information about the llvm-commits mailing list