1. Support for c++ mangled names.

2. Support for private/protected class members.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29104 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jim Laskey 2006-07-11 15:58:09 +00:00
parent a4e64359aa
commit e2a78f2e3d
4 changed files with 34 additions and 4 deletions

View File

@ -57,7 +57,8 @@ class StructType;
// Debug info constants.
enum {
LLVMDebugVersion = (4 << 16), // Current version of debug information.
LLVMDebugVersion = (5 << 16), // Current version of debug information.
LLVMDebugVersion4 = (4 << 16), // Constant for version 4.
LLVMDebugVersionMask = 0xffff0000 // Mask for version number.
};
@ -276,6 +277,10 @@ public:
///
class TypeDesc : public DebugInfoDesc {
private:
enum {
FlagPrivate = 1 << 0,
FlagProtected = 1 << 1
};
DebugInfoDesc *Context; // Context debug descriptor.
std::string Name; // Type name (may be empty.)
DebugInfoDesc *File; // Defined compile unit (may be NULL.)
@ -283,6 +288,7 @@ private:
uint64_t Size; // Type bit size (may be zero.)
uint64_t Align; // Type bit alignment (may be zero.)
uint64_t Offset; // Type bit offset (may be zero.)
unsigned Flags; // Miscellaneous flags.
public:
TypeDesc(unsigned T);
@ -297,6 +303,12 @@ public:
uint64_t getSize() const { return Size; }
uint64_t getAlign() const { return Align; }
uint64_t getOffset() const { return Offset; }
bool isPrivate() const {
return (Flags & FlagPrivate) != 0;
}
bool isProtected() const {
return (Flags & FlagProtected) != 0;
}
void setContext(DebugInfoDesc *C) { Context = C; }
void setName(const std::string &N) { Name = N; }
void setFile(CompileUnitDesc *U) {
@ -306,6 +318,8 @@ public:
void setSize(uint64_t S) { Size = S; }
void setAlign(uint64_t A) { Align = A; }
void setOffset(uint64_t O) { Offset = O; }
void setIsPrivate() { Flags |= FlagPrivate; }
void setIsProtected() { Flags |= FlagProtected; }
/// ApplyToFields - Target the visitor to the fields of the TypeDesc.
///
@ -572,6 +586,7 @@ class GlobalDesc : public AnchoredDesc {
private:
DebugInfoDesc *Context; // Context debug descriptor.
std::string Name; // Global name.
std::string DisplayName; // C++ unmangled name.
DebugInfoDesc *File; // Defined compile unit (may be NULL.)
unsigned Line; // Defined line# (may be zero.)
DebugInfoDesc *TyDesc; // Type debug descriptor.
@ -585,6 +600,7 @@ public:
// Accessors
DebugInfoDesc *getContext() const { return Context; }
const std::string &getName() const { return Name; }
const std::string &getDisplayName() const { return DisplayName; }
CompileUnitDesc *getFile() const {
return static_cast<CompileUnitDesc *>(File);
}
@ -596,6 +612,7 @@ public:
bool isDefinition() const { return IsDefinition; }
void setContext(DebugInfoDesc *C) { Context = C; }
void setName(const std::string &N) { Name = N; }
void setDisplayName(const std::string &N) { DisplayName = N; }
void setFile(CompileUnitDesc *U) {
File = static_cast<DebugInfoDesc *>(U);
}

View File

@ -1383,6 +1383,12 @@ DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit) {
Block->AddUInt(DW_FORM_udata, FieldOffset >> 3);
Block->ComputeSize(*this);
Member->AddBlock(DW_AT_data_member_location, 0, Block);
if (MemberDesc->isProtected()) {
Member->AddUInt(DW_AT_accessibility, 0, DW_ACCESS_protected);
} else if (MemberDesc->isPrivate()) {
Member->AddUInt(DW_AT_accessibility, 0, DW_ACCESS_private);
}
Ty->AddChild(Member);
}

View File

@ -671,6 +671,7 @@ TypeDesc::TypeDesc(unsigned T)
, Size(0)
, Align(0)
, Offset(0)
, Flags(0)
{}
/// ApplyToFields - Target the visitor to the fields of the TypeDesc.
@ -685,6 +686,7 @@ void TypeDesc::ApplyToFields(DIVisitor *Visitor) {
Visitor->Apply(Size);
Visitor->Apply(Align);
Visitor->Apply(Offset);
if (getVersion() > LLVMDebugVersion4) Visitor->Apply(Flags);
}
/// getDescString - Return a string used to compose global names and labels.
@ -710,7 +712,8 @@ void TypeDesc::dump() {
<< "Line(" << Line << "), "
<< "Size(" << Size << "), "
<< "Align(" << Align << "), "
<< "Offset(" << Offset << ")\n";
<< "Offset(" << Offset << "), "
<< "Flags(" << Flags << ")\n";
}
#endif
@ -1029,6 +1032,7 @@ GlobalDesc::GlobalDesc(unsigned T)
: AnchoredDesc(T)
, Context(0)
, Name("")
, DisplayName("")
, File(NULL)
, Line(0)
, TyDesc(NULL)
@ -1043,6 +1047,7 @@ void GlobalDesc::ApplyToFields(DIVisitor *Visitor) {
Visitor->Apply(Context);
Visitor->Apply(Name);
if (getVersion() > LLVMDebugVersion4) Visitor->Apply(DisplayName);
Visitor->Apply(File);
Visitor->Apply(Line);
Visitor->Apply(TyDesc);
@ -1096,6 +1101,7 @@ void GlobalVariableDesc::dump() {
<< "Tag(" << getTag() << "), "
<< "Anchor(" << getAnchor() << "), "
<< "Name(\"" << getName() << "\"), "
<< "DisplayName(\"" << getDisplayName() << "\"), "
<< "File(" << getFile() << "),"
<< "Line(" << getLine() << "),"
<< "Type(\"" << getType() << "\"), "
@ -1148,6 +1154,7 @@ void SubprogramDesc::dump() {
<< "Tag(" << getTag() << "), "
<< "Anchor(" << getAnchor() << "), "
<< "Name(\"" << getName() << "\"), "
<< "DisplayName(\"" << getDisplayName() << "\"), "
<< "File(" << getFile() << "),"
<< "Line(" << getLine() << "),"
<< "Type(\"" << getType() << "\"), "

View File

@ -61,7 +61,7 @@ Value *DbgInfoIntrinsic::StripCast(Value *C) {
std::string DbgStopPointInst::getFileName() const {
// Once the operand indices are verified, update this assert
assert(LLVMDebugVersion == (4 << 16) && "Verify operand indices");
assert(LLVMDebugVersion == (5 << 16) && "Verify operand indices");
GlobalVariable *GV = cast<GlobalVariable>(getContext());
ConstantStruct *CS = cast<ConstantStruct>(GV->getInitializer());
return CS->getOperand(3)->getStringValue();
@ -69,7 +69,7 @@ std::string DbgStopPointInst::getFileName() const {
std::string DbgStopPointInst::getDirectory() const {
// Once the operand indices are verified, update this assert
assert(LLVMDebugVersion == (4 << 16) && "Verify operand indices");
assert(LLVMDebugVersion == (5 << 16) && "Verify operand indices");
GlobalVariable *GV = cast<GlobalVariable>(getContext());
ConstantStruct *CS = cast<ConstantStruct>(GV->getInitializer());
return CS->getOperand(4)->getStringValue();