mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-11 07:24:06 +00:00
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:
parent
a4e64359aa
commit
e2a78f2e3d
@ -57,7 +57,8 @@ class StructType;
|
|||||||
// Debug info constants.
|
// Debug info constants.
|
||||||
|
|
||||||
enum {
|
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.
|
LLVMDebugVersionMask = 0xffff0000 // Mask for version number.
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -276,6 +277,10 @@ public:
|
|||||||
///
|
///
|
||||||
class TypeDesc : public DebugInfoDesc {
|
class TypeDesc : public DebugInfoDesc {
|
||||||
private:
|
private:
|
||||||
|
enum {
|
||||||
|
FlagPrivate = 1 << 0,
|
||||||
|
FlagProtected = 1 << 1
|
||||||
|
};
|
||||||
DebugInfoDesc *Context; // Context debug descriptor.
|
DebugInfoDesc *Context; // Context debug descriptor.
|
||||||
std::string Name; // Type name (may be empty.)
|
std::string Name; // Type name (may be empty.)
|
||||||
DebugInfoDesc *File; // Defined compile unit (may be NULL.)
|
DebugInfoDesc *File; // Defined compile unit (may be NULL.)
|
||||||
@ -283,6 +288,7 @@ private:
|
|||||||
uint64_t Size; // Type bit size (may be zero.)
|
uint64_t Size; // Type bit size (may be zero.)
|
||||||
uint64_t Align; // Type bit alignment (may be zero.)
|
uint64_t Align; // Type bit alignment (may be zero.)
|
||||||
uint64_t Offset; // Type bit offset (may be zero.)
|
uint64_t Offset; // Type bit offset (may be zero.)
|
||||||
|
unsigned Flags; // Miscellaneous flags.
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TypeDesc(unsigned T);
|
TypeDesc(unsigned T);
|
||||||
@ -297,6 +303,12 @@ public:
|
|||||||
uint64_t getSize() const { return Size; }
|
uint64_t getSize() const { return Size; }
|
||||||
uint64_t getAlign() const { return Align; }
|
uint64_t getAlign() const { return Align; }
|
||||||
uint64_t getOffset() const { return Offset; }
|
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 setContext(DebugInfoDesc *C) { Context = C; }
|
||||||
void setName(const std::string &N) { Name = N; }
|
void setName(const std::string &N) { Name = N; }
|
||||||
void setFile(CompileUnitDesc *U) {
|
void setFile(CompileUnitDesc *U) {
|
||||||
@ -306,6 +318,8 @@ public:
|
|||||||
void setSize(uint64_t S) { Size = S; }
|
void setSize(uint64_t S) { Size = S; }
|
||||||
void setAlign(uint64_t A) { Align = A; }
|
void setAlign(uint64_t A) { Align = A; }
|
||||||
void setOffset(uint64_t O) { Offset = O; }
|
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.
|
/// ApplyToFields - Target the visitor to the fields of the TypeDesc.
|
||||||
///
|
///
|
||||||
@ -572,6 +586,7 @@ class GlobalDesc : public AnchoredDesc {
|
|||||||
private:
|
private:
|
||||||
DebugInfoDesc *Context; // Context debug descriptor.
|
DebugInfoDesc *Context; // Context debug descriptor.
|
||||||
std::string Name; // Global name.
|
std::string Name; // Global name.
|
||||||
|
std::string DisplayName; // C++ unmangled name.
|
||||||
DebugInfoDesc *File; // Defined compile unit (may be NULL.)
|
DebugInfoDesc *File; // Defined compile unit (may be NULL.)
|
||||||
unsigned Line; // Defined line# (may be zero.)
|
unsigned Line; // Defined line# (may be zero.)
|
||||||
DebugInfoDesc *TyDesc; // Type debug descriptor.
|
DebugInfoDesc *TyDesc; // Type debug descriptor.
|
||||||
@ -585,6 +600,7 @@ public:
|
|||||||
// Accessors
|
// Accessors
|
||||||
DebugInfoDesc *getContext() const { return Context; }
|
DebugInfoDesc *getContext() const { return Context; }
|
||||||
const std::string &getName() const { return Name; }
|
const std::string &getName() const { return Name; }
|
||||||
|
const std::string &getDisplayName() const { return DisplayName; }
|
||||||
CompileUnitDesc *getFile() const {
|
CompileUnitDesc *getFile() const {
|
||||||
return static_cast<CompileUnitDesc *>(File);
|
return static_cast<CompileUnitDesc *>(File);
|
||||||
}
|
}
|
||||||
@ -596,6 +612,7 @@ public:
|
|||||||
bool isDefinition() const { return IsDefinition; }
|
bool isDefinition() const { return IsDefinition; }
|
||||||
void setContext(DebugInfoDesc *C) { Context = C; }
|
void setContext(DebugInfoDesc *C) { Context = C; }
|
||||||
void setName(const std::string &N) { Name = N; }
|
void setName(const std::string &N) { Name = N; }
|
||||||
|
void setDisplayName(const std::string &N) { DisplayName = N; }
|
||||||
void setFile(CompileUnitDesc *U) {
|
void setFile(CompileUnitDesc *U) {
|
||||||
File = static_cast<DebugInfoDesc *>(U);
|
File = static_cast<DebugInfoDesc *>(U);
|
||||||
}
|
}
|
||||||
|
@ -1383,6 +1383,12 @@ DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit) {
|
|||||||
Block->AddUInt(DW_FORM_udata, FieldOffset >> 3);
|
Block->AddUInt(DW_FORM_udata, FieldOffset >> 3);
|
||||||
Block->ComputeSize(*this);
|
Block->ComputeSize(*this);
|
||||||
Member->AddBlock(DW_AT_data_member_location, 0, Block);
|
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);
|
Ty->AddChild(Member);
|
||||||
}
|
}
|
||||||
|
@ -671,6 +671,7 @@ TypeDesc::TypeDesc(unsigned T)
|
|||||||
, Size(0)
|
, Size(0)
|
||||||
, Align(0)
|
, Align(0)
|
||||||
, Offset(0)
|
, Offset(0)
|
||||||
|
, Flags(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
/// ApplyToFields - Target the visitor to the fields of the TypeDesc.
|
/// ApplyToFields - Target the visitor to the fields of the TypeDesc.
|
||||||
@ -685,6 +686,7 @@ void TypeDesc::ApplyToFields(DIVisitor *Visitor) {
|
|||||||
Visitor->Apply(Size);
|
Visitor->Apply(Size);
|
||||||
Visitor->Apply(Align);
|
Visitor->Apply(Align);
|
||||||
Visitor->Apply(Offset);
|
Visitor->Apply(Offset);
|
||||||
|
if (getVersion() > LLVMDebugVersion4) Visitor->Apply(Flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// getDescString - Return a string used to compose global names and labels.
|
/// getDescString - Return a string used to compose global names and labels.
|
||||||
@ -710,7 +712,8 @@ void TypeDesc::dump() {
|
|||||||
<< "Line(" << Line << "), "
|
<< "Line(" << Line << "), "
|
||||||
<< "Size(" << Size << "), "
|
<< "Size(" << Size << "), "
|
||||||
<< "Align(" << Align << "), "
|
<< "Align(" << Align << "), "
|
||||||
<< "Offset(" << Offset << ")\n";
|
<< "Offset(" << Offset << "), "
|
||||||
|
<< "Flags(" << Flags << ")\n";
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1029,6 +1032,7 @@ GlobalDesc::GlobalDesc(unsigned T)
|
|||||||
: AnchoredDesc(T)
|
: AnchoredDesc(T)
|
||||||
, Context(0)
|
, Context(0)
|
||||||
, Name("")
|
, Name("")
|
||||||
|
, DisplayName("")
|
||||||
, File(NULL)
|
, File(NULL)
|
||||||
, Line(0)
|
, Line(0)
|
||||||
, TyDesc(NULL)
|
, TyDesc(NULL)
|
||||||
@ -1043,6 +1047,7 @@ void GlobalDesc::ApplyToFields(DIVisitor *Visitor) {
|
|||||||
|
|
||||||
Visitor->Apply(Context);
|
Visitor->Apply(Context);
|
||||||
Visitor->Apply(Name);
|
Visitor->Apply(Name);
|
||||||
|
if (getVersion() > LLVMDebugVersion4) Visitor->Apply(DisplayName);
|
||||||
Visitor->Apply(File);
|
Visitor->Apply(File);
|
||||||
Visitor->Apply(Line);
|
Visitor->Apply(Line);
|
||||||
Visitor->Apply(TyDesc);
|
Visitor->Apply(TyDesc);
|
||||||
@ -1096,6 +1101,7 @@ void GlobalVariableDesc::dump() {
|
|||||||
<< "Tag(" << getTag() << "), "
|
<< "Tag(" << getTag() << "), "
|
||||||
<< "Anchor(" << getAnchor() << "), "
|
<< "Anchor(" << getAnchor() << "), "
|
||||||
<< "Name(\"" << getName() << "\"), "
|
<< "Name(\"" << getName() << "\"), "
|
||||||
|
<< "DisplayName(\"" << getDisplayName() << "\"), "
|
||||||
<< "File(" << getFile() << "),"
|
<< "File(" << getFile() << "),"
|
||||||
<< "Line(" << getLine() << "),"
|
<< "Line(" << getLine() << "),"
|
||||||
<< "Type(\"" << getType() << "\"), "
|
<< "Type(\"" << getType() << "\"), "
|
||||||
@ -1148,6 +1154,7 @@ void SubprogramDesc::dump() {
|
|||||||
<< "Tag(" << getTag() << "), "
|
<< "Tag(" << getTag() << "), "
|
||||||
<< "Anchor(" << getAnchor() << "), "
|
<< "Anchor(" << getAnchor() << "), "
|
||||||
<< "Name(\"" << getName() << "\"), "
|
<< "Name(\"" << getName() << "\"), "
|
||||||
|
<< "DisplayName(\"" << getDisplayName() << "\"), "
|
||||||
<< "File(" << getFile() << "),"
|
<< "File(" << getFile() << "),"
|
||||||
<< "Line(" << getLine() << "),"
|
<< "Line(" << getLine() << "),"
|
||||||
<< "Type(\"" << getType() << "\"), "
|
<< "Type(\"" << getType() << "\"), "
|
||||||
|
@ -61,7 +61,7 @@ Value *DbgInfoIntrinsic::StripCast(Value *C) {
|
|||||||
|
|
||||||
std::string DbgStopPointInst::getFileName() const {
|
std::string DbgStopPointInst::getFileName() const {
|
||||||
// Once the operand indices are verified, update this assert
|
// 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());
|
GlobalVariable *GV = cast<GlobalVariable>(getContext());
|
||||||
ConstantStruct *CS = cast<ConstantStruct>(GV->getInitializer());
|
ConstantStruct *CS = cast<ConstantStruct>(GV->getInitializer());
|
||||||
return CS->getOperand(3)->getStringValue();
|
return CS->getOperand(3)->getStringValue();
|
||||||
@ -69,7 +69,7 @@ std::string DbgStopPointInst::getFileName() const {
|
|||||||
|
|
||||||
std::string DbgStopPointInst::getDirectory() const {
|
std::string DbgStopPointInst::getDirectory() const {
|
||||||
// Once the operand indices are verified, update this assert
|
// 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());
|
GlobalVariable *GV = cast<GlobalVariable>(getContext());
|
||||||
ConstantStruct *CS = cast<ConstantStruct>(GV->getInitializer());
|
ConstantStruct *CS = cast<ConstantStruct>(GV->getInitializer());
|
||||||
return CS->getOperand(4)->getStringValue();
|
return CS->getOperand(4)->getStringValue();
|
||||||
|
Loading…
Reference in New Issue
Block a user