aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Laskey <jlaskey@mac.com>2006-07-11 15:58:09 +0000
committerJim Laskey <jlaskey@mac.com>2006-07-11 15:58:09 +0000
commite2a78f2e3dcea4a087fd776aefc56e9edef840a9 (patch)
treece0350e6e5ab55986917806c5cf1def26c74c555
parenta4e64359aafaf23e440e9dc171859daef1995f1b (diff)
downloadexternal_llvm-e2a78f2e3dcea4a087fd776aefc56e9edef840a9.zip
external_llvm-e2a78f2e3dcea4a087fd776aefc56e9edef840a9.tar.gz
external_llvm-e2a78f2e3dcea4a087fd776aefc56e9edef840a9.tar.bz2
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
-rw-r--r--include/llvm/CodeGen/MachineDebugInfo.h19
-rw-r--r--lib/CodeGen/DwarfWriter.cpp6
-rw-r--r--lib/CodeGen/MachineDebugInfo.cpp9
-rw-r--r--lib/VMCore/IntrinsicInst.cpp4
4 files changed, 34 insertions, 4 deletions
diff --git a/include/llvm/CodeGen/MachineDebugInfo.h b/include/llvm/CodeGen/MachineDebugInfo.h
index 70c8398..17d28d8 100644
--- a/include/llvm/CodeGen/MachineDebugInfo.h
+++ b/include/llvm/CodeGen/MachineDebugInfo.h
@@ -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);
}
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp
index 55bac8b..14bb962 100644
--- a/lib/CodeGen/DwarfWriter.cpp
+++ b/lib/CodeGen/DwarfWriter.cpp
@@ -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);
}
diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp
index c1aac50..54fb1b9 100644
--- a/lib/CodeGen/MachineDebugInfo.cpp
+++ b/lib/CodeGen/MachineDebugInfo.cpp
@@ -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() << "\"), "
diff --git a/lib/VMCore/IntrinsicInst.cpp b/lib/VMCore/IntrinsicInst.cpp
index 9c2efc3..a85d9a4 100644
--- a/lib/VMCore/IntrinsicInst.cpp
+++ b/lib/VMCore/IntrinsicInst.cpp
@@ -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();