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 {
3030fdc8d8SChris Lattner }
3130fdc8d8SChris Lattner 
32efabb123SGreg Clayton SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs) :
33efabb123SGreg Clayton     m_opaque_ptr (rhs.m_opaque_ptr)
34efabb123SGreg Clayton {
35efabb123SGreg Clayton }
36efabb123SGreg Clayton 
37efabb123SGreg Clayton const SBCompileUnit &
38efabb123SGreg Clayton SBCompileUnit::operator = (const SBCompileUnit &rhs)
39efabb123SGreg Clayton {
40efabb123SGreg Clayton     m_opaque_ptr = rhs.m_opaque_ptr;
41efabb123SGreg Clayton     return *this;
42efabb123SGreg Clayton }
43efabb123SGreg Clayton 
44efabb123SGreg Clayton 
4530fdc8d8SChris Lattner SBCompileUnit::~SBCompileUnit ()
4630fdc8d8SChris Lattner {
476611103cSGreg Clayton     m_opaque_ptr = NULL;
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner SBFileSpec
5130fdc8d8SChris Lattner SBCompileUnit::GetFileSpec () const
5230fdc8d8SChris Lattner {
5330fdc8d8SChris Lattner     SBFileSpec file_spec;
546611103cSGreg Clayton     if (m_opaque_ptr)
556611103cSGreg Clayton         file_spec.SetFileSpec(*m_opaque_ptr);
5630fdc8d8SChris Lattner     return file_spec;
5730fdc8d8SChris Lattner }
5830fdc8d8SChris Lattner 
5930fdc8d8SChris Lattner uint32_t
6030fdc8d8SChris Lattner SBCompileUnit::GetNumLineEntries () const
6130fdc8d8SChris Lattner {
626611103cSGreg Clayton     if (m_opaque_ptr)
6330fdc8d8SChris Lattner     {
646611103cSGreg Clayton         LineTable *line_table = m_opaque_ptr->GetLineTable ();
6530fdc8d8SChris Lattner         if (line_table)
6630fdc8d8SChris Lattner             return line_table->GetSize();
6730fdc8d8SChris Lattner     }
6830fdc8d8SChris Lattner     return 0;
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7130fdc8d8SChris Lattner SBLineEntry
7230fdc8d8SChris Lattner SBCompileUnit::GetLineEntryAtIndex (uint32_t idx) const
7330fdc8d8SChris Lattner {
742d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
75ceb6b139SCaroline Tice 
7630fdc8d8SChris Lattner     SBLineEntry sb_line_entry;
776611103cSGreg Clayton     if (m_opaque_ptr)
7830fdc8d8SChris Lattner     {
796611103cSGreg Clayton         LineTable *line_table = m_opaque_ptr->GetLineTable ();
8030fdc8d8SChris Lattner         if (line_table)
8130fdc8d8SChris Lattner         {
8230fdc8d8SChris Lattner             LineEntry line_entry;
8330fdc8d8SChris Lattner             if (line_table->GetLineEntryAtIndex(idx, line_entry))
8430fdc8d8SChris Lattner                 sb_line_entry.SetLineEntry(line_entry);
8530fdc8d8SChris Lattner         }
8630fdc8d8SChris Lattner     }
87ceb6b139SCaroline Tice 
88ceb6b139SCaroline Tice     if (log)
89ceb6b139SCaroline Tice     {
90ceb6b139SCaroline Tice         SBStream sstr;
91ceb6b139SCaroline Tice         sb_line_entry.GetDescription (sstr);
92cfd1acedSGreg Clayton         log->Printf ("SBCompileUnit(%p)::GetLineEntryAtIndex (idx=%u) => SBLineEntry(%p): '%s'",
93cfd1acedSGreg Clayton                      m_opaque_ptr, idx, sb_line_entry.get(), sstr.GetData());
94ceb6b139SCaroline Tice     }
95ceb6b139SCaroline Tice 
9630fdc8d8SChris Lattner     return sb_line_entry;
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner uint32_t
10030fdc8d8SChris Lattner SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec) const
10130fdc8d8SChris Lattner {
10287df91b8SJim Ingham     const bool exact = true;
10387df91b8SJim Ingham     return FindLineEntryIndex (start_idx, line, inline_file_spec, exact);
10487df91b8SJim Ingham }
10587df91b8SJim Ingham 
10687df91b8SJim Ingham uint32_t
10787df91b8SJim Ingham SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec, bool exact) const
10887df91b8SJim Ingham {
1092d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
110ceb6b139SCaroline Tice 
111cfd1acedSGreg Clayton     uint32_t index = UINT32_MAX;
1126611103cSGreg Clayton     if (m_opaque_ptr)
11330fdc8d8SChris Lattner     {
11430fdc8d8SChris Lattner         FileSpec file_spec;
11530fdc8d8SChris Lattner         if (inline_file_spec && inline_file_spec->IsValid())
11630fdc8d8SChris Lattner             file_spec = inline_file_spec->ref();
11730fdc8d8SChris Lattner         else
1186611103cSGreg Clayton             file_spec = *m_opaque_ptr;
11930fdc8d8SChris Lattner 
120ceb6b139SCaroline Tice 
121cfd1acedSGreg Clayton         index = m_opaque_ptr->FindLineEntry (start_idx,
12230fdc8d8SChris Lattner                                              line,
12330fdc8d8SChris Lattner                                              inline_file_spec ? inline_file_spec->get() : NULL,
12487df91b8SJim Ingham                                              exact,
12530fdc8d8SChris Lattner                                              NULL);
12630fdc8d8SChris Lattner     }
127ceb6b139SCaroline Tice 
128ceb6b139SCaroline Tice     if (log)
129750cd175SCaroline Tice     {
130750cd175SCaroline Tice         SBStream sstr;
131cfd1acedSGreg Clayton         if (index == UINT32_MAX)
132cfd1acedSGreg Clayton         {
133cfd1acedSGreg Clayton             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => NOT FOUND",
134cfd1acedSGreg Clayton                          m_opaque_ptr, start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL);
135cfd1acedSGreg Clayton         }
136cfd1acedSGreg Clayton         else
137cfd1acedSGreg Clayton         {
138cfd1acedSGreg Clayton             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => %u",
139cfd1acedSGreg Clayton                          m_opaque_ptr, start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL, index);
140cfd1acedSGreg Clayton         }
141750cd175SCaroline Tice     }
142ceb6b139SCaroline Tice 
143cfd1acedSGreg Clayton     return index;
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 
1768f7180b1SGreg Clayton lldb_private::CompileUnit *
1778f7180b1SGreg Clayton SBCompileUnit::get ()
178750cd175SCaroline Tice {
179750cd175SCaroline Tice     return m_opaque_ptr;
180750cd175SCaroline Tice }
18172eff18aSGreg Clayton 
18272eff18aSGreg Clayton void
18372eff18aSGreg Clayton SBCompileUnit::reset (lldb_private::CompileUnit *lldb_object_ptr)
18472eff18aSGreg Clayton {
18572eff18aSGreg Clayton     m_opaque_ptr = lldb_object_ptr;
18672eff18aSGreg Clayton }
18772eff18aSGreg Clayton 
188750cd175SCaroline Tice 
189dde9cff3SCaroline Tice bool
190dde9cff3SCaroline Tice SBCompileUnit::GetDescription (SBStream &description)
191dde9cff3SCaroline Tice {
192*da7bc7d0SGreg Clayton     Stream &strm = description.ref();
193*da7bc7d0SGreg Clayton 
194dde9cff3SCaroline Tice     if (m_opaque_ptr)
195dde9cff3SCaroline Tice     {
196*da7bc7d0SGreg Clayton         m_opaque_ptr->Dump (&strm, false);
197dde9cff3SCaroline Tice     }
198dde9cff3SCaroline Tice     else
199*da7bc7d0SGreg Clayton         strm.PutCString ("No value");
200dde9cff3SCaroline Tice 
201dde9cff3SCaroline Tice     return true;
202dde9cff3SCaroline Tice }
203