Files
clang-p2996/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugMacinfoEntry.cpp
Greg Clayton c7bece56fa <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
2013-01-25 18:06:21 +00:00

133 lines
3.4 KiB
C++

//===-- DWARFDebugMacinfoEntry.cpp ------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "DWARFDebugMacinfoEntry.h"
#include "lldb/Core/Stream.h"
using namespace lldb_private;
using namespace std;
DWARFDebugMacinfoEntry::DWARFDebugMacinfoEntry() :
m_type_code(0),
m_line(0),
m_op2()
{
m_op2.cstr = NULL;
}
DWARFDebugMacinfoEntry::~DWARFDebugMacinfoEntry()
{
}
const char*
DWARFDebugMacinfoEntry::GetCString() const
{
switch (m_type_code)
{
case 0:
case DW_MACINFO_start_file:
case DW_MACINFO_end_file:
return NULL;
default:
break;
}
return m_op2.cstr;
}
void
DWARFDebugMacinfoEntry::Dump(Stream *s) const
{
if (m_type_code)
{
s->PutCString(DW_MACINFO_value_to_name(m_type_code));
switch (m_type_code)
{
case DW_MACINFO_define:
s->Printf(" line:%u #define %s\n", (uint32_t)m_line, m_op2.cstr);
break;
case DW_MACINFO_undef:
s->Printf(" line:%u #undef %s\n", (uint32_t)m_line, m_op2.cstr);
break;
default:
s->Printf(" line:%u str: '%s'\n", (uint32_t)m_line, m_op2.cstr);
break;
case DW_MACINFO_start_file:
s->Printf(" line:%u file index: '%u'\n", (uint32_t)m_line, (uint32_t)m_op2.file_idx);
break;
case DW_MACINFO_end_file:
break;
}
}
else
{
s->PutCString(" END\n");
}
}
bool
DWARFDebugMacinfoEntry::Extract(const DataExtractor& mac_info_data, lldb::offset_t* offset_ptr)
{
if (mac_info_data.ValidOffset(*offset_ptr))
{
m_type_code = mac_info_data.GetU8(offset_ptr);
switch (m_type_code)
{
case DW_MACINFO_define:
case DW_MACINFO_undef:
// 2 operands:
// Arg 1: operand encodes the line number of the source line on which
// the relevant defining or undefining pre-processor directives
// appeared.
m_line = mac_info_data.GetULEB128(offset_ptr);
// Arg 2: define string
m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
break;
case DW_MACINFO_start_file:
// 2 operands:
// Op 1: line number of the source line on which the inclusion
// pre-processor directive occurred.
m_line = mac_info_data.GetULEB128(offset_ptr);
// Op 2: a source file name index to a file number in the statement
// information table for the relevant compilation unit.
m_op2.file_idx = mac_info_data.GetULEB128(offset_ptr);
break;
case 0: // End of list
case DW_MACINFO_end_file:
// No operands
m_line = DW_INVALID_OFFSET;
m_op2.cstr = NULL;
break;
default:
// Vendor specific entries always have a ULEB128 and a string
m_line = mac_info_data.GetULEB128(offset_ptr);
m_op2.cstr = mac_info_data.GetCStr(offset_ptr);
break;
}
return true;
}
else
m_type_code = 0;
return false;
}