<rdar://problem/13069948>

Major fixed to allow reading files that are over 4GB. The main problems were that the DataExtractor was using 32 bit offsets as a data cursor, and since we mmap all of our object files we could run into cases where if we had a very large core file that was over 4GB, we were running into the 4GB boundary.

So I defined a new "lldb::offset_t" which should be used for all file offsets.

After making this change, I enabled warnings for data loss and for enexpected implicit conversions temporarily and found a ton of things that I fixed.

Any functions that take an index internally, should use "size_t" for any indexes and also should return "size_t" for any sizes of collections.

llvm-svn: 173463
This commit is contained in:
Greg Clayton
2013-01-25 18:06:21 +00:00
parent d0ed6c249d
commit c7bece56fa
248 changed files with 1676 additions and 1817 deletions

View File

@@ -53,7 +53,7 @@ public:
~ELFRelocation();
bool
Parse(const lldb_private::DataExtractor &data, uint32_t *offset);
Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
static unsigned
RelocType32(const ELFRelocation &rel);
@@ -94,7 +94,7 @@ ELFRelocation::~ELFRelocation()
}
bool
ELFRelocation::Parse(const lldb_private::DataExtractor &data, uint32_t *offset)
ELFRelocation::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset)
{
if (reloc.is<ELFRel*>())
return reloc.get<ELFRel*>()->Parse(data, offset);
@@ -270,28 +270,28 @@ ObjectFileELF::GetByteOrder() const
return eByteOrderInvalid;
}
size_t
uint32_t
ObjectFileELF::GetAddressByteSize() const
{
return m_data.GetAddressByteSize();
}
unsigned
size_t
ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I)
{
return std::distance(m_section_headers.begin(), I) + 1;
return std::distance(m_section_headers.begin(), I) + 1u;
}
unsigned
size_t
ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const
{
return std::distance(m_section_headers.begin(), I) + 1;
return std::distance(m_section_headers.begin(), I) + 1u;
}
bool
ObjectFileELF::ParseHeader()
{
uint32_t offset = GetOffset();
lldb::offset_t offset = GetOffset();
return m_header.Parse(m_data, &offset);
}
@@ -445,8 +445,8 @@ ObjectFileELF::ParseDependentModules()
ReadSectionData(dynstr, dynstr_data))
{
ELFDynamic symbol;
const unsigned section_size = dynsym_data.GetByteSize();
unsigned offset = 0;
const lldb::offset_t section_size = dynsym_data.GetByteSize();
lldb::offset_t offset = 0;
// The only type of entries we are concerned with are tagged DT_NEEDED,
// yielding the name of a required library.
@@ -492,7 +492,7 @@ ObjectFileELF::ParseProgramHeaders()
return 0;
uint32_t idx;
uint32_t offset;
lldb::offset_t offset;
for (idx = 0, offset = 0; idx < m_header.e_phnum; ++idx)
{
if (m_program_headers[idx].Parse(data, &offset) == false)
@@ -530,7 +530,7 @@ ObjectFileELF::ParseSectionHeaders()
return 0;
uint32_t idx;
uint32_t offset;
lldb::offset_t offset;
for (idx = 0, offset = 0; idx < m_header.e_shnum; ++idx)
{
if (m_section_headers[idx].Parse(data, &offset) == false)
@@ -698,9 +698,8 @@ ParseSymbols(Symtab *symtab,
const DataExtractor &strtab_data)
{
ELFSymbol symbol;
uint32_t offset = 0;
const unsigned num_symbols =
symtab_data.GetByteSize() / symtab_shdr->sh_entsize;
lldb::offset_t offset = 0;
const size_t num_symbols = symtab_data.GetByteSize() / symtab_shdr->sh_entsize;
static ConstString text_section_name(".text");
static ConstString init_section_name(".init");
@@ -877,8 +876,8 @@ ObjectFileELF::ParseDynamicSymbols()
DataExtractor dynsym_data;
if (ReadSectionData(dynsym, dynsym_data))
{
const unsigned section_size = dynsym_data.GetByteSize();
unsigned cursor = 0;
const lldb::offset_t section_size = dynsym_data.GetByteSize();
lldb::offset_t cursor = 0;
while (cursor < section_size)
{
@@ -956,9 +955,9 @@ ParsePLTRelocations(Symtab *symbol_table,
{
ELFRelocation rel(rel_type);
ELFSymbol symbol;
uint32_t offset = 0;
const unsigned plt_entsize = plt_hdr->sh_entsize;
const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
lldb::offset_t offset = 0;
const elf_xword plt_entsize = plt_hdr->sh_entsize;
const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
reloc_info_fn reloc_type;
@@ -985,7 +984,7 @@ ParsePLTRelocations(Symtab *symbol_table,
if (reloc_type(rel) != slot_type)
continue;
unsigned symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
uint64_t plt_index = (i + 1) * plt_entsize;
if (!symbol.Parse(symtab_data, &symbol_offset))
@@ -1378,7 +1377,7 @@ ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type)
// Dump an token value for the ELF section header member sh_flags
//----------------------------------------------------------------------
void
ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_word sh_flags)
ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags)
{
*s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
<< (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')