[Lldb-commits] [lldb] r203383 - Implement ObjectFilePECOFF::GetModuleSpecifications().
Virgile Bello
virgile.bello at gmail.com
Sun Mar 9 01:59:37 PST 2014
Author: xen2
Date: Sun Mar 9 04:59:36 2014
New Revision: 203383
URL: http://llvm.org/viewvc/llvm-project?rev=203383&view=rev
Log:
Implement ObjectFilePECOFF::GetModuleSpecifications().
Modified:
lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
Modified: lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp?rev=203383&r1=203382&r2=203383&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp Sun Mar 9 04:59:36 2014
@@ -109,7 +109,33 @@ ObjectFilePECOFF::GetModuleSpecification
lldb::offset_t length,
lldb_private::ModuleSpecList &specs)
{
- return 0;
+ const size_t initial_count = specs.GetSize();
+
+ if (ObjectFilePECOFF::MagicBytesMatch(data_sp))
+ {
+ DataExtractor data;
+ data.SetData(data_sp, data_offset, length);
+ data.SetByteOrder(eByteOrderLittle);
+
+ dos_header_t dos_header;
+ coff_header_t coff_header;
+
+ if (ParseDOSHeader(data, dos_header))
+ {
+ lldb::offset_t offset = dos_header.e_lfanew;
+ uint32_t pe_signature = data.GetU32(&offset);
+ if (pe_signature != IMAGE_NT_SIGNATURE)
+ return false;
+ if (ParseCOFFHeader(data, &offset, coff_header))
+ {
+ ArchSpec spec;
+ spec.SetArchitecture(eArchTypeCOFF, coff_header.machine, LLDB_INVALID_CPUTYPE);
+ specs.Append(ModuleSpec(file, spec));
+ }
+ }
+ }
+
+ return specs.GetSize() - initial_count;
}
@@ -157,13 +183,13 @@ ObjectFilePECOFF::ParseHeader ()
m_data.SetByteOrder (eByteOrderLittle);
lldb::offset_t offset = 0;
- if (ParseDOSHeader())
+ if (ParseDOSHeader(m_data, m_dos_header))
{
offset = m_dos_header.e_lfanew;
uint32_t pe_signature = m_data.GetU32 (&offset);
if (pe_signature != IMAGE_NT_SIGNATURE)
return false;
- if (ParseCOFFHeader(&offset))
+ if (ParseCOFFHeader(m_data, &offset, m_coff_header))
{
if (m_coff_header.hdrsize > 0)
ParseCOFFOptionalHeader(&offset);
@@ -254,56 +280,56 @@ ObjectFilePECOFF::NeedsEndianSwap() cons
// ParseDOSHeader
//----------------------------------------------------------------------
bool
-ObjectFilePECOFF::ParseDOSHeader ()
+ObjectFilePECOFF::ParseDOSHeader (DataExtractor &data, dos_header_t &dos_header)
{
bool success = false;
lldb::offset_t offset = 0;
- success = m_data.ValidOffsetForDataOfSize(0, sizeof(m_dos_header));
+ success = data.ValidOffsetForDataOfSize(0, sizeof(dos_header));
if (success)
{
- m_dos_header.e_magic = m_data.GetU16(&offset); // Magic number
- success = m_dos_header.e_magic == IMAGE_DOS_SIGNATURE;
+ dos_header.e_magic = data.GetU16(&offset); // Magic number
+ success = dos_header.e_magic == IMAGE_DOS_SIGNATURE;
if (success)
{
- m_dos_header.e_cblp = m_data.GetU16(&offset); // Bytes on last page of file
- m_dos_header.e_cp = m_data.GetU16(&offset); // Pages in file
- m_dos_header.e_crlc = m_data.GetU16(&offset); // Relocations
- m_dos_header.e_cparhdr = m_data.GetU16(&offset); // Size of header in paragraphs
- m_dos_header.e_minalloc = m_data.GetU16(&offset); // Minimum extra paragraphs needed
- m_dos_header.e_maxalloc = m_data.GetU16(&offset); // Maximum extra paragraphs needed
- m_dos_header.e_ss = m_data.GetU16(&offset); // Initial (relative) SS value
- m_dos_header.e_sp = m_data.GetU16(&offset); // Initial SP value
- m_dos_header.e_csum = m_data.GetU16(&offset); // Checksum
- m_dos_header.e_ip = m_data.GetU16(&offset); // Initial IP value
- m_dos_header.e_cs = m_data.GetU16(&offset); // Initial (relative) CS value
- m_dos_header.e_lfarlc = m_data.GetU16(&offset); // File address of relocation table
- m_dos_header.e_ovno = m_data.GetU16(&offset); // Overlay number
+ dos_header.e_cblp = data.GetU16(&offset); // Bytes on last page of file
+ dos_header.e_cp = data.GetU16(&offset); // Pages in file
+ dos_header.e_crlc = data.GetU16(&offset); // Relocations
+ dos_header.e_cparhdr = data.GetU16(&offset); // Size of header in paragraphs
+ dos_header.e_minalloc = data.GetU16(&offset); // Minimum extra paragraphs needed
+ dos_header.e_maxalloc = data.GetU16(&offset); // Maximum extra paragraphs needed
+ dos_header.e_ss = data.GetU16(&offset); // Initial (relative) SS value
+ dos_header.e_sp = data.GetU16(&offset); // Initial SP value
+ dos_header.e_csum = data.GetU16(&offset); // Checksum
+ dos_header.e_ip = data.GetU16(&offset); // Initial IP value
+ dos_header.e_cs = data.GetU16(&offset); // Initial (relative) CS value
+ dos_header.e_lfarlc = data.GetU16(&offset); // File address of relocation table
+ dos_header.e_ovno = data.GetU16(&offset); // Overlay number
- m_dos_header.e_res[0] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res[1] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res[2] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res[3] = m_data.GetU16(&offset); // Reserved words
+ dos_header.e_res[0] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res[1] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res[2] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res[3] = data.GetU16(&offset); // Reserved words
- m_dos_header.e_oemid = m_data.GetU16(&offset); // OEM identifier (for e_oeminfo)
- m_dos_header.e_oeminfo = m_data.GetU16(&offset); // OEM information; e_oemid specific
- m_dos_header.e_res2[0] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res2[1] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res2[2] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res2[3] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res2[4] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res2[5] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res2[6] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res2[7] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res2[8] = m_data.GetU16(&offset); // Reserved words
- m_dos_header.e_res2[9] = m_data.GetU16(&offset); // Reserved words
+ dos_header.e_oemid = data.GetU16(&offset); // OEM identifier (for e_oeminfo)
+ dos_header.e_oeminfo = data.GetU16(&offset); // OEM information; e_oemid specific
+ dos_header.e_res2[0] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res2[1] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res2[2] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res2[3] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res2[4] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res2[5] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res2[6] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res2[7] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res2[8] = data.GetU16(&offset); // Reserved words
+ dos_header.e_res2[9] = data.GetU16(&offset); // Reserved words
- m_dos_header.e_lfanew = m_data.GetU32(&offset); // File address of new exe header
+ dos_header.e_lfanew = data.GetU32(&offset); // File address of new exe header
}
}
if (!success)
- memset(&m_dos_header, 0, sizeof(m_dos_header));
+ memset(&dos_header, 0, sizeof(dos_header));
return success;
}
@@ -312,21 +338,21 @@ ObjectFilePECOFF::ParseDOSHeader ()
// ParserCOFFHeader
//----------------------------------------------------------------------
bool
-ObjectFilePECOFF::ParseCOFFHeader(lldb::offset_t *offset_ptr)
+ObjectFilePECOFF::ParseCOFFHeader(DataExtractor &data, lldb::offset_t *offset_ptr, coff_header_t &coff_header)
{
- bool success = m_data.ValidOffsetForDataOfSize (*offset_ptr, sizeof(m_coff_header));
+ bool success = data.ValidOffsetForDataOfSize (*offset_ptr, sizeof(coff_header));
if (success)
{
- m_coff_header.machine = m_data.GetU16(offset_ptr);
- m_coff_header.nsects = m_data.GetU16(offset_ptr);
- m_coff_header.modtime = m_data.GetU32(offset_ptr);
- m_coff_header.symoff = m_data.GetU32(offset_ptr);
- m_coff_header.nsyms = m_data.GetU32(offset_ptr);
- m_coff_header.hdrsize = m_data.GetU16(offset_ptr);
- m_coff_header.flags = m_data.GetU16(offset_ptr);
+ coff_header.machine = data.GetU16(offset_ptr);
+ coff_header.nsects = data.GetU16(offset_ptr);
+ coff_header.modtime = data.GetU32(offset_ptr);
+ coff_header.symoff = data.GetU32(offset_ptr);
+ coff_header.nsyms = data.GetU32(offset_ptr);
+ coff_header.hdrsize = data.GetU16(offset_ptr);
+ coff_header.flags = data.GetU16(offset_ptr);
}
if (!success)
- memset(&m_coff_header, 0, sizeof(m_coff_header));
+ memset(&coff_header, 0, sizeof(coff_header));
return success;
}
Modified: lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h?rev=203383&r1=203382&r2=203383&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h (original)
+++ lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h Sun Mar 9 04:59:36 2014
@@ -245,8 +245,8 @@ protected:
uint32_t address_of_name_ordinals;
} export_directory_entry;
- bool ParseDOSHeader ();
- bool ParseCOFFHeader (lldb::offset_t *offset_ptr);
+ static bool ParseDOSHeader (lldb_private::DataExtractor &data, dos_header_t &dos_header);
+ static bool ParseCOFFHeader (lldb_private::DataExtractor &data, lldb::offset_t *offset_ptr, coff_header_t &coff_header);
bool ParseCOFFOptionalHeader (lldb::offset_t *offset_ptr);
bool ParseSectionHeaders (uint32_t offset);
More information about the lldb-commits
mailing list