diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/Breakpoint/BreakpointResolverName.cpp | 28 | ||||
-rw-r--r-- | source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp | 60 | ||||
-rw-r--r-- | source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h | 1 | ||||
-rw-r--r-- | source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 47 | ||||
-rw-r--r-- | source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h | 3 | ||||
-rw-r--r-- | source/Symbol/SymbolContext.cpp | 2 | ||||
-rw-r--r-- | source/Target/Target.cpp | 135 |
7 files changed, 217 insertions, 59 deletions
diff --git a/source/Breakpoint/BreakpointResolverName.cpp b/source/Breakpoint/BreakpointResolverName.cpp index 87acb521b..37054d4af 100644 --- a/source/Breakpoint/BreakpointResolverName.cpp +++ b/source/Breakpoint/BreakpointResolverName.cpp @@ -26,7 +26,8 @@ BreakpointResolverName::BreakpointResolverName Breakpoint *bkpt, const char *func_name, uint32_t func_name_type_mask, - Breakpoint::MatchType type + Breakpoint::MatchType type, + bool skip_prologue ) : BreakpointResolver (bkpt, BreakpointResolver::NameResolver), m_func_name (), @@ -34,7 +35,8 @@ BreakpointResolverName::BreakpointResolverName m_func_name_type_mask (func_name_type_mask), m_class_name (), m_regex (), - m_match_type (type) + m_match_type (type), + m_skip_prologue (skip_prologue) { if (func_name_type_mask == eFunctionNameTypeAuto) { @@ -92,13 +94,15 @@ BreakpointResolverName::BreakpointResolverName BreakpointResolverName::BreakpointResolverName ( Breakpoint *bkpt, - RegularExpression &func_regex + RegularExpression &func_regex, + bool skip_prologue ) : BreakpointResolver (bkpt, BreakpointResolver::NameResolver), m_func_name (NULL), m_class_name (NULL), m_regex (func_regex), - m_match_type (Breakpoint::Regexp) + m_match_type (Breakpoint::Regexp), + m_skip_prologue (skip_prologue) { } @@ -108,13 +112,15 @@ BreakpointResolverName::BreakpointResolverName Breakpoint *bkpt, const char *class_name, const char *method, - Breakpoint::MatchType type + Breakpoint::MatchType type, + bool skip_prologue ) : BreakpointResolver (bkpt, BreakpointResolver::NameResolver), m_func_name (method), m_class_name (class_name), m_regex (), - m_match_type (type) + m_match_type (type), + m_skip_prologue (skip_prologue) { } @@ -139,18 +145,12 @@ BreakpointResolverName::SearchCallback SymbolContextList func_list; SymbolContextList sym_list; - bool skip_prologue = true; uint32_t i; bool new_location; SymbolContext sc; Address break_addr; assert (m_breakpoint != NULL); - if (context.target_sp) - { - skip_prologue = context.target_sp->GetSkipPrologue(); - } - LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); if (m_class_name) @@ -294,7 +294,7 @@ BreakpointResolverName::SearchCallback else if (sc.function) { break_addr = sc.function->GetAddressRange().GetBaseAddress(); - if (skip_prologue) + if (m_skip_prologue) { if (break_addr.IsValid()) { @@ -333,7 +333,7 @@ BreakpointResolverName::SearchCallback { break_addr = sc.symbol->GetAddressRangePtr()->GetBaseAddress(); - if (skip_prologue) + if (m_skip_prologue) { const uint32_t prologue_byte_size = sc.symbol->GetPrologueByteSize(); if (prologue_byte_size) diff --git a/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp b/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp index 50004ce27..609e6fc2c 100644 --- a/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp +++ b/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp @@ -87,6 +87,7 @@ DynamicLoaderMacOSXKernel::CreateInstance (Process* process, bool force) DynamicLoaderMacOSXKernel::DynamicLoaderMacOSXKernel (Process* process) : DynamicLoader(process), m_kernel(), + m_kext_summary_header_ptr_addr (), m_kext_summary_header_addr (), m_kext_summary_header (), m_break_id (LLDB_INVALID_BREAK_ID), @@ -150,6 +151,7 @@ DynamicLoaderMacOSXKernel::Clear (bool clear_process) if (clear_process) m_process = NULL; m_kernel.Clear(false); + m_kext_summary_header_ptr_addr.Clear(); m_kext_summary_header_addr.Clear(); m_kext_summaries.clear(); m_break_id = LLDB_INVALID_BREAK_ID; @@ -165,7 +167,7 @@ DynamicLoaderMacOSXKernel::Clear (bool clear_process) void DynamicLoaderMacOSXKernel::LoadKernelModuleIfNeeded() { - if (!m_kext_summary_header_addr.IsValid()) + if (!m_kext_summary_header_ptr_addr.IsValid()) { m_kernel.Clear(false); m_kernel.module_sp = m_process->GetTarget().GetExecutableModule(); @@ -176,7 +178,7 @@ DynamicLoaderMacOSXKernel::LoadKernelModuleIfNeeded() const Symbol *symbol = NULL; symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData); if (symbol) - m_kext_summary_header_addr = symbol->GetValue(); + m_kext_summary_header_ptr_addr = symbol->GetValue(); symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (mach_header_name, eSymbolTypeAbsolute); if (symbol) @@ -395,7 +397,15 @@ DynamicLoaderMacOSXKernel::BreakpointHit (StoppointCallbackContext *context, user_id_t break_id, user_id_t break_loc_id) { + LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); + if (log) + log->Printf ("DynamicLoaderMacOSXKernel::BreakpointHit (...)\n"); + ReadAllKextSummaries (); + + if (log) + PutToLog(log.get()); + return GetStopWhenImagesChange(); } @@ -408,7 +418,7 @@ DynamicLoaderMacOSXKernel::ReadKextSummaryHeader () // the all image infos is already valid for this process stop ID m_kext_summaries.clear(); - if (m_kext_summary_header_addr.IsValid()) + if (m_kext_summary_header_ptr_addr.IsValid()) { const uint32_t addr_size = m_kernel.GetAddressByteSize (); const ByteOrder byte_order = m_kernel.GetByteOrder(); @@ -419,17 +429,29 @@ DynamicLoaderMacOSXKernel::ReadKextSummaryHeader () DataExtractor data (buf, sizeof(buf), byte_order, addr_size); const size_t count = 4 * sizeof(uint32_t) + addr_size; const bool prefer_file_cache = false; - const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error); - if (bytes_read == count) + if (m_process->GetTarget().ReadPointerFromMemory (m_kext_summary_header_ptr_addr, + prefer_file_cache, + error, + m_kext_summary_header_addr)) { - uint32_t offset = 0; - m_kext_summary_header.version = data.GetU32(&offset); - m_kext_summary_header.entry_size = data.GetU32(&offset); - m_kext_summary_header.entry_count = data.GetU32(&offset); - m_kext_summary_header.reserved = data.GetU32(&offset); - return true; + // We got a valid address for our kext summary header and make sure it isn't NULL + if (m_kext_summary_header_addr.IsValid() && + m_kext_summary_header_addr.GetFileAddress() != 0) + { + const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error); + if (bytes_read == count) + { + uint32_t offset = 0; + m_kext_summary_header.version = data.GetU32(&offset); + m_kext_summary_header.entry_size = data.GetU32(&offset); + m_kext_summary_header.entry_count = data.GetU32(&offset); + m_kext_summary_header.reserved = data.GetU32(&offset); + return true; + } + } } } + m_kext_summary_header_addr.Clear(); return false; } @@ -471,16 +493,9 @@ DynamicLoaderMacOSXKernel::AddModulesUsingImageInfos (OSKextLoadedKextSummary::c { // Now add these images to the main list. ModuleList loaded_module_list; - LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); for (uint32_t idx = 0; idx < image_infos.size(); ++idx) { - if (log) - { - log->Printf ("Adding new image at address=0x%16.16llx.", image_infos[idx].address); - image_infos[idx].PutToLog (log.get()); - } - m_kext_summaries.push_back(image_infos[idx]); if (FindTargetModule (image_infos[idx], true, NULL)) @@ -517,8 +532,8 @@ DynamicLoaderMacOSXKernel::AddModulesUsingImageInfos (OSKextLoadedKextSummary::c } } } - if (log) - loaded_module_list.LogUUIDAndPaths (log, "DynamicLoaderMacOSXKernel::ModulesDidLoad"); +// if (log) +// loaded_module_list.LogUUIDAndPaths (log, "DynamicLoaderMacOSXKernel::ModulesDidLoad"); m_process->GetTarget().ModulesDidLoad (loaded_module_list); } return true; @@ -895,11 +910,14 @@ DynamicLoaderMacOSXKernel::SetNotificationBreakpointIfNeeded () { DEBUG_PRINTF("DynamicLoaderMacOSXKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState())); + const bool internal_bp = false; + const LazyBool skip_prologue = eLazyBoolNo; Breakpoint *bp = m_process->GetTarget().CreateBreakpoint (&m_kernel.module_sp->GetFileSpec(), "OSKextLoadedKextSummariesUpdated", eFunctionNameTypeFull, - internal_bp).get(); + internal_bp, + skip_prologue).get(); bp->SetCallback (DynamicLoaderMacOSXKernel::BreakpointHitCallback, this, true); m_break_id = bp->GetID(); diff --git a/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h b/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h index 53d3c6003..c2066f562 100644 --- a/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h +++ b/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h @@ -411,6 +411,7 @@ protected: UnloadImageLoadAddress (OSKextLoadedKextSummary& info); OSKextLoadedKextSummary m_kernel; // Info about the current kernel image being used + lldb_private::Address m_kext_summary_header_ptr_addr; lldb_private::Address m_kext_summary_header_addr; OSKextLoadedKextSummaryHeader m_kext_summary_header; OSKextLoadedKextSummary::collection m_kext_summaries; diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 75977a309..be9a12b62 100644 --- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -1218,16 +1218,30 @@ SymbolFileDWARF::ParseChildMembers if (is_artificial == false) { Type *member_type = ResolveTypeUID(encoding_uid); - assert(member_type); - if (accessibility == eAccessNone) - accessibility = default_accessibility; - member_accessibilities.push_back(accessibility); - - GetClangASTContext().AddFieldToRecordType (class_clang_type, - name, - member_type->GetClangLayoutType(), - accessibility, - bit_size); + if (member_type) + { + if (accessibility == eAccessNone) + accessibility = default_accessibility; + member_accessibilities.push_back(accessibility); + + GetClangASTContext().AddFieldToRecordType (class_clang_type, + name, + member_type->GetClangLayoutType(), + accessibility, + bit_size); + } + else + { + if (name) + ReportError ("0x%8.8x: DW_TAG_member '%s' refers to type 0x%8.8x which was unable to be parsed", + die->GetOffset(), + name, + encoding_uid); + else + ReportError ("0x%8.8x: DW_TAG_member refers to type 0x%8.8x which was unable to be parsed", + die->GetOffset(), + encoding_uid); + } } } ++member_idx; @@ -2237,6 +2251,19 @@ SymbolFileDWARF::FindFunctions(const RegularExpression& regex, bool append, Symb // Return the number of variable that were appended to the list return sc_list.GetSize() - original_size; } +void +SymbolFileDWARF::ReportError (const char *format, ...) +{ + ::fprintf (stderr, + "error: %s/%s ", + m_obj_file->GetFileSpec().GetDirectory().GetCString(), + m_obj_file->GetFileSpec().GetFilename().GetCString()); + + va_list args; + va_start (args, format); + vfprintf (stderr, format, args); + va_end (args); +} uint32_t SymbolFileDWARF::FindTypes(const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types) diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index d3b309cfc..3ed1d9493 100644 --- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -347,6 +347,9 @@ protected: m_decl_ctx_to_die[decl_ctx] = die; } + void + ReportError (const char *format, ...); + SymbolFileDWARFDebugMap * m_debug_map_symfile; clang::TranslationUnitDecl * m_clang_tu_decl; lldb_private::Flags m_flags; diff --git a/source/Symbol/SymbolContext.cpp b/source/Symbol/SymbolContext.cpp index 0898b8125..6d570d79e 100644 --- a/source/Symbol/SymbolContext.cpp +++ b/source/Symbol/SymbolContext.cpp @@ -164,7 +164,7 @@ SymbolContext::DumpStopContext dumped_something = true; s->PutCString(" at "); if (line_entry.DumpStopContext(s, show_fullpaths)) - return dumped_something; + dumped_something = true; } } } diff --git a/source/Target/Target.cpp b/source/Target/Target.cpp index 136269bd9..8ef6b92f3 100644 --- a/source/Target/Target.cpp +++ b/source/Target/Target.cpp @@ -213,13 +213,22 @@ Target::CreateBreakpoint (Address &addr, bool internal) } BreakpointSP -Target::CreateBreakpoint (const FileSpec *containingModule, const char *func_name, uint32_t func_name_type_mask, bool internal) +Target::CreateBreakpoint (const FileSpec *containingModule, + const char *func_name, + uint32_t func_name_type_mask, + bool internal, + LazyBool skip_prologue) { BreakpointSP bp_sp; if (func_name) { SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule)); - BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, func_name, func_name_type_mask, Breakpoint::Exact)); + + BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, + func_name, + func_name_type_mask, + Breakpoint::Exact, + skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue)); bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal); } return bp_sp; @@ -247,10 +256,15 @@ Target::GetSearchFilterForModule (const FileSpec *containingModule) } BreakpointSP -Target::CreateBreakpoint (const FileSpec *containingModule, RegularExpression &func_regex, bool internal) +Target::CreateBreakpoint (const FileSpec *containingModule, + RegularExpression &func_regex, + bool internal, + LazyBool skip_prologue) { SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule)); - BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL, func_regex)); + BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL, + func_regex, + skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue)); return CreateBreakpoint (filter_sp, resolver_sp, internal); } @@ -600,19 +614,21 @@ Target::ReadMemory (const Address& addr, bool prefer_file_cache, void *dst, size Address resolved_addr; if (!addr.IsSectionOffset()) { - if (process_is_valid) + if (m_section_load_list.IsEmpty()) { - // Process is valid and we were given an address that - // isn't section offset, so assume this is a load address - load_addr = addr.GetOffset(); - m_section_load_list.ResolveLoadAddress (addr.GetOffset(), resolved_addr); + // No sections are loaded, so we must assume we are not running + // yet and anything we are given is a file address. + file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address + m_images.ResolveFileAddress (file_addr, resolved_addr); } else { - // Process is NOT valid and we were given an address that - // isn't section offset, so assume this is a file address - file_addr = addr.GetOffset(); - m_images.ResolveFileAddress(addr.GetOffset(), resolved_addr); + // We have at least one section loaded. This can be becuase + // we have manually loaded some sections with "target modules load ..." + // or because we have have a live process that has sections loaded + // through the dynamic loader + load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address + m_section_load_list.ResolveLoadAddress (load_addr, resolved_addr); } } if (!resolved_addr.IsValid()) @@ -674,6 +690,99 @@ Target::ReadMemory (const Address& addr, bool prefer_file_cache, void *dst, size return 0; } +size_t +Target::ReadScalarIntegerFromMemory (const Address& addr, + bool prefer_file_cache, + uint32_t byte_size, + bool is_signed, + Scalar &scalar, + Error &error) +{ + uint64_t uval; + + if (byte_size <= sizeof(uval)) + { + size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error); + if (bytes_read == byte_size) + { + DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize()); + uint32_t offset = 0; + if (byte_size <= 4) + scalar = data.GetMaxU32 (&offset, byte_size); + else + scalar = data.GetMaxU64 (&offset, byte_size); + + if (is_signed) + scalar.SignExtend(byte_size * 8); + return bytes_read; + } + } + else + { + error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); + } + return 0; +} + +uint64_t +Target::ReadUnsignedIntegerFromMemory (const Address& addr, + bool prefer_file_cache, + size_t integer_byte_size, + uint64_t fail_value, + Error &error) +{ + Scalar scalar; + if (ReadScalarIntegerFromMemory (addr, + prefer_file_cache, + integer_byte_size, + false, + scalar, + error)) + return scalar.ULongLong(fail_value); + return fail_value; +} + +bool +Target::ReadPointerFromMemory (const Address& addr, + bool prefer_file_cache, + Error &error, + Address &pointer_addr) +{ + Scalar scalar; + if (ReadScalarIntegerFromMemory (addr, + prefer_file_cache, + m_arch.GetAddressByteSize(), + false, + scalar, + error)) + { + addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS); + if (pointer_vm_addr != LLDB_INVALID_ADDRESS) + { + if (m_section_load_list.IsEmpty()) + { + // No sections are loaded, so we must assume we are not running + // yet and anything we are given is a file address. + m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr); + } + else + { + // We have at least one section loaded. This can be becuase + // we have manually loaded some sections with "target modules load ..." + // or because we have have a live process that has sections loaded + // through the dynamic loader + m_section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr); + } + // We weren't able to resolve the pointer value, so just return + // an address with no section + if (!pointer_addr.IsValid()) + pointer_addr.SetOffset (pointer_vm_addr); + return true; + + } + } + return false; +} ModuleSP Target::GetSharedModule |