Author: amccarth
Date: Mon Jan 25 18:58:09 2016
New Revision: 258758

URL: http://llvm.org/viewvc/llvm-project?rev=258758&view=rev
Log:
Set symbol types for function symbols loaded from PE/COFF

This fixes the regression of several tests on Windows after rL258621.

The root problem is that ObjectFilePECOFF was not setting type information for 
the symbols, and the new CL rejects symbols without type information, breaking 
functionality like thread step-over.

The fix sets the type information for functions (and creates a TODO for other 
types).

Along the way, I fixed some typos and formatting that made the code I was 
debugging harder to understand.

In the long run, we should consider replacing most of ObjectFilePECOFF with the 
COFF parsing code from LLVM.

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

Modified:
    lldb/trunk/include/lldb/Core/RangeMap.h
    lldb/trunk/include/lldb/Symbol/Symtab.h
    lldb/trunk/source/Core/Module.cpp
    lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
    lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
    lldb/trunk/source/Symbol/Symtab.cpp

Modified: lldb/trunk/include/lldb/Core/RangeMap.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/RangeMap.h?rev=258758&r1=258757&r2=258758&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/RangeMap.h (original)
+++ lldb/trunk/include/lldb/Core/RangeMap.h Mon Jan 25 18:58:09 2016
@@ -1218,7 +1218,7 @@ namespace lldb_private {
         }
 
         uint32_t
