#endif
};
+//===--------------------------------------------------------------------===//
+/// DIEValue - A debug information entry value. Some of these roughly correlate
+/// to DWARF attribute classes.
+///
+class DIEValue {
+public:
+ enum Type {
+ isInteger,
+ isString,
+ isExpr,
+ isLabel,
+ isDelta,
+ isEntry,
+ isTypeSignature,
+ isBlock,
+ isLoc,
+ isLocList,
+ };
+
+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 {
+class DIEInteger : public DIEValue {
+ friend DIEValue;
+
uint64_t Integer;
public:
- explicit DIEInteger(uint64_t I) : Integer(I) {}
+ explicit DIEInteger(uint64_t I) : DIEValue(isInteger), Integer(I) {}
/// BestForm - Choose the best form for integer.
///
uint64_t getValue() const { return Integer; }
void setValue(uint64_t Val) { Integer = Val; }
- void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
- unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
+ // 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;
#ifndef NDEBUG
- void print(raw_ostream &O) const;
+ void printImpl(raw_ostream &O) const;
#endif
};
//===--------------------------------------------------------------------===//
/// DIEExpr - An expression DIE.
//
-class DIEExpr {
+class DIEExpr : public DIEValue {
+ friend class DIEValue;
+
const MCExpr *Expr;
public:
- explicit DIEExpr(const MCExpr *E) : Expr(E) {}
+ explicit DIEExpr(const MCExpr *E) : DIEValue(isExpr), Expr(E) {}
/// getValue - Get MCExpr.
///
const MCExpr *getValue() const { return Expr; }
- void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
- unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
+ // 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;
#ifndef NDEBUG
- void print(raw_ostream &O) const;
+ void printImpl(raw_ostream &O) const;
#endif
};
//===--------------------------------------------------------------------===//
/// DIELabel - A label DIE.
//
-class DIELabel {
+class DIELabel : public DIEValue {
+ friend class DIEValue;
+
const MCSymbol *Label;
public:
- explicit DIELabel(const MCSymbol *L) : Label(L) {}
+ explicit DIELabel(const MCSymbol *L) : DIEValue(isLabel), Label(L) {}
/// getValue - Get MCSymbol.
///
const MCSymbol *getValue() const { return Label; }
- void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
- unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
+ // 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;
#ifndef NDEBUG
- void print(raw_ostream &O) const;
+ void printImpl(raw_ostream &O) const;
#endif
};
//===--------------------------------------------------------------------===//
/// DIEDelta - A simple label difference DIE.
///
-class DIEDelta {
+class DIEDelta : public DIEValue {
+ friend class DIEValue;
+
const MCSymbol *LabelHi;
const MCSymbol *LabelLo;
public:
- DIEDelta(const MCSymbol *Hi, const MCSymbol *Lo) : LabelHi(Hi), LabelLo(Lo) {}
+ DIEDelta(const MCSymbol *Hi, const MCSymbol *Lo)
+ : DIEValue(isDelta), LabelHi(Hi), LabelLo(Lo) {}
- void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
- unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
+ // 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;
#ifndef NDEBUG
- void print(raw_ostream &O) const;
+ void printImpl(raw_ostream &O) const;
#endif
};
//===--------------------------------------------------------------------===//
/// DIEString - A container for string values.
///
-class DIEString {
+class DIEString : public DIEValue {
+ friend class DIEValue;
+
DwarfStringPoolEntryRef S;
public:
- DIEString(DwarfStringPoolEntryRef S) : S(S) {}
+ DIEString(DwarfStringPoolEntryRef S) : DIEValue(isString), S(S) {}
/// getString - Grab the string out of the object.
StringRef getString() const { return S.getString(); }
- void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
- unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
+ // 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;
#ifndef NDEBUG
- void print(raw_ostream &O) const;
+ void printImpl(raw_ostream &O) const;
#endif
};
/// this class can also be used as a proxy for a debug information entry not
/// yet defined (ie. types.)
class DIE;
-class DIEEntry {
- DIE *Entry;
+class DIEEntry : public DIEValue {
+ friend class DIEValue;
- DIEEntry() = delete;
+ DIE &Entry;
public:
- explicit DIEEntry(DIE &E) : Entry(&E) {}
+ explicit DIEEntry(DIE &E) : DIEValue(isEntry), 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);
- void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
- unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+ // 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 {
return Form == dwarf::DW_FORM_ref_addr ? getRefAddrSize(AP)
: sizeof(int32_t);
}
#ifndef NDEBUG
- void print(raw_ostream &O) const;
+ void printImpl(raw_ostream &O) const;
#endif
};
//===--------------------------------------------------------------------===//
/// \brief A signature reference to a type unit.
-class DIETypeSignature {
- const DwarfTypeUnit *Unit;
+class DIETypeSignature : public DIEValue {
+ friend class DIEValue;
- DIETypeSignature() = delete;
+ const DwarfTypeUnit &Unit;
public:
- explicit DIETypeSignature(const DwarfTypeUnit &Unit) : Unit(&Unit) {}
+ explicit DIETypeSignature(const DwarfTypeUnit &Unit)
+ : DIEValue(isTypeSignature), Unit(Unit) {}
- void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
- unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+ // \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 {
assert(Form == dwarf::DW_FORM_ref_sig8);
return 8;
}
#ifndef NDEBUG
- void print(raw_ostream &O) const;
+ void printImpl(raw_ostream &O) const;
#endif
};
/// DIELocList - Represents a pointer to a location list in the debug_loc
/// section.
//
-class DIELocList {
+class DIELocList : public DIEValue {
+ friend class DIEValue;
+
// Index into the .debug_loc vector.
size_t Index;
public:
- DIELocList(size_t I) : Index(I) {}
+ DIELocList(size_t I) : DIEValue(isLocList), Index(I) {}
/// getValue - Grab the current index out.
size_t getValue() const { return Index; }
- 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,
- isInteger,
- isString,
- isExpr,
- isLabel,
- isDelta,
- isEntry,
- isTypeSignature,
- isBlock,
- isLoc,
- isLocList,
- };
+ // Implement isa/cast/dyncast.
+ static bool classof(const DIEValue *E) { return E->getType() == isLocList; }
private:
- /// Ty - Type of data stored in the value.
- ///
- Type Ty;
-
- AlignedCharArrayUnion<DIEInteger, DIEString, DIEExpr, DIELabel, DIEDelta *,
- DIEEntry, DIETypeSignature, DIEBlock *, DIELoc *,
- DIELocList> Val;
- static_assert(sizeof(Val) == sizeof(uint64_t),
- "Only small values should be allocated locally");
-
-public:
- DIEValue() : Ty(isNone) {}
- DIEValue(const DIEValue &X) = default;
- DIEValue &operator=(const DIEValue &X) = default;
-
- explicit operator bool() const { return Ty; }
-
-#define CONSTRUCT_FROM_SMALL(Kind) \
- DIEValue(const DIE##Kind &V) : Ty(is##Kind) { \
- static_assert(std::is_trivially_copyable<DIE##Kind>::value, \
- "Expected trivial type"); \
- new (reinterpret_cast<void *>(Val.buffer)) DIE##Kind(V); \
- }
-#define CONSTRUCT_FROM_LARGE(Kind) \
- DIEValue(const DIE##Kind *V) : Ty(is##Kind) { \
- assert(V && "Expected valid value"); \
- *reinterpret_cast<const DIE##Kind **>(Val.buffer) = V; \
- }
- CONSTRUCT_FROM_SMALL(Integer)
- CONSTRUCT_FROM_SMALL(Expr)
- CONSTRUCT_FROM_SMALL(Label)
- CONSTRUCT_FROM_SMALL(Entry)
- CONSTRUCT_FROM_SMALL(TypeSignature)
- CONSTRUCT_FROM_SMALL(LocList)
- CONSTRUCT_FROM_SMALL(String)
- CONSTRUCT_FROM_LARGE(Delta)
- CONSTRUCT_FROM_LARGE(Block)
- CONSTRUCT_FROM_LARGE(Loc)
-#undef CONSTRUCT_FROM_SMALL
-#undef CONSTRUCT_FROM_LARGE
-
- // Accessors
- Type getType() const { return Ty; }
-
-#define GET_VALUE_REF_SMALL(Kind) \
- const DIE##Kind &getDIE##Kind() const { \
- assert(getType() == is##Kind && "Expected " #Kind); \
- return *reinterpret_cast<const DIE##Kind *>(Val.buffer); \
- }
-#define GET_VALUE_REF_LARGE(Kind) \
- const DIE##Kind &getDIE##Kind() const { \
- assert(getType() == is##Kind && "Expected " #Kind); \
- return **reinterpret_cast<const DIE##Kind *const *>(Val.buffer); \
- }
- GET_VALUE_REF_SMALL(Integer)
- GET_VALUE_REF_SMALL(Expr)
- GET_VALUE_REF_SMALL(Label)
- GET_VALUE_REF_SMALL(Entry)
- GET_VALUE_REF_SMALL(TypeSignature)
- GET_VALUE_REF_SMALL(LocList)
- GET_VALUE_REF_SMALL(String)
- GET_VALUE_REF_LARGE(Delta)
- GET_VALUE_REF_LARGE(Block)
- GET_VALUE_REF_LARGE(Loc)
-#undef GET_VALUE_REF_SMALL
-#undef GET_VALUE_REF_LARGE
-
- /// 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;
+ void EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const;
+ unsigned SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const;
#ifndef NDEBUG
- void print(raw_ostream &O) const;
- void dump() const;
+ void printImpl(raw_ostream &O) const;
#endif
};
/// Attribute values.
///
- SmallVector<DIEValue, 12> Values;
+ SmallVector<DIEValue *, 12> Values;
protected:
DIE()
const std::vector<std::unique_ptr<DIE>> &getChildren() const {
return Children;
}
- const SmallVectorImpl<DIEValue> &getValues() const { return Values; }
- void setValue(unsigned I, DIEValue New) {
- assert(I < Values.size());
- Values[I] = New;
- }
+ const SmallVectorImpl<DIEValue *> &getValues() const { return Values; }
DIE *getParent() const { return Parent; }
/// Climb up the parent chain to get the compile or type unit DIE this DIE
/// belongs to.
/// 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);
}
Children.push_back(std::move(Child));
}
- /// 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;
+ /// findAttribute - Find a value in the DIE with the attribute given,
+ /// returns NULL if no such attribute exists.
+ DIEValue *findAttribute(dwarf::Attribute Attribute) const;
#ifndef NDEBUG
void print(raw_ostream &O, unsigned IndentCount = 0) const;
//===--------------------------------------------------------------------===//
/// DIELoc - Represents an expression location.
//
-class DIELoc : public DIE {
- mutable unsigned Size; // Size in bytes excluding size header.
+class DIELoc : public DIEValue, public DIE {
+ friend class DIEValue;
+ mutable unsigned Size; // Size in bytes excluding size header.
public:
- DIELoc() : Size(0) {}
+ DIELoc() : DIEValue(isLoc), Size(0) {}
/// ComputeSize - Calculate the size of the location expression.
///
return dwarf::DW_FORM_block;
}
- void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
- unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
+ // 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;
#ifndef NDEBUG
- void print(raw_ostream &O) const;
+ void printImpl(raw_ostream &O) const;
#endif
};
//===--------------------------------------------------------------------===//
/// DIEBlock - Represents a block of values.
//
-class DIEBlock : public DIE {
- mutable unsigned Size; // Size in bytes excluding size header.
+class DIEBlock : public DIEValue, public DIE {
+ friend class DIEValue;
+ mutable unsigned Size; // Size in bytes excluding size header.
public:
- DIEBlock() : Size(0) {}
+ DIEBlock() : DIEValue(isBlock), Size(0) {}
/// ComputeSize - Calculate the size of the location expression.
///
return dwarf::DW_FORM_block;
}
- void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
- unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
+ // 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;
#ifndef NDEBUG
- void print(raw_ostream &O) const;
+ void printImpl(raw_ostream &O) const;
#endif
};
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.
if (isVerbose()) {
OutStreamer->AddComment(dwarf::AttributeString(Attr));
if (Attr == dwarf::DW_AT_accessibility)
- OutStreamer->AddComment(
- dwarf::AccessibilityString(Values[i].getDIEInteger().getValue()));
+ OutStreamer->AddComment(dwarf::AccessibilityString(
+ cast<DIEInteger>(Values[i])->getValue()));
}
// Emit an attribute using the defined form.
- Values[i].EmitValue(this, Form);
+ Values[i]->EmitValue(this, Form);
}
// Emit the DIE children if any.
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
for (size_t i = 0; i < Values.size(); ++i)
if (Abbrevs.getData()[i].getAttribute() == Attribute)
return Values[i];
- return DIEValue();
+ return nullptr;
}
#ifndef NDEBUG
O << " "
<< dwarf::FormEncodingString(Data[i].getForm())
<< " ";
- Values[i].print(O);
+ Values[i]->print(O);
O << "\n";
}
IndentCount -= 2;
void DIEValue::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
switch (Ty) {
- case isNone:
- llvm_unreachable("Expected valid DIEValue");
#define EMIT_VALUE_IMPL(Kind) \
case is##Kind: \
- getDIE##Kind().EmitValue(AP, Form); \
+ cast<DIE##Kind>(this)->EmitValueImpl(AP, Form); \
break;
EMIT_VALUE_IMPL(Integer)
EMIT_VALUE_IMPL(String)
unsigned DIEValue::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
switch (Ty) {
- case isNone:
- llvm_unreachable("Expected valid DIEValue");
#define SIZE_OF_IMPL(Kind) \
case is##Kind: \
- return getDIE##Kind().SizeOf(AP, Form);
+ return cast<DIE##Kind>(this)->SizeOfImpl(AP, Form);
SIZE_OF_IMPL(Integer)
SIZE_OF_IMPL(String)
SIZE_OF_IMPL(Expr)
#ifndef NDEBUG
void DIEValue::print(raw_ostream &O) const {
switch (Ty) {
- case isNone:
- llvm_unreachable("Expected valid DIEValue");
#define PRINT_IMPL(Kind) \
case is##Kind: \
- getDIE##Kind().print(O); \
+ cast<DIE##Kind>(this)->printImpl(O); \
break;
PRINT_IMPL(Integer)
PRINT_IMPL(String)
/// EmitValue - Emit integer of appropriate size.
///
-void DIEInteger::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
+void DIEInteger::EmitValueImpl(const AsmPrinter *Asm, dwarf::Form Form) const {
unsigned Size = ~0U;
switch (Form) {
case dwarf::DW_FORM_flag_present:
/// SizeOf - Determine size of integer value in bytes.
///
-unsigned DIEInteger::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+unsigned DIEInteger::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
switch (Form) {
case dwarf::DW_FORM_flag_present: return 0;
case dwarf::DW_FORM_flag: // Fall thru
}
#ifndef NDEBUG
-void DIEInteger::print(raw_ostream &O) const {
+void DIEInteger::printImpl(raw_ostream &O) const {
O << "Int: " << (int64_t)Integer << " 0x";
O.write_hex(Integer);
}
/// EmitValue - Emit expression value.
///
-void DIEExpr::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
+void DIEExpr::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
AP->OutStreamer->EmitValue(Expr, SizeOf(AP, Form));
}
/// SizeOf - Determine size of expression value in bytes.
///
-unsigned DIEExpr::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+unsigned DIEExpr::SizeOfImpl(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;
}
#ifndef NDEBUG
-void DIEExpr::print(raw_ostream &O) const { O << "Expr: " << *Expr; }
+void DIEExpr::printImpl(raw_ostream &O) const { O << "Expr: " << *Expr; }
#endif
//===----------------------------------------------------------------------===//
/// EmitValue - Emit label value.
///
-void DIELabel::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
+void DIELabel::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
AP->EmitLabelReference(Label, SizeOf(AP, Form),
Form == dwarf::DW_FORM_strp ||
Form == dwarf::DW_FORM_sec_offset ||
/// SizeOf - Determine size of label value in bytes.
///
-unsigned DIELabel::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+unsigned DIELabel::SizeOfImpl(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;
}
#ifndef NDEBUG
-void DIELabel::print(raw_ostream &O) const { O << "Lbl: " << Label->getName(); }
+void DIELabel::printImpl(raw_ostream &O) const {
+ O << "Lbl: " << Label->getName();
+}
#endif
//===----------------------------------------------------------------------===//
/// EmitValue - Emit delta value.
///
-void DIEDelta::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
+void DIEDelta::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
AP->EmitLabelDifference(LabelHi, LabelLo, SizeOf(AP, Form));
}
/// SizeOf - Determine size of delta value in bytes.
///
-unsigned DIEDelta::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+unsigned DIEDelta::SizeOfImpl(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;
}
#ifndef NDEBUG
-void DIEDelta::print(raw_ostream &O) const {
+void DIEDelta::printImpl(raw_ostream &O) const {
O << "Del: " << LabelHi->getName() << "-" << LabelLo->getName();
}
#endif
/// EmitValue - Emit string value.
///
-void DIEString::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
+void DIEString::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
assert(
(Form == dwarf::DW_FORM_strp || Form == dwarf::DW_FORM_GNU_str_index) &&
"Expected valid string form");
/// SizeOf - Determine size of delta value in bytes.
///
-unsigned DIEString::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+unsigned DIEString::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
assert(
(Form == dwarf::DW_FORM_strp || Form == dwarf::DW_FORM_GNU_str_index) &&
"Expected valid string form");
}
#ifndef NDEBUG
-void DIEString::print(raw_ostream &O) const {
+void DIEString::printImpl(raw_ostream &O) const {
O << "String: " << S.getString();
}
#endif
/// EmitValue - Emit debug information entry offset.
///
-void DIEEntry::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
+void DIEEntry::EmitValueImpl(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())
else
AP->OutStreamer->EmitIntValue(Addr, DIEEntry::getRefAddrSize(AP));
} else
- AP->EmitInt32(Entry->getOffset());
+ AP->EmitInt32(Entry.getOffset());
}
unsigned DIEEntry::getRefAddrSize(const AsmPrinter *AP) {
}
#ifndef NDEBUG
-void DIEEntry::print(raw_ostream &O) const {
+void DIEEntry::printImpl(raw_ostream &O) const {
O << format("Die: 0x%lx", (long)(intptr_t)&Entry);
}
#endif
//===----------------------------------------------------------------------===//
// DIETypeSignature Implementation
//===----------------------------------------------------------------------===//
-void DIETypeSignature::EmitValue(const AsmPrinter *Asm,
- dwarf::Form Form) const {
+void DIETypeSignature::EmitValueImpl(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::print(raw_ostream &O) const {
- O << format("Type Unit: 0x%lx", Unit->getTypeSignature());
+void DIETypeSignature::printImpl(raw_ostream &O) const {
+ O << format("Type Unit: 0x%lx", Unit.getTypeSignature());
}
#endif
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;
/// EmitValue - Emit location data.
///
-void DIELoc::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
+void DIELoc::EmitValueImpl(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;
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::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+unsigned DIELoc::SizeOfImpl(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);
}
#ifndef NDEBUG
-void DIELoc::print(raw_ostream &O) const {
+void DIELoc::printImpl(raw_ostream &O) const {
O << "ExprLoc: ";
DIE::print(O, 5);
}
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;
/// EmitValue - Emit block data.
///
-void DIEBlock::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
+void DIEBlock::EmitValueImpl(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;
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::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+unsigned DIEBlock::SizeOfImpl(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);
}
#ifndef NDEBUG
-void DIEBlock::print(raw_ostream &O) const {
+void DIEBlock::printImpl(raw_ostream &O) const {
O << "Blk: ";
DIE::print(O, 5);
}
// DIELocList Implementation
//===----------------------------------------------------------------------===//
-unsigned DIELocList::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
+unsigned DIELocList::SizeOfImpl(const AsmPrinter *AP, dwarf::Form Form) const {
if (Form == dwarf::DW_FORM_data4)
return 4;
if (Form == dwarf::DW_FORM_sec_offset)
/// EmitValue - Emit label value.
///
-void DIELocList::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
+void DIELocList::EmitValueImpl(const AsmPrinter *AP, dwarf::Form Form) const {
DwarfDebug *DD = AP->getDwarfDebug();
MCSymbol *Label = DD->getDebugLocs().getList(Index).Label;
}
#ifndef NDEBUG
-void DIELocList::print(raw_ostream &O) const { O << "LocList: " << Index; }
+void DIELocList::printImpl(raw_ostream &O) const {
+ O << "LocList: " << Index;
+
+}
#endif
/// \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 auto &Values = Die.getValues();
+ const SmallVectorImpl<DIEValue *> &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)
- return Values[i].getDIEString().getString();
+ 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();
+ }
}
return StringRef("");
}
// 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) \
// 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 (auto I = Values.begin(), E = Values.end(); I != E; ++I)
- Hash.update((uint64_t)I->getDIEInteger().getValue());
+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());
}
// Hash the contents of a loclistptr class.
// 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();
// computation is limited to the following: DW_FORM_sdata, DW_FORM_flag,
// DW_FORM_string, and DW_FORM_block.
- switch (Value.getType()) {
- case DIEValue::isNone:
- llvm_unreachable("Expected valid DIEValue");
-
+ switch (Value->getType()) {
// 7.27 Step 3
// ... An attribute that refers to another type entry T is processed as
// follows:
case DIEValue::isEntry:
- hashDIEEntry(Attribute, Tag, Value.getDIEEntry().getEntry());
+ hashDIEEntry(Attribute, Tag, cast<DIEEntry>(Value)->getEntry());
break;
case DIEValue::isInteger: {
addULEB128('A');
case dwarf::DW_FORM_udata:
case dwarf::DW_FORM_sdata:
addULEB128(dwarf::DW_FORM_sdata);
- addSLEB128((int64_t)Value.getDIEInteger().getValue());
+ addSLEB128((int64_t)cast<DIEInteger>(Value)->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)Value.getDIEInteger().getValue());
+ addULEB128((int64_t)cast<DIEInteger>(Value)->getValue());
break;
default:
llvm_unreachable("Unknown integer form!");
addULEB128('A');
addULEB128(Attribute);
addULEB128(dwarf::DW_FORM_string);
- addString(Value.getDIEString().getString());
+ addString(cast<DIEString>(Value)->getString());
break;
case DIEValue::isBlock:
case DIEValue::isLoc:
addULEB128('A');
addULEB128(Attribute);
addULEB128(dwarf::DW_FORM_block);
- 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());
+ 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());
} 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(Value.getDIELocList());
+ hashLocList(*cast<DIELocList>(Value));
}
break;
// FIXME: It's uncertain whether or not we should handle this at the moment.
void DIEHash::hashAttributes(const DIEAttrs &Attrs, dwarf::Tag Tag) {
#define ADD_ATTR(ATTR) \
{ \
- if (ATTR.Val) \
+ if (ATTR.Val != 0) \
hashAttribute(ATTR, Tag); \
}
// The entry for a particular attribute.
struct AttrEntry {
- DIEValue Val;
+ const DIEValue *Val;
const DIEAbbrevData *Desc;
};
/// \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);
DD->addArangeLabel(SymbolCU(this, Label));
unsigned idx = DD->getAddressPool().getIndex(Label);
- Die.addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, DIEInteger(idx));
+ DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
+ Die.addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
}
void DwarfCompileUnit::addLocalLabelAddress(DIE &Die,
DD->addArangeLabel(SymbolCU(this, Label));
Die.addValue(Attribute, dwarf::DW_FORM_addr,
- Label ? DIEValue(DIELabel(Label)) : DIEValue(DIEInteger(0)));
+ Label ? (DIEValue *)new (DIEValueAllocator) DIELabel(Label)
+ : new (DIEValueAllocator) DIEInteger(0));
}
unsigned DwarfCompileUnit::getOrCreateSourceID(StringRef FileName,
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.
} 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));
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,
- new (DIEValueAllocator) DIEDelta(Hi, Lo));
+ Value);
}
void DwarfCompileUnit::addScopeRangeList(DIE &ScopeDIE,
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;
/// 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())
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();
/// 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, DIELocList(Index));
+ Die.addValue(Attribute, Form, Value);
}
void DwarfCompileUnit::applyVariableAttributes(const DbgVariable &Var,
/// Add a Dwarf expression attribute data and value.
void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form,
const MCExpr *Expr) {
- Die.addValue((dwarf::Attribute)0, Form, DIEExpr(Expr));
+ DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
+ Die.addValue((dwarf::Attribute)0, Form, Value);
}
void DwarfCompileUnit::applySubprogramAttributesToDefinition(
// We could have a specification DIE that has our most of our knowledge,
// look for that now.
- if (DIEValue SpecVal = Die->findAttribute(dwarf::DW_AT_specification)) {
- DIE &SpecDIE = SpecVal.getDIEEntry().getEntry();
+ DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
+ if (SpecVal) {
+ DIE &SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
if (SpecDIE.findAttribute(dwarf::DW_AT_external))
Linkage = dwarf::GIEL_EXTERNAL;
} else if (Die->findAttribute(dwarf::DW_AT_external))
// 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();
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,
DIELocs[j]->~DIELoc();
}
+DIEEntry *DwarfUnit::createDIEEntry(DIE &Entry) {
+ DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
+ return Value;
+}
+
int64_t DwarfUnit::getDefaultLowerBound() const {
switch (getLanguage()) {
default:
void DwarfUnit::addFlag(DIE &Die, dwarf::Attribute Attribute) {
if (DD->getDwarfVersion() >= 4)
- Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEInteger(1));
+ Die.addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
else
- Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEInteger(1));
+ Die.addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
}
void DwarfUnit::addUInt(DIE &Die, dwarf::Attribute Attribute,
Optional<dwarf::Form> Form, uint64_t Integer) {
if (!Form)
Form = DIEInteger::BestForm(false, Integer);
- Die.addValue(Attribute, *Form, DIEInteger(Integer));
+ DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
+ DIEInteger(Integer);
+ Die.addValue(Attribute, *Form, Value);
}
void DwarfUnit::addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer) {
Optional<dwarf::Form> Form, int64_t Integer) {
if (!Form)
Form = DIEInteger::BestForm(true, Integer);
- Die.addValue(Attribute, *Form, DIEInteger(Integer));
+ DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
+ Die.addValue(Attribute, *Form, Value);
}
void DwarfUnit::addSInt(DIELoc &Die, Optional<dwarf::Form> Form,
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) {
- Die.addValue(Attribute, Form, DIELabel(Label));
+ DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
+ Die.addValue(Attribute, Form, Value);
}
void DwarfUnit::addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label) {
void DwarfUnit::addLabelDelta(DIE &Die, dwarf::Attribute Attribute,
const MCSymbol *Hi, const MCSymbol *Lo) {
- Die.addValue(Attribute, dwarf::DW_FORM_data4,
- new (DIEValueAllocator) DIEDelta(Hi, Lo));
+ DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
+ Die.addValue(Attribute, dwarf::DW_FORM_data4, Value);
}
void DwarfUnit::addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry) {
- addDIEEntry(Die, Attribute, DIEEntry(Entry));
+ addDIEEntry(Die, Attribute, createDIEEntry(Entry));
}
void DwarfUnit::addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type) {
addFlag(Die, dwarf::DW_AT_declaration);
Die.addValue(dwarf::DW_AT_signature, dwarf::DW_FORM_ref_sig8,
- DIETypeSignature(Type));
+ new (DIEValueAllocator) 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();
// 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())
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.
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();
void DwarfUnit::addType(DIE &Entity, const DIType *Ty,
dwarf::Attribute Attribute) {
assert(Ty && "Trying to add a type that doesn't exist?");
- addDIEEntry(Entity, Attribute, DIEEntry(*getOrCreateTypeDIE(Ty)));
+
+ // 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);
}
std::string DwarfUnit::getParentContextString(const DIScope *Context) const {
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);
+ }
}
}
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.
// 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);
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);
dwarf::DW_VIRTUALITY_virtual);
// Objective-C properties.
- if (DINode *PNode = DT->getObjCProperty())
- if (DIE *PDie = getDIE(PNode))
+ if (MDNode *PNode = DT->getObjCProperty())
+ if (DIEEntry *PropertyDie = getDIEEntry(PNode))
MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
- DIEEntry(*PDie));
+ PropertyDie);
if (DT->isArtificial())
addFlag(MemberDie, dwarf::DW_AT_artificial);
/// 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;
// 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;
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.
///
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);
/// 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,
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.
CompileUnit(DWARFUnit &OrigUnit, unsigned ID)
: OrigUnit(OrigUnit), ID(ID), LowPc(UINT64_MAX), HighPc(0), RangeAlloc(),
- Ranges(RangeAlloc) {
+ Ranges(RangeAlloc), UnitRangeAttribute(nullptr) {
Info.resize(OrigUnit.getNumDIEs());
}
uint64_t getLowPc() const { return LowPc; }
uint64_t getHighPc() const { return HighPc; }
- Optional<PatchLocation> getUnitRangesAttribute() const {
- return UnitRangeAttribute;
- }
+ DIEInteger *getUnitRangesAttribute() const { return UnitRangeAttribute; }
const FunctionIntervals &getFunctionRanges() const { return Ranges; }
- const std::vector<PatchLocation> &getRangesAttributes() const {
+ const std::vector<DIEInteger *> &getRangesAttributes() const {
return RangeAttributes;
}
- const std::vector<std::pair<PatchLocation, int64_t>> &
+ const std::vector<std::pair<DIEInteger *, int64_t>> &
getLocationAttributes() const {
return LocationAttributes;
}
/// 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,
- PatchLocation Attr);
+ DIEInteger *Attr);
/// \brief Apply all fixups recored by noteForwardReference().
void fixupForwardReferences();
/// \brief Keep track of a DW_AT_range attribute that we will need to
/// patch up later.
- void noteRangeAttribute(const DIE &Die, PatchLocation Attr);
+ void noteRangeAttribute(const DIE &Die, DIEInteger *Attr);
/// \brief Keep track of a location attribute pointing to a location
/// list in the debug_loc section.
- void noteLocationAttribute(PatchLocation Attr, int64_t PcOffset);
+ void noteLocationAttribute(DIEInteger *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.
/// 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 *, PatchLocation>>
+ std::vector<std::tuple<DIE *, const CompileUnit *, DIEInteger *>>
ForwardDIEReferences;
FunctionIntervals::Allocator RangeAlloc;
/// \brief DW_AT_ranges attributes to patch after we have gathered
/// all the unit's function addresses.
/// @{
- std::vector<PatchLocation> RangeAttributes;
- Optional<PatchLocation> UnitRangeAttribute;
+ std::vector<DIEInteger *> RangeAttributes;
+ DIEInteger *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<PatchLocation, int64_t>> LocationAttributes;
+ std::vector<std::pair<DIEInteger *, int64_t>> LocationAttributes;
/// \brief Accelerator entries for the unit, both for the pub*
/// sections and the apple* ones.
/// \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,
- PatchLocation Attr) {
+ DIEInteger *Attr) {
ForwardDIEReferences.emplace_back(Die, RefUnit, Attr);
}
for (const auto &Ref : ForwardDIEReferences) {
DIE *RefDie;
const CompileUnit *RefUnit;
- PatchLocation Attr;
+ DIEInteger *Attr;
std::tie(RefDie, RefUnit, Attr) = Ref;
- Attr.set(RefDie->getOffset() + RefUnit->getStartOffset());
+ Attr->setValue(RefDie->getOffset() + RefUnit->getStartOffset());
}
}
this->HighPc = std::max(HighPc, FuncHighPc + PcOffset);
}
-void CompileUnit::noteRangeAttribute(const DIE &Die, PatchLocation Attr) {
+void CompileUnit::noteRangeAttribute(const DIE &Die, DIEInteger *Attr) {
if (Die.getTag() != dwarf::DW_TAG_compile_unit)
RangeAttributes.push_back(Attr);
else
UnitRangeAttribute = Attr;
}
-void CompileUnit::noteLocationAttribute(PatchLocation Attr, int64_t PcOffset) {
+void CompileUnit::noteLocationAttribute(DIEInteger *Attr, int64_t PcOffset) {
LocationAttributes.emplace_back(Attr, PcOffset);
}
/// point to the new entries.
void DwarfStreamer::emitLocationsForUnit(const CompileUnit &Unit,
DWARFContext &Dwarf) {
- const auto &Attributes = Unit.getLocationAttributes();
+ const std::vector<std::pair<DIEInteger *, int64_t>> &Attributes =
+ Unit.getLocationAttributes();
if (Attributes.empty())
return;
UnitPcOffset = int64_t(OrigLowPc) - Unit.getLowPc();
for (const auto &Attr : Attributes) {
- uint32_t Offset = Attr.first.get();
- Attr.first.set(LocSectionSize);
+ uint32_t Offset = Attr.first->getValue();
+ Attr.first->setValue(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;
const char *String = *Val.getAsCString(&U);
unsigned Offset = StringPool.getStringOffset(String);
Die.addValue(dwarf::Attribute(AttrSpec.Attr), dwarf::DW_FORM_strp,
- DIEInteger(Offset));
+ new (DIEAlloc) DIEInteger(Offset));
return 4;
}
// to find the unit offset. (We don't have a DwarfDebug)
// FIXME: we should be able to design DIEEntry reliance on
// DwarfDebug away.
- uint64_t Attr;
+ DIEInteger *Attr;
if (Ref < InputDIE.getOffset()) {
// We must have already cloned that DIE.
uint32_t NewRefOffset =
RefUnit->getStartOffset() + NewRefDie->getOffset();
- Attr = NewRefOffset;
+ Attr = new (DIEAlloc) DIEInteger(NewRefOffset);
} else {
// A forward reference. Note and fixup later.
- Attr = 0xBADDEF;
- Unit.noteForwardReference(NewRefDie, RefUnit,
- PatchLocation(Die, Die.getValues().size()));
+ Attr = new (DIEAlloc) DIEInteger(0xBADDEF);
+ Unit.noteForwardReference(NewRefDie, RefUnit, Attr);
}
Die.addValue(dwarf::Attribute(AttrSpec.Attr), dwarf::DW_FORM_ref_addr,
- DIEInteger(Attr));
+ Attr);
return AttrSize;
}
Die.addValue(dwarf::Attribute(AttrSpec.Attr), dwarf::Form(AttrSpec.Form),
- DIEEntry(*NewRefDie));
+ new (DIEAlloc) DIEEntry(*NewRefDie));
return AttrSize;
}
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 ? DIEValue(Loc) : DIEValue(Block);
+ Value = Loc ? static_cast<DIEValue *>(Loc) : static_cast<DIEValue *>(Block);
ArrayRef<uint8_t> Bytes = *Val.getAsBlock();
for (auto Byte : Bytes)
Attr->addValue(static_cast<dwarf::Attribute>(0), dwarf::DW_FORM_data1,
- DIEInteger(Byte));
+ new (DIEAlloc) 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()).
}
Die.addValue(static_cast<dwarf::Attribute>(AttrSpec.Attr),
- static_cast<dwarf::Form>(AttrSpec.Form), DIEInteger(Addr));
+ static_cast<dwarf::Form>(AttrSpec.Form),
+ new (DIEAlloc) DIEInteger(Addr));
return Unit.getOrigUnit().getAddressByteSize();
}
&Unit.getOrigUnit(), &InputDIE);
return 0;
}
- DIEInteger Attr(Value);
+ DIEInteger *Attr = new (DIEAlloc) DIEInteger(Value);
if (AttrSpec.Attr == dwarf::DW_AT_ranges)
- Unit.noteRangeAttribute(Die, PatchLocation(Die, Die.getValues().size()));
+ Unit.noteRangeAttribute(Die, Attr);
// A more generic way to check for location attributes would be
// nice, but it's very unlikely that any other attribute needs a
// location list.
else if (AttrSpec.Attr == dwarf::DW_AT_location ||
AttrSpec.Attr == dwarf::DW_AT_frame_base)
- Unit.noteLocationAttribute(PatchLocation(Die, Die.getValues().size()),
- Info.PCOffset);
+ Unit.noteLocationAttribute(Attr, Info.PCOffset);
else if (AttrSpec.Attr == dwarf::DW_AT_declaration && Value)
Info.IsDeclaration = true;
UnitPcOffset = int64_t(OrigLowPc) - Unit.getLowPc();
for (const auto &RangeAttribute : Unit.getRangesAttributes()) {
- uint32_t Offset = RangeAttribute.get();
- RangeAttribute.set(Streamer->getRangesSectionSize());
+ uint32_t Offset = RangeAttribute->getValue();
+ RangeAttribute->setValue(Streamer->getRangesSectionSize());
RangeList.extract(RangeExtractor, &Offset);
const auto &Entries = RangeList.getEntries();
const DWARFDebugRangeList::RangeListEntry &First = Entries.front();
/// 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 {
- auto Attr = Unit.getUnitRangesAttribute();
+ DIEInteger *Attr = Unit.getUnitRangesAttribute();
if (Attr)
- Attr->set(Streamer->getRangesSectionSize());
- Streamer->emitUnitRangesEntries(Unit, static_cast<bool>(Attr));
+ Attr->setValue(Streamer->getRangesSectionSize());
+ Streamer->emitUnitRangesEntries(Unit, Attr != nullptr);
}
/// \brief Insert the new line info sequence \p Seq into the current
return AbbrevData.getAttribute() == dwarf::DW_AT_stmt_list;
});
assert(Stmt < Abbrev.end() && "Didn't find DW_AT_stmt_list in cloned DIE!");
- OutputDIE->setValue(Stmt - Abbrev.begin(),
- DIEInteger(Streamer->getLineSectionSize()));
+ DIEInteger *StmtAttr =
+ cast<DIEInteger>(OutputDIE->getValues()[Stmt - Abbrev.begin()]);
+ StmtAttr->setValue(Streamer->getLineSectionSize());
}
// Parse the original line info for the unit.
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);
}
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.
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);
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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);
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);