summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Symbol/CompileUnit.h2
-rw-r--r--lldb/include/lldb/Symbol/SymbolVendor.h4
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp282
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h14
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp20
-rw-r--r--lldb/source/Symbol/SymbolVendor.cpp10
6 files changed, 178 insertions, 154 deletions
diff --git a/lldb/include/lldb/Symbol/CompileUnit.h b/lldb/include/lldb/Symbol/CompileUnit.h
index 4fe0b8baeeb..31295498c00 100644
--- a/lldb/include/lldb/Symbol/CompileUnit.h
+++ b/lldb/include/lldb/Symbol/CompileUnit.h
@@ -32,6 +32,7 @@ namespace lldb_private {
/// files), and a line table.
//----------------------------------------------------------------------
class CompileUnit :
+ public STD_ENABLE_SHARED_FROM_THIS(CompileUnit),
public ModuleChild,
public FileSpec,
public UserID,
@@ -105,6 +106,7 @@ public:
//------------------------------------------------------------------
/// Destructor
//------------------------------------------------------------------
+ virtual
~CompileUnit();
//------------------------------------------------------------------
diff --git a/lldb/include/lldb/Symbol/SymbolVendor.h b/lldb/include/lldb/Symbol/SymbolVendor.h
index b6a50d558e7..9c2e989b097 100644
--- a/lldb/include/lldb/Symbol/SymbolVendor.h
+++ b/lldb/include/lldb/Symbol/SymbolVendor.h
@@ -140,8 +140,8 @@ public:
GetNumCompileUnits();
virtual bool
- SetCompileUnitAtIndex (lldb::CompUnitSP& cu,
- uint32_t index);
+ SetCompileUnitAtIndex (uint32_t cu_idx,
+ const lldb::CompUnitSP &cu_sp);
virtual lldb::CompUnitSP
GetCompileUnitAtIndex(uint32_t idx);
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 243cbce0056..5ce1b75f013 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -706,61 +706,86 @@ SymbolFileDWARF::DebugRanges() const
return m_ranges.get();
}
-bool
-SymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* curr_cu, CompUnitSP& compile_unit_sp)
+lldb::CompUnitSP
+SymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx)
{
- if (curr_cu != NULL)
+ CompUnitSP cu_sp;
+ if (dwarf_cu)
{
- ModuleSP module_sp (m_obj_file->GetModule());
- if (!module_sp)
- return false;
-
- const DWARFDebugInfoEntry * cu_die = curr_cu->GetCompileUnitDIEOnly ();
- if (cu_die)
+ CompileUnit *comp_unit = (CompileUnit*)dwarf_cu->GetUserData();
+ if (comp_unit)
+ {
+ // We already parsed this compile unit, had out a shared pointer to it
+ cu_sp = comp_unit->shared_from_this();
+ }
+ else
{
- const char * cu_die_name = cu_die->GetName(this, curr_cu);
- const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, curr_cu, DW_AT_comp_dir, NULL);
- LanguageType cu_language = (LanguageType)cu_die->GetAttributeValueAsUnsigned(this, curr_cu, DW_AT_language, 0);
- if (cu_die_name)
+ ModuleSP module_sp (m_obj_file->GetModule());
+ if (module_sp)
{
- std::string ramapped_file;
- FileSpec cu_file_spec;
-
- if (cu_die_name[0] == '/' || cu_comp_dir == NULL || cu_comp_dir[0] == '\0')
- {
- // If we have a full path to the compile unit, we don't need to resolve
- // the file. This can be expensive e.g. when the source files are NFS mounted.
- if (module_sp->RemapSourceFile(cu_die_name, ramapped_file))
- cu_file_spec.SetFile (ramapped_file.c_str(), false);
- else
- cu_file_spec.SetFile (cu_die_name, false);
- }
- else
+ const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly ();
+ if (cu_die)
{
- std::string fullpath(cu_comp_dir);
- if (*fullpath.rbegin() != '/')
- fullpath += '/';
- fullpath += cu_die_name;
- if (module_sp->RemapSourceFile (fullpath.c_str(), ramapped_file))
- cu_file_spec.SetFile (ramapped_file.c_str(), false);
- else
- cu_file_spec.SetFile (fullpath.c_str(), false);
- }
+ const char * cu_die_name = cu_die->GetName(this, dwarf_cu);
+ const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL);
+ LanguageType cu_language = (LanguageType)cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_language, 0);
+ if (cu_die_name)
+ {
+ std::string ramapped_file;
+ FileSpec cu_file_spec;
- compile_unit_sp.reset(new CompileUnit (module_sp,
- curr_cu,
- cu_file_spec,
- MakeUserID(curr_cu->GetOffset()),
- cu_language));
- if (compile_unit_sp.get())
- {
- curr_cu->SetUserData(compile_unit_sp.get());
- return true;
+ if (cu_die_name[0] == '/' || cu_comp_dir == NULL || cu_comp_dir[0] == '\0')
+ {
+ // If we have a full path to the compile unit, we don't need to resolve
+ // the file. This can be expensive e.g. when the source files are NFS mounted.
+ if (module_sp->RemapSourceFile(cu_die_name, ramapped_file))
+ cu_file_spec.SetFile (ramapped_file.c_str(), false);
+ else
+ cu_file_spec.SetFile (cu_die_name, false);
+ }
+ else
+ {
+ std::string fullpath(cu_comp_dir);
+ if (*fullpath.rbegin() != '/')
+ fullpath += '/';
+ fullpath += cu_die_name;
+ if (module_sp->RemapSourceFile (fullpath.c_str(), ramapped_file))
+ cu_file_spec.SetFile (ramapped_file.c_str(), false);
+ else
+ cu_file_spec.SetFile (fullpath.c_str(), false);
+ }
+
+ cu_sp.reset(new CompileUnit (module_sp,
+ dwarf_cu,
+ cu_file_spec,
+ MakeUserID(dwarf_cu->GetOffset()),
+ cu_language));
+ if (cu_sp)
+ {
+ dwarf_cu->SetUserData(cu_sp.get());
+
+ if (m_debug_map_symfile)
+ {
+ // Let the symbol file register the compile unit with
+ // the symbol vendor using its compile unit index
+ // when we are doing DWARF in .o files + debug map
+ m_debug_map_symfile->SetCompileUnit(this, cu_sp);
+ }
+ else
+ {
+ // Figure out the compile unit index if we weren't given one
+ if (cu_idx == UINT32_MAX)
+ DebugInfo()->GetCompileUnit(dwarf_cu->GetOffset(), &cu_idx);
+
+ m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp);
+ }
+ }
+ }
}
}
}
}
- return false;
+ return cu_sp;
}
uint32_t
@@ -775,22 +800,15 @@ SymbolFileDWARF::GetNumCompileUnits()
CompUnitSP
SymbolFileDWARF::ParseCompileUnitAtIndex(uint32_t cu_idx)
{
- CompUnitSP comp_unit;
+ CompUnitSP cu_sp;
DWARFDebugInfo* info = DebugInfo();
if (info)
{
- DWARFCompileUnit* curr_cu = info->GetCompileUnitAtIndex(cu_idx);
- if (curr_cu != NULL)
- {
- // Our symbol vendor shouldn't be asking us to add a compile unit that
- // has already been added to it, which this DWARF plug-in knows as it
- // stores the lldb compile unit (CompileUnit) pointer in each
- // DWARFCompileUnit object when it gets added.
- assert(curr_cu->GetUserData() == NULL);
- ParseCompileUnit(curr_cu, comp_unit);
- }
+ DWARFCompileUnit* dwarf_cu = info->GetCompileUnitAtIndex(cu_idx);
+ if (dwarf_cu)
+ cu_sp = ParseCompileUnit(dwarf_cu, cu_idx);
}
- return comp_unit;
+ return cu_sp;
}
static void
@@ -924,14 +942,14 @@ bool
SymbolFileDWARF::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files)
{
assert (sc.comp_unit);
- DWARFCompileUnit* curr_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID());
- assert (curr_cu);
- const DWARFDebugInfoEntry * cu_die = curr_cu->GetCompileUnitDIEOnly();
+ DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID());
+ assert (dwarf_cu);
+ const DWARFDebugInfoEntry * cu_die = dwarf_cu->GetCompileUnitDIEOnly();
if (cu_die)
{
- const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, curr_cu, DW_AT_comp_dir, NULL);
- dw_offset_t stmt_list = cu_die->GetAttributeValueAsUnsigned(this, curr_cu, DW_AT_stmt_list, DW_INVALID_OFFSET);
+ const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_comp_dir, NULL);
+ dw_offset_t stmt_list = cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_stmt_list, DW_INVALID_OFFSET);
// All file indexes in DWARF are one based and a file of index zero is
// supposed to be the compile unit itself.
@@ -1938,7 +1956,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type
DWARFDebugInfo* debug_info = DebugInfo();
- DWARFCompileUnit *curr_cu = debug_info->GetCompileUnitContainingDIE (die->GetOffset()).get();
+ DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitContainingDIE (die->GetOffset()).get();
Type *type = m_die_to_type.lookup (die);
const dw_tag_t tag = die->Tag();
@@ -2005,7 +2023,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type
default_accessibility = eAccessPrivate;
}
- SymbolContext sc(GetCompUnitForDWARFCompUnit(curr_cu));
+ SymbolContext sc(GetCompUnitForDWARFCompUnit(dwarf_cu));
std::vector<clang::CXXBaseSpecifier *> base_classes;
std::vector<int> member_accessibilities;
bool is_a_class = false;
@@ -2013,7 +2031,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type
DWARFDIECollection member_function_dies;
ParseChildMembers (sc,
- curr_cu,
+ dwarf_cu,
die,
clang_type,
class_language,
@@ -2030,7 +2048,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type
{
for (size_t i=0; i<num_functions; ++i)
{
- ResolveType(curr_cu, member_function_dies.GetDIEPtrAtIndex(i));
+ ResolveType(dwarf_cu, member_function_dies.GetDIEPtrAtIndex(i));
}
}
@@ -2132,7 +2150,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type
if (type)
layout_info.bit_size = type->GetByteSize() * 8;
if (layout_info.bit_size == 0)
- layout_info.bit_size = die->GetAttributeValueAsUnsigned(this, curr_cu, DW_AT_byte_size, 0) * 8;
+ layout_info.bit_size = die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_byte_size, 0) * 8;
clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
const clang::RecordType *record_type = clang::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
if (record_type)
@@ -2170,8 +2188,8 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type
ast.StartTagDeclarationDefinition (clang_type);
if (die->HasChildren())
{
- SymbolContext sc(GetCompUnitForDWARFCompUnit(curr_cu));
- ParseChildEnumerators(sc, clang_type, type->GetByteSize(), curr_cu, die);
+ SymbolContext sc(GetCompUnitForDWARFCompUnit(dwarf_cu));
+ ParseChildEnumerators(sc, clang_type, type->GetByteSize(), dwarf_cu, die);
}
ast.CompleteTagDeclarationDefinition (clang_type);
return clang_type;
@@ -2184,14 +2202,14 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type
}
Type*
-SymbolFileDWARF::ResolveType (DWARFCompileUnit* curr_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed)
+SymbolFileDWARF::ResolveType (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed)
{
if (type_die != NULL)
{
Type *type = m_die_to_type.lookup (type_die);
if (type == NULL)
- type = GetTypeForDIE (curr_cu, type_die).get();
+ type = GetTypeForDIE (dwarf_cu, type_die).get();
if (assert_not_being_parsed)
{
@@ -2199,9 +2217,9 @@ SymbolFileDWARF::ResolveType (DWARFCompileUnit* curr_cu, const DWARFDebugInfoEnt
return type;
GetObjectFile()->GetModule()->ReportError ("Parsing a die that is being parsed die: 0x%8.8x: %s %s",
- type_die->GetOffset(),
- DW_TAG_value_to_name(type_die->Tag()),
- type_die->GetName(this, curr_cu));
+ type_die->GetOffset(),
+ DW_TAG_value_to_name(type_die->Tag()),
+ type_die->GetName(this, dwarf_cu));
}
else
@@ -2211,40 +2229,28 @@ SymbolFileDWARF::ResolveType (DWARFCompileUnit* curr_cu, const DWARFDebugInfoEnt
}
CompileUnit*
-SymbolFileDWARF::GetCompUnitForDWARFCompUnit (DWARFCompileUnit* curr_cu, uint32_t cu_idx)
+SymbolFileDWARF::GetCompUnitForDWARFCompUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx)
{
// Check if the symbol vendor already knows about this compile unit?
- if (curr_cu->GetUserData() == NULL)
+ if (dwarf_cu->GetUserData() == NULL)
{
// The symbol vendor doesn't know about this compile unit, we
// need to parse and add it to the symbol vendor object.
- CompUnitSP dc_cu;
- ParseCompileUnit(curr_cu, dc_cu);
- if (dc_cu.get())
- {
- // Figure out the compile unit index if we weren't given one
- if (cu_idx == UINT32_MAX)
- DebugInfo()->GetCompileUnit(curr_cu->GetOffset(), &cu_idx);
-
- m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(dc_cu, cu_idx);
-
- if (m_debug_map_symfile)
- m_debug_map_symfile->SetCompileUnit(this, dc_cu);
- }
+ return ParseCompileUnit(dwarf_cu, cu_idx).get();
}
- return (CompileUnit*)curr_cu->GetUserData();
+ return (CompileUnit*)dwarf_cu->GetUserData();
}
bool
-SymbolFileDWARF::GetFunction (DWARFCompileUnit* curr_cu, const DWARFDebugInfoEntry* func_die, SymbolContext& sc)
+SymbolFileDWARF::GetFunction (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* func_die, SymbolContext& sc)
{
sc.Clear();
// Check if the symbol vendor already knows about this compile unit?
- sc.comp_unit = GetCompUnitForDWARFCompUnit(curr_cu, UINT32_MAX);
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(func_die->GetOffset())).get();
if (sc.function == NULL)
- sc.function = ParseCompileUnitFunction(sc, curr_cu, func_die);
+ sc.function = ParseCompileUnitFunction(sc, dwarf_cu, func_die);
if (sc.function)
{
@@ -2278,10 +2284,10 @@ SymbolFileDWARF::ResolveSymbolContext (const Address& so_addr, uint32_t resolve_
if (cu_offset != DW_INVALID_OFFSET)
{
uint32_t cu_idx;
- DWARFCompileUnit* curr_cu = debug_info->GetCompileUnit(cu_offset, &cu_idx).get();
- if (curr_cu)
+ DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnit(cu_offset, &cu_idx).get();
+ if (dwarf_cu)
{
- sc.comp_unit = GetCompUnitForDWARFCompUnit(curr_cu, cu_idx);
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
assert(sc.comp_unit != NULL);
resolved |= eSymbolContextCompUnit;
@@ -2312,18 +2318,18 @@ SymbolFileDWARF::ResolveSymbolContext (const Address& so_addr, uint32_t resolve_
DWARFDebugInfoEntry *block_die = NULL;
if (resolve_scope & eSymbolContextBlock)
{
- curr_cu->LookupAddress(file_vm_addr, &function_die, &block_die);
+ dwarf_cu->LookupAddress(file_vm_addr, &function_die, &block_die);
}
else
{
- curr_cu->LookupAddress(file_vm_addr, &function_die, NULL);
+ dwarf_cu->LookupAddress(file_vm_addr, &function_die, NULL);
}
if (function_die != NULL)
{
sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(function_die->GetOffset())).get();
if (sc.function == NULL)
- sc.function = ParseCompileUnitFunction(sc, curr_cu, function_die);
+ sc.function = ParseCompileUnitFunction(sc, dwarf_cu, function_die);
}
else
{
@@ -2373,16 +2379,16 @@ SymbolFileDWARF::ResolveSymbolContext(const FileSpec& file_spec, uint32_t line,
if (debug_info)
{
uint32_t cu_idx;
- DWARFCompileUnit* curr_cu = NULL;
+ DWARFCompileUnit* dwarf_cu = NULL;
- for (cu_idx = 0; (curr_cu = debug_info->GetCompileUnitAtIndex(cu_idx)) != NULL; ++cu_idx)
+ for (cu_idx = 0; (dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx)) != NULL; ++cu_idx)
{
- CompileUnit *dc_cu = GetCompUnitForDWARFCompUnit(curr_cu, cu_idx);
+ CompileUnit *dc_cu = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
bool file_spec_matches_cu_file_spec = dc_cu != NULL && FileSpec::Compare(file_spec, *dc_cu, false) == 0;
if (check_inlines || file_spec_matches_cu_file_spec)
{
SymbolContext sc (m_obj_file->GetModule());
- sc.comp_unit = GetCompUnitForDWARFCompUnit(curr_cu, cu_idx);
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, cu_idx);
assert(sc.comp_unit != NULL);
uint32_t file_idx = UINT32_MAX;
@@ -2424,13 +2430,13 @@ SymbolFileDWARF::ResolveSymbolContext(const FileSpec& file_spec, uint32_t line,
{
DWARFDebugInfoEntry *function_die = NULL;
DWARFDebugInfoEntry *block_die = NULL;
- curr_cu->LookupAddress(file_vm_addr, &function_die, resolve_scope & eSymbolContextBlock ? &block_die : NULL);
+ dwarf_cu->LookupAddress(file_vm_addr, &function_die, resolve_scope & eSymbolContextBlock ? &block_die : NULL);
if (function_die != NULL)
{
sc.function = sc.comp_unit->FindFunctionByUID (MakeUserID(function_die->GetOffset())).get();
if (sc.function == NULL)
- sc.function = ParseCompileUnitFunction(sc, curr_cu, function_die);
+ sc.function = ParseCompileUnitFunction(sc, dwarf_cu, function_die);
}
if (sc.function != NULL)
@@ -2490,24 +2496,24 @@ SymbolFileDWARF::Index ()
const uint32_t num_compile_units = GetNumCompileUnits();
for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
{
- DWARFCompileUnit* curr_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
-
- bool clear_dies = curr_cu->ExtractDIEsIfNeeded (false) > 1;
-
- curr_cu->Index (cu_idx,
- m_function_basename_index,
- m_function_fullname_index,
- m_function_method_index,
- m_function_selector_index,
- m_objc_class_selectors_index,
- m_global_index,
- m_type_index,
- m_namespace_index);
+ DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+
+ bool clear_dies = dwarf_cu->ExtractDIEsIfNeeded (false) > 1;
+
+ dwarf_cu->Index (cu_idx,
+ m_function_basename_index,
+ m_function_fullname_index,
+ m_function_method_index,
+ m_function_selector_index,
+ m_objc_class_selectors_index,
+ m_global_index,
+ m_type_index,
+ m_namespace_index);
// Keep memory down by clearing DIEs if this generate function
// caused them to be parsed
if (clear_dies)
- curr_cu->ClearDIEs (true);
+ dwarf_cu->ClearDIEs (true);
}
m_function_basename_index.Finalize();
@@ -3678,11 +3684,19 @@ SymbolFileDWARF::ParseChildParameters (const SymbolContext& sc,
// HACK: Objective C formal parameters "self" and "_cmd"
// are not marked as artificial in the DWARF...
- CompileUnit *curr_cu = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
- if (curr_cu && (curr_cu->GetLanguage() == eLanguageTypeObjC || curr_cu->GetLanguage() == eLanguageTypeObjC_plus_plus))
+ CompileUnit *comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX);
+ if (comp_unit)
{
- if (name && name[0] && (strcmp (name, "self") == 0 || strcmp (name, "_cmd") == 0))
- skip = true;
+ switch (comp_unit->GetLanguage())
+ {
+ case eLanguageTypeObjC:
+ case eLanguageTypeObjC_plus_plus:
+ if (name && name[0] && (strcmp (name, "self") == 0 || strcmp (name, "_cmd") == 0))
+ skip = true;
+ break;
+ default:
+ break;
+ }
}
}
}
@@ -3943,19 +3957,19 @@ SymbolFileDWARF::ParseChildArrayInfo
}
TypeSP
-SymbolFileDWARF::GetTypeForDIE (DWARFCompileUnit *curr_cu, const DWARFDebugInfoEntry* die)
+SymbolFileDWARF::GetTypeForDIE (DWARFCompileUnit *dwarf_cu, const DWARFDebugInfoEntry* die)
{
TypeSP type_sp;
if (die != NULL)
{
- assert(curr_cu != NULL);
+ assert(dwarf_cu != NULL);
Type *type_ptr = m_die_to_type.lookup (die);
if (type_ptr == NULL)
{
- CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(curr_cu);
+ CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(dwarf_cu);
assert (lldb_cu);
SymbolContext sc(lldb_cu);
- type_sp = ParseType(sc, curr_cu, die, NULL);
+ type_sp = ParseType(sc, dwarf_cu, die, NULL);
}
else if (type_ptr != DIE_IS_BEING_PARSED)
{
@@ -3997,7 +4011,7 @@ SymbolFileDWARF::GetClangDeclContextForDIEOffset (const SymbolContext &sc, dw_of
}
clang::NamespaceDecl *
-SymbolFileDWARF::ResolveNamespaceDIE (DWARFCompileUnit *curr_cu, const DWARFDebugInfoEntry *die)
+SymbolFileDWARF::ResolveNamespaceDIE (DWARFCompileUnit *dwarf_cu, const DWARFDebugInfoEntry *die)
{
if (die && die->Tag() == DW_TAG_namespace)
{
@@ -4008,8 +4022,8 @@ SymbolFileDWARF::ResolveNamespaceDIE (DWARFCompileUnit *curr_cu, const DWARFDebu
return namespace_decl;
else
{
- const char *namespace_name = die->GetAttributeValueAsString(this, curr_cu, DW_AT_name, NULL);
- clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (curr_cu, die, NULL);
+ const char *namespace_name = die->GetAttributeValueAsString(this, dwarf_cu, DW_AT_name, NULL);
+ clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (dwarf_cu, die, NULL);
namespace_decl = GetClangASTContext().GetUniqueNamespaceDeclaration (namespace_name, containing_decl_ctx);
LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO));
if (log)
@@ -4216,8 +4230,8 @@ SymbolFileDWARF::Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu)
const uint32_t num_compile_units = GetNumCompileUnits();
for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
{
- DWARFCompileUnit* curr_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
- if (curr_cu != cu && curr_cu->Supports_DW_AT_APPLE_objc_complete_type())
+ DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+ if (dwarf_cu != cu && dwarf_cu->Supports_DW_AT_APPLE_objc_complete_type())
{
m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
break;
@@ -4303,7 +4317,7 @@ SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry
{
DEBUG_PRINTF ("resolved 0x%8.8llx (cu 0x%8.8llx) from %s to 0x%8.8llx (cu 0x%8.8llx)\n",
MakeUserID(die->GetOffset()),
- MakeUserID(curr_cu->GetOffset()),
+ MakeUserID(dwarf_cu->GetOffset()),
m_obj_file->GetFileSpec().GetFilename().AsCString(),
MakeUserID(type_die->GetOffset()),
MakeUserID(type_cu->GetOffset()));
@@ -4523,7 +4537,7 @@ SymbolFileDWARF::FindDefinitionTypeForDIE (DWARFCompileUnit* cu,
{
DEBUG_PRINTF ("resolved 0x%8.8llx (cu 0x%8.8llx) from %s to 0x%8.8llx (cu 0x%8.8llx)\n",
MakeUserID(die->GetOffset()),
- MakeUserID(curr_cu->GetOffset()),
+ MakeUserID(dwarf_cu->GetOffset()),
m_obj_file->GetFileSpec().GetFilename().AsCString(),
MakeUserID(type_die->GetOffset()),
MakeUserID(type_cu->GetOffset()));
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 4c8c7cbb9f2..95568277881 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -105,7 +105,7 @@ public:
virtual lldb_private::Type* ResolveTypeUID(lldb::user_id_t type_uid);
virtual lldb::clang_type_t ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_opaque_type);
- virtual lldb_private::Type* ResolveType (DWARFCompileUnit* cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed = true);
+ virtual lldb_private::Type* ResolveType (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed = true);
virtual clang::DeclContext* GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid);
virtual clang::DeclContext* GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid);
@@ -296,15 +296,15 @@ protected:
bool NamespaceDeclMatchesThisSymbolFile (const lldb_private::ClangNamespaceDecl *namespace_decl);
bool DIEIsInNamespace (const lldb_private::ClangNamespaceDecl *namespace_decl,
- DWARFCompileUnit* cu,
+ DWARFCompileUnit* dwarf_cu,
const DWARFDebugInfoEntry* die);
DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF);
- bool ParseCompileUnit (DWARFCompileUnit* cu, lldb::CompUnitSP& compile_unit_sp);
+ lldb::CompUnitSP ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx);
DWARFCompileUnit* GetDWARFCompileUnitForUID(lldb::user_id_t cu_uid);
DWARFCompileUnit* GetNextUnparsedDWARFCompileUnit(DWARFCompileUnit* prev_cu);
- lldb_private::CompileUnit* GetCompUnitForDWARFCompUnit(DWARFCompileUnit* cu, uint32_t cu_idx = UINT32_MAX);
- bool GetFunction (DWARFCompileUnit* cu, const DWARFDebugInfoEntry* func_die, lldb_private::SymbolContext& sc);
+ lldb_private::CompileUnit* GetCompUnitForDWARFCompUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx = UINT32_MAX);
+ bool GetFunction (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* func_die, lldb_private::SymbolContext& sc);
lldb_private::Function * ParseCompileUnitFunction (const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die);
size_t ParseFunctionBlocks (const lldb_private::SymbolContext& sc,
lldb_private::Block *parent_block,
@@ -314,7 +314,7 @@ protected:
uint32_t depth);
size_t ParseTypes (const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool parse_siblings, bool parse_children);
lldb::TypeSP ParseType (const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool *type_is_new);
- lldb_private::Type* ResolveTypeUID (DWARFCompileUnit* cu, const DWARFDebugInfoEntry* die, bool assert_not_being_parsed);
+ lldb_private::Type* ResolveTypeUID (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* die, bool assert_not_being_parsed);
lldb::VariableSP ParseVariableDIE(
const lldb_private::SymbolContext& sc,
@@ -406,7 +406,7 @@ protected:
lldb_private::SymbolContextList& sc_list);
lldb::TypeSP FindDefinitionTypeForDIE (
- DWARFCompileUnit* cu,
+ DWARFCompileUnit* dwarf_cu,
const DWARFDebugInfoEntry *die,
const lldb_private::ConstString &type_name);
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 9e8b5e8c5c9..14bd2e5ea1b 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -481,7 +481,8 @@ SymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx)
if (cu_idx < cu_count)
{
- if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL && m_compile_unit_infos[cu_idx].symbol_file_supported)
+ if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL &&
+ m_compile_unit_infos[cu_idx].symbol_file_supported)
{
SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (cu_idx);
if (oso_dwarf)
@@ -508,8 +509,8 @@ SymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx)
eLanguageTypeUnknown));
// Let our symbol vendor know about this compile unit
- m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (m_compile_unit_infos[cu_idx].oso_compile_unit_sp,
- cu_idx);
+ m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (cu_idx,
+ m_compile_unit_infos[cu_idx].oso_compile_unit_sp);
}
}
}
@@ -1101,18 +1102,19 @@ void
SymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp)
{
const uint32_t cu_count = GetNumCompileUnits();
- for (uint32_t i=0; i<cu_count; ++i)
+ for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx)
{
- if (m_compile_unit_infos[i].oso_symbol_vendor &&
- m_compile_unit_infos[i].oso_symbol_vendor->GetSymbolFile() == oso_dwarf)
+ if (m_compile_unit_infos[cu_idx].oso_symbol_vendor &&
+ m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetSymbolFile() == oso_dwarf)
{
- if (m_compile_unit_infos[i].oso_compile_unit_sp)
+ if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
{
- assert (m_compile_unit_infos[i].oso_compile_unit_sp.get() == cu_sp.get());
+ assert (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == cu_sp.get());
}
else
{
- m_compile_unit_infos[i].oso_compile_unit_sp = cu_sp;
+ m_compile_unit_infos[cu_idx].oso_compile_unit_sp = cu_sp;
+ m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp);
}
}
}
diff --git a/lldb/source/Symbol/SymbolVendor.cpp b/lldb/source/Symbol/SymbolVendor.cpp
index 506ee191b6b..7443eae98c9 100644
--- a/lldb/source/Symbol/SymbolVendor.cpp
+++ b/lldb/source/Symbol/SymbolVendor.cpp
@@ -100,7 +100,7 @@ SymbolVendor::AddSymbolFileRepresentation(const ObjectFileSP &objfile_sp)
}
bool
-SymbolVendor::SetCompileUnitAtIndex (CompUnitSP& cu, uint32_t idx)
+SymbolVendor::SetCompileUnitAtIndex (uint32_t idx, const CompUnitSP &cu_sp)
{
ModuleSP module_sp(GetModule());
if (module_sp)
@@ -115,9 +115,15 @@ SymbolVendor::SetCompileUnitAtIndex (CompUnitSP& cu, uint32_t idx)
// we don't have a race condition, or have a second parse of the same
// compile unit.
assert(m_compile_units[idx].get() == NULL);
- m_compile_units[idx] = cu;
+ m_compile_units[idx] = cu_sp;
return true;
}
+ else
+ {
+ // This should NOT happen, and if it does, we want to crash and know
+ // about it
+ assert (idx < num_compile_units);
+ }
}
return false;
}
OpenPOWER on IntegriCloud