Subprogram is a scope. Derive DISubprogram from DIScope.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80637 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Devang Patel 2009-08-31 22:47:13 +00:00
parent 5e005d814f
commit 82dfc0cd8c
4 changed files with 59 additions and 8 deletions

View File

@ -342,11 +342,26 @@ namespace llvm {
};
/// DISubprogram - This is a wrapper for a subprogram (e.g. a function).
class DISubprogram : public DIGlobal {
class DISubprogram : public DIScope {
public:
explicit DISubprogram(MDNode *N = 0)
: DIGlobal(N, dwarf::DW_TAG_subprogram) {}
explicit DISubprogram(MDNode *N = 0) {
DbgNode = N;
if (DbgNode && !isSubprogram())
DbgNode = 0;
}
DIDescriptor getContext() const { return getDescriptorField(2); }
const std::string &getName(std::string &F) const {
return getStringField(3, F);
}
const std::string &getDisplayName(std::string &F) const {
return getStringField(4, F);
}
const std::string &getLinkageName(std::string &F) const {
return getStringField(5, F);
}
DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(6); }
unsigned getLineNumber() const { return getUnsignedField(7); }
DICompositeType getType() const { return getFieldAs<DICompositeType>(8); }
/// getReturnTypeName - Subprogram return types are encoded either as
@ -362,6 +377,11 @@ namespace llvm {
return T.getName(F);
}
/// isLocalToUnit - Return true if this subprogram is local to the current
/// compile unit, like 'static' in C.
unsigned isLocalToUnit() const { return getUnsignedField(9); }
unsigned isDefinition() const { return getUnsignedField(10); }
/// Verify - Verify that a subprogram descriptor is well formed.
bool Verify() const;

View File

@ -494,7 +494,24 @@ void DIGlobal::dump() const {
/// dump - Print subprogram.
void DISubprogram::dump() const {
DIGlobal::dump();
std::string Res;
if (!getName(Res).empty())
errs() << " [" << Res << "] ";
unsigned Tag = getTag();
errs() << " [" << dwarf::TagString(Tag) << "] ";
// TODO : Print context
getCompileUnit().dump();
errs() << " [" << getLineNumber() << "] ";
if (isLocalToUnit())
errs() << " [local] ";
if (isDefinition())
errs() << " [def] ";
errs() << "\n";
}
/// dump - Print global variable.

View File

@ -487,6 +487,23 @@ void DwarfDebug::AddSourceLine(DIE *Die, const DIGlobal *G) {
AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
}
/// AddSourceLine - Add location information to specified debug information
/// entry.
void DwarfDebug::AddSourceLine(DIE *Die, const DISubprogram *SP) {
// If there is no compile unit specified, don't add a line #.
if (SP->getCompileUnit().isNull())
return;
unsigned Line = SP->getLineNumber();
unsigned FileID = FindCompileUnit(SP->getCompileUnit()).getID();
assert(FileID && "Invalid file id");
AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
}
/// AddSourceLine - Add location information to specified debug information
/// entry.
void DwarfDebug::AddSourceLine(DIE *Die, const DIType *Ty) {
// If there is no compile unit specified, don't add a line #.
DICompileUnit CU = Ty->getCompileUnit();

View File

@ -275,11 +275,8 @@ class VISIBILITY_HIDDEN DwarfDebug : public Dwarf {
/// AddSourceLine - Add location information to specified debug information
/// entry.
void AddSourceLine(DIE *Die, const DIVariable *V);
/// AddSourceLine - Add location information to specified debug information
/// entry.
void AddSourceLine(DIE *Die, const DIGlobal *G);
void AddSourceLine(DIE *Die, const DISubprogram *SP);
void AddSourceLine(DIE *Die, const DIType *Ty);
/// AddAddress - Add an address attribute to a die based on the location