124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFDebugMacinfoEntry.cpp ------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugMacinfoEntry.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace std;
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugMacinfoEntry::DWARFDebugMacinfoEntry() :
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type_code(0),
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_line(0),
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_op2()
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_op2.cstr = NULL;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugMacinfoEntry::~DWARFDebugMacinfoEntry()
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char*
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugMacinfoEntry::GetCString() const
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type_code)
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case 0:
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_MACINFO_start_file:
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case DW_MACINFO_end_file:
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_op2.cstr;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugMacinfoEntry::Dump(Stream *s) const
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_type_code)
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(DW_MACINFO_value_to_name(m_type_code));
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (m_type_code)
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_MACINFO_define:
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->Printf(" line:%u  #define %s\n", (uint32_t)m_line, m_op2.cstr);
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_MACINFO_undef:
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->Printf(" line:%u  #undef %s\n", (uint32_t)m_line, m_op2.cstr);
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            s->Printf(" line:%u  str: '%s'\n", (uint32_t)m_line, m_op2.cstr);
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_MACINFO_start_file:
687e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda            s->Printf(" line:%u  file index: '%u'\n", (uint32_t)m_line, (uint32_t)m_op2.file_idx);
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_MACINFO_end_file:
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->PutCString(" END\n");
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
8336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFDebugMacinfoEntry::Extract(const DataExtractor& mac_info_data, lldb::offset_t* offset_ptr)
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (mac_info_data.ValidOffset(*offset_ptr))
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type_code = mac_info_data.GetU8(offset_ptr);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (m_type_code)
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_MACINFO_define:
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_MACINFO_undef:
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // 2 operands:
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Arg 1: operand encodes the line number of the source line on which
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            //      the relevant defining or undefining pre-processor directives
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            //      appeared.
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_line  = mac_info_data.GetULEB128(offset_ptr);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Arg 2: define string
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_op2.cstr  = mac_info_data.GetCStr(offset_ptr);
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_MACINFO_start_file:
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // 2 operands:
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Op 1: line number of the source line on which the inclusion
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            //      pre-processor directive occurred.
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_line  = mac_info_data.GetULEB128(offset_ptr);
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Op 2: a source file name index to a file number in the statement
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            //      information table for the relevant compilation unit.
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_op2.file_idx  = mac_info_data.GetULEB128(offset_ptr);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case 0: // End of list
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_MACINFO_end_file:
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No operands
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_line = DW_INVALID_OFFSET;
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_op2.cstr = NULL;
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Vendor specific entries always have a ULEB128 and a string
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_line      = mac_info_data.GetULEB128(offset_ptr);
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_op2.cstr  = mac_info_data.GetCStr(offset_ptr);
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type_code = 0;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
133