forked from OSchip/llvm-project
Added motheds to C++ classes as we parse them to keep clang happy.
llvm-svn: 114616
This commit is contained in:
parent
866ac0a0da
commit
a51ed9bb49
|
@ -37,6 +37,7 @@ namespace clang
|
|||
class CXXBaseSpecifier;
|
||||
class CXXBoolLiteralExpr;
|
||||
class CXXFunctionalCastExpr;
|
||||
class CXXMethodDecl;
|
||||
class CXXNamedCastExpr;
|
||||
class CXXRecordDecl;
|
||||
class CXXThisExpr;
|
||||
|
|
|
@ -182,22 +182,28 @@ public:
|
|||
bitfield_bit_size);
|
||||
}
|
||||
|
||||
static bool
|
||||
static clang::CXXMethodDecl *
|
||||
AddMethodToCXXRecordType (clang::ASTContext *ast_context,
|
||||
void *record_clang_type,
|
||||
void *record_opaque_type,
|
||||
const char *name,
|
||||
void *method_type);
|
||||
void *method_opaque_type,
|
||||
lldb::AccessType access,
|
||||
bool is_virtual);
|
||||
|
||||
bool
|
||||
AddMethodToCXXRecordType (void *record_clang_type,
|
||||
clang::CXXMethodDecl *
|
||||
AddMethodToCXXRecordType (void *record_opaque_type,
|
||||
const char *name,
|
||||
void *method_type)
|
||||
void *method_opaque_type,
|
||||
lldb::AccessType access,
|
||||
bool is_virtual)
|
||||
|
||||
{
|
||||
return ClangASTContext::AddMethodToCXXRecordType(getASTContext(),
|
||||
record_clang_type,
|
||||
record_opaque_type,
|
||||
name,
|
||||
method_type);
|
||||
method_opaque_type,
|
||||
access,
|
||||
is_virtual);
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -584,6 +584,9 @@
|
|||
268F9D54123AA16600B91E9B /* SBSymbolContextList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBSymbolContextList.cpp; path = source/API/SBSymbolContextList.cpp; sourceTree = "<group>"; };
|
||||
269416AD119A024800FF2715 /* CommandObjectTarget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CommandObjectTarget.cpp; path = source/Commands/CommandObjectTarget.cpp; sourceTree = "<group>"; };
|
||||
269416AE119A024800FF2715 /* CommandObjectTarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CommandObjectTarget.h; path = source/Commands/CommandObjectTarget.h; sourceTree = "<group>"; };
|
||||
269FF07D12494F7D00225026 /* FuncUnwinders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FuncUnwinders.h; path = include/lldb/Symbol/FuncUnwinders.h; sourceTree = "<group>"; };
|
||||
269FF07F12494F8E00225026 /* UnwindPlan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UnwindPlan.h; path = include/lldb/Symbol/UnwindPlan.h; sourceTree = "<group>"; };
|
||||
269FF08112494FC200225026 /* UnwindTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UnwindTable.h; path = include/lldb/Symbol/UnwindTable.h; sourceTree = "<group>"; };
|
||||
26A0604711A5BC7A00F75969 /* Baton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Baton.h; path = include/lldb/Core/Baton.h; sourceTree = "<group>"; };
|
||||
26A0604811A5D03C00F75969 /* Baton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Baton.cpp; path = source/Core/Baton.cpp; sourceTree = "<group>"; };
|
||||
26A3B4AC1181454800381BC2 /* ObjectContainerBSDArchive.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ObjectContainerBSDArchive.cpp; sourceTree = "<group>"; };
|
||||
|
@ -1741,9 +1744,6 @@
|
|||
26BC7C4B10F1B6C100F91463 /* Symbol */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
961FABB81235DE1600F93A47 /* FuncUnwinders.cpp */,
|
||||
961FABB91235DE1600F93A47 /* UnwindPlan.cpp */,
|
||||
961FABBA1235DE1600F93A47 /* UnwindTable.cpp */,
|
||||
26BC7C5510F1B6E900F91463 /* Block.h */,
|
||||
26BC7F1310F1B8EC00F91463 /* Block.cpp */,
|
||||
26BC7C5610F1B6E900F91463 /* ClangASTContext.h */,
|
||||
|
@ -1758,6 +1758,8 @@
|
|||
26BC7F1710F1B8EC00F91463 /* DWARFCallFrameInfo.cpp */,
|
||||
26BC7C5A10F1B6E900F91463 /* Function.h */,
|
||||
26BC7F1810F1B8EC00F91463 /* Function.cpp */,
|
||||
269FF07D12494F7D00225026 /* FuncUnwinders.h */,
|
||||
961FABB81235DE1600F93A47 /* FuncUnwinders.cpp */,
|
||||
26BC7C5B10F1B6E900F91463 /* LineEntry.h */,
|
||||
26BC7F1910F1B8EC00F91463 /* LineEntry.cpp */,
|
||||
26BC7C5C10F1B6E900F91463 /* LineTable.h */,
|
||||
|
@ -1781,6 +1783,10 @@
|
|||
26BC7F2010F1B8EC00F91463 /* Type.cpp */,
|
||||
26BC7C6610F1B6E900F91463 /* TypeList.h */,
|
||||
26BC7F2110F1B8EC00F91463 /* TypeList.cpp */,
|
||||
269FF07F12494F8E00225026 /* UnwindPlan.h */,
|
||||
961FABB91235DE1600F93A47 /* UnwindPlan.cpp */,
|
||||
269FF08112494FC200225026 /* UnwindTable.h */,
|
||||
961FABBA1235DE1600F93A47 /* UnwindTable.cpp */,
|
||||
26BC7C6710F1B6E900F91463 /* Variable.h */,
|
||||
26BC7F2210F1B8EC00F91463 /* Variable.cpp */,
|
||||
26BC7C6810F1B6E900F91463 /* VariableList.h */,
|
||||
|
|
|
@ -1205,10 +1205,12 @@ ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
|
|||
false,
|
||||
ClangASTContext::GetTypeQualifiers(copied_type));
|
||||
|
||||
ClangASTContext::AddMethodToCXXRecordType(parser_ast_context,
|
||||
copied_type,
|
||||
"___clang_expr",
|
||||
method_type);
|
||||
ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
|
||||
copied_type,
|
||||
"___clang_expr",
|
||||
method_type,
|
||||
lldb::eAccessPublic,
|
||||
false);
|
||||
}
|
||||
|
||||
context.AddTypeDecl(copied_type);
|
||||
|
|
|
@ -1108,18 +1108,133 @@ SymbolFileDWARF::ParseChildMembers
|
|||
|
||||
case DW_TAG_subprogram:
|
||||
{
|
||||
DWARFDebugInfoEntry::Attributes attributes;
|
||||
is_a_class = true;
|
||||
if (default_accessibility == eAccessNone)
|
||||
default_accessibility = eAccessPrivate;
|
||||
// TODO: implement DW_TAG_subprogram type parsing
|
||||
// UserDefTypeChildInfo method_info(die->GetOffset());
|
||||
//
|
||||
// FunctionSP func_sp (sc.comp_unit->FindFunctionByUID (die->GetOffset()));
|
||||
// if (func_sp.get() == NULL)
|
||||
// ParseCompileUnitFunction(sc, dwarf_cu, die);
|
||||
//
|
||||
// method_info.SetEncodingTypeUID(die->GetOffset());
|
||||
// struct_udt->AddMethod(method_info);
|
||||
|
||||
//printf("0x%8.8x: %s (ParesTypes)\n", die->GetOffset(), DW_TAG_value_to_name(tag));
|
||||
// Set a bit that lets us know that we are currently parsing this
|
||||
const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(DIE_IS_BEING_PARSED);
|
||||
|
||||
const char *mangled = NULL;
|
||||
dw_offset_t type_die_offset = DW_INVALID_OFFSET;
|
||||
Declaration decl;
|
||||
bool is_variadic = false;
|
||||
bool is_inline = false;
|
||||
bool is_virtual = false;
|
||||
unsigned type_quals = 0;
|
||||
AccessType accessibility = default_accessibility;
|
||||
|
||||
clang::FunctionDecl::StorageClass storage = clang::FunctionDecl::None;//, Extern, Static, PrivateExtern
|
||||
const char *type_name_cstr = NULL;
|
||||
ConstString type_name_dbstr;
|
||||
|
||||
|
||||
const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes);
|
||||
if (num_attributes > 0)
|
||||
{
|
||||
uint32_t i;
|
||||
for (i=0; i<num_attributes; ++i)
|
||||
{
|
||||
const dw_attr_t attr = attributes.AttributeAtIndex(i);
|
||||
DWARFFormValue form_value;
|
||||
if (attributes.ExtractFormValueAtIndex(this, i, form_value))
|
||||
{
|
||||
switch (attr)
|
||||
{
|
||||
case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break;
|
||||
case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break;
|
||||
case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
|
||||
case DW_AT_name:
|
||||
type_name_cstr = form_value.AsCString(&get_debug_str_data());
|
||||
break;
|
||||
|
||||
case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(&get_debug_str_data()); break;
|
||||
case DW_AT_type: type_die_offset = form_value.Reference(dwarf_cu); break;
|
||||
case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
|
||||
//case DW_AT_declaration: is_forward_declaration = form_value.Unsigned() != 0; break;
|
||||
case DW_AT_external:
|
||||
if (form_value.Unsigned())
|
||||
{
|
||||
if (storage == clang::FunctionDecl::None)
|
||||
storage = clang::FunctionDecl::Extern;
|
||||
else
|
||||
storage = clang::FunctionDecl::PrivateExtern;
|
||||
}
|
||||
break;
|
||||
case DW_AT_inline:
|
||||
is_inline = form_value.Unsigned() != 0;
|
||||
break;
|
||||
|
||||
|
||||
case DW_AT_virtuality:
|
||||
is_virtual = form_value.Unsigned() != 0;
|
||||
break;
|
||||
|
||||
case DW_AT_allocated:
|
||||
case DW_AT_associated:
|
||||
case DW_AT_address_class:
|
||||
case DW_AT_artificial:
|
||||
case DW_AT_calling_convention:
|
||||
case DW_AT_data_location:
|
||||
case DW_AT_elemental:
|
||||
case DW_AT_entry_pc:
|
||||
case DW_AT_explicit:
|
||||
case DW_AT_frame_base:
|
||||
case DW_AT_high_pc:
|
||||
case DW_AT_low_pc:
|
||||
case DW_AT_object_pointer:
|
||||
case DW_AT_prototyped:
|
||||
case DW_AT_pure:
|
||||
case DW_AT_ranges:
|
||||
case DW_AT_recursive:
|
||||
case DW_AT_return_addr:
|
||||
case DW_AT_segment:
|
||||
case DW_AT_specification:
|
||||
case DW_AT_start_scope:
|
||||
case DW_AT_static_link:
|
||||
case DW_AT_trampoline:
|
||||
case DW_AT_visibility:
|
||||
case DW_AT_vtable_elem_location:
|
||||
case DW_AT_abstract_origin:
|
||||
case DW_AT_description:
|
||||
case DW_AT_sibling:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void *return_clang_type = NULL;
|
||||
Type *func_type = ResolveTypeUID(type_die_offset);
|
||||
if (func_type)
|
||||
return_clang_type = func_type->GetOpaqueClangQualType();
|
||||
else
|
||||
return_clang_type = type_list->GetClangASTContext().GetBuiltInType_void();
|
||||
|
||||
std::vector<void *> function_param_types;
|
||||
std::vector<clang::ParmVarDecl*> function_param_decls;
|
||||
|
||||
// Parse the function children for the parameters
|
||||
bool skip_artificial = true;
|
||||
|
||||
ParseChildParameters (sc, type_sp, dwarf_cu, die, skip_artificial, type_list, function_param_types, function_param_decls);
|
||||
|
||||
void *method_function_proto = type_list->GetClangASTContext().CreateFunctionType (return_clang_type, &function_param_types[0], function_param_types.size(), is_variadic, type_quals);
|
||||
if (type_name_cstr)
|
||||
{
|
||||
clang::CXXMethodDecl *method_decl = type_list->GetClangASTContext().AddMethodToCXXRecordType (class_clang_type,
|
||||
type_name_cstr,
|
||||
method_function_proto,
|
||||
accessibility,
|
||||
is_virtual);
|
||||
assert (method_decl);
|
||||
//m_die_to_decl_ctx[die] = method_decl;
|
||||
}
|
||||
|
||||
const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(type_sp.get());
|
||||
assert(type_sp.get());
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1913,6 +2028,7 @@ SymbolFileDWARF::ParseChildParameters
|
|||
TypeSP& type_sp,
|
||||
const DWARFCompileUnit* dwarf_cu,
|
||||
const DWARFDebugInfoEntry *parent_die,
|
||||
bool skip_artificial,
|
||||
TypeList* type_list,
|
||||
std::vector<void *>& function_param_types,
|
||||
std::vector<clang::ParmVarDecl*>& function_param_decls
|
||||
|
@ -1939,6 +2055,7 @@ SymbolFileDWARF::ParseChildParameters
|
|||
const char *name = NULL;
|
||||
Declaration decl;
|
||||
dw_offset_t param_type_die_offset = DW_INVALID_OFFSET;
|
||||
bool is_artificial = false;
|
||||
// one of None, Auto, Register, Extern, Static, PrivateExtern
|
||||
|
||||
clang::VarDecl::StorageClass storage = clang::VarDecl::None;
|
||||
|
@ -1956,6 +2073,7 @@ SymbolFileDWARF::ParseChildParameters
|
|||
case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
|
||||
case DW_AT_name: name = form_value.AsCString(&get_debug_str_data()); break;
|
||||
case DW_AT_type: param_type_die_offset = form_value.Reference(dwarf_cu); break;
|
||||
case DW_AT_artificial: is_artificial = form_value.Unsigned() != 0; break;
|
||||
case DW_AT_location:
|
||||
// if (form_value.BlockData())
|
||||
// {
|
||||
|
@ -1967,7 +2085,6 @@ SymbolFileDWARF::ParseChildParameters
|
|||
// {
|
||||
// }
|
||||
// break;
|
||||
case DW_AT_artificial:
|
||||
case DW_AT_const_value:
|
||||
case DW_AT_default_value:
|
||||
case DW_AT_description:
|
||||
|
@ -1982,6 +2099,10 @@ SymbolFileDWARF::ParseChildParameters
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (skip_artificial && is_artificial)
|
||||
continue;
|
||||
|
||||
Type *dc_type = ResolveTypeUID(param_type_die_offset);
|
||||
if (dc_type)
|
||||
{
|
||||
|
@ -2717,7 +2838,7 @@ SymbolFileDWARF::ParseType(const SymbolContext& sc, const DWARFCompileUnit* dwar
|
|||
const char *mangled = NULL;
|
||||
dw_offset_t type_die_offset = DW_INVALID_OFFSET;
|
||||
Declaration decl;
|
||||
bool isVariadic = false;
|
||||
bool is_variadic = false;
|
||||
bool is_inline = false;
|
||||
unsigned type_quals = 0;
|
||||
clang::FunctionDecl::StorageClass storage = clang::FunctionDecl::None;//, Extern, Static, PrivateExtern
|
||||
|
@ -2805,9 +2926,10 @@ SymbolFileDWARF::ParseType(const SymbolContext& sc, const DWARFCompileUnit* dwar
|
|||
std::vector<clang::ParmVarDecl*> function_param_decls;
|
||||
|
||||
// Parse the function children for the parameters
|
||||
ParseChildParameters(sc, type_sp, dwarf_cu, die, type_list, function_param_types, function_param_decls);
|
||||
bool skip_artificial = false;
|
||||
ParseChildParameters(sc, type_sp, dwarf_cu, die, skip_artificial, type_list, function_param_types, function_param_decls);
|
||||
|
||||
clang_type = type_list->GetClangASTContext().CreateFunctionType (return_clang_type, &function_param_types[0], function_param_types.size(), isVariadic, type_quals);
|
||||
clang_type = type_list->GetClangASTContext().CreateFunctionType (return_clang_type, &function_param_types[0], function_param_types.size(), is_variadic, type_quals);
|
||||
if (type_name_cstr)
|
||||
{
|
||||
clang::FunctionDecl *function_decl = type_list->GetClangASTContext().CreateFunctionDeclaration (type_name_cstr, clang_type, storage, is_inline);
|
||||
|
|
|
@ -248,6 +248,7 @@ protected:
|
|||
lldb::TypeSP& type_sp,
|
||||
const DWARFCompileUnit* dwarf_cu,
|
||||
const DWARFDebugInfoEntry *parent_die,
|
||||
bool skip_artificial,
|
||||
lldb_private::TypeList* type_list,
|
||||
std::vector<void *>& function_args,
|
||||
std::vector<clang::ParmVarDecl*>& function_param_decls);
|
||||
|
|
|
@ -803,14 +803,16 @@ ClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl
|
|||
return ast_context->getTagDeclType(decl).getAsOpaquePtr();
|
||||
}
|
||||
|
||||
bool
|
||||
CXXMethodDecl *
|
||||
ClangASTContext::AddMethodToCXXRecordType
|
||||
(
|
||||
clang::ASTContext *ast_context,
|
||||
void *record_opaque_type,
|
||||
const char *name,
|
||||
void *method_opaque_type
|
||||
)
|
||||
clang::ASTContext *ast_context,
|
||||
void *record_opaque_type,
|
||||
const char *name,
|
||||
void *method_opaque_type,
|
||||
lldb::AccessType access,
|
||||
bool is_virtual
|
||||
)
|
||||
{
|
||||
if (!record_opaque_type || !method_opaque_type || !name)
|
||||
return false;
|
||||
|
@ -825,22 +827,22 @@ ClangASTContext::AddMethodToCXXRecordType
|
|||
clang::Type *record_type(record_qual_type.getTypePtr());
|
||||
|
||||
if (!record_type)
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
RecordType *record_recty(dyn_cast<RecordType>(record_type));
|
||||
|
||||
if (!record_recty)
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
RecordDecl *record_decl = record_recty->getDecl();
|
||||
|
||||
if (!record_decl)
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
|
||||
|
||||
if (!cxx_record_decl)
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
QualType method_qual_type(QualType::getFromOpaquePtr(method_opaque_type));
|
||||
|
||||
|
@ -851,17 +853,19 @@ ClangASTContext::AddMethodToCXXRecordType
|
|||
method_qual_type,
|
||||
NULL);
|
||||
|
||||
cxx_method_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access));
|
||||
cxx_method_decl->setVirtualAsWritten (is_virtual);
|
||||
|
||||
// Populate the method decl with parameter decls
|
||||
|
||||
clang::Type *method_type(method_qual_type.getTypePtr());
|
||||
|
||||
if (!method_type)
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
FunctionProtoType *method_funprototy(dyn_cast<FunctionProtoType>(method_type));
|
||||
|
||||
if (!method_funprototy)
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
unsigned int num_params = method_funprototy->getNumArgs();
|
||||
|
||||
|
@ -886,7 +890,7 @@ ClangASTContext::AddMethodToCXXRecordType
|
|||
|
||||
cxx_record_decl->addDecl(cxx_method_decl);
|
||||
|
||||
return true;
|
||||
return cxx_method_decl;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -7,18 +7,19 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "lldb/Symbol/ObjectFile.h"
|
||||
#include "lldb/Symbol/UnwindTable.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lldb/lldb-forward.h"
|
||||
|
||||
#include "lldb/Core/Module.h"
|
||||
#include "lldb/Core/Section.h"
|
||||
#include "lldb/Symbol/ObjectFile.h"
|
||||
#include "lldb/Symbol/FuncUnwinders.h"
|
||||
#include "lldb/Symbol/SymbolContext.h"
|
||||
#include "lldb/Core/Section.h"
|
||||
#include "lldb/Core/Module.h"
|
||||
#include "lldb/lldb-forward.h"
|
||||
#include "lldb/Utility/UnwindAssemblyProfiler.h"
|
||||
#include "lldb/Symbol/DWARFCallFrameInfo.h"
|
||||
|
||||
#include "lldb/Symbol/UnwindTable.h"
|
||||
#include <stdio.h>
|
||||
#include "lldb/Utility/UnwindAssemblyProfiler.h"
|
||||
|
||||
// There is one UnwindTable object per ObjectFile.
|
||||
// It contains a list of Unwind objects -- one per function, populated lazily -- for the ObjectFile.
|
||||
|
|
Loading…
Reference in New Issue