Feel free to do whatever you want with ObjectFilePECOFF, no reviews are 
necessary.

Looks good.

On Aug 23, 2013, at 10:19 AM, Virgile Bello <[email protected]> wrote:

> Add support for export symbols in PECOFF (useful for stacktrace).
> Import table still not yet supported.
> 
> http://llvm-reviews.chandlerc.com/D1489
> 
> Files:
>  source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
>  source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
> 
> Index: source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
> ===================================================================
> --- source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
> +++ source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
> @@ -593,6 +593,54 @@
>                 }
> 
>             }
> +
> +            // Export header?
> +            if (m_coff_header_opt.data_dirs[0].vmsize > 0 && 
> m_coff_header_opt.data_dirs[0].vmaddr > 0)
> +            {
> +                export_directory_entry export_table;
> +                             uint32_t data_start = 
> m_coff_header_opt.data_dirs[0].vmaddr;
> +                Address address(m_coff_header_opt.image_base + data_start, 
> sect_list);
> +                DataBufferSP 
> symtab_data_sp(m_file.ReadFileContents(address.GetSection()->GetFileOffset() 
> + address.GetOffset(), m_coff_header_opt.data_dirs[0].vmsize));
> +                DataExtractor symtab_data (symtab_data_sp, GetByteOrder(), 
> GetAddressByteSize());
> +                lldb::offset_t offset = 0;
> +                export_table.characteristics = symtab_data.GetU32(&offset);
> +                export_table.time_date_stamp = symtab_data.GetU32(&offset);
> +                export_table.major_version = symtab_data.GetU16(&offset);
> +                export_table.minor_version = symtab_data.GetU16(&offset);
> +                export_table.name = symtab_data.GetU32(&offset);
> +                export_table.base = symtab_data.GetU32(&offset);
> +                export_table.number_of_functions = 
> symtab_data.GetU32(&offset);
> +                export_table.number_of_names = symtab_data.GetU32(&offset);
> +                export_table.address_of_functions = 
> symtab_data.GetU32(&offset);
> +                export_table.address_of_names = symtab_data.GetU32(&offset);
> +                export_table.address_of_name_ordinals = 
> symtab_data.GetU32(&offset);
> +
> +                bool has_ordinal = export_table.address_of_name_ordinals != 
> 0;
> +
> +                lldb::offset_t name_offset = export_table.address_of_names - 
> data_start;
> +                lldb::offset_t name_ordinal_offset = 
> export_table.address_of_name_ordinals - data_start;
> +
> +                Symbol *symbols = 
> m_symtab_ap->Resize(export_table.number_of_names);
> +
> +                std::string symbol_name;
> +
> +                for (size_t i = 0; i < export_table.number_of_names; ++i)
> +                {
> +                    uint32_t name_ordinal = has_ordinal ? 
> symtab_data.GetU16(&name_ordinal_offset) : i;
> +                                     uint32_t name_address = 
> symtab_data.GetU32(&name_offset);
> +                    const char* symbol_name_cstr = 
> symtab_data.PeekCStr(name_address - data_start);
> +                    symbol_name.assign(symbol_name_cstr);
> +
> +                    lldb::offset_t function_offset = 
> export_table.address_of_functions - data_start + sizeof(uint32_t) * 
> name_ordinal;
> +                                     uint32_t function_rva = 
> symtab_data.GetU32(&function_offset);
> +
> +                    Address symbol_addr(m_coff_header_opt.image_base + 
> function_rva, sect_list);
> +                    
> symbols[i].GetMangled().SetValue(ConstString(symbol_name.c_str()));
> +                    symbols[i].GetAddress() = symbol_addr;
> +                    symbols[i].SetType(lldb::eSymbolTypeCode);
> +                    symbols[i].SetDebug(true);
> +                }
> +            }
>         }
>     }
>     return m_symtab_ap.get();
> Index: source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
> ===================================================================
> --- source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
> +++ source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
> @@ -221,6 +221,20 @@
>               uint8_t         storage;
>               uint8_t         naux;           
>       } coff_symbol_t;
> +
> +    typedef struct export_directory_entry {
> +        uint32_t   characteristics;
> +        uint32_t   time_date_stamp;
> +        uint16_t   major_version;
> +        uint16_t   minor_version;
> +        uint32_t   name;
> +        uint32_t   base;
> +        uint32_t   number_of_functions;
> +        uint32_t   number_of_names;
> +        uint32_t   address_of_functions;
> +        uint32_t   address_of_names;
> +        uint32_t   address_of_name_ordinals;
> +    };
> 
>       bool ParseDOSHeader ();
>       bool ParseCOFFHeader (lldb::offset_t *offset_ptr);
> <D1489.1.patch>_______________________________________________
> lldb-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to