-        FindEntryIndexesThatContains (B addr, std::vector<uint32_t> &indexes) 
const
+        FindEntryIndexesThatContain(B addr, std::vector<uint32_t> &indexes) 
const
         {
 #ifdef ASSERT_RANGEMAP_ARE_SORTED
             assert (IsSorted());
@@ -1227,10 +1227,10 @@ namespace lldb_private {
             if (!m_entries.empty())
             {
                 typename Collection::const_iterator pos;
-                for(pos = m_entries.begin(); pos != m_entries.end(); pos++)
+                for (const auto &entry : m_entries)
                 {
-                    if (pos->Contains(addr))
-                        indexes.push_back (pos->data);
+                    if (entry.Contains(addr))
+                        indexes.push_back(entry.data);
                 }
             }
             return indexes.size() ;

Modified: lldb/trunk/include/lldb/Symbol/Symtab.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Symtab.h?rev=258758&r1=258757&r2=258758&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/Symtab.h (original)
+++ lldb/trunk/include/lldb/Symbol/Symtab.h Mon Jan 25 18:58:09 2016
@@ -81,7 +81,7 @@ public:
             Symbol *    FindFirstSymbolWithNameAndType (const ConstString 
&name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility 
symbol_visibility);
             Symbol *    FindSymbolContainingFileAddress (lldb::addr_t 
file_addr, const uint32_t* indexes, uint32_t num_indexes);
             Symbol *    FindSymbolContainingFileAddress (lldb::addr_t 
file_addr);
-            void        ForEachSymbolContainingFileAddresss (lldb::addr_t 
file_addr, std::function <bool(Symbol *)> const &callback);
+            void        ForEachSymbolContainingFileAddress(lldb::addr_t 
file_addr, std::function<bool(Symbol *)> const &callback);
             size_t      FindFunctionSymbols (const ConstString &name, uint32_t 
name_type_mask, SymbolContextList& sc_list);
             void        CalculateSymbolSizes ();
 

Modified: lldb/trunk/source/Core/Module.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=258758&r1=258757&r2=258758&view=diff
==============================================================================
--- lldb/trunk/source/Core/Module.cpp (original)
+++ lldb/trunk/source/Core/Module.cpp Mon Jan 25 18:58:09 2016
@@ -560,14 +560,16 @@ Module::ResolveSymbolContextForAddress (
             if (symtab && so_addr.IsSectionOffset())
             {
                 Symbol *matching_symbol = nullptr;
-                symtab->ForEachSymbolContainingFileAddresss 
(so_addr.GetFileAddress(), [&matching_symbol](Symbol *symbol) -> bool {
-                    if (symbol->GetType() != eSymbolTypeInvalid)
-                    {
-                        matching_symbol = symbol;
-                        return false; // Stop iterating
-                    }
-                    return true; // Keep iterating
-                });
+
+                
symtab->ForEachSymbolContainingFileAddress(so_addr.GetFileAddress(),
+                                                           
[&matching_symbol](Symbol *symbol) -> bool {
+                                                               if 
(symbol->GetType() != eSymbolTypeInvalid)
+                                                               {
+                                                                   
matching_symbol = symbol;
+                                                                   return 
false; // Stop iterating
+                                                               }
+                                                               return true; // 
Keep iterating
+                                                           });
                 sc.symbol = matching_symbol;
                 if (!sc.symbol &&
                     resolve_scope & eSymbolContextFunction && !(resolved_flags 
& eSymbolContextFunction))

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=258758&r1=258757&r2=258758&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp Mon Jan 25 
18:58:09 2016
@@ -169,6 +169,18 @@ ObjectFilePECOFF::MagicBytesMatch (DataB
     return magic == IMAGE_DOS_SIGNATURE;
 }
 
+lldb::SymbolType
+ObjectFilePECOFF::MapSymbolType(uint16_t coff_symbol_type)
+{
+    // TODO:  We need to complete this mapping of COFF symbol types to LLDB 
ones.
+    // For now, here's a hack to make sure our function have types.
+    const auto complex_type = coff_symbol_type >> 
llvm::COFF::SCT_COMPLEX_TYPE_SHIFT;
+    if (complex_type == llvm::COFF::IMAGE_SYM_DTYPE_FUNCTION)
+    {
+        return lldb::eSymbolTypeCode;
+    }
+    return lldb::eSymbolTypeInvalid;
+}
 
 ObjectFilePECOFF::ObjectFilePECOFF (const lldb::ModuleSP &module_sp, 
                                     DataBufferSP& data_sp,
@@ -534,8 +546,8 @@ ObjectFilePECOFF::GetSymtab()
             {
                 const uint32_t symbol_size = 18;
                 const uint32_t addr_byte_size = GetAddressByteSize ();
-                const size_t symbol_data_size = num_syms * symbol_size; 
-                // Include the 4 bytes string table size at the end of the 
symbols
+                const size_t symbol_data_size = num_syms * symbol_size;
+                // Include the 4-byte string table size at the end of the 
symbols
                 DataBufferSP symtab_data_sp(m_file.ReadFileContents 
(m_coff_header.symoff, symbol_data_size + 4));
                 DataExtractor symtab_data (symtab_data_sp, GetByteOrder(), 
addr_byte_size);
                 lldb::offset_t offset = symbol_data_size;
@@ -556,8 +568,8 @@ ObjectFilePECOFF::GetSymtab()
                     coff_symbol_t symbol;
                     const uint32_t symbol_offset = offset;
                     const char *symbol_name_cstr = NULL;
-                    // If the first 4 bytes of the symbol string are zero, 
then we
-                    // it is followed by a 4 byte string table offset. Else 
these
+                    // If the first 4 bytes of the symbol string are zero, 
then they
+                    // are followed by a 4-byte string table offset. Else these
                     // 8 bytes contain the symbol name
                     if (symtab_data.GetU32 (&offset) == 0)
                     {
@@ -586,6 +598,7 @@ ObjectFilePECOFF::GetSymtab()
                     {
                         Address 
symbol_addr(sect_list->GetSectionAtIndex(symbol.sect-1), symbol.value);
                         symbols[i].GetAddressRef() = symbol_addr;
+                        symbols[i].SetType(MapSymbolType(symbol.type));
                     }
 
                     if (symbol.naux > 0)

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=258758&r1=258757&r2=258758&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h (original)
+++ lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h Mon Jan 25 
18:58:09 2016
@@ -101,7 +101,10 @@ public:
 
     static bool
     MagicBytesMatch (lldb::DataBufferSP& data_sp);
-    
+
+    static lldb::SymbolType
+    MapSymbolType(uint16_t coff_symbol_type);
+
     bool
     ParseHeader() override;
     
@@ -116,7 +119,7 @@ public:
     
     uint32_t
     GetAddressByteSize() const override;
-    
+
 //    virtual lldb_private::AddressClass
 //    GetAddressClass (lldb::addr_t file_addr);
 

Modified: lldb/trunk/source/Symbol/Symtab.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Symtab.cpp?rev=258758&r1=258757&r2=258758&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Symtab.cpp (original)
+++ lldb/trunk/source/Symbol/Symtab.cpp Mon Jan 25 18:58:09 2016
@@ -1074,7 +1074,7 @@ Symtab::FindSymbolContainingFileAddress
 }
 
 void
-Symtab::ForEachSymbolContainingFileAddresss (addr_t file_addr, std::function 
<bool(Symbol *)> const &callback)
+Symtab::ForEachSymbolContainingFileAddress(addr_t file_addr, 
std::function<bool(Symbol *)> const &callback)
 {
     Mutex::Locker locker (m_mutex);
 
@@ -1084,9 +1084,9 @@ Symtab::ForEachSymbolContainingFileAddre
     std::vector<uint32_t> all_addr_indexes;
 
     // Get all symbols with file_addr
-    const size_t addr_match_count = 
m_file_addr_to_index.FindEntryIndexesThatContains(file_addr, all_addr_indexes);
+    const size_t addr_match_count = 
m_file_addr_to_index.FindEntryIndexesThatContain(file_addr, all_addr_indexes);
 
-    for (size_t i=0; i<addr_match_count; ++i)
+    for (size_t i = 0; i < addr_match_count; ++i)
     {
         if (!callback(SymbolAtIndex(all_addr_indexes[i])))
         break;


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to