Implement ObjectFilePECOFF::GetEntryPointAddress.
authorStephane Sezer <sas@cd80.net>
Wed, 23 Mar 2016 18:00:13 +0000 (18:00 +0000)
committerStephane Sezer <sas@cd80.net>
Wed, 23 Mar 2016 18:00:13 +0000 (18:00 +0000)
Reviewers: zturner, clayborg

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D17970

llvm-svn: 264173

lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h

index 52c6ac8..48b9f88 100644 (file)
@@ -192,7 +192,8 @@ ObjectFilePECOFF::ObjectFilePECOFF (const lldb::ModuleSP &module_sp,
     m_dos_header (),
     m_coff_header (),
     m_coff_header_opt (),
-    m_sect_headers ()
+    m_sect_headers (),
+    m_entry_point_address ()
 {
     ::memset (&m_dos_header, 0, sizeof(m_dos_header));
     ::memset (&m_coff_header, 0, sizeof(m_coff_header));
@@ -814,6 +815,25 @@ ObjectFilePECOFF::GetDependentModules (FileSpecList& files)
     return 0;
 }
 
+lldb_private::Address
+ObjectFilePECOFF::GetEntryPointAddress ()
+{
+    if (m_entry_point_address.IsValid())
+        return m_entry_point_address;
+
+    if (!ParseHeader() || !IsExecutable())
+        return m_entry_point_address;
+
+    SectionList *section_list = GetSectionList();
+    addr_t offset = m_coff_header_opt.entry;
+
+    if (!section_list)
+        m_entry_point_address.SetOffset(offset);
+    else
+        m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
+    return m_entry_point_address;
+}
+
 
 //----------------------------------------------------------------------
 // Dump
index 44e5ee1..6c1cdbf 100644 (file)
@@ -144,8 +144,8 @@ public:
     uint32_t
     GetDependentModules(lldb_private::FileSpecList& files) override;
     
-//    virtual lldb_private::Address
-//    GetEntryPointAddress ();
+    virtual lldb_private::Address
+    GetEntryPointAddress () override;
     
     ObjectFile::Type
     CalculateType() override;
@@ -301,6 +301,7 @@ private:
        coff_opt_header_t       m_coff_header_opt;
        SectionHeaderColl       m_sect_headers;
     lldb::addr_t               m_image_base;
+    lldb_private::Address      m_entry_point_address;
 };
 
 #endif // liblldb_ObjectFilePECOFF_h_