130fdc8d8SChris Lattner //===-- SBCompileUnit.cpp ---------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/API/SBCompileUnit.h"
1130fdc8d8SChris Lattner #include "lldb/API/SBLineEntry.h"
12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1330fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
1430fdc8d8SChris Lattner #include "lldb/Symbol/LineEntry.h"
1530fdc8d8SChris Lattner #include "lldb/Symbol/LineTable.h"
16ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner using namespace lldb;
1930fdc8d8SChris Lattner using namespace lldb_private;
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner SBCompileUnit::SBCompileUnit () :
236611103cSGreg Clayton     m_opaque_ptr (NULL)
2430fdc8d8SChris Lattner {
2530fdc8d8SChris Lattner }
2630fdc8d8SChris Lattner 
2730fdc8d8SChris Lattner SBCompileUnit::SBCompileUnit (lldb_private::CompileUnit *lldb_object_ptr) :
286611103cSGreg Clayton     m_opaque_ptr (lldb_object_ptr)
2930fdc8d8SChris Lattner {
30*750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
31ceb6b139SCaroline Tice 
32ceb6b139SCaroline Tice     if (log)
33ceb6b139SCaroline Tice     {
34ceb6b139SCaroline Tice         SBStream sstr;
35ceb6b139SCaroline Tice         GetDescription (sstr);
36*750cd175SCaroline Tice         log->Printf ("SBCompileUnit::SBCompileUnit (lldb_private::CompileUnit *lldb_object_ptr=%p)"
37*750cd175SCaroline Tice                      " => this.obj = %p (%s)", lldb_object_ptr, m_opaque_ptr, sstr.GetData());
38ceb6b139SCaroline Tice     }
3930fdc8d8SChris Lattner }
4030fdc8d8SChris Lattner 
4130fdc8d8SChris Lattner SBCompileUnit::~SBCompileUnit ()
4230fdc8d8SChris Lattner {
436611103cSGreg Clayton     m_opaque_ptr = NULL;
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner SBFileSpec
4730fdc8d8SChris Lattner SBCompileUnit::GetFileSpec () const
4830fdc8d8SChris Lattner {
4930fdc8d8SChris Lattner     SBFileSpec file_spec;
506611103cSGreg Clayton     if (m_opaque_ptr)
516611103cSGreg Clayton         file_spec.SetFileSpec(*m_opaque_ptr);
5230fdc8d8SChris Lattner     return file_spec;
5330fdc8d8SChris Lattner }
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner uint32_t
5630fdc8d8SChris Lattner SBCompileUnit::GetNumLineEntries () const
5730fdc8d8SChris Lattner {
586611103cSGreg Clayton     if (m_opaque_ptr)
5930fdc8d8SChris Lattner     {
606611103cSGreg Clayton         LineTable *line_table = m_opaque_ptr->GetLineTable ();
6130fdc8d8SChris Lattner         if (line_table)
6230fdc8d8SChris Lattner             return line_table->GetSize();
6330fdc8d8SChris Lattner     }
6430fdc8d8SChris Lattner     return 0;
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner SBLineEntry
6830fdc8d8SChris Lattner SBCompileUnit::GetLineEntryAtIndex (uint32_t idx) const
6930fdc8d8SChris Lattner {
70ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
71ceb6b139SCaroline Tice 
72*750cd175SCaroline Tice     //if (log)
73*750cd175SCaroline Tice     //    log->Printf ("SBCompileUnit::GetLineEntryAtIndex (this.obj=%p, idx=%d)", m_opaque_ptr, idx);
74ceb6b139SCaroline Tice 
7530fdc8d8SChris Lattner     SBLineEntry sb_line_entry;
766611103cSGreg Clayton     if (m_opaque_ptr)
7730fdc8d8SChris Lattner     {
786611103cSGreg Clayton         LineTable *line_table = m_opaque_ptr->GetLineTable ();
7930fdc8d8SChris Lattner         if (line_table)
8030fdc8d8SChris Lattner         {
8130fdc8d8SChris Lattner             LineEntry line_entry;
8230fdc8d8SChris Lattner             if (line_table->GetLineEntryAtIndex(idx, line_entry))
8330fdc8d8SChris Lattner                 sb_line_entry.SetLineEntry(line_entry);
8430fdc8d8SChris Lattner         }
8530fdc8d8SChris Lattner     }
86ceb6b139SCaroline Tice 
87ceb6b139SCaroline Tice     if (log)
88ceb6b139SCaroline Tice     {
89ceb6b139SCaroline Tice         SBStream sstr;
90ceb6b139SCaroline Tice         sb_line_entry.GetDescription (sstr);
91*750cd175SCaroline Tice         log->Printf ("SBCompileUnit::GetLineEntryAtIndex (this.obj=%p, idx=%d) => SBLineEntry: '%s'", m_opaque_ptr,
92*750cd175SCaroline Tice                      idx, sstr.GetData());
93ceb6b139SCaroline Tice     }
94ceb6b139SCaroline Tice 
9530fdc8d8SChris Lattner     return sb_line_entry;
9630fdc8d8SChris Lattner }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner uint32_t
9930fdc8d8SChris Lattner SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec) const
10030fdc8d8SChris Lattner {
101ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
102ceb6b139SCaroline Tice 
103*750cd175SCaroline Tice     //if (log)
104*750cd175SCaroline Tice     //{
105*750cd175SCaroline Tice     //    SBStream sstr;
106*750cd175SCaroline Tice     //    inline_file_spec->GetDescription (sstr);
107*750cd175SCaroline Tice     //    log->Printf ("SBCompileUnit::FindLineEntryIndex (this.obj=%p, start_idx=%d, line=%d, inline_file_spec='%s')",
108*750cd175SCaroline Tice     //                 m_opaque_ptr, start_idx, line, sstr.GetData());
109*750cd175SCaroline Tice     //}
110ceb6b139SCaroline Tice 
1116611103cSGreg Clayton     if (m_opaque_ptr)
11230fdc8d8SChris Lattner     {
11330fdc8d8SChris Lattner         FileSpec file_spec;
11430fdc8d8SChris Lattner         if (inline_file_spec && inline_file_spec->IsValid())
11530fdc8d8SChris Lattner             file_spec = inline_file_spec->ref();
11630fdc8d8SChris Lattner         else
1176611103cSGreg Clayton             file_spec = *m_opaque_ptr;
11830fdc8d8SChris Lattner 
119ceb6b139SCaroline Tice 
120ceb6b139SCaroline Tice         uint32_t ret_value = m_opaque_ptr->FindLineEntry (start_idx,
12130fdc8d8SChris Lattner                                                           line,
12230fdc8d8SChris Lattner                                                           inline_file_spec ? inline_file_spec->get() : NULL,
12330fdc8d8SChris Lattner                                                           NULL);
124ceb6b139SCaroline Tice         if (log)
125*750cd175SCaroline Tice         {
126*750cd175SCaroline Tice             SBStream sstr;
127*750cd175SCaroline Tice             inline_file_spec->GetDescription (sstr);
128*750cd175SCaroline Tice             log->Printf ("SBCompileUnit::FindLineEntryIndex(this.obj=%p, start_idx=%d, line=%d, inline_file_spec='%s')"
129*750cd175SCaroline Tice                          "=> '%d'", m_opaque_ptr, start_idx, line, sstr.GetData(), ret_value);
130*750cd175SCaroline Tice         }
131ceb6b139SCaroline Tice 
132ceb6b139SCaroline Tice         return ret_value;
13330fdc8d8SChris Lattner     }
134ceb6b139SCaroline Tice 
135ceb6b139SCaroline Tice     if (log)
136*750cd175SCaroline Tice     {
137*750cd175SCaroline Tice         SBStream sstr;
138*750cd175SCaroline Tice         inline_file_spec->GetDescription (sstr);
139*750cd175SCaroline Tice         log->Printf ("SBCompileUnit::FindLineEntryIndex (this.obj=%p, start_idx=%d, line=%d, inline_file_spec='%s')"
140*750cd175SCaroline Tice                      " => '%d'", m_opaque_ptr, start_idx, line, sstr.GetData(), UINT32_MAX);
141*750cd175SCaroline Tice     }
142ceb6b139SCaroline Tice 
14330fdc8d8SChris Lattner     return UINT32_MAX;
14430fdc8d8SChris Lattner }
14530fdc8d8SChris Lattner 
14630fdc8d8SChris Lattner bool
14730fdc8d8SChris Lattner SBCompileUnit::IsValid () const
14830fdc8d8SChris Lattner {
1496611103cSGreg Clayton     return m_opaque_ptr != NULL;
15030fdc8d8SChris Lattner }
15130fdc8d8SChris Lattner 
15230fdc8d8SChris Lattner bool
15330fdc8d8SChris Lattner SBCompileUnit::operator == (const SBCompileUnit &rhs) const
15430fdc8d8SChris Lattner {
1556611103cSGreg Clayton     return m_opaque_ptr == rhs.m_opaque_ptr;
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
15830fdc8d8SChris Lattner bool
15930fdc8d8SChris Lattner SBCompileUnit::operator != (const SBCompileUnit &rhs) const
16030fdc8d8SChris Lattner {
1616611103cSGreg Clayton     return m_opaque_ptr != rhs.m_opaque_ptr;
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
16430fdc8d8SChris Lattner const lldb_private::CompileUnit *
16530fdc8d8SChris Lattner SBCompileUnit::operator->() const
16630fdc8d8SChris Lattner {
1676611103cSGreg Clayton     return m_opaque_ptr;
16830fdc8d8SChris Lattner }
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner const lldb_private::CompileUnit &
17130fdc8d8SChris Lattner SBCompileUnit::operator*() const
17230fdc8d8SChris Lattner {
1736611103cSGreg Clayton     return *m_opaque_ptr;
17430fdc8d8SChris Lattner }
175dde9cff3SCaroline Tice 
176*750cd175SCaroline Tice const lldb_private::CompileUnit *
177*750cd175SCaroline Tice SBCompileUnit::get () const
178*750cd175SCaroline Tice {
179*750cd175SCaroline Tice     return m_opaque_ptr;
180*750cd175SCaroline Tice }
181*750cd175SCaroline Tice 
182dde9cff3SCaroline Tice bool
183dde9cff3SCaroline Tice SBCompileUnit::GetDescription (SBStream &description)
184dde9cff3SCaroline Tice {
185dde9cff3SCaroline Tice     if (m_opaque_ptr)
186dde9cff3SCaroline Tice     {
187dac97f31SCaroline Tice         description.ref();
188dde9cff3SCaroline Tice         m_opaque_ptr->Dump (description.get(), false);
189dde9cff3SCaroline Tice     }
190dde9cff3SCaroline Tice     else
191dde9cff3SCaroline Tice         description.Printf ("No Value");
192dde9cff3SCaroline Tice 
193dde9cff3SCaroline Tice     return true;
194dde9cff3SCaroline Tice }
195