[llvm] r238362 - Reapply "AsmPrinter: Change DIEValue to be stored by value"
Duncan Exon Smith
dexonsmith at apple.com
Thu May 28 07:23:40 PDT 2015
Thanks for pointing it out. My build is clean, as are the bots I looked at that build with -Werror.
What compiler are you using? Looks like some version of GCC maybe?
Chandler, you helped me yesterday... any ideas for me here? Any other experts on AlignedCharArrayUnion?
> On May 28, 2015, at 6:32 AM, Aaron Ballman <aaron at aaronballman.com> wrote:
>
> This commit is generating a considerable number of warnings:
>
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h:345:51:
> warning: dereferencing type-punned pointer will break strict-aliasing
> rules [-Wstrict-aliasing]
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h: In
> instantiation of ‘const T& llvm::DIEValue::get() const [with T =
> llvm::DIEString]’:
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIEValue.def:35:1:
> required from here
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h:345:51:
> warning: dereferencing type-punned pointer will break strict-aliasing
> rules [-Wstrict-aliasing]
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h: In
> instantiation of ‘const T& llvm::DIEValue::get() const [with T =
> llvm::DIEExpr]’:
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIEValue.def:36:1:
> required from here
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h:345:51:
> warning: dereferencing type-punned pointer will break strict-aliasing
> rules [-Wstrict-aliasing]
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h: In
> instantiation of ‘const T& llvm::DIEValue::get() const [with T =
> llvm::DIELabel]’:
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIEValue.def:37:1:
> required from here
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h:345:51:
> warning: dereferencing type-punned pointer will break strict-aliasing
> rules [-Wstrict-aliasing]
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h: In
> instantiation of ‘const T& llvm::DIEValue::get() const [with T = const
> llvm::DIEDelta*]’:
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIEValue.def:38:1:
> required from here
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h:345:51:
> warning: dereferencing type-punned pointer will break strict-aliasing
> rules [-Wstrict-aliasing]
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h: In
> instantiation of ‘const T& llvm::DIEValue::get() const [with T =
> llvm::DIEEntry]’:
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIEValue.def:39:1:
> required from here
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h:345:51:
> warning: dereferencing type-punned pointer will break strict-aliasing
> rules [-Wstrict-aliasing]
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h: In
> instantiation of ‘const T& llvm::DIEValue::get() const [with T =
> llvm::DIETypeSignature]’:
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIEValue.def:40:1:
> required from here
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h:345:51:
> warning: dereferencing type-punned pointer will break strict-aliasing
> rules [-Wstrict-aliasing]
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h: In
> instantiation of ‘const T& llvm::DIEValue::get() const [with T = const
> llvm::DIEBlock*]’:
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIEValue.def:41:1:
> required from here
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h:345:51:
> warning: dereferencing type-punned pointer will break strict-aliasing
> rules [-Wstrict-aliasing]
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h: In
> instantiation of ‘const T& llvm::DIEValue::get() const [with T = const
> llvm::DIELoc*]’:
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIEValue.def:42:1:
> required from here
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h:345:51:
> warning: dereferencing type-punned pointer will break strict-aliasing
> rules [-Wstrict-aliasing]
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIE.h: In
> instantiation of ‘const T& llvm::DIEValue::get() const [with T =
> llvm::DIELocList]’:
> /opt/llvm/build-llvm/src/llvm/include/llvm/CodeGen/DIEValue.def:43:1:
> required from here
>
> Can you please address these?
>
> Thanks!
>
> ~Aaron
>
> On Wed, May 27, 2015 at 6:14 PM, Duncan P. N. Exon Smith
> <dexonsmith at apple.com> wrote:
>> Author: dexonsmith
>> Date: Wed May 27 17:14:58 2015
>> New Revision: 238362
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=238362&view=rev
>> Log:
>> Reapply "AsmPrinter: Change DIEValue to be stored by value"
>>
>> This reverts commit r238350, effectively reapplying r238349 after fixing
>> (all?) the problems, all somehow related to how I was using
>> `AlignedArrayCharUnion<>` inside `DIEValue`:
>>
>> - MSVC can only handle `sizeof()` on types, not values. Change the
>> assert.
>> - GCC doesn't know the `is_trivially_copyable` type trait. Instead of
>> asserting it, add destructors.
>> - Call placement new even when constructing POD (i.e., the pointers).
>> - Instead of copying the char buffer, copy the casted classes.
>>
>> I've left in a couple of `static_assert`s that I think both MSVC and GCC
>> know how to handle. If the bots disagree with me, I'll remove them.
>>
>> - Check that the constructed type is either standard layout or a
>> pointer. This protects against a programming error: we really want
>> the "small" `DIEValue`s to be small and simple, so don't
>> accidentally change them not to be.
>> - Similarly, check that the size of the buffer is no bigger than a
>> `uint64_t` or a pointer. (I thought checking against
>> `sizeof(uint64_t)` would be good enough, but Chandler suggested that
>> pointers might sometimes be bigger than that in the context of
>> sanitizers.)
>>
>> I've also committed r238359 in the meantime, which introduces a
>> DIEValue.def to simplify dispatching between the various types (thanks
>> to a review comment by David Blaikie). Without that, this commit would
>> be almost unintelligible.
>>
>> Here's the original commit message:
>> --
>> Change `DIEValue` to be stored/passed/etc. by value, instead of
>> reference. It's now a discriminated union, with a `Val` field storing
>> the actual type. The classes that used to inherit from `DIEValue` no
>> longer do. There are two categories of these:
>>
>> - Small values fit in a single pointer and are stored by value.
>> - Large values require auxiliary storage, and are stored by reference.
>>
>> The only non-mechanical change is to tools/dsymutil/DwarfLinker.cpp. It
>> was relying on `DIEInteger`s being passed around by reference, so I
>> replaced that assumption with a `PatchLocation` type that stores a safe
>> reference to where the `DIEInteger` lives instead.
>>
>> This commit causes a temporary regression in memory usage, since I've
>> left merging `DIEAbbrevData` into `DIEValue` for a follow-up commit. I
>> measured an increase from 845 MB to 879 MB, around 3.9%. The follow-up
>> drops it lower than the starting point, and I've only recently brought
>> the memory this low anyway, so I'm committing these changes separately
>> to keep them incremental. (I also considered swapping the commits, but
>> the other one first would cause a lot more code churn.)
>>
>> (I'm looking at `llc` memory usage on `verify-uselistorder.lto.opt.bc`;
>> see r236629 for details.)
>> --
>>
>> Modified:
>> llvm/trunk/include/llvm/CodeGen/DIE.h
>> llvm/trunk/include/llvm/CodeGen/DIEValue.def
>> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
>> 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/DwarfDebug.cpp
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp
>> 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/CodeGen/DIE.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DIE.h?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/CodeGen/DIE.h (original)
>> +++ llvm/trunk/include/llvm/CodeGen/DIE.h Wed May 27 17:14:58 2015
>> @@ -105,53 +105,13 @@ public:
>> };
>>
>> //===--------------------------------------------------------------------===//
>> -/// DIEValue - A debug information entry value. Some of these roughly correlate
>> -/// to DWARF attribute classes.
>> -///
>> -class DIEValue {
>> -public:
>> - enum Type {
>> -#define HANDLE_DIEVALUE(T) is##T,
>> -#include "llvm/CodeGen/DIEValue.def"
>> - };
>> -
>> -private:
>> - /// Ty - Type of data stored in the value.
>> - ///
>> - Type Ty;
>> -
>> -protected:
>> - explicit DIEValue(Type T) : Ty(T) {}
>> - ~DIEValue() {}
>> -
>> -public:
>> - // Accessors
>> - Type getType() const { return Ty; }
>> -
>> - /// EmitValue - Emit value via the Dwarf writer.
>> - ///
>> - void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> -
>> - /// SizeOf - Return the size of a value in bytes.
>> - ///
>> - unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>> -
>> -#ifndef NDEBUG
>> - void print(raw_ostream &O) const;
>> - void dump() const;
>> -#endif
>> -};
>> -
>> -//===--------------------------------------------------------------------===//
>> /// DIEInteger - An integer value DIE.
>> ///
>> -class DIEInteger : public DIEValue {
>> - friend DIEValue;
>> -
>> +class DIEInteger {
>> uint64_t Integer;
>>
>> public:
>> - explicit DIEInteger(uint64_t I) : DIEValue(isInteger), Integer(I) {}
>> + explicit DIEInteger(uint64_t I) : Integer(I) {}
>>
>> /// BestForm - Choose the best form for integer.
>> ///
>> @@ -178,120 +138,91 @@ public:
>> uint64_t getValue() const { return Integer; }
>> void setValue(uint64_t Val) { Integer = Val; }
>>
>> - // Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *I) { return I->getType() == isInteger; }
>> -
>> -private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> #endif
>> };
>>
>> //===--------------------------------------------------------------------===//
>> /// DIEExpr - An expression DIE.
>> //
>> -class DIEExpr : public DIEValue {
>> - friend class DIEValue;
>> -
>> +class DIEExpr {
>> const MCExpr *Expr;
>>
>> public:
>> - explicit DIEExpr(const MCExpr *E) : DIEValue(isExpr), Expr(E) {}
>> + explicit DIEExpr(const MCExpr *E) : Expr(E) {}
>>
>> /// getValue - Get MCExpr.
>> ///
>> const MCExpr *getValue() const { return Expr; }
>>
>> - // Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *E) { return E->getType() == isExpr; }
>> -
>> -private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> #endif
>> };
>>
>> //===--------------------------------------------------------------------===//
>> /// DIELabel - A label DIE.
>> //
>> -class DIELabel : public DIEValue {
>> - friend class DIEValue;
>> -
>> +class DIELabel {
>> const MCSymbol *Label;
>>
>> public:
>> - explicit DIELabel(const MCSymbol *L) : DIEValue(isLabel), Label(L) {}
>> + explicit DIELabel(const MCSymbol *L) : Label(L) {}
>>
>> /// getValue - Get MCSymbol.
>> ///
>> const MCSymbol *getValue() const { return Label; }
>>
>> - // Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *L) { return L->getType() == isLabel; }
>> -
>> -private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> #endif
>> };
>>
>> //===--------------------------------------------------------------------===//
>> /// DIEDelta - A simple label difference DIE.
>> ///
>> -class DIEDelta : public DIEValue {
>> - friend class DIEValue;
>> -
>> +class DIEDelta {
>> const MCSymbol *LabelHi;
>> const MCSymbol *LabelLo;
>>
>> public:
>> - DIEDelta(const MCSymbol *Hi, const MCSymbol *Lo)
>> - : DIEValue(isDelta), LabelHi(Hi), LabelLo(Lo) {}
>> + DIEDelta(const MCSymbol *Hi, const MCSymbol *Lo) : LabelHi(Hi), LabelLo(Lo) {}
>>
>> - // Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *D) { return D->getType() == isDelta; }
>> -
>> -private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> #endif
>> };
>>
>> //===--------------------------------------------------------------------===//
>> /// DIEString - A container for string values.
>> ///
>> -class DIEString : public DIEValue {
>> - friend class DIEValue;
>> -
>> +class DIEString {
>> DwarfStringPoolEntryRef S;
>>
>> public:
>> - DIEString(DwarfStringPoolEntryRef S) : DIEValue(isString), S(S) {}
>> + DIEString(DwarfStringPoolEntryRef S) : S(S) {}
>>
>> /// getString - Grab the string out of the object.
>> StringRef getString() const { return S.getString(); }
>>
>> - // Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *D) { return D->getType() == isString; }
>> -
>> -private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> #endif
>> };
>>
>> @@ -300,60 +231,48 @@ private:
>> /// this class can also be used as a proxy for a debug information entry not
>> /// yet defined (ie. types.)
>> class DIE;
>> -class DIEEntry : public DIEValue {
>> - friend class DIEValue;
>> +class DIEEntry {
>> + DIE *Entry;
>>
>> - DIE &Entry;
>> + DIEEntry() = delete;
>>
>> public:
>> - explicit DIEEntry(DIE &E) : DIEValue(isEntry), Entry(E) {
>> - }
>> + explicit DIEEntry(DIE &E) : Entry(&E) {}
>>
>> - DIE &getEntry() const { return Entry; }
>> + DIE &getEntry() const { return *Entry; }
>>
>> /// Returns size of a ref_addr entry.
>> static unsigned getRefAddrSize(const AsmPrinter *AP);
>>
>> - // Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *E) { return E->getType() == isEntry; }
>> -
>> -private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> return Form == dwarf::DW_FORM_ref_addr ? getRefAddrSize(AP)
>> : sizeof(int32_t);
>> }
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> #endif
>> };
>>
>> //===--------------------------------------------------------------------===//
>> /// \brief A signature reference to a type unit.
>> -class DIETypeSignature : public DIEValue {
>> - friend class DIEValue;
>> +class DIETypeSignature {
>> + const DwarfTypeUnit *Unit;
>>
>> - const DwarfTypeUnit &Unit;
>> + DIETypeSignature() = delete;
>>
>> public:
>> - explicit DIETypeSignature(const DwarfTypeUnit &Unit)
>> - : DIEValue(isTypeSignature), Unit(Unit) {}
>> + explicit DIETypeSignature(const DwarfTypeUnit &Unit) : Unit(&Unit) {}
>>
>> - // \brief Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *E) {
>> - return E->getType() == isTypeSignature;
>> - }
>> -
>> -private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> assert(Form == dwarf::DW_FORM_ref_sig8);
>> return 8;
>> }
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> #endif
>> };
>>
>> @@ -361,27 +280,159 @@ private:
>> /// DIELocList - Represents a pointer to a location list in the debug_loc
>> /// section.
>> //
>> -class DIELocList : public DIEValue {
>> - friend class DIEValue;
>> -
>> +class DIELocList {
>> // Index into the .debug_loc vector.
>> size_t Index;
>>
>> public:
>> - DIELocList(size_t I) : DIEValue(isLocList), Index(I) {}
>> + DIELocList(size_t I) : Index(I) {}
>>
>> /// getValue - Grab the current index out.
>> size_t getValue() const { return Index; }
>>
>> - // Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *E) { return E->getType() == isLocList; }
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>> +
>> +#ifndef NDEBUG
>> + void print(raw_ostream &O) const;
>> +#endif
>> +};
>> +
>> +//===--------------------------------------------------------------------===//
>> +/// DIEValue - A debug information entry value. Some of these roughly correlate
>> +/// to DWARF attribute classes.
>> +///
>> +class DIEBlock;
>> +class DIELoc;
>> +class DIEValue {
>> +public:
>> + enum Type {
>> + isNone,
>> +#define HANDLE_DIEVALUE(T) is##T,
>> +#include "llvm/CodeGen/DIEValue.def"
>> + };
>>
>> private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> + /// Ty - Type of data stored in the value.
>> + ///
>> + Type Ty;
>> +
>> + /// Storage for the value.
>> + ///
>> + /// All values that aren't standard layout (or are larger than 8 bytes)
>> + /// should be stored by reference instead of by value.
>> + typedef AlignedCharArrayUnion<DIEInteger, DIEString, DIEExpr, DIELabel,
>> + DIEDelta *, DIEEntry, DIETypeSignature,
>> + DIEBlock *, DIELoc *, DIELocList> ValTy;
>> + static_assert(sizeof(ValTy) <= sizeof(uint64_t) ||
>> + sizeof(ValTy) <= sizeof(void *),
>> + "Expected all large types to be stored via pointer");
>> +
>> + /// Underlying stored value.
>> + ValTy Val;
>> +
>> + template <class T> void construct(T V) {
>> + static_assert(std::is_standard_layout<T>::value ||
>> + std::is_pointer<T>::value,
>> + "Expected standard layout or pointer");
>> + new (reinterpret_cast<void *>(Val.buffer)) T(V);
>> + }
>> +
>> + template <class T> T &get() { return *reinterpret_cast<T *>(Val.buffer); }
>> + template <class T> const T &get() const {
>> + return *reinterpret_cast<const T *>(Val.buffer);
>> + }
>> + template <class T> void destruct() { get<T>().~T(); }
>> +
>> + /// Destroy the underlying value.
>> + ///
>> + /// This should get optimized down to a no-op. We could skip it if we could
>> + /// add a static assert on \a std::is_trivially_copyable(), but we currently
>> + /// support versions of GCC that don't understand that.
>> + void destroyVal() {
>> + switch (Ty) {
>> + case isNone:
>> + return;
>> +#define HANDLE_DIEVALUE_SMALL(T) \
>> + case is##T: \
>> + destruct<DIE##T>();
>> + return;
>> +#define HANDLE_DIEVALUE_LARGE(T) \
>> + case is##T: \
>> + destruct<const DIE##T *>();
>> + return;
>> +#include "llvm/CodeGen/DIEValue.def"
>> + }
>> + }
>> +
>> + /// Copy the underlying value.
>> + ///
>> + /// This should get optimized down to a simple copy. We need to actually
>> + /// construct the value, rather than calling memcpy, to satisfy strict
>> + /// aliasing rules.
>> + void copyVal(const DIEValue &X) {
>> + switch (Ty) {
>> + case isNone:
>> + return;
>> +#define HANDLE_DIEVALUE_SMALL(T) \
>> + case is##T: \
>> + construct<DIE##T>(X.get<DIE##T>()); \
>> + return;
>> +#define HANDLE_DIEVALUE_LARGE(T) \
>> + case is##T: \
>> + construct<const DIE##T *>(X.get<const DIE##T *>()); \
>> + return;
>> +#include "llvm/CodeGen/DIEValue.def"
>> + }
>> + }
>> +
>> +public:
>> + DIEValue() : Ty(isNone) {}
>> + DIEValue(const DIEValue &X) : Ty(X.Ty) { copyVal(X); }
>> + DIEValue &operator=(const DIEValue &X) {
>> + destroyVal();
>> + Ty = X.Ty;
>> + copyVal(X);
>> + return *this;
>> + }
>> + ~DIEValue() { destroyVal(); }
>> +
>> +#define HANDLE_DIEVALUE_SMALL(T) \
>> + DIEValue(const DIE##T &V) : Ty(is##T) { construct<DIE##T>(V); }
>> +#define HANDLE_DIEVALUE_LARGE(T) \
>> + DIEValue(const DIE##T *V) : Ty(is##T) { \
>> + assert(V && "Expected valid value"); \
>> + construct<const DIE##T *>(V); \
>> + }
>> +#include "llvm/CodeGen/DIEValue.def"
>> +
>> + // Accessors
>> + Type getType() const { return Ty; }
>> + explicit operator bool() const { return Ty; }
>> +
>> +#define HANDLE_DIEVALUE_SMALL(T) \
>> + const DIE##T &getDIE##T() const { \
>> + assert(getType() == is##T && "Expected " #T); \
>> + return get<DIE##T>(); \
>> + }
>> +#define HANDLE_DIEVALUE_LARGE(T) \
>> + const DIE##T &getDIE##T() const { \
>> + assert(getType() == is##T && "Expected " #T); \
>> + return *get<const DIE##T *>(); \
>> + }
>> +#include "llvm/CodeGen/DIEValue.def"
>> +
>> + /// EmitValue - Emit value via the Dwarf writer.
>> + ///
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> +
>> + /// SizeOf - Return the size of a value in bytes.
>> + ///
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> + void dump() const;
>> #endif
>> };
>>
>> @@ -416,7 +467,7 @@ protected:
>>
>> /// Attribute values.
>> ///
>> - SmallVector<DIEValue *, 12> Values;
>> + SmallVector<DIEValue, 12> Values;
>>
>> protected:
>> DIE()
>> @@ -438,7 +489,11 @@ public:
>> const std::vector<std::unique_ptr<DIE>> &getChildren() const {
>> return Children;
>> }
>> - const SmallVectorImpl<DIEValue *> &getValues() const { return Values; }
>> + const SmallVectorImpl<DIEValue> &getValues() const { return Values; }
>> + void setValue(unsigned I, DIEValue New) {
>> + assert(I < Values.size());
>> + Values[I] = New;
>> + }
>> DIE *getParent() const { return Parent; }
>> /// Climb up the parent chain to get the compile or type unit DIE this DIE
>> /// belongs to.
>> @@ -451,7 +506,7 @@ public:
>>
>> /// addValue - Add a value and attributes to a DIE.
>> ///
>> - void addValue(dwarf::Attribute Attribute, dwarf::Form Form, DIEValue *Value) {
>> + void addValue(dwarf::Attribute Attribute, dwarf::Form Form, DIEValue Value) {
>> Abbrev.AddAttribute(Attribute, Form);
>> Values.push_back(Value);
>> }
>> @@ -465,9 +520,11 @@ public:
>> Children.push_back(std::move(Child));
>> }
>>
>> - /// findAttribute - Find a value in the DIE with the attribute given,
>> - /// returns NULL if no such attribute exists.
>> - DIEValue *findAttribute(dwarf::Attribute Attribute) const;
>> + /// Find a value in the DIE with the attribute given.
>> + ///
>> + /// Returns a default-constructed DIEValue (where \a DIEValue::getType()
>> + /// gives \a DIEValue::isNone) if no such attribute exists.
>> + DIEValue findAttribute(dwarf::Attribute Attribute) const;
>>
>> #ifndef NDEBUG
>> void print(raw_ostream &O, unsigned IndentCount = 0) const;
>> @@ -478,12 +535,11 @@ public:
>> //===--------------------------------------------------------------------===//
>> /// DIELoc - Represents an expression location.
>> //
>> -class DIELoc : public DIEValue, public DIE {
>> - friend class DIEValue;
>> -
>> +class DIELoc : public DIE {
>> mutable unsigned Size; // Size in bytes excluding size header.
>> +
>> public:
>> - DIELoc() : DIEValue(isLoc), Size(0) {}
>> + DIELoc() : Size(0) {}
>>
>> /// ComputeSize - Calculate the size of the location expression.
>> ///
>> @@ -504,27 +560,22 @@ public:
>> return dwarf::DW_FORM_block;
>> }
>>
>> - // Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *E) { return E->getType() == isLoc; }
>> -
>> -private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> #endif
>> };
>>
>> //===--------------------------------------------------------------------===//
>> /// DIEBlock - Represents a block of values.
>> //
>> -class DIEBlock : public DIEValue, public DIE {
>> - friend class DIEValue;
>> -
>> +class DIEBlock : public DIE {
>> mutable unsigned Size; // Size in bytes excluding size header.
>> +
>> public:
>> - DIEBlock() : DIEValue(isBlock), Size(0) {}
>> + DIEBlock() : Size(0) {}
>>
>> /// ComputeSize - Calculate the size of the location expression.
>> ///
>> @@ -542,15 +593,11 @@ public:
>> return dwarf::DW_FORM_block;
>> }
>>
>> - // Implement isa/cast/dyncast.
>> - static bool classof(const DIEValue *E) { return E->getType() == isBlock; }
>> -
>> -private:
>> - void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> - unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const;
>> + void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
>> + unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
>>
>> #ifndef NDEBUG
>> - void printImpl(raw_ostream &O) const;
>> + void print(raw_ostream &O) const;
>> #endif
>> };
>>
>>
>> Modified: llvm/trunk/include/llvm/CodeGen/DIEValue.def
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DIEValue.def?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/CodeGen/DIEValue.def (original)
>> +++ llvm/trunk/include/llvm/CodeGen/DIEValue.def Wed May 27 17:14:58 2015
>> @@ -11,19 +11,37 @@
>> //
>> //===----------------------------------------------------------------------===//
>>
>> -#if !(defined HANDLE_DIEVALUE)
>> +#if !(defined HANDLE_DIEVALUE || defined HANDLE_DIEVALUE_SMALL || \
>> + defined HANDLE_DIEVALUE_LARGE)
>> #error "Missing macro definition of HANDLE_DIEVALUE"
>> #endif
>>
>> -HANDLE_DIEVALUE(Integer)
>> -HANDLE_DIEVALUE(String)
>> -HANDLE_DIEVALUE(Expr)
>> -HANDLE_DIEVALUE(Label)
>> -HANDLE_DIEVALUE(Delta)
>> -HANDLE_DIEVALUE(Entry)
>> -HANDLE_DIEVALUE(TypeSignature)
>> -HANDLE_DIEVALUE(Block)
>> -HANDLE_DIEVALUE(Loc)
>> -HANDLE_DIEVALUE(LocList)
>> +// Handler for all values.
>> +#ifndef HANDLE_DIEVALUE
>> +#define HANDLE_DIEVALUE(T)
>> +#endif
>> +
>> +// Handler for small values.
>> +#ifndef HANDLE_DIEVALUE_SMALL
>> +#define HANDLE_DIEVALUE_SMALL(T) HANDLE_DIEVALUE(T)
>> +#endif
>> +
>> +// Handler for large values.
>> +#ifndef HANDLE_DIEVALUE_LARGE
>> +#define HANDLE_DIEVALUE_LARGE(T) HANDLE_DIEVALUE(T)
>> +#endif
>> +
>> +HANDLE_DIEVALUE_SMALL(Integer)
>> +HANDLE_DIEVALUE_SMALL(String)
>> +HANDLE_DIEVALUE_SMALL(Expr)
>> +HANDLE_DIEVALUE_SMALL(Label)
>> +HANDLE_DIEVALUE_LARGE(Delta)
>> +HANDLE_DIEVALUE_SMALL(Entry)
>> +HANDLE_DIEVALUE_SMALL(TypeSignature)
>> +HANDLE_DIEVALUE_LARGE(Block)
>> +HANDLE_DIEVALUE_LARGE(Loc)
>> +HANDLE_DIEVALUE_SMALL(LocList)
>>
>> #undef HANDLE_DIEVALUE
>> +#undef HANDLE_DIEVALUE_SMALL
>> +#undef HANDLE_DIEVALUE_LARGE
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp Wed May 27 17:14:58 2015
>> @@ -265,7 +265,7 @@ void AsmPrinter::emitDwarfDIE(const DIE
>> dwarf::TagString(Abbrev.getTag()));
>> EmitULEB128(Abbrev.getNumber());
>>
>> - const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
>> + const SmallVectorImpl<DIEValue> &Values = Die.getValues();
>> const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
>>
>> // Emit the DIE attribute values.
>> @@ -277,12 +277,12 @@ void AsmPrinter::emitDwarfDIE(const DIE
>> if (isVerbose()) {
>> OutStreamer->AddComment(dwarf::AttributeString(Attr));
>> if (Attr == dwarf::DW_AT_accessibility)
>> - OutStreamer->AddComment(dwarf::AccessibilityString(
>> - cast<DIEInteger>(Values[i])->getValue()));
>> + OutStreamer->AddComment(
>> + dwarf::AccessibilityString(Values[i].getDIEInteger().getValue()));
>> }
>>
>> // Emit an attribute using the defined form.
>> - Values[i]->EmitValue(this, Form);
>> + Values[i].EmitValue(this, Form);
>> }
>>
>> // Emit the DIE children if any.
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Wed May 27 17:14:58 2015
>> @@ -128,8 +128,8 @@ const DIE *DIE::getUnitOrNull() const {
>> return nullptr;
>> }
>>
>> -DIEValue *DIE::findAttribute(dwarf::Attribute Attribute) const {
>> - const SmallVectorImpl<DIEValue *> &Values = getValues();
>> +DIEValue DIE::findAttribute(dwarf::Attribute Attribute) const {
>> + const SmallVectorImpl<DIEValue> &Values = getValues();
>> const DIEAbbrev &Abbrevs = getAbbrev();
>>
>> // Iterate through all the attributes until we find the one we're
>> @@ -137,7 +137,7 @@ DIEValue *DIE::findAttribute(dwarf::Attr
>> for (size_t i = 0; i < Values.size(); ++i)
>> if (Abbrevs.getData()[i].getAttribute() == Attribute)
>> return Values[i];
>> - return nullptr;
>> + return DIEValue();
>> }
>>
>> #ifndef NDEBUG
>> @@ -174,7 +174,7 @@ void DIE::print(raw_ostream &O, unsigned
>> O << " "
>> << dwarf::FormEncodingString(Data[i].getForm())
>> << " ";
>> - Values[i]->print(O);
>> + Values[i].print(O);
>> O << "\n";
>> }
>> IndentCount -= 2;
>> @@ -193,9 +193,11 @@ void DIE::dump() {
>>
>> void DIEValue::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
>> switch (Ty) {
>> + case isNone:
>> + llvm_unreachable("Expected valid DIEValue");
>> #define HANDLE_DIEVALUE(T) \
>> case is##T: \
>> - cast<DIE##T>(this)->EmitValueImpl(AP, Form); \
>> + getDIE##T().EmitValue(AP, Form); \
>> break;
>> #include "llvm/CodeGen/DIEValue.def"
>> }
>> @@ -203,9 +205,11 @@ void DIEValue::EmitValue(const AsmPrinte
>>
>> unsigned DIEValue::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> switch (Ty) {
>> + case isNone:
>> + llvm_unreachable("Expected valid DIEValue");
>> #define HANDLE_DIEVALUE(T) \
>> case is##T: \
>> - return cast<DIE##T>(this)->SizeOfImpl(AP, Form);
>> + return getDIE##T().SizeOf(AP, Form);
>> #include "llvm/CodeGen/DIEValue.def"
>> }
>> llvm_unreachable("Unknown DIE kind");
>> @@ -214,9 +218,11 @@ unsigned DIEValue::SizeOf(const AsmPrint
>> #ifndef NDEBUG
>> void DIEValue::print(raw_ostream &O) const {
>> switch (Ty) {
>> + case isNone:
>> + llvm_unreachable("Expected valid DIEValue");
>> #define HANDLE_DIEVALUE(T) \
>> case is##T: \
>> - cast<DIE##T>(this)->printImpl(O); \
>> + getDIE##T().print(O); \
>> break;
>> #include "llvm/CodeGen/DIEValue.def"
>> }
>> @@ -233,7 +239,7 @@ void DIEValue::dump() const {
>>
>> /// EmitValue - Emit integer of appropriate size.
>> ///
>> -void DIEInteger::EmitValueImpl(const AsmPrinter *Asm, dwarf::Form Form) const {
>> +void DIEInteger::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
>> unsigned Size = ~0U;
>> switch (Form) {
>> case dwarf::DW_FORM_flag_present:
>> @@ -269,7 +275,7 @@ void DIEInteger::EmitValueImpl(const Asm
>>
>> /// SizeOf - Determine size of integer value in bytes.
>> ///
>> -unsigned DIEInteger::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +unsigned DIEInteger::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> switch (Form) {
>> case dwarf::DW_FORM_flag_present: return 0;
>> case dwarf::DW_FORM_flag: // Fall thru
>> @@ -298,7 +304,7 @@ unsigned DIEInteger::SizeOfImpl(const As
>> }
>>
>> #ifndef NDEBUG
>> -void DIEInteger::printImpl(raw_ostream &O) const {
>> +void DIEInteger::print(raw_ostream &O) const {
>> O << "Int: " << (int64_t)Integer << " 0x";
>> O.write_hex(Integer);
>> }
>> @@ -310,13 +316,13 @@ void DIEInteger::printImpl(raw_ostream &
>>
>> /// EmitValue - Emit expression value.
>> ///
>> -void DIEExpr::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +void DIEExpr::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
>> AP->OutStreamer->EmitValue(Expr, SizeOf(AP, Form));
>> }
>>
>> /// SizeOf - Determine size of expression value in bytes.
>> ///
>> -unsigned DIEExpr::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +unsigned DIEExpr::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> if (Form == dwarf::DW_FORM_data4) return 4;
>> if (Form == dwarf::DW_FORM_sec_offset) return 4;
>> if (Form == dwarf::DW_FORM_strp) return 4;
>> @@ -324,7 +330,7 @@ unsigned DIEExpr::SizeOfImpl(const AsmPr
>> }
>>
>> #ifndef NDEBUG
>> -void DIEExpr::printImpl(raw_ostream &O) const { O << "Expr: " << *Expr; }
>> +void DIEExpr::print(raw_ostream &O) const { O << "Expr: " << *Expr; }
>> #endif
>>
>> //===----------------------------------------------------------------------===//
>> @@ -333,7 +339,7 @@ void DIEExpr::printImpl(raw_ostream &O)
>>
>> /// EmitValue - Emit label value.
>> ///
>> -void DIELabel::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +void DIELabel::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
>> AP->EmitLabelReference(Label, SizeOf(AP, Form),
>> Form == dwarf::DW_FORM_strp ||
>> Form == dwarf::DW_FORM_sec_offset ||
>> @@ -342,7 +348,7 @@ void DIELabel::EmitValueImpl(const AsmPr
>>
>> /// SizeOf - Determine size of label value in bytes.
>> ///
>> -unsigned DIELabel::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +unsigned DIELabel::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> if (Form == dwarf::DW_FORM_data4) return 4;
>> if (Form == dwarf::DW_FORM_sec_offset) return 4;
>> if (Form == dwarf::DW_FORM_strp) return 4;
>> @@ -350,9 +356,7 @@ unsigned DIELabel::SizeOfImpl(const AsmP
>> }
>>
>> #ifndef NDEBUG
>> -void DIELabel::printImpl(raw_ostream &O) const {
>> - O << "Lbl: " << Label->getName();
>> -}
>> +void DIELabel::print(raw_ostream &O) const { O << "Lbl: " << Label->getName(); }
>> #endif
>>
>> //===----------------------------------------------------------------------===//
>> @@ -361,13 +365,13 @@ void DIELabel::printImpl(raw_ostream &O)
>>
>> /// EmitValue - Emit delta value.
>> ///
>> -void DIEDelta::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +void DIEDelta::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
>> AP->EmitLabelDifference(LabelHi, LabelLo, SizeOf(AP, Form));
>> }
>>
>> /// SizeOf - Determine size of delta value in bytes.
>> ///
>> -unsigned DIEDelta::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +unsigned DIEDelta::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> if (Form == dwarf::DW_FORM_data4) return 4;
>> if (Form == dwarf::DW_FORM_sec_offset) return 4;
>> if (Form == dwarf::DW_FORM_strp) return 4;
>> @@ -375,7 +379,7 @@ unsigned DIEDelta::SizeOfImpl(const AsmP
>> }
>>
>> #ifndef NDEBUG
>> -void DIEDelta::printImpl(raw_ostream &O) const {
>> +void DIEDelta::print(raw_ostream &O) const {
>> O << "Del: " << LabelHi->getName() << "-" << LabelLo->getName();
>> }
>> #endif
>> @@ -386,7 +390,7 @@ void DIEDelta::printImpl(raw_ostream &O)
>>
>> /// EmitValue - Emit string value.
>> ///
>> -void DIEString::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +void DIEString::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
>> assert(
>> (Form == dwarf::DW_FORM_strp || Form == dwarf::DW_FORM_GNU_str_index) &&
>> "Expected valid string form");
>> @@ -410,7 +414,7 @@ void DIEString::EmitValueImpl(const AsmP
>>
>> /// SizeOf - Determine size of delta value in bytes.
>> ///
>> -unsigned DIEString::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +unsigned DIEString::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> assert(
>> (Form == dwarf::DW_FORM_strp || Form == dwarf::DW_FORM_GNU_str_index) &&
>> "Expected valid string form");
>> @@ -428,7 +432,7 @@ unsigned DIEString::SizeOfImpl(const Asm
>> }
>>
>> #ifndef NDEBUG
>> -void DIEString::printImpl(raw_ostream &O) const {
>> +void DIEString::print(raw_ostream &O) const {
>> O << "String: " << S.getString();
>> }
>> #endif
>> @@ -439,16 +443,16 @@ void DIEString::printImpl(raw_ostream &O
>>
>> /// EmitValue - Emit debug information entry offset.
>> ///
>> -void DIEEntry::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +void DIEEntry::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
>>
>> if (Form == dwarf::DW_FORM_ref_addr) {
>> const DwarfDebug *DD = AP->getDwarfDebug();
>> - unsigned Addr = Entry.getOffset();
>> + unsigned Addr = Entry->getOffset();
>> assert(!DD->useSplitDwarf() && "TODO: dwo files can't have relocations.");
>> // For DW_FORM_ref_addr, output the offset from beginning of debug info
>> // section. Entry->getOffset() returns the offset from start of the
>> // compile unit.
>> - DwarfCompileUnit *CU = DD->lookupUnit(Entry.getUnit());
>> + DwarfCompileUnit *CU = DD->lookupUnit(Entry->getUnit());
>> assert(CU && "CUDie should belong to a CU.");
>> Addr += CU->getDebugInfoOffset();
>> if (AP->MAI->doesDwarfUseRelocationsAcrossSections())
>> @@ -457,7 +461,7 @@ void DIEEntry::EmitValueImpl(const AsmPr
>> else
>> AP->OutStreamer->EmitIntValue(Addr, DIEEntry::getRefAddrSize(AP));
>> } else
>> - AP->EmitInt32(Entry.getOffset());
>> + AP->EmitInt32(Entry->getOffset());
>> }
>>
>> unsigned DIEEntry::getRefAddrSize(const AsmPrinter *AP) {
>> @@ -473,7 +477,7 @@ unsigned DIEEntry::getRefAddrSize(const
>> }
>>
>> #ifndef NDEBUG
>> -void DIEEntry::printImpl(raw_ostream &O) const {
>> +void DIEEntry::print(raw_ostream &O) const {
>> O << format("Die: 0x%lx", (long)(intptr_t)&Entry);
>> }
>> #endif
>> @@ -481,14 +485,15 @@ void DIEEntry::printImpl(raw_ostream &O)
>> //===----------------------------------------------------------------------===//
>> // DIETypeSignature Implementation
>> //===----------------------------------------------------------------------===//
>> -void DIETypeSignature::EmitValueImpl(const AsmPrinter *Asm, dwarf::Form Form) const {
>> +void DIETypeSignature::EmitValue(const AsmPrinter *Asm,
>> + dwarf::Form Form) const {
>> assert(Form == dwarf::DW_FORM_ref_sig8);
>> - Asm->OutStreamer->EmitIntValue(Unit.getTypeSignature(), 8);
>> + Asm->OutStreamer->EmitIntValue(Unit->getTypeSignature(), 8);
>> }
>>
>> #ifndef NDEBUG
>> -void DIETypeSignature::printImpl(raw_ostream &O) const {
>> - O << format("Type Unit: 0x%lx", Unit.getTypeSignature());
>> +void DIETypeSignature::print(raw_ostream &O) const {
>> + O << format("Type Unit: 0x%lx", Unit->getTypeSignature());
>> }
>> #endif
>>
>> @@ -502,7 +507,7 @@ unsigned DIELoc::ComputeSize(const AsmPr
>> if (!Size) {
>> const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
>> for (unsigned i = 0, N = Values.size(); i < N; ++i)
>> - Size += Values[i]->SizeOf(AP, AbbrevData[i].getForm());
>> + Size += Values[i].SizeOf(AP, AbbrevData[i].getForm());
>> }
>>
>> return Size;
>> @@ -510,7 +515,7 @@ unsigned DIELoc::ComputeSize(const AsmPr
>>
>> /// EmitValue - Emit location data.
>> ///
>> -void DIELoc::EmitValueImpl(const AsmPrinter *Asm, dwarf::Form Form) const {
>> +void DIELoc::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
>> switch (Form) {
>> default: llvm_unreachable("Improper form for block");
>> case dwarf::DW_FORM_block1: Asm->EmitInt8(Size); break;
>> @@ -523,12 +528,12 @@ void DIELoc::EmitValueImpl(const AsmPrin
>>
>> const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
>> for (unsigned i = 0, N = Values.size(); i < N; ++i)
>> - Values[i]->EmitValue(Asm, AbbrevData[i].getForm());
>> + Values[i].EmitValue(Asm, AbbrevData[i].getForm());
>> }
>>
>> /// SizeOf - Determine size of location data in bytes.
>> ///
>> -unsigned DIELoc::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +unsigned DIELoc::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> switch (Form) {
>> case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
>> case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
>> @@ -541,7 +546,7 @@ unsigned DIELoc::SizeOfImpl(const AsmPri
>> }
>>
>> #ifndef NDEBUG
>> -void DIELoc::printImpl(raw_ostream &O) const {
>> +void DIELoc::print(raw_ostream &O) const {
>> O << "ExprLoc: ";
>> DIE::print(O, 5);
>> }
>> @@ -557,7 +562,7 @@ unsigned DIEBlock::ComputeSize(const Asm
>> if (!Size) {
>> const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
>> for (unsigned i = 0, N = Values.size(); i < N; ++i)
>> - Size += Values[i]->SizeOf(AP, AbbrevData[i].getForm());
>> + Size += Values[i].SizeOf(AP, AbbrevData[i].getForm());
>> }
>>
>> return Size;
>> @@ -565,7 +570,7 @@ unsigned DIEBlock::ComputeSize(const Asm
>>
>> /// EmitValue - Emit block data.
>> ///
>> -void DIEBlock::EmitValueImpl(const AsmPrinter *Asm, dwarf::Form Form) const {
>> +void DIEBlock::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
>> switch (Form) {
>> default: llvm_unreachable("Improper form for block");
>> case dwarf::DW_FORM_block1: Asm->EmitInt8(Size); break;
>> @@ -576,12 +581,12 @@ void DIEBlock::EmitValueImpl(const AsmPr
>>
>> const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
>> for (unsigned i = 0, N = Values.size(); i < N; ++i)
>> - Values[i]->EmitValue(Asm, AbbrevData[i].getForm());
>> + Values[i].EmitValue(Asm, AbbrevData[i].getForm());
>> }
>>
>> /// SizeOf - Determine size of block data in bytes.
>> ///
>> -unsigned DIEBlock::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +unsigned DIEBlock::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> switch (Form) {
>> case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
>> case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
>> @@ -592,7 +597,7 @@ unsigned DIEBlock::SizeOfImpl(const AsmP
>> }
>>
>> #ifndef NDEBUG
>> -void DIEBlock::printImpl(raw_ostream &O) const {
>> +void DIEBlock::print(raw_ostream &O) const {
>> O << "Blk: ";
>> DIE::print(O, 5);
>> }
>> @@ -602,7 +607,7 @@ void DIEBlock::printImpl(raw_ostream &O)
>> // DIELocList Implementation
>> //===----------------------------------------------------------------------===//
>>
>> -unsigned DIELocList::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +unsigned DIELocList::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
>> if (Form == dwarf::DW_FORM_data4)
>> return 4;
>> if (Form == dwarf::DW_FORM_sec_offset)
>> @@ -612,7 +617,7 @@ unsigned DIELocList::SizeOfImpl(const As
>>
>> /// EmitValue - Emit label value.
>> ///
>> -void DIELocList::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
>> +void DIELocList::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
>> DwarfDebug *DD = AP->getDwarfDebug();
>> MCSymbol *Label = DD->getDebugLocs().getList(Index).Label;
>>
>> @@ -623,8 +628,5 @@ void DIELocList::EmitValueImpl(const Asm
>> }
>>
>> #ifndef NDEBUG
>> -void DIELocList::printImpl(raw_ostream &O) const {
>> - O << "LocList: " << Index;
>> -
>> -}
>> +void DIELocList::print(raw_ostream &O) const { O << "LocList: " << Index; }
>> #endif
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp Wed May 27 17:14:58 2015
>> @@ -31,18 +31,14 @@ using namespace llvm;
>> /// \brief Grabs the string in whichever attribute is passed in and returns
>> /// a reference to it.
>> static StringRef getDIEStringAttr(const DIE &Die, uint16_t Attr) {
>> - const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
>> + const auto &Values = Die.getValues();
>> const DIEAbbrev &Abbrevs = Die.getAbbrev();
>>
>> // Iterate through all the attributes until we find the one we're
>> // looking for, if we can't find it return an empty string.
>> for (size_t i = 0; i < Values.size(); ++i) {
>> - if (Abbrevs.getData()[i].getAttribute() == Attr) {
>> - DIEValue *V = Values[i];
>> - assert(isa<DIEString>(V) && "String requested. Not a string.");
>> - DIEString *S = cast<DIEString>(V);
>> - return S->getString();
>> - }
>> + if (Abbrevs.getData()[i].getAttribute() == Attr)
>> + return Values[i].getDIEString().getString();
>> }
>> return StringRef("");
>> }
>> @@ -123,7 +119,7 @@ void DIEHash::addParentContext(const DIE
>>
>> // Collect all of the attributes for a particular DIE in single structure.
>> void DIEHash::collectAttributes(const DIE &Die, DIEAttrs &Attrs) {
>> - const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
>> + const SmallVectorImpl<DIEValue> &Values = Die.getValues();
>> const DIEAbbrev &Abbrevs = Die.getAbbrev();
>>
>> #define COLLECT_ATTR(NAME) \
>> @@ -274,11 +270,9 @@ 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 SmallVectorImpl<DIEValue *> &Values) {
>> - for (SmallVectorImpl<DIEValue *>::const_iterator I = Values.begin(),
>> - E = Values.end();
>> - I != E; ++I)
>> - Hash.update((uint64_t)cast<DIEInteger>(*I)->getValue());
>> +void DIEHash::hashBlockData(const SmallVectorImpl<DIEValue> &Values) {
>> + for (auto I = Values.begin(), E = Values.end(); I != E; ++I)
>> + Hash.update((uint64_t)I->getDIEInteger().getValue());
>> }
>>
>> // Hash the contents of a loclistptr class.
>> @@ -293,7 +287,7 @@ void DIEHash::hashLocList(const DIELocLi
>> // Hash an individual attribute \param Attr based on the type of attribute and
>> // the form.
>> void DIEHash::hashAttribute(AttrEntry Attr, dwarf::Tag Tag) {
>> - const DIEValue *Value = Attr.Val;
>> + const DIEValue &Value = Attr.Val;
>> const DIEAbbrevData *Desc = Attr.Desc;
>> dwarf::Attribute Attribute = Desc->getAttribute();
>>
>> @@ -304,12 +298,15 @@ void DIEHash::hashAttribute(AttrEntry At
>> // computation is limited to the following: DW_FORM_sdata, DW_FORM_flag,
>> // DW_FORM_string, and DW_FORM_block.
>>
>> - switch (Value->getType()) {
>> + switch (Value.getType()) {
>> + case DIEValue::isNone:
>> + llvm_unreachable("Expected valid DIEValue");
>> +
>> // 7.27 Step 3
>> // ... An attribute that refers to another type entry T is processed as
>> // follows:
>> case DIEValue::isEntry:
>> - hashDIEEntry(Attribute, Tag, cast<DIEEntry>(Value)->getEntry());
>> + hashDIEEntry(Attribute, Tag, Value.getDIEEntry().getEntry());
>> break;
>> case DIEValue::isInteger: {
>> addULEB128('A');
>> @@ -322,14 +319,14 @@ void DIEHash::hashAttribute(AttrEntry At
>> case dwarf::DW_FORM_udata:
>> case dwarf::DW_FORM_sdata:
>> addULEB128(dwarf::DW_FORM_sdata);
>> - addSLEB128((int64_t)cast<DIEInteger>(Value)->getValue());
>> + addSLEB128((int64_t)Value.getDIEInteger().getValue());
>> break;
>> // DW_FORM_flag_present is just flag with a value of one. We still give it a
>> // value so just use the value.
>> case dwarf::DW_FORM_flag_present:
>> case dwarf::DW_FORM_flag:
>> addULEB128(dwarf::DW_FORM_flag);
>> - addULEB128((int64_t)cast<DIEInteger>(Value)->getValue());
>> + addULEB128((int64_t)Value.getDIEInteger().getValue());
>> break;
>> default:
>> llvm_unreachable("Unknown integer form!");
>> @@ -340,7 +337,7 @@ void DIEHash::hashAttribute(AttrEntry At
>> addULEB128('A');
>> addULEB128(Attribute);
>> addULEB128(dwarf::DW_FORM_string);
>> - addString(cast<DIEString>(Value)->getString());
>> + addString(Value.getDIEString().getString());
>> break;
>> case DIEValue::isBlock:
>> case DIEValue::isLoc:
>> @@ -348,17 +345,17 @@ void DIEHash::hashAttribute(AttrEntry At
>> addULEB128('A');
>> addULEB128(Attribute);
>> addULEB128(dwarf::DW_FORM_block);
>> - if (isa<DIEBlock>(Value)) {
>> - addULEB128(cast<DIEBlock>(Value)->ComputeSize(AP));
>> - hashBlockData(cast<DIEBlock>(Value)->getValues());
>> - } else if (isa<DIELoc>(Value)) {
>> - addULEB128(cast<DIELoc>(Value)->ComputeSize(AP));
>> - hashBlockData(cast<DIELoc>(Value)->getValues());
>> + if (Value.getType() == DIEValue::isBlock) {
>> + addULEB128(Value.getDIEBlock().ComputeSize(AP));
>> + hashBlockData(Value.getDIEBlock().getValues());
>> + } else if (Value.getType() == DIEValue::isLoc) {
>> + addULEB128(Value.getDIELoc().ComputeSize(AP));
>> + hashBlockData(Value.getDIELoc().getValues());
>> } else {
>> // We could add the block length, but that would take
>> // a bit of work and not add a lot of uniqueness
>> // to the hash in some way we could test.
>> - hashLocList(*cast<DIELocList>(Value));
>> + hashLocList(Value.getDIELocList());
>> }
>> break;
>> // FIXME: It's uncertain whether or not we should handle this at the moment.
>> @@ -375,7 +372,7 @@ void DIEHash::hashAttribute(AttrEntry At
>> void DIEHash::hashAttributes(const DIEAttrs &Attrs, dwarf::Tag Tag) {
>> #define ADD_ATTR(ATTR) \
>> { \
>> - if (ATTR.Val != 0) \
>> + if (ATTR.Val) \
>> hashAttribute(ATTR, Tag); \
>> }
>>
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.h?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.h Wed May 27 17:14:58 2015
>> @@ -29,7 +29,7 @@ class DIEHash {
>>
>> // The entry for a particular attribute.
>> struct AttrEntry {
>> - const DIEValue *Val;
>> + DIEValue Val;
>> const DIEAbbrevData *Desc;
>> };
>>
>> @@ -135,7 +135,7 @@ private:
>>
>> /// \brief Hashes the data in a block like DIEValue, e.g. DW_FORM_block or
>> /// DW_FORM_exprloc.
>> - void hashBlockData(const SmallVectorImpl<DIEValue *> &Values);
>> + void hashBlockData(const SmallVectorImpl<DIEValue> &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=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Wed May 27 17:14:58 2015
>> @@ -42,8 +42,7 @@ void DwarfCompileUnit::addLabelAddress(D
>> DD->addArangeLabel(SymbolCU(this, Label));
>>
>> unsigned idx = DD->getAddressPool().getIndex(Label);
>> - DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
>> - Die.addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
>> + Die.addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, DIEInteger(idx));
>> }
>>
>> void DwarfCompileUnit::addLocalLabelAddress(DIE &Die,
>> @@ -53,8 +52,7 @@ void DwarfCompileUnit::addLocalLabelAddr
>> DD->addArangeLabel(SymbolCU(this, Label));
>>
>> Die.addValue(Attribute, dwarf::DW_FORM_addr,
>> - Label ? (DIEValue *)new (DIEValueAllocator) DIELabel(Label)
>> - : new (DIEValueAllocator) DIEInteger(0));
>> + Label ? DIEValue(DIELabel(Label)) : DIEValue(DIEInteger(0)));
>> }
>>
>> unsigned DwarfCompileUnit::getOrCreateSourceID(StringRef FileName,
>> @@ -145,7 +143,7 @@ DIE *DwarfCompileUnit::getOrCreateGlobal
>> bool addToAccelTable = false;
>> if (auto *Global = dyn_cast_or_null<GlobalVariable>(GV->getVariable())) {
>> addToAccelTable = true;
>> - DIELoc *Loc = new (DIEValueAllocator) DIELoc();
>> + DIELoc *Loc = new (DIEValueAllocator) DIELoc;
>> const MCSymbol *Sym = Asm->getSymbol(Global);
>> if (Global->isThreadLocal()) {
>> // FIXME: Make this work with -gsplit-dwarf.
>> @@ -183,7 +181,7 @@ DIE *DwarfCompileUnit::getOrCreateGlobal
>> } else if (const ConstantExpr *CE = getMergedGlobalExpr(GV->getVariable())) {
>> addToAccelTable = true;
>> // GV is a merged global.
>> - DIELoc *Loc = new (DIEValueAllocator) DIELoc();
>> + DIELoc *Loc = new (DIEValueAllocator) DIELoc;
>> Value *Ptr = CE->getOperand(0);
>> MCSymbol *Sym = Asm->getSymbol(cast<GlobalValue>(Ptr));
>> DD->addArangeLabel(SymbolCU(this, Sym));
>> @@ -365,10 +363,9 @@ void DwarfCompileUnit::constructScopeDIE
>>
>> void DwarfCompileUnit::addSectionDelta(DIE &Die, dwarf::Attribute Attribute,
>> const MCSymbol *Hi, const MCSymbol *Lo) {
>> - DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
>> Die.addValue(Attribute, DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
>> : dwarf::DW_FORM_data4,
>> - Value);
>> + new (DIEValueAllocator) DIEDelta(Hi, Lo));
>> }
>>
>> void DwarfCompileUnit::addScopeRangeList(DIE &ScopeDIE,
>> @@ -515,7 +512,7 @@ DwarfCompileUnit::constructVariableDIEIm
>> return VariableDie;
>>
>> auto Expr = DV.getExpression().begin();
>> - DIELoc *Loc = new (DIEValueAllocator) DIELoc();
>> + DIELoc *Loc = new (DIEValueAllocator) DIELoc;
>> DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
>> for (auto FI : DV.getFrameIndex()) {
>> unsigned FrameReg = 0;
>> @@ -739,7 +736,7 @@ void DwarfCompileUnit::addVariableAddres
>> /// Add an address attribute to a die based on the location provided.
>> void DwarfCompileUnit::addAddress(DIE &Die, dwarf::Attribute Attribute,
>> const MachineLocation &Location) {
>> - DIELoc *Loc = new (DIEValueAllocator) DIELoc();
>> + DIELoc *Loc = new (DIEValueAllocator) DIELoc;
>>
>> bool validReg;
>> if (Location.isReg())
>> @@ -761,7 +758,7 @@ void DwarfCompileUnit::addAddress(DIE &D
>> void DwarfCompileUnit::addComplexAddress(const DbgVariable &DV, DIE &Die,
>> dwarf::Attribute Attribute,
>> const MachineLocation &Location) {
>> - DIELoc *Loc = new (DIEValueAllocator) DIELoc();
>> + DIELoc *Loc = new (DIEValueAllocator) DIELoc;
>> DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
>> assert(DV.getExpression().size() == 1);
>> const DIExpression *Expr = DV.getExpression().back();
>> @@ -782,10 +779,9 @@ void DwarfCompileUnit::addComplexAddress
>> /// Add a Dwarf loclistptr attribute data and value.
>> void DwarfCompileUnit::addLocationList(DIE &Die, dwarf::Attribute Attribute,
>> unsigned Index) {
>> - DIEValue *Value = new (DIEValueAllocator) DIELocList(Index);
>> dwarf::Form Form = DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
>> : dwarf::DW_FORM_data4;
>> - Die.addValue(Attribute, Form, Value);
>> + Die.addValue(Attribute, Form, DIELocList(Index));
>> }
>>
>> void DwarfCompileUnit::applyVariableAttributes(const DbgVariable &Var,
>> @@ -802,8 +798,7 @@ void DwarfCompileUnit::applyVariableAttr
>> /// Add a Dwarf expression attribute data and value.
>> void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form,
>> const MCExpr *Expr) {
>> - DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
>> - Die.addValue((dwarf::Attribute)0, Form, Value);
>> + Die.addValue((dwarf::Attribute)0, Form, DIEExpr(Expr));
>> }
>>
>> void DwarfCompileUnit::applySubprogramAttributesToDefinition(
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed May 27 17:14:58 2015
>> @@ -1340,9 +1340,8 @@ static dwarf::PubIndexEntryDescriptor co
>>
>> // We could have a specification DIE that has our most of our knowledge,
>> // look for that now.
>> - DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
>> - if (SpecVal) {
>> - DIE &SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
>> + if (DIEValue SpecVal = Die->findAttribute(dwarf::DW_AT_specification)) {
>> + DIE &SpecDIE = SpecVal.getDIEEntry().getEntry();
>> if (SpecDIE.findAttribute(dwarf::DW_AT_external))
>> Linkage = dwarf::GIEL_EXTERNAL;
>> } else if (Die->findAttribute(dwarf::DW_AT_external))
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp Wed May 27 17:14:58 2015
>> @@ -94,13 +94,13 @@ unsigned DwarfFile::computeSizeAndOffset
>> // Start the size with the size of abbreviation code.
>> Offset += getULEB128Size(Die.getAbbrevNumber());
>>
>> - const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
>> + const SmallVectorImpl<DIEValue> &Values = Die.getValues();
>> const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
>>
>> // Size the DIE attribute values.
>> for (unsigned i = 0, N = Values.size(); i < N; ++i)
>> // Size attribute value.
>> - Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
>> + Offset += Values[i].SizeOf(Asm, AbbrevData[i].getForm());
>>
>> // Get the children.
>> const auto &Children = Die.getChildren();
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Wed May 27 17:14:58 2015
>> @@ -70,7 +70,6 @@ DwarfUnit::DwarfUnit(unsigned UID, dwarf
>> DD(DW), DU(DWU), IndexTyDie(nullptr), Section(nullptr) {
>> assert(UnitTag == dwarf::DW_TAG_compile_unit ||
>> UnitTag == dwarf::DW_TAG_type_unit);
>> - DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
>> }
>>
>> DwarfTypeUnit::DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A,
>> @@ -89,11 +88,6 @@ DwarfUnit::~DwarfUnit() {
>> DIELocs[j]->~DIELoc();
>> }
>>
>> -DIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
>> - DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
>> - return Value;
>> -}
>> -
>> int64_t DwarfUnit::getDefaultLowerBound() const {
>> switch (getLanguage()) {
>> default:
>> @@ -190,18 +184,16 @@ 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, DIEIntegerOne);
>> + Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEInteger(1));
>> else
>> - Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
>> + Die.addValue(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);
>> - DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
>> - DIEInteger(Integer);
>> - Die.addValue(Attribute, *Form, Value);
>> + Die.addValue(Attribute, *Form, DIEInteger(Integer));
>> }
>>
>> void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
>> @@ -212,8 +204,7 @@ void DwarfUnit::addSInt(DIE &Die, dwarf:
>> Optional<dwarf::Form> Form, int64_t Integer) {
>> if (!Form)
>> Form = DIEInteger::BestForm(true, Integer);
>> - DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
>> - Die.addValue(Attribute, *Form, Value);
>> + Die.addValue(Attribute, *Form, DIEInteger(Integer));
>> }
>>
>> void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
>> @@ -225,14 +216,12 @@ void DwarfUnit::addString(DIE &Die, dwar
>> StringRef String) {
>> Die.addValue(Attribute,
>> isDwoUnit() ? dwarf::DW_FORM_GNU_str_index : dwarf::DW_FORM_strp,
>> - new (DIEValueAllocator)
>> DIEString(DU->getStringPool().getEntry(*Asm, String)));
>> }
>>
>> void DwarfUnit::addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form,
>> const MCSymbol *Label) {
>> - DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
>> - Die.addValue(Attribute, Form, Value);
>> + Die.addValue(Attribute, Form, DIELabel(Label));
>> }
>>
>> void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
>> @@ -265,12 +254,12 @@ void DwarfUnit::addOpAddress(DIELoc &Die
>>
>> void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
>> const MCSymbol *Hi, const MCSymbol *Lo) {
>> - DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
>> - Die.addValue(Attribute, dwarf::DW_FORM_data4, Value);
>> + Die.addValue(Attribute, dwarf::DW_FORM_data4,
>> + new (DIEValueAllocator) DIEDelta(Hi, Lo));
>> }
>>
>> void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
>> - addDIEEntry(Die, Attribute, createDIEEntry(Entry));
>> + addDIEEntry(Die, Attribute, DIEEntry(Entry));
>> }
>>
>> void DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) {
>> @@ -281,13 +270,13 @@ void DwarfUnit::addDIETypeSignature(DIE
>> addFlag(Die, dwarf::DW_AT_declaration);
>>
>> Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
>> - new (DIEValueAllocator) DIETypeSignature(Type));
>> + DIETypeSignature(Type));
>> }
>>
>> void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute,
>> - DIEEntry *Entry) {
>> + DIEEntry Entry) {
>> const DIE *DieCU = Die.getUnitOrNull();
>> - const DIE *EntryCU = Entry->getEntry().getUnitOrNull();
>> + const DIE *EntryCU = Entry.getEntry().getUnitOrNull();
>> if (!DieCU)
>> // We assume that Die belongs to this CU, if it is not linked to any CU yet.
>> DieCU = &getUnitDie();
>> @@ -471,7 +460,7 @@ void DwarfUnit::addBlockByrefAddress(con
>>
>> // Decode the original location, and use that as the start of the byref
>> // variable's location.
>> - DIELoc *Loc = new (DIEValueAllocator) DIELoc();
>> + DIELoc *Loc = new (DIEValueAllocator) DIELoc;
>>
>> bool validReg;
>> if (Location.isReg())
>> @@ -588,7 +577,7 @@ static uint64_t getBaseTypeSize(DwarfDeb
>>
>> void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) {
>> assert(MO.isFPImm() && "Invalid machine operand!");
>> - DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
>> + DIEBlock *Block = new (DIEValueAllocator) DIEBlock;
>> APFloat FPImm = MO.getFPImm()->getValueAPF();
>>
>> // Get the raw data form of the floating point.
>> @@ -644,7 +633,7 @@ void DwarfUnit::addConstantValue(DIE &Di
>> return;
>> }
>>
>> - DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
>> + DIEBlock *Block = new (DIEValueAllocator) DIEBlock;
>>
>> // Get the raw data form of the large APInt.
>> const uint64_t *Ptr64 = Val.getRawData();
>> @@ -777,22 +766,7 @@ void DwarfUnit::updateAcceleratorTables(
>> void DwarfUnit::addType(DIE &Entity, const DIType *Ty,
>> dwarf::Attribute Attribute) {
>> assert(Ty && "Trying to add a type that doesn't exist?");
>> -
>> - // Check for pre-existence.
>> - DIEEntry *Entry = getDIEEntry(Ty);
>> - // If it exists then use the existing value.
>> - if (Entry) {
>> - addDIEEntry(Entity, Attribute, Entry);
>> - return;
>> - }
>> -
>> - // Construct type.
>> - DIE *Buffer = getOrCreateTypeDIE(Ty);
>> -
>> - // Set up proxy.
>> - Entry = createDIEEntry(*Buffer);
>> - insertDIEEntry(Ty, Entry);
>> - addDIEEntry(Entity, Attribute, Entry);
>> + addDIEEntry(Entity, Attribute, DIEEntry(*getOrCreateTypeDIE(Ty)));
>> }
>>
>> std::string DwarfUnit::getParentContextString(const DIScope *Context) const {
>> @@ -969,12 +943,6 @@ void DwarfUnit::constructTypeDIE(DIE &Bu
>> if (unsigned PropertyAttributes = Property->getAttributes())
>> addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None,
>> PropertyAttributes);
>> -
>> - DIEEntry *Entry = getDIEEntry(Element);
>> - if (!Entry) {
>> - Entry = createDIEEntry(ElemDie);
>> - insertDIEEntry(Element, Entry);
>> - }
>> }
>> }
>>
>> @@ -1061,7 +1029,7 @@ void DwarfUnit::constructTemplateValuePa
>> else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {
>> // For declaration non-type template parameters (such as global values and
>> // functions)
>> - DIELoc *Loc = new (DIEValueAllocator) DIELoc();
>> + DIELoc *Loc = new (DIEValueAllocator) DIELoc;
>> addOpAddress(*Loc, Asm->getSymbol(GV));
>> // Emit DW_OP_stack_value to use the address as the immediate value of the
>> // parameter, rather than a pointer to it.
>> @@ -1354,7 +1322,7 @@ void DwarfUnit::constructMemberDIE(DIE &
>> // expression to extract appropriate offset from vtable.
>> // BaseAddr = ObAddr + *((*ObAddr) - Offset)
>>
>> - DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc();
>> + DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc;
>> addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
>> addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
>> addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
>> @@ -1393,7 +1361,7 @@ void DwarfUnit::constructMemberDIE(DIE &
>> OffsetInBytes = DT->getOffsetInBits() >> 3;
>>
>> if (DD->getDwarfVersion() <= 2) {
>> - DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc();
>> + DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc;
>> addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
>> addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes);
>> addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie);
>> @@ -1417,10 +1385,10 @@ void DwarfUnit::constructMemberDIE(DIE &
>> dwarf::DW_VIRTUALITY_virtual);
>>
>> // Objective-C properties.
>> - if (MDNode *PNode = DT->getObjCProperty())
>> - if (DIEEntry *PropertyDie = getDIEEntry(PNode))
>> + if (DINode *PNode = DT->getObjCProperty())
>> + if (DIE *PDie = getDIE(PNode))
>> MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
>> - PropertyDie);
>> + 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=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h Wed May 27 17:14:58 2015
>> @@ -93,10 +93,6 @@ protected:
>> /// information entries.
>> DenseMap<const MDNode *, DIE *> MDNodeToDieMap;
>>
>> - /// Tracks the mapping of unit level debug information descriptors to debug
>> - /// information entries using a DIEEntry proxy.
>> - DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap;
>> -
>> /// A list of all the DIEBlocks in use.
>> std::vector<DIEBlock *> DIEBlocks;
>>
>> @@ -111,9 +107,6 @@ protected:
>> // All DIEValues are allocated through this allocator.
>> BumpPtrAllocator DIEValueAllocator;
>>
>> - // A preallocated DIEValue because 1 is used frequently.
>> - DIEInteger *DIEIntegerOne;
>> -
>> /// The section this unit will be emitted in.
>> MCSection *Section;
>>
>> @@ -180,7 +173,7 @@ public:
>> DIE *getDIE(const DINode *D) const;
>>
>> /// \brief Returns a fresh newly allocated DIELoc.
>> - DIELoc *getDIELoc() { return new (DIEValueAllocator) DIELoc(); }
>> + DIELoc *getDIELoc() { return new (DIEValueAllocator) DIELoc; }
>>
>> /// \brief Insert DIE into the map.
>> ///
>> @@ -233,7 +226,7 @@ public:
>> void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry);
>>
>> /// \brief Add a DIE attribute data and value.
>> - void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIEEntry *Entry);
>> + void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIEEntry Entry);
>>
>> void addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type);
>>
>> @@ -369,26 +362,12 @@ private:
>> /// If the DWARF version doesn't handle the language, return -1.
>> int64_t getDefaultLowerBound() const;
>>
>> - /// \brief Returns the DIE entry for the specified debug variable.
>> - DIEEntry *getDIEEntry(const MDNode *N) const {
>> - return MDNodeToDIEEntryMap.lookup(N);
>> - }
>> -
>> - /// \brief Insert debug information entry into the map.
>> - void insertDIEEntry(const MDNode *N, DIEEntry *E) {
>> - MDNodeToDIEEntryMap.insert(std::make_pair(N, E));
>> - }
>> -
>> /// \brief Get an anonymous type for index type.
>> DIE *getIndexTyDie();
>>
>> /// \brief Set D as anonymous type for index which can be reused later.
>> void setIndexTyDie(DIE *D) { IndexTyDie = D; }
>>
>> - /// \brief Creates a new DIEEntry to be a proxy for a debug information
>> - /// entry.
>> - DIEEntry *createDIEEntry(DIE &Entry);
>> -
>> /// If this is a named finished type then include it in the list of types for
>> /// the accelerator tables.
>> void updateAcceleratorTables(const DIScope *Context, const DIType *Ty,
>>
>> Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)
>> +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Wed May 27 17:14:58 2015
>> @@ -60,6 +60,30 @@ using HalfOpenIntervalMap =
>>
>> typedef HalfOpenIntervalMap<uint64_t, int64_t> FunctionIntervals;
>>
>> +// FIXME: Delete this structure once DIE::Values has a stable iterator we can
>> +// use instead.
>> +struct PatchLocation {
>> + DIE *Die;
>> + unsigned Index;
>> +
>> + PatchLocation() : Die(nullptr), Index(0) {}
>> + PatchLocation(DIE &Die, unsigned Index) : Die(&Die), Index(Index) {}
>> +
>> + void set(uint64_t New) const {
>> + assert(Die);
>> + assert(Index < Die->getValues().size());
>> + assert(Die->getValues()[Index].getType() == DIEValue::isInteger);
>> + Die->setValue(Index, DIEInteger(New));
>> + }
>> +
>> + uint64_t get() const {
>> + assert(Die);
>> + assert(Index < Die->getValues().size());
>> + assert(Die->getValues()[Index].getType() == DIEValue::isInteger);
>> + return Die->getValues()[Index].getDIEInteger().getValue();
>> + }
>> +};
>> +
>> /// \brief Stores all information relating to a compile unit, be it in
>> /// its original instance in the object file to its brand new cloned
>> /// and linked DIE tree.
>> @@ -76,7 +100,7 @@ public:
>>
>> CompileUnit(DWARFUnit &OrigUnit, unsigned ID)
>> : OrigUnit(OrigUnit), ID(ID), LowPc(UINT64_MAX), HighPc(0), RangeAlloc(),
>> - Ranges(RangeAlloc), UnitRangeAttribute(nullptr) {
>> + Ranges(RangeAlloc) {
>> Info.resize(OrigUnit.getNumDIEs());
>> }
>>
>> @@ -106,13 +130,15 @@ public:
>> uint64_t getLowPc() const { return LowPc; }
>> uint64_t getHighPc() const { return HighPc; }
>>
>> - DIEInteger *getUnitRangesAttribute() const { return UnitRangeAttribute; }
>> + Optional<PatchLocation> getUnitRangesAttribute() const {
>> + return UnitRangeAttribute;
>> + }
>> const FunctionIntervals &getFunctionRanges() const { return Ranges; }
>> - const std::vector<DIEInteger *> &getRangesAttributes() const {
>> + const std::vector<PatchLocation> &getRangesAttributes() const {
>> return RangeAttributes;
>> }
>>
>> - const std::vector<std::pair<DIEInteger *, int64_t>> &
>> + const std::vector<std::pair<PatchLocation, int64_t>> &
>> getLocationAttributes() const {
>> return LocationAttributes;
>> }
>> @@ -127,7 +153,7 @@ public:
>> /// RefUnit by \p Attr. The attribute should be fixed up later to
>> /// point to the absolute offset of \p Die in the debug_info section.
>> void noteForwardReference(DIE *Die, const CompileUnit *RefUnit,
>> - DIEInteger *Attr);
>> + PatchLocation Attr);
>>
>> /// \brief Apply all fixups recored by noteForwardReference().
>> void fixupForwardReferences();
>> @@ -138,11 +164,11 @@ public:
>>
>> /// \brief Keep track of a DW_AT_range attribute that we will need to
>> /// patch up later.
>> - void noteRangeAttribute(const DIE &Die, DIEInteger *Attr);
>> + void noteRangeAttribute(const DIE &Die, PatchLocation Attr);
>>
>> /// \brief Keep track of a location attribute pointing to a location
>> /// list in the debug_loc section.
>> - void noteLocationAttribute(DIEInteger *Attr, int64_t PcOffset);
>> + void noteLocationAttribute(PatchLocation Attr, int64_t PcOffset);
>>
>> /// \brief Add a name accelerator entry for \p Die with \p Name
>> /// which is stored in the string table at \p Offset.
>> @@ -186,7 +212,7 @@ private:
>> /// The offsets for the attributes in this array couldn't be set while
>> /// cloning because for cross-cu forward refences the target DIE's
>> /// offset isn't known you emit the reference attribute.
>> - std::vector<std::tuple<DIE *, const CompileUnit *, DIEInteger *>>
>> + std::vector<std::tuple<DIE *, const CompileUnit *, PatchLocation>>
>> ForwardDIEReferences;
>>
>> FunctionIntervals::Allocator RangeAlloc;
>> @@ -198,15 +224,15 @@ private:
>> /// \brief DW_AT_ranges attributes to patch after we have gathered
>> /// all the unit's function addresses.
>> /// @{
>> - std::vector<DIEInteger *> RangeAttributes;
>> - DIEInteger *UnitRangeAttribute;
>> + std::vector<PatchLocation> RangeAttributes;
>> + Optional<PatchLocation> UnitRangeAttribute;
>> /// @}
>>
>> /// \brief Location attributes that need to be transfered from th
>> /// original debug_loc section to the liked one. They are stored
>> /// along with the PC offset that is to be applied to their
>> /// function's address.
>> - std::vector<std::pair<DIEInteger *, int64_t>> LocationAttributes;
>> + std::vector<std::pair<PatchLocation, int64_t>> LocationAttributes;
>>
>> /// \brief Accelerator entries for the unit, both for the pub*
>> /// sections and the apple* ones.
>> @@ -229,7 +255,7 @@ uint64_t CompileUnit::computeNextUnitOff
>> /// \brief Keep track of a forward cross-cu reference from this unit
>> /// to \p Die that lives in \p RefUnit.
>> void CompileUnit::noteForwardReference(DIE *Die, const CompileUnit *RefUnit,
>> - DIEInteger *Attr) {
>> + PatchLocation Attr) {
>> ForwardDIEReferences.emplace_back(Die, RefUnit, Attr);
>> }
>>
>> @@ -238,9 +264,9 @@ void CompileUnit::fixupForwardReferences
>> for (const auto &Ref : ForwardDIEReferences) {
>> DIE *RefDie;
>> const CompileUnit *RefUnit;
>> - DIEInteger *Attr;
>> + PatchLocation Attr;
>> std::tie(RefDie, RefUnit, Attr) = Ref;
>> - Attr->setValue(RefDie->getOffset() + RefUnit->getStartOffset());
>> + Attr.set(RefDie->getOffset() + RefUnit->getStartOffset());
>> }
>> }
>>
>> @@ -251,14 +277,14 @@ void CompileUnit::addFunctionRange(uint6
>> this->HighPc = std::max(HighPc, FuncHighPc + PcOffset);
>> }
>>
>> -void CompileUnit::noteRangeAttribute(const DIE &Die, DIEInteger *Attr) {
>> +void CompileUnit::noteRangeAttribute(const DIE &Die, PatchLocation Attr) {
>> if (Die.getTag() != dwarf::DW_TAG_compile_unit)
>> RangeAttributes.push_back(Attr);
>> else
>> UnitRangeAttribute = Attr;
>> }
>>
>> -void CompileUnit::noteLocationAttribute(DIEInteger *Attr, int64_t PcOffset) {
>> +void CompileUnit::noteLocationAttribute(PatchLocation Attr, int64_t PcOffset) {
>> LocationAttributes.emplace_back(Attr, PcOffset);
>> }
>>
>> @@ -717,8 +743,7 @@ void DwarfStreamer::emitUnitRangesEntrie
>> /// point to the new entries.
>> void DwarfStreamer::emitLocationsForUnit(const CompileUnit &Unit,
>> DWARFContext &Dwarf) {
>> - const std::vector<std::pair<DIEInteger *, int64_t>> &Attributes =
>> - Unit.getLocationAttributes();
>> + const auto &Attributes = Unit.getLocationAttributes();
>>
>> if (Attributes.empty())
>> return;
>> @@ -737,8 +762,8 @@ void DwarfStreamer::emitLocationsForUnit
>> UnitPcOffset = int64_t(OrigLowPc) - Unit.getLowPc();
>>
>> for (const auto &Attr : Attributes) {
>> - uint32_t Offset = Attr.first->getValue();
>> - Attr.first->setValue(LocSectionSize);
>> + uint32_t Offset = Attr.first.get();
>> + Attr.first.set(LocSectionSize);
>> // This is the quantity to add to the old location address to get
>> // the correct address for the new one.
>> int64_t LocPcOffset = Attr.second + UnitPcOffset;
>> @@ -1760,7 +1785,7 @@ unsigned DwarfLinker::cloneStringAttribu
>> const char *String = *Val.getAsCString(&U);
>> unsigned Offset = StringPool.getStringOffset(String);
>> Die.addValue(dwarf::Attribute(AttrSpec.Attr), dwarf::DW_FORM_strp,
>> - new (DIEAlloc) DIEInteger(Offset));
>> + DIEInteger(Offset));
>> return 4;
>> }
>>
>> @@ -1803,24 +1828,25 @@ unsigned DwarfLinker::cloneDieReferenceA
>> // to find the unit offset. (We don't have a DwarfDebug)
>> // FIXME: we should be able to design DIEEntry reliance on
>> // DwarfDebug away.
>> - DIEInteger *Attr;
>> + uint64_t Attr;
>> if (Ref < InputDIE.getOffset()) {
>> // We must have already cloned that DIE.
>> uint32_t NewRefOffset =
>> RefUnit->getStartOffset() + NewRefDie->getOffset();
>> - Attr = new (DIEAlloc) DIEInteger(NewRefOffset);
>> + Attr = NewRefOffset;
>> } else {
>> // A forward reference. Note and fixup later.
>> - Attr = new (DIEAlloc) DIEInteger(0xBADDEF);
>> - Unit.noteForwardReference(NewRefDie, RefUnit, Attr);
>> + Attr = 0xBADDEF;
>> + Unit.noteForwardReference(NewRefDie, RefUnit,
>> + PatchLocation(Die, Die.getValues().size()));
>> }
>> Die.addValue(dwarf::Attribute(AttrSpec.Attr), dwarf::DW_FORM_ref_addr,
>> - Attr);
>> + DIEInteger(Attr));
>> return AttrSize;
>> }
>>
>> Die.addValue(dwarf::Attribute(AttrSpec.Attr), dwarf::Form(AttrSpec.Form),
>> - new (DIEAlloc) DIEEntry(*NewRefDie));
>> + DIEEntry(*NewRefDie));
>> return AttrSize;
>> }
>>
>> @@ -1831,23 +1857,23 @@ unsigned DwarfLinker::cloneBlockAttribut
>> const DWARFFormValue &Val,
>> unsigned AttrSize) {
>> DIE *Attr;
>> - DIEValue *Value;
>> + DIEValue Value;
>> DIELoc *Loc = nullptr;
>> DIEBlock *Block = nullptr;
>> // Just copy the block data over.
>> if (AttrSpec.Form == dwarf::DW_FORM_exprloc) {
>> - Loc = new (DIEAlloc) DIELoc();
>> + Loc = new (DIEAlloc) DIELoc;
>> DIELocs.push_back(Loc);
>> } else {
>> - Block = new (DIEAlloc) DIEBlock();
>> + Block = new (DIEAlloc) DIEBlock;
>> DIEBlocks.push_back(Block);
>> }
>> Attr = Loc ? static_cast<DIE *>(Loc) : static_cast<DIE *>(Block);
>> - Value = Loc ? static_cast<DIEValue *>(Loc) : static_cast<DIEValue *>(Block);
>> + Value = Loc ? DIEValue(Loc) : DIEValue(Block);
>> ArrayRef<uint8_t> Bytes = *Val.getAsBlock();
>> for (auto Byte : Bytes)
>> Attr->addValue(static_cast<dwarf::Attribute>(0), dwarf::DW_FORM_data1,
>> - new (DIEAlloc) DIEInteger(Byte));
>> + 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()).
>> @@ -1893,8 +1919,7 @@ unsigned DwarfLinker::cloneAddressAttrib
>> }
>>
>> Die.addValue(static_cast<dwarf::Attribute>(AttrSpec.Attr),
>> - static_cast<dwarf::Form>(AttrSpec.Form),
>> - new (DIEAlloc) DIEInteger(Addr));
>> + static_cast<dwarf::Form>(AttrSpec.Form), DIEInteger(Addr));
>> return Unit.getOrigUnit().getAddressByteSize();
>> }
>>
>> @@ -1922,15 +1947,16 @@ unsigned DwarfLinker::cloneScalarAttribu
>> &Unit.getOrigUnit(), &InputDIE);
>> return 0;
>> }
>> - DIEInteger *Attr = new (DIEAlloc) DIEInteger(Value);
>> + DIEInteger Attr(Value);
>> if (AttrSpec.Attr == dwarf::DW_AT_ranges)
>> - Unit.noteRangeAttribute(Die, Attr);
>> + Unit.noteRangeAttribute(Die, PatchLocation(Die, Die.getValues().size()));
>> // 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(Attr, Info.PCOffset);
>> + Unit.noteLocationAttribute(PatchLocation(Die, Die.getValues().size()),
>> + Info.PCOffset);
>> else if (AttrSpec.Attr == dwarf::DW_AT_declaration && Value)
>> Info.IsDeclaration = true;
>>
>> @@ -2213,8 +2239,8 @@ void DwarfLinker::patchRangesForUnit(con
>> UnitPcOffset = int64_t(OrigLowPc) - Unit.getLowPc();
>>
>> for (const auto &RangeAttribute : Unit.getRangesAttributes()) {
>> - uint32_t Offset = RangeAttribute->getValue();
>> - RangeAttribute->setValue(Streamer->getRangesSectionSize());
>> + uint32_t Offset = RangeAttribute.get();
>> + RangeAttribute.set(Streamer->getRangesSectionSize());
>> RangeList.extract(RangeExtractor, &Offset);
>> const auto &Entries = RangeList.getEntries();
>> const DWARFDebugRangeList::RangeListEntry &First = Entries.front();
>> @@ -2241,10 +2267,10 @@ void DwarfLinker::patchRangesForUnit(con
>> /// but for the sake of initial bit-for-bit compatibility with legacy
>> /// dsymutil, we have to do it in a delayed pass.
>> void DwarfLinker::generateUnitRanges(CompileUnit &Unit) const {
>> - DIEInteger *Attr = Unit.getUnitRangesAttribute();
>> + auto Attr = Unit.getUnitRangesAttribute();
>> if (Attr)
>> - Attr->setValue(Streamer->getRangesSectionSize());
>> - Streamer->emitUnitRangesEntries(Unit, Attr != nullptr);
>> + Attr->set(Streamer->getRangesSectionSize());
>> + Streamer->emitUnitRangesEntries(Unit, static_cast<bool>(Attr));
>> }
>>
>> /// \brief Insert the new line info sequence \p Seq into the current
>> @@ -2301,9 +2327,8 @@ void DwarfLinker::patchLineTableForUnit(
>> return AbbrevData.getAttribute() == dwarf::DW_AT_stmt_list;
>> });
>> assert(Stmt < Abbrev.end() && "Didn't find DW_AT_stmt_list in cloned DIE!");
>> - DIEInteger *StmtAttr =
>> - cast<DIEInteger>(OutputDIE->getValues()[Stmt - Abbrev.begin()]);
>> - StmtAttr->setValue(Streamer->getLineSectionSize());
>> + OutputDIE->setValue(Stmt - Abbrev.begin(),
>> + DIEInteger(Streamer->getLineSectionSize()));
>> }
>>
>> // Parse the original line info for the unit.
>>
>> Modified: llvm/trunk/unittests/CodeGen/DIEHashTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/DIEHashTest.cpp?rev=238362&r1=238361&r2=238362&view=diff
>> ==============================================================================
>> --- llvm/trunk/unittests/CodeGen/DIEHashTest.cpp (original)
>> +++ llvm/trunk/unittests/CodeGen/DIEHashTest.cpp Wed May 27 17:14:58 2015
>> @@ -36,7 +36,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(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Size);
>> uint64_t MD5Res = Hash.computeTypeSignature(Die);
>> ASSERT_EQ(0x1AFE116E83701108ULL, MD5Res);
>> }
>> @@ -45,11 +45,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(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(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, One);
>> + Unnamed.addValue(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 +61,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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> + Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>>
>> uint64_t MD5Res = DIEHash().computeTypeSignature(Foo);
>>
>> @@ -77,15 +77,15 @@ 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(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(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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> + Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>>
>> DIE &N = *Foo;
>> Space->addChild(std::move(Foo));
>> @@ -101,24 +101,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(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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr);
>> + Int.addValue(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(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(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);
>> + Zero);
>> + Member->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef);
>>
>> Unnamed.addChild(std::move(Member));
>>
>> @@ -131,34 +131,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(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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, IntStr);
>> + Int.addValue(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(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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, Mem1Str);
>> DIEInteger Zero(0);
>> Mem1->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> - &Zero);
>> - Mem1->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &IntRef);
>> + Zero);
>> + Mem1->addValue(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_name, dwarf::DW_FORM_strp, Mem2Str);
>> Mem2->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> - &Four);
>> - Mem2->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &IntRef);
>> + Four);
>> + Mem2->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IntRef);
>>
>> Unnamed.addChild(std::move(Mem2));
>>
>> @@ -171,15 +171,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(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(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(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(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 +193,23 @@ 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(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(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(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(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(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(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(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooPtrRef);
>>
>> Foo.addChild(std::move(Mem));
>>
>> @@ -222,27 +222,27 @@ 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(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(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(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(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(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(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(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(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef);
>>
>> Foo.addChild(std::move(Mem));
>>
>> @@ -255,27 +255,27 @@ 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(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(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(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(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(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(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(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(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, FooRefConstRef);
>>
>> Foo.addChild(std::move(Mem));
>>
>> @@ -288,24 +288,24 @@ 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(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(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(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(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_type, dwarf::DW_FORM_ref4, FooEntry);
>> PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
>> - &FooEntry);
>> + FooEntry);
>>
>> DIEEntry PtrToFooMemRef(PtrToFooMem);
>> - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef);
>> + Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef);
>>
>> Foo.addChild(std::move(Mem));
>>
>> @@ -329,27 +329,27 @@ 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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> + Bar.addValue(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(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> + Foo.addValue(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_name, dwarf::DW_FORM_strp, MemStr);
>> Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> - &Zero);
>> + 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_type, dwarf::DW_FORM_ref4, BarEntry);
>> DIEEntry FooEntry(Foo);
>> PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
>> - &FooEntry);
>> + FooEntry);
>>
>> DIEEntry PtrToFooMemRef(PtrToFooMem);
>> - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef);
>> + Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef);
>>
>> Foo.addChild(std::move(Mem));
>>
>> @@ -358,27 +358,27 @@ 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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> + Bar.addValue(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(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> + Foo.addValue(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_name, dwarf::DW_FORM_strp, MemStr);
>> Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> - &Zero);
>> + 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_type, dwarf::DW_FORM_ref4, BarEntry);
>> DIEEntry FooEntry(Foo);
>> PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
>> - &FooEntry);
>> + FooEntry);
>>
>> DIEEntry PtrToFooMemRef(PtrToFooMem);
>> - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef);
>> + Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef);
>>
>> Foo.addChild(std::move(Mem));
>>
>> @@ -402,26 +402,26 @@ 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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> + Bar.addValue(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(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> + Foo.addValue(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_name, dwarf::DW_FORM_strp, MemStr);
>> Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> - &Zero);
>> + 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_type, dwarf::DW_FORM_ref4, BarEntry);
>> PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
>> - &BarEntry);
>> + BarEntry);
>>
>> DIEEntry PtrToFooMemRef(PtrToFooMem);
>> - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef);
>> + Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef);
>>
>> Foo.addChild(std::move(Mem));
>>
>> @@ -430,26 +430,26 @@ 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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, BarStr);
>> + Bar.addValue(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(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> + Foo.addValue(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_name, dwarf::DW_FORM_strp, MemStr);
>> Mem->addValue(dwarf::DW_AT_data_member_location, dwarf::DW_FORM_data1,
>> - &Zero);
>> + 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_type, dwarf::DW_FORM_ref4, BarEntry);
>> PtrToFooMem.addValue(dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
>> - &BarEntry);
>> + BarEntry);
>>
>> DIEEntry PtrToFooMemRef(PtrToFooMem);
>> - Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, &PtrToFooMemRef);
>> + Mem->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, PtrToFooMemRef);
>>
>> Foo.addChild(std::move(Mem));
>>
>> @@ -473,23 +473,23 @@ 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(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(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, Eight);
>> + Foo.addValue(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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, MemStr);
>> + Mem->addValue(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(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(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(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, UnnamedPtrRef);
>>
>> Foo.addChild(std::move(Mem));
>>
>> @@ -502,12 +502,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(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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FooStr);
>> + Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, One);
>>
>> Unnamed.addChild(std::move(Foo));
>>
>> @@ -521,11 +521,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(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(dwarf::DW_AT_name, dwarf::DW_FORM_strp, FuncStr);
>>
>> Unnamed.addChild(std::move(Func));
>>
>> @@ -542,21 +542,21 @@ 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(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);
>>
>> 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(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);
>>
>> A.addChild(std::move(Func));
>>
>> @@ -575,35 +575,35 @@ 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(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);
>>
>> 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(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);
>>
>> 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(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(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);
>>
>> A.addChild(std::move(PI));
>>
>> @@ -620,32 +620,32 @@ 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(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);
>>
>> 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(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);
>>
>> 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(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(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);
>>
>> DIEBlock PIBlock;
>> DIEInteger Blk1(0xc3);
>> @@ -653,10 +653,10 @@ 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((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);
>>
>> PI->addValue(dwarf::DW_AT_const_value, dwarf::DW_FORM_block1, &PIBlock);
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list