forked from OSchip/llvm-project
Revert "AsmPrinter: Change DIEValue to be stored by value"
This reverts commit r238349, since it caused some errors on bots: - std::is_trivially_copyable isn't available until GCC 5.0. - It was complaining about strict aliasing with my use of ArrayCharUnion. llvm-svn: 238350
This commit is contained in:
parent
7735b48a8b
commit
583bc03829
|
@ -104,14 +104,62 @@ public:
|
|||
#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.
|
||||
///
|
||||
|
@ -138,91 +186,120 @@ public:
|
|||
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
|
||||
};
|
||||
|
||||
|
@ -231,48 +308,60 @@ public:
|
|||
/// 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
|
||||
};
|
||||
|
||||
|
@ -280,125 +369,27 @@ public:
|
|||
/// 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
|
||||
};
|
||||
|
||||
|
@ -433,7 +424,7 @@ protected:
|
|||
|
||||
/// Attribute values.
|
||||
///
|
||||
SmallVector<DIEValue, 12> Values;
|
||||
SmallVector<DIEValue *, 12> Values;
|
||||
|
||||
protected:
|
||||
DIE()
|
||||
|
@ -455,11 +446,7 @@ public:
|
|||
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.
|
||||
|
@ -472,7 +459,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);
|
||||
}
|
||||
|
@ -486,11 +473,9 @@ public:
|
|||
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;
|
||||
|
@ -501,11 +486,12 @@ public:
|
|||
//===--------------------------------------------------------------------===//
|
||||
/// 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.
|
||||
///
|
||||
|
@ -526,22 +512,27 @@ public:
|
|||
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.
|
||||
///
|
||||
|
@ -559,11 +550,15 @@ public:
|
|||
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
|
||||
};
|
||||
|
||||
|
|
|
@ -265,7 +265,7 @@ void AsmPrinter::emitDwarfDIE(const DIE &Die) const {
|
|||
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 &Die) const {
|
|||
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.
|
||||
|
|
|
@ -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::Attribute Attribute) const {
|
|||
for (size_t i = 0; i < Values.size(); ++i)
|
||||
if (Abbrevs.getData()[i].getAttribute() == Attribute)
|
||||
return Values[i];
|
||||
return DIEValue();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
@ -174,7 +174,7 @@ void DIE::print(raw_ostream &O, unsigned IndentCount) const {
|
|||
O << " "
|
||||
<< dwarf::FormEncodingString(Data[i].getForm())
|
||||
<< " ";
|
||||
Values[i].print(O);
|
||||
Values[i]->print(O);
|
||||
O << "\n";
|
||||
}
|
||||
IndentCount -= 2;
|
||||
|
@ -193,11 +193,9 @@ void DIE::dump() {
|
|||
|
||||
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)
|
||||
|
@ -215,11 +213,9 @@ void DIEValue::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
|
||||
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)
|
||||
|
@ -238,11 +234,9 @@ unsigned DIEValue::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
#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)
|
||||
|
@ -269,7 +263,7 @@ void DIEValue::dump() const {
|
|||
|
||||
/// 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:
|
||||
|
@ -305,7 +299,7 @@ void DIEInteger::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
|
|||
|
||||
/// 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
|
||||
|
@ -334,7 +328,7 @@ unsigned DIEInteger::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
}
|
||||
|
||||
#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);
|
||||
}
|
||||
|
@ -346,13 +340,13 @@ void DIEInteger::print(raw_ostream &O) const {
|
|||
|
||||
/// 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;
|
||||
|
@ -360,7 +354,7 @@ unsigned DIEExpr::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
void DIEExpr::print(raw_ostream &O) const { O << "Expr: " << *Expr; }
|
||||
void DIEExpr::printImpl(raw_ostream &O) const { O << "Expr: " << *Expr; }
|
||||
#endif
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -369,7 +363,7 @@ void DIEExpr::print(raw_ostream &O) const { O << "Expr: " << *Expr; }
|
|||
|
||||
/// 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 ||
|
||||
|
@ -378,7 +372,7 @@ void DIELabel::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
|
||||
/// 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;
|
||||
|
@ -386,7 +380,9 @@ unsigned DIELabel::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
}
|
||||
|
||||
#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
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -395,13 +391,13 @@ void DIELabel::print(raw_ostream &O) const { O << "Lbl: " << Label->getName(); }
|
|||
|
||||
/// 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;
|
||||
|
@ -409,7 +405,7 @@ unsigned DIEDelta::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
void DIEDelta::print(raw_ostream &O) const {
|
||||
void DIEDelta::printImpl(raw_ostream &O) const {
|
||||
O << "Del: " << LabelHi->getName() << "-" << LabelLo->getName();
|
||||
}
|
||||
#endif
|
||||
|
@ -420,7 +416,7 @@ void DIEDelta::print(raw_ostream &O) const {
|
|||
|
||||
/// 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");
|
||||
|
@ -444,7 +440,7 @@ void DIEString::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
|
||||
/// 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");
|
||||
|
@ -462,7 +458,7 @@ unsigned DIEString::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
void DIEString::print(raw_ostream &O) const {
|
||||
void DIEString::printImpl(raw_ostream &O) const {
|
||||
O << "String: " << S.getString();
|
||||
}
|
||||
#endif
|
||||
|
@ -473,16 +469,16 @@ void DIEString::print(raw_ostream &O) const {
|
|||
|
||||
/// 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())
|
||||
|
@ -491,7 +487,7 @@ void DIEEntry::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
else
|
||||
AP->OutStreamer->EmitIntValue(Addr, DIEEntry::getRefAddrSize(AP));
|
||||
} else
|
||||
AP->EmitInt32(Entry->getOffset());
|
||||
AP->EmitInt32(Entry.getOffset());
|
||||
}
|
||||
|
||||
unsigned DIEEntry::getRefAddrSize(const AsmPrinter *AP) {
|
||||
|
@ -507,7 +503,7 @@ 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
|
||||
|
@ -515,15 +511,14 @@ void DIEEntry::print(raw_ostream &O) const {
|
|||
//===----------------------------------------------------------------------===//
|
||||
// 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
|
||||
|
||||
|
@ -537,7 +532,7 @@ unsigned DIELoc::ComputeSize(const AsmPrinter *AP) const {
|
|||
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;
|
||||
|
@ -545,7 +540,7 @@ unsigned DIELoc::ComputeSize(const AsmPrinter *AP) const {
|
|||
|
||||
/// 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;
|
||||
|
@ -558,12 +553,12 @@ void DIELoc::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
|
|||
|
||||
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);
|
||||
|
@ -576,7 +571,7 @@ unsigned DIELoc::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
void DIELoc::print(raw_ostream &O) const {
|
||||
void DIELoc::printImpl(raw_ostream &O) const {
|
||||
O << "ExprLoc: ";
|
||||
DIE::print(O, 5);
|
||||
}
|
||||
|
@ -592,7 +587,7 @@ unsigned DIEBlock::ComputeSize(const AsmPrinter *AP) const {
|
|||
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;
|
||||
|
@ -600,7 +595,7 @@ unsigned DIEBlock::ComputeSize(const AsmPrinter *AP) const {
|
|||
|
||||
/// 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;
|
||||
|
@ -611,12 +606,12 @@ void DIEBlock::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
|
|||
|
||||
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);
|
||||
|
@ -627,7 +622,7 @@ unsigned DIEBlock::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
void DIEBlock::print(raw_ostream &O) const {
|
||||
void DIEBlock::printImpl(raw_ostream &O) const {
|
||||
O << "Blk: ";
|
||||
DIE::print(O, 5);
|
||||
}
|
||||
|
@ -637,7 +632,7 @@ void DIEBlock::print(raw_ostream &O) const {
|
|||
// 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)
|
||||
|
@ -647,7 +642,7 @@ unsigned DIELocList::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
|
||||
/// 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;
|
||||
|
||||
|
@ -658,5 +653,8 @@ void DIELocList::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {
|
|||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
void DIELocList::print(raw_ostream &O) const { O << "LocList: " << Index; }
|
||||
void DIELocList::printImpl(raw_ostream &O) const {
|
||||
O << "LocList: " << Index;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -31,14 +31,18 @@ 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 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("");
|
||||
}
|
||||
|
@ -119,7 +123,7 @@ void DIEHash::addParentContext(const DIE &Parent) {
|
|||
|
||||
// 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) \
|
||||
|
@ -270,9 +274,11 @@ void DIEHash::hashDIEEntry(dwarf::Attribute Attribute, dwarf::Tag Tag,
|
|||
|
||||
// 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.
|
||||
|
@ -287,7 +293,7 @@ void DIEHash::hashLocList(const DIELocList &LocList) {
|
|||
// 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();
|
||||
|
||||
|
@ -298,15 +304,12 @@ void DIEHash::hashAttribute(AttrEntry Attr, dwarf::Tag Tag) {
|
|||
// 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');
|
||||
|
@ -319,14 +322,14 @@ void DIEHash::hashAttribute(AttrEntry Attr, dwarf::Tag Tag) {
|
|||
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!");
|
||||
|
@ -337,7 +340,7 @@ void DIEHash::hashAttribute(AttrEntry Attr, dwarf::Tag Tag) {
|
|||
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:
|
||||
|
@ -345,17 +348,17 @@ void DIEHash::hashAttribute(AttrEntry Attr, dwarf::Tag Tag) {
|
|||
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.
|
||||
|
@ -372,7 +375,7 @@ void DIEHash::hashAttribute(AttrEntry Attr, dwarf::Tag Tag) {
|
|||
void DIEHash::hashAttributes(const DIEAttrs &Attrs, dwarf::Tag Tag) {
|
||||
#define ADD_ATTR(ATTR) \
|
||||
{ \
|
||||
if (ATTR.Val) \
|
||||
if (ATTR.Val != 0) \
|
||||
hashAttribute(ATTR, Tag); \
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ class DIEHash {
|
|||
|
||||
// The entry for a particular attribute.
|
||||
struct AttrEntry {
|
||||
DIEValue Val;
|
||||
const 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);
|
||||
|
|
|
@ -42,7 +42,8 @@ void DwarfCompileUnit::addLabelAddress(DIE &Die, dwarf::Attribute Attribute,
|
|||
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,
|
||||
|
@ -52,7 +53,8 @@ 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,
|
||||
|
@ -143,7 +145,7 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(
|
|||
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.
|
||||
|
@ -181,7 +183,7 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(
|
|||
} 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));
|
||||
|
@ -363,9 +365,10 @@ 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,
|
||||
new (DIEValueAllocator) DIEDelta(Hi, Lo));
|
||||
Value);
|
||||
}
|
||||
|
||||
void DwarfCompileUnit::addScopeRangeList(DIE &ScopeDIE,
|
||||
|
@ -512,7 +515,7 @@ DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV,
|
|||
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;
|
||||
|
@ -736,7 +739,7 @@ void DwarfCompileUnit::addVariableAddress(const DbgVariable &DV, DIE &Die,
|
|||
/// 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())
|
||||
|
@ -758,7 +761,7 @@ void DwarfCompileUnit::addAddress(DIE &Die, dwarf::Attribute Attribute,
|
|||
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();
|
||||
|
@ -779,9 +782,10 @@ void DwarfCompileUnit::addComplexAddress(const DbgVariable &DV, DIE &Die,
|
|||
/// 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,
|
||||
|
@ -798,7 +802,8 @@ 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(
|
||||
|
|
|
@ -1340,8 +1340,9 @@ static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
|
|||
|
||||
// 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))
|
||||
|
|
|
@ -94,13 +94,13 @@ unsigned DwarfFile::computeSizeAndOffset(DIE &Die, unsigned Offset) {
|
|||
// 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();
|
||||
|
|
|
@ -70,6 +70,7 @@ DwarfUnit::DwarfUnit(unsigned UID, dwarf::Tag UnitTag,
|
|||
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,
|
||||
|
@ -88,6 +89,11 @@ 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:
|
||||
|
@ -184,16 +190,18 @@ void DwarfUnit::insertDIE(const DINode *Desc, DIE *D) {
|
|||
|
||||
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) {
|
||||
|
@ -204,7 +212,8 @@ void DwarfUnit::addSInt(DIE &Die, dwarf::Attribute Attribute,
|
|||
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,
|
||||
|
@ -216,12 +225,14 @@ void DwarfUnit::addString(DIE &Die, dwarf::Attribute Attribute,
|
|||
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) {
|
||||
|
@ -254,12 +265,12 @@ void DwarfUnit::addOpAddress(DIELoc &Die, const MCSymbol *Sym) {
|
|||
|
||||
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) {
|
||||
|
@ -270,13 +281,13 @@ 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();
|
||||
|
@ -460,7 +471,7 @@ void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
|
|||
|
||||
// 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())
|
||||
|
@ -577,7 +588,7 @@ static uint64_t getBaseTypeSize(DwarfDebug *DD, const DIDerivedType *Ty) {
|
|||
|
||||
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.
|
||||
|
@ -633,7 +644,7 @@ void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
|
|||
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();
|
||||
|
@ -766,7 +777,22 @@ void DwarfUnit::updateAcceleratorTables(const DIScope *Context,
|
|||
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 {
|
||||
|
@ -943,6 +969,12 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DICompositeType *CTy) {
|
|||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1029,7 +1061,7 @@ void DwarfUnit::constructTemplateValueParameterDIE(
|
|||
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.
|
||||
|
@ -1322,7 +1354,7 @@ void DwarfUnit::constructMemberDIE(DIE &Buffer, const DIDerivedType *DT) {
|
|||
// 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);
|
||||
|
@ -1361,7 +1393,7 @@ void DwarfUnit::constructMemberDIE(DIE &Buffer, const DIDerivedType *DT) {
|
|||
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);
|
||||
|
@ -1385,10 +1417,10 @@ void DwarfUnit::constructMemberDIE(DIE &Buffer, const DIDerivedType *DT) {
|
|||
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);
|
||||
|
|
|
@ -93,6 +93,10 @@ 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;
|
||||
|
||||
|
@ -107,6 +111,9 @@ 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;
|
||||
|
||||
|
@ -173,7 +180,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.
|
||||
///
|
||||
|
@ -226,7 +233,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);
|
||||
|
||||
|
@ -362,12 +369,26 @@ 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,
|
||||
|
|
|
@ -60,30 +60,6 @@ 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.
|
||||
|
@ -100,7 +76,7 @@ public:
|
|||
|
||||
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());
|
||||
}
|
||||
|
||||
|
@ -130,15 +106,13 @@ public:
|
|||
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;
|
||||
}
|
||||
|
@ -153,7 +127,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,
|
||||
PatchLocation Attr);
|
||||
DIEInteger *Attr);
|
||||
|
||||
/// \brief Apply all fixups recored by noteForwardReference().
|
||||
void fixupForwardReferences();
|
||||
|
@ -164,11 +138,11 @@ public:
|
|||
|
||||
/// \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.
|
||||
|
@ -212,7 +186,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 *, PatchLocation>>
|
||||
std::vector<std::tuple<DIE *, const CompileUnit *, DIEInteger *>>
|
||||
ForwardDIEReferences;
|
||||
|
||||
FunctionIntervals::Allocator RangeAlloc;
|
||||
|
@ -224,15 +198,15 @@ private:
|
|||
/// \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.
|
||||
|
@ -255,7 +229,7 @@ uint64_t CompileUnit::computeNextUnitOffset() {
|
|||
/// \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);
|
||||
}
|
||||
|
||||
|
@ -264,9 +238,9 @@ void CompileUnit::fixupForwardReferences() {
|
|||
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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -277,14 +251,14 @@ void CompileUnit::addFunctionRange(uint64_t FuncLowPc, uint64_t FuncHighPc,
|
|||
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);
|
||||
}
|
||||
|
||||
|
@ -743,7 +717,8 @@ void DwarfStreamer::emitUnitRangesEntries(CompileUnit &Unit,
|
|||
/// 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;
|
||||
|
@ -762,8 +737,8 @@ void DwarfStreamer::emitLocationsForUnit(const CompileUnit &Unit,
|
|||
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;
|
||||
|
@ -1785,7 +1760,7 @@ unsigned DwarfLinker::cloneStringAttribute(DIE &Die, AttributeSpec AttrSpec,
|
|||
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;
|
||||
}
|
||||
|
||||
|
@ -1828,25 +1803,24 @@ unsigned DwarfLinker::cloneDieReferenceAttribute(
|
|||
// 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;
|
||||
}
|
||||
|
||||
|
@ -1857,23 +1831,23 @@ unsigned DwarfLinker::cloneBlockAttribute(DIE &Die, AttributeSpec AttrSpec,
|
|||
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()).
|
||||
|
@ -1919,7 +1893,8 @@ unsigned DwarfLinker::cloneAddressAttribute(DIE &Die, AttributeSpec AttrSpec,
|
|||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -1947,16 +1922,15 @@ unsigned DwarfLinker::cloneScalarAttribute(
|
|||
&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;
|
||||
|
||||
|
@ -2239,8 +2213,8 @@ void DwarfLinker::patchRangesForUnit(const CompileUnit &Unit,
|
|||
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();
|
||||
|
@ -2267,10 +2241,10 @@ void DwarfLinker::patchRangesForUnit(const CompileUnit &Unit,
|
|||
/// 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
|
||||
|
@ -2327,8 +2301,9 @@ void DwarfLinker::patchLineTableForUnit(CompileUnit &Unit,
|
|||
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.
|
||||
|
|
|
@ -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, PtrToMemberDeclDefMatch) {
|
|||
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, PtrToMemberDeclDefMatch) {
|
|||
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, PtrToMemberDeclDefMisMatch) {
|
|||
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, PtrToMemberDeclDefMisMatch) {
|
|||
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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue