summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Core')
-rw-r--r--lldb/source/Core/Address.cpp146
-rw-r--r--lldb/source/Core/Disassembler.cpp298
-rw-r--r--lldb/source/Core/FileSpec.cpp48
-rw-r--r--lldb/source/Core/Section.cpp24
4 files changed, 388 insertions, 128 deletions
diff --git a/lldb/source/Core/Address.cpp b/lldb/source/Core/Address.cpp
index f7e75001701..4658cf27add 100644
--- a/lldb/source/Core/Address.cpp
+++ b/lldb/source/Core/Address.cpp
@@ -17,39 +17,57 @@
using namespace lldb;
using namespace lldb_private;
+//static size_t
+//ReadBytes (ExecutionContextScope *exe_scope, const Address &address, void *dst, size_t dst_len)
+//{
+// if (exe_scope == NULL)
+// return 0;
+//
+// lldb::AddressType addr_type = eAddressTypeInvalid;
+// addr_t addr = LLDB_INVALID_ADDRESS;
+//
+// Process *process = exe_scope->CalculateProcess();
+//
+// if (process && process->IsAlive())
+// {
+// addr = address.GetLoadAddress(process);
+// if (addr != LLDB_INVALID_ADDRESS)
+// addr_type = eAddressTypeLoad;
+// }
+//
+// if (addr == LLDB_INVALID_ADDRESS)
+// {
+// addr = address.GetFileAddress();
+// if (addr != LLDB_INVALID_ADDRESS)
+// addr_type = eAddressTypeFile;
+// }
+//
+// if (addr_type == eAddressTypeInvalid)
+// return false;
+//
+// Target *target = exe_scope->CalculateTarget();
+// if (target)
+// {
+// Error error;
+// ObjectFile *objfile = NULL;
+// if (address.GetModule())
+// objfile = address.GetModule()->GetObjectFile();
+// return target->ReadMemory (addr_type, addr, dst, dst_len, error, objfile);
+// }
+// return 0;
+//}
+
static size_t
ReadBytes (ExecutionContextScope *exe_scope, const Address &address, void *dst, size_t dst_len)
{
if (exe_scope == NULL)
return 0;
- lldb::AddressType addr_type = eAddressTypeInvalid;
- addr_t addr = LLDB_INVALID_ADDRESS;
-
- Process *process = exe_scope->CalculateProcess();
-
- if (process && process->IsAlive())
- {
- addr = address.GetLoadAddress(process);
- if (addr != LLDB_INVALID_ADDRESS)
- addr_type = eAddressTypeLoad;
- }
-
- if (addr == LLDB_INVALID_ADDRESS)
- {
- addr = address.GetFileAddress();
- if (addr != LLDB_INVALID_ADDRESS)
- addr_type = eAddressTypeFile;
- }
-
- if (addr_type == eAddressTypeInvalid)
- return false;
-
Target *target = exe_scope->CalculateTarget();
if (target)
{
Error error;
- return target->ReadMemory (addr_type, addr, dst, dst_len, error, NULL);
+ return target->ReadMemory (address, dst, dst_len, error);
}
return 0;
}
@@ -386,7 +404,7 @@ Address::Clear()
bool
-Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, DumpStyle fallback_style) const
+Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, DumpStyle fallback_style, uint32_t addr_size) const
{
// If the section was NULL, only load address is going to work.
if (m_section == NULL)
@@ -395,12 +413,17 @@ Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, Dum
Process *process = NULL;
if (exe_scope)
process = exe_scope->CalculateProcess();
- int addr_size = sizeof (addr_t);
- if (process)
- addr_size = process->GetAddressByteSize ();
+ // If addr_byte_size is UINT32_MAX, then determine the correct address
+ // byte size for the process or default to the size of addr_t
+ if (addr_size == UINT32_MAX)
+ {
+ if (process)
+ addr_size = process->GetAddressByteSize ();
+ else
+ addr_size = sizeof(addr_t);
+ }
lldb_private::Address so_addr;
-
switch (style)
{
case DumpStyleSectionNameOffset:
@@ -411,12 +434,13 @@ Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, Dum
}
else
{
- s->Printf("0x%16.16llx", m_offset);
+ s->Address(m_offset, addr_size);
}
break;
case DumpStyleSectionPointerOffset:
- s->Printf("(Section *)%.*p + 0x%16.16llx", (int)sizeof(void*) * 2, m_section, m_offset);
+ s->Printf("(Section *)%.*p + ", (int)sizeof(void*) * 2, m_section);
+ s->Address(m_offset, addr_size);
break;
case DumpStyleModuleWithFileAddress:
@@ -428,7 +452,7 @@ Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, Dum
if (file_addr == LLDB_INVALID_ADDRESS)
{
if (fallback_style != DumpStyleInvalid)
- return Dump (s, exe_scope, fallback_style);
+ return Dump (s, exe_scope, fallback_style, DumpStyleInvalid, addr_size);
return false;
}
s->Address (file_addr, addr_size);
@@ -443,7 +467,7 @@ Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, Dum
if (load_addr == LLDB_INVALID_ADDRESS)
{
if (fallback_style != DumpStyleInvalid)
- return Dump (s, exe_scope, fallback_style);
+ return Dump (s, exe_scope, fallback_style, DumpStyleInvalid, addr_size);
return false;
}
s->Address (load_addr, addr_size);
@@ -592,13 +616,17 @@ Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, Dum
if (so_addr.IsSectionOffset())
{
lldb_private::SymbolContext pointer_sc;
- process->GetTarget().GetImages().ResolveSymbolContextForAddress (so_addr,
- eSymbolContextEverything,
- pointer_sc);
- if (pointer_sc.function || pointer_sc.symbol)
+ Target *target = exe_scope->CalculateTarget();
+ if (target)
{
- s->PutCString(": ");
- pointer_sc.DumpStopContext(s, process, so_addr, false);
+ target->GetImages().ResolveSymbolContextForAddress (so_addr,
+ eSymbolContextEverything,
+ pointer_sc);
+ if (pointer_sc.function || pointer_sc.symbol)
+ {
+ s->PutCString(": ");
+ pointer_sc.DumpStopContext(s, process, so_addr, false);
+ }
}
}
}
@@ -629,10 +657,7 @@ Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, Dum
{
// We have a function or a symbol from the same
// sections as this address.
- s->Indent(" Summary: ");
- sc.DumpStopContext(s, process, *this, false);
- s->EOL();
- sc.GetDescription(s, eDescriptionLevelBrief, process);
+ sc.DumpStopContext(s, process, *this, true);
}
else
{
@@ -648,10 +673,45 @@ Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, Dum
else
{
if (fallback_style != DumpStyleInvalid)
- return Dump (s, exe_scope, fallback_style);
+ return Dump (s, exe_scope, fallback_style, DumpStyleInvalid, addr_size);
return false;
}
break;
+
+ case DumpStyleDetailedSymbolContext:
+ if (IsSectionOffset())
+ {
+ lldb::AddressType addr_type = eAddressTypeLoad;
+ addr_t addr = GetLoadAddress (process);
+ if (addr == LLDB_INVALID_ADDRESS)
+ {
+ addr = GetFileAddress();
+ addr_type = eAddressTypeFile;
+ }
+
+ lldb_private::Module *module = GetModule();
+ if (module)
+ {
+ lldb_private::SymbolContext sc;
+ module->ResolveSymbolContextForAddress(*this, eSymbolContextEverything, sc);
+ if (sc.function || sc.symbol)
+ {
+ if (sc.function == NULL && sc.symbol != NULL)
+ {
+ // If we have just a symbol make sure it is in the right section
+ if (sc.symbol->GetAddressRangePtr() && sc.symbol->GetAddressRangePtr()->GetBaseAddress().GetSection() == GetSection())
+ {
+ sc.GetDescription(s, eDescriptionLevelBrief, process);
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (fallback_style != DumpStyleInvalid)
+ return Dump (s, exe_scope, fallback_style, DumpStyleInvalid, addr_size);
+ return false;
+ break;
}
return true;
diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp
index 9cdf618c087..a8eceb74ff9 100644
--- a/lldb/source/Core/Disassembler.cpp
+++ b/lldb/source/Core/Disassembler.cpp
@@ -52,53 +52,121 @@ Disassembler::FindPlugin (const ArchSpec &arch)
return NULL;
}
-bool
+
+
+size_t
Disassembler::Disassemble
(
Debugger &debugger,
const ArchSpec &arch,
const ExecutionContext &exe_ctx,
- uint32_t mixed_context_lines,
+ SymbolContextList &sc_list,
+ uint32_t num_mixed_context_lines,
+ bool show_bytes,
Stream &strm
)
{
- Disassembler *disassembler = Disassembler::FindPlugin(arch);
-
- if (disassembler)
+ size_t success_count = 0;
+ const size_t count = sc_list.GetSize();
+ SymbolContext sc;
+ AddressRange range;
+ for (size_t i=0; i<count; ++i)
{
- lldb::addr_t addr = LLDB_INVALID_ADDRESS;
- size_t byte_size = 0;
- if (exe_ctx.frame)
+ if (sc_list.GetContextAtIndex(i, sc) == false)
+ break;
+ if (sc.GetAddressRange(eSymbolContextFunction | eSymbolContextSymbol, range))
{
- SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
- if (sc.function)
+ if (Disassemble (debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, strm))
{
- addr = sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress(exe_ctx.process);
- if (addr != LLDB_INVALID_ADDRESS)
- byte_size = sc.function->GetAddressRange().GetByteSize();
+ ++success_count;
+ strm.EOL();
}
- else if (sc.symbol && sc.symbol->GetAddressRangePtr())
+ }
+ }
+ return success_count;
+}
+
+bool
+Disassembler::Disassemble
+(
+ Debugger &debugger,
+ const ArchSpec &arch,
+ const ExecutionContext &exe_ctx,
+ const ConstString &name,
+ Module *module,
+ uint32_t num_mixed_context_lines,
+ bool show_bytes,
+ Stream &strm
+)
+{
+ if (exe_ctx.target == NULL && name)
+ return false;
+
+ SymbolContextList sc_list;
+
+ if (module)
+ {
+ if (!module->FindFunctions (name,
+ eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
+ true,
+ sc_list))
+ return false;
+ }
+ else
+ {
+ if (exe_ctx.target->GetImages().FindFunctions (name,
+ eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
+ sc_list))
+ {
+ return Disassemble (debugger, arch, exe_ctx, sc_list, num_mixed_context_lines, show_bytes, strm);
+ }
+ else if (exe_ctx.target->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list))
+ {
+ return Disassemble (debugger, arch, exe_ctx, sc_list, num_mixed_context_lines, show_bytes, strm);
+ }
+ }
+ return false;
+}
+
+bool
+Disassembler::Disassemble
+(
+ Debugger &debugger,
+ const ArchSpec &arch,
+ const ExecutionContext &exe_ctx,
+ const AddressRange &disasm_range,
+ uint32_t num_mixed_context_lines,
+ bool show_bytes,
+ Stream &strm
+)
+{
+ if (disasm_range.GetByteSize())
+ {
+ Disassembler *disassembler = Disassembler::FindPlugin(arch);
+
+ if (disassembler)
+ {
+ AddressRange range(disasm_range);
+
+ Process *process = exe_ctx.process;
+
+ // If we weren't passed in a section offset address range,
+ // try and resolve it to something
+ if (range.GetBaseAddress().IsSectionOffset() == false)
{
- addr = sc.symbol->GetAddressRangePtr()->GetBaseAddress().GetLoadAddress(exe_ctx.process);
- if (addr != LLDB_INVALID_ADDRESS)
+ if (process && process->IsAlive())
{
- byte_size = sc.symbol->GetAddressRangePtr()->GetByteSize();
- if (byte_size == 0)
- byte_size = DEFAULT_DISASM_BYTE_SIZE;
+ process->ResolveLoadAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
+ }
+ else if (exe_ctx.target)
+ {
+ exe_ctx.target->GetImages().ResolveFileAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
}
}
- else
- {
- addr = exe_ctx.frame->GetPC().GetLoadAddress(exe_ctx.process);
- if (addr != LLDB_INVALID_ADDRESS)
- byte_size = DEFAULT_DISASM_BYTE_SIZE;
- }
- }
- if (byte_size)
- {
+
DataExtractor data;
- size_t bytes_disassembled = disassembler->ParseInstructions (&exe_ctx, eAddressTypeLoad, addr, byte_size, data);
+ size_t bytes_disassembled = disassembler->ParseInstructions (&exe_ctx, range, data);
if (bytes_disassembled == 0)
{
return false;
@@ -111,63 +179,94 @@ Disassembler::Disassemble
SymbolContext sc;
SymbolContext prev_sc;
AddressRange sc_range;
- if (mixed_context_lines)
+ if (num_mixed_context_lines)
strm.IndentMore ();
+
+ Address addr(range.GetBaseAddress());
+
+ // We extract the section to make sure we don't transition out
+ // of the current section when disassembling
+ const Section *addr_section = addr.GetSection();
+ Module *range_module = range.GetBaseAddress().GetModule();
+
for (size_t i=0; i<num_instructions; ++i)
{
Disassembler::Instruction *inst = disassembler->GetInstructionList().GetInstructionAtIndex (i);
if (inst)
{
- lldb::addr_t curr_addr = addr + offset;
- if (mixed_context_lines)
+ addr_t file_addr = addr.GetFileAddress();
+ if (addr_section == NULL || addr_section->ContainsFileAddress (file_addr) == false)
+ {
+ if (range_module)
+ range_module->ResolveFileAddress (file_addr, addr);
+ else if (exe_ctx.target)
+ exe_ctx.target->GetImages().ResolveFileAddress (file_addr, addr);
+
+ addr_section = addr.GetSection();
+ }
+
+ prev_sc = sc;
+
+ if (addr_section)
{
- if (!sc_range.ContainsLoadAddress (curr_addr, exe_ctx.process))
+ Module *module = addr_section->GetModule();
+ uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
+ if (resolved_mask)
{
- prev_sc = sc;
- Address curr_so_addr;
- Process *process = exe_ctx.process;
- if (process && process->ResolveLoadAddress (curr_addr, curr_so_addr))
+ if (prev_sc.function != sc.function || prev_sc.symbol != sc.symbol)
{
- if (curr_so_addr.GetSection())
+ if (prev_sc.function || prev_sc.symbol)
+ strm.EOL();
+
+ strm << sc.module_sp->GetFileSpec().GetFilename();
+
+ if (sc.function)
+ strm << '`' << sc.function->GetMangled().GetName();
+ else if (sc.symbol)
+ strm << '`' << sc.symbol->GetMangled().GetName();
+ strm << ":\n";
+ }
+
+ if (num_mixed_context_lines && !sc_range.ContainsFileAddress (addr))
+ {
+ sc.GetAddressRange (eSymbolContextEverything, sc_range);
+
+ if (sc != prev_sc)
{
- Module *module = curr_so_addr.GetSection()->GetModule();
- uint32_t resolved_mask = module->ResolveSymbolContextForAddress(curr_so_addr, eSymbolContextEverything, sc);
- if (resolved_mask)
+ if (offset != 0)
+ strm.EOL();
+
+ sc.DumpStopContext(&strm, process, addr);
+
+ if (sc.comp_unit && sc.line_entry.IsValid())
{
- sc.GetAddressRange (eSymbolContextEverything, sc_range);
- if (sc != prev_sc)
- {
- if (offset != 0)
- strm.EOL();
-
- sc.DumpStopContext(&strm, process, curr_so_addr);
-
- if (sc.comp_unit && sc.line_entry.IsValid())
- {
- debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (
- sc.line_entry.file,
- sc.line_entry.line,
- mixed_context_lines,
- mixed_context_lines,
- mixed_context_lines ? "->" : "",
- &strm);
- }
- }
+ debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.line_entry.file,
+ sc.line_entry.line,
+ num_mixed_context_lines,
+ num_mixed_context_lines,
+ num_mixed_context_lines ? "->" : "",
+ &strm);
}
}
}
}
+ else
+ {
+ sc.Clear();
+ }
}
- if (mixed_context_lines)
+ if (num_mixed_context_lines)
strm.IndentMore ();
strm.Indent();
size_t inst_byte_size = inst->GetByteSize();
- //inst->Dump(&strm, curr_addr, &data, offset); // Do dump opcode bytes
- inst->Dump(&strm, curr_addr, NULL, offset, exe_ctx, false); // Don't dump opcode bytes
+ inst->Dump(&strm, &addr, show_bytes ? &data : NULL, offset, exe_ctx, show_bytes);
strm.EOL();
offset += inst_byte_size;
- if (mixed_context_lines)
+
+ addr.SetOffset (addr.GetOffset() + inst_byte_size);
+
+ if (num_mixed_context_lines)
strm.IndentLess ();
}
else
@@ -175,7 +274,7 @@ Disassembler::Disassemble
break;
}
}
- if (mixed_context_lines)
+ if (num_mixed_context_lines)
strm.IndentLess ();
}
@@ -185,6 +284,42 @@ Disassembler::Disassemble
return false;
}
+
+bool
+Disassembler::Disassemble
+(
+ Debugger &debugger,
+ const ArchSpec &arch,
+ const ExecutionContext &exe_ctx,
+ uint32_t num_mixed_context_lines,
+ bool show_bytes,
+ Stream &strm
+)
+{
+ AddressRange range;
+ if (exe_ctx.frame)
+ {
+ SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
+ if (sc.function)
+ {
+ range = sc.function->GetAddressRange();
+ }
+ else if (sc.symbol && sc.symbol->GetAddressRangePtr())
+ {
+ range = *sc.symbol->GetAddressRangePtr();
+ }
+ else
+ {
+ range.GetBaseAddress() = exe_ctx.frame->GetPC();
+ }
+
+ if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0)
+ range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE);
+ }
+
+ return Disassemble(debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, strm);
+}
+
Disassembler::Instruction::Instruction()
{
}
@@ -244,26 +379,39 @@ size_t
Disassembler::ParseInstructions
(
const ExecutionContext *exe_ctx,
- lldb::AddressType addr_type,
- lldb::addr_t addr,
- size_t byte_size,
+ const AddressRange &range,
DataExtractor& data
)
{
- Process *process = exe_ctx->process;
+ Target *target = exe_ctx->target;
- if (process == NULL)
+ const addr_t byte_size = range.GetByteSize();
+ if (target == NULL || byte_size == 0 || !range.GetBaseAddress().IsValid())
return 0;
- DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0'));
+ DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0');
+ DataBufferSP data_sp(heap_buffer);
Error error;
- if (process->GetTarget().ReadMemory (addr_type, addr, data_sp->GetBytes(), data_sp->GetByteSize(), error, NULL))
+ const size_t bytes_read = target->ReadMemory (range.GetBaseAddress(), heap_buffer->GetBytes(), heap_buffer->GetByteSize(), error);
+
+ if (bytes_read > 0)
{
+ if (bytes_read != heap_buffer->GetByteSize())
+ heap_buffer->SetByteSize (bytes_read);
+
data.SetData(data_sp);
- data.SetByteOrder(process->GetByteOrder());
- data.SetAddressByteSize(process->GetAddressByteSize());
- return ParseInstructions (data, 0, UINT32_MAX, addr);
+ if (exe_ctx->process)
+ {
+ data.SetByteOrder(exe_ctx->process->GetByteOrder());
+ data.SetAddressByteSize(exe_ctx->process->GetAddressByteSize());
+ }
+ else
+ {
+ data.SetByteOrder(target->GetArchitecture().GetDefaultEndian());
+ data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
+ }
+ return DecodeInstructions (data, 0, UINT32_MAX);
}
return 0;
diff --git a/lldb/source/Core/FileSpec.cpp b/lldb/source/Core/FileSpec.cpp
index 91ad6b04351..ea3d3af3c75 100644
--- a/lldb/source/Core/FileSpec.cpp
+++ b/lldb/source/Core/FileSpec.cpp
@@ -496,6 +496,41 @@ FileSpec::MemorySize() const
return m_filename.MemorySize() + m_directory.MemorySize();
}
+
+size_t
+FileSpec::ReadFileContents (off_t file_offset, void *dst, size_t dst_len) const
+{
+ size_t bytes_read = 0;
+ char resolved_path[PATH_MAX];
+ if (GetPath(resolved_path, sizeof(resolved_path)))
+ {
+ int fd = ::open (resolved_path, O_RDONLY, 0);
+ if (fd != -1)
+ {
+ struct stat file_stats;
+ if (::fstat (fd, &file_stats) == 0)
+ {
+ // Read bytes directly into our basic_string buffer
+ if (file_stats.st_size > 0)
+ {
+ off_t lseek_result = 0;
+ if (file_offset > 0)
+ lseek_result = ::lseek (fd, file_offset, SEEK_SET);
+
+ if (lseek_result == file_offset)
+ {
+ ssize_t n = ::read (fd, dst, dst_len);
+ if (n >= 0)
+ bytes_read = n;
+ }
+ }
+ }
+ }
+ close(fd);
+ }
+ return bytes_read;
+}
+
//------------------------------------------------------------------
// Returns a shared pointer to a data buffer that contains all or
// part of the contents of a file. The data copies into a heap based
@@ -508,7 +543,7 @@ FileSpec::MemorySize() const
// verified using the DataBuffer::GetByteSize() function.
//------------------------------------------------------------------
DataBufferSP
-FileSpec::ReadFileContents(off_t file_offset, size_t file_size) const
+FileSpec::ReadFileContents (off_t file_offset, size_t file_size) const
{
DataBufferSP data_sp;
char resolved_path[PATH_MAX];
@@ -520,7 +555,6 @@ FileSpec::ReadFileContents(off_t file_offset, size_t file_size) const
struct stat file_stats;
if (::fstat (fd, &file_stats) == 0)
{
- // Read bytes directly into our basic_string buffer
if (file_stats.st_size > 0)
{
off_t lseek_result = 0;
@@ -533,11 +567,13 @@ FileSpec::ReadFileContents(off_t file_offset, size_t file_size) const
}
else if (lseek_result == file_offset)
{
+ const size_t bytes_left = file_stats.st_size - file_offset;
+ size_t num_bytes_to_read = file_size;
+ if (num_bytes_to_read > bytes_left)
+ num_bytes_to_read = bytes_left;
+
std::auto_ptr<DataBufferHeap> data_heap_ap;
- if (file_stats.st_size < file_size)
- data_heap_ap.reset(new DataBufferHeap(file_stats.st_size, '\0'));
- else
- data_heap_ap.reset(new DataBufferHeap(file_size, '\0'));
+ data_heap_ap.reset(new DataBufferHeap(num_bytes_to_read, '\0'));
if (data_heap_ap.get())
{
diff --git a/lldb/source/Core/Section.cpp b/lldb/source/Core/Section.cpp
index 6ed47730c6f..89549f002ab 100644
--- a/lldb/source/Core/Section.cpp
+++ b/lldb/source/Core/Section.cpp
@@ -323,6 +323,22 @@ Section::GetSectionDataFromImage (const DataExtractor& image_data, DataExtractor
return false;
}
+size_t
+Section::ReadSectionDataFromObjectFile (const ObjectFile* objfile, off_t section_offset, void *dst, size_t dst_len) const
+{
+ if (objfile && dst && dst_len)
+ {
+ const FileSpec& file = objfile->GetFileSpec();
+
+ if (file)
+ {
+ off_t section_file_offset = GetFileOffset() + objfile->GetOffset() + section_offset;
+ return file.ReadFileContents (section_file_offset, dst, dst_len);
+ }
+ }
+ return 0;
+}
+
//----------------------------------------------------------------------
// Get the section data the file on disk
//----------------------------------------------------------------------
@@ -340,11 +356,11 @@ Section::ReadSectionDataFromObjectFile(const ObjectFile* objfile, DataExtractor&
if (section_file_size > 0)
{
off_t section_file_offset = GetFileOffset() + objfile->GetOffset();
- DataBufferSP sectionDataSP(file.ReadFileContents(section_file_offset, section_file_size));
+ DataBufferSP section_data_sp(file.ReadFileContents(section_file_offset, section_file_size));
section_data.SetByteOrder(objfile->GetByteOrder());
section_data.SetAddressByteSize(objfile->GetAddressByteSize());
- return section_data.SetData (sectionDataSP);
+ return section_data.SetData (section_data_sp);
}
}
return 0;
@@ -364,10 +380,10 @@ Section::MemoryMapSectionDataFromObjectFile(const ObjectFile* objfile, DataExtra
if (section_file_size > 0)
{
off_t section_file_offset = GetFileOffset() + objfile->GetOffset();
- DataBufferSP sectionDataSP(file.MemoryMapFileContents(section_file_offset, section_file_size));
+ DataBufferSP section_data_sp(file.MemoryMapFileContents(section_file_offset, section_file_size));
section_data.SetByteOrder(objfile->GetByteOrder());
section_data.SetAddressByteSize(objfile->GetAddressByteSize());
- return section_data.SetData (sectionDataSP);
+ return section_data.SetData (section_data_sp);
}
}
return 0;
OpenPOWER on IntegriCloud