diff options
Diffstat (limited to 'lldb/source/Core')
-rw-r--r-- | lldb/source/Core/Address.cpp | 146 | ||||
-rw-r--r-- | lldb/source/Core/Disassembler.cpp | 298 | ||||
-rw-r--r-- | lldb/source/Core/FileSpec.cpp | 48 | ||||
-rw-r--r-- | lldb/source/Core/Section.cpp | 24 |
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; |