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 {
74*2d4edfbcSGreg 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 {
102*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
103ceb6b139SCaroline Tice 
104cfd1acedSGreg Clayton     uint32_t index = UINT32_MAX;
1056611103cSGreg Clayton     if (m_opaque_ptr)
10630fdc8d8SChris Lattner     {
10730fdc8d8SChris Lattner         FileSpec file_spec;
10830fdc8d8SChris Lattner         if (inline_file_spec && inline_file_spec->IsValid())
10930fdc8d8SChris Lattner             file_spec = inline_file_spec->ref();
11030fdc8d8SChris Lattner         else
1116611103cSGreg Clayton             file_spec = *m_opaque_ptr;
11230fdc8d8SChris Lattner 
113ceb6b139SCaroline Tice 
114cfd1acedSGreg Clayton         index = m_opaque_ptr->FindLineEntry (start_idx,
11530fdc8d8SChris Lattner                                              line,
11630fdc8d8SChris Lattner                                              inline_file_spec ? inline_file_spec->get() : NULL,
11730fdc8d8SChris Lattner                                              NULL);
11830fdc8d8SChris Lattner     }
119ceb6b139SCaroline Tice 
120ceb6b139SCaroline Tice     if (log)
121750cd175SCaroline Tice     {
122750cd175SCaroline Tice         SBStream sstr;
123cfd1acedSGreg Clayton         if (index == UINT32_MAX)
124cfd1acedSGreg Clayton         {
125cfd1acedSGreg Clayton             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => NOT FOUND",
126cfd1acedSGreg Clayton                          m_opaque_ptr, start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL);
127cfd1acedSGreg Clayton         }
128cfd1acedSGreg Clayton         else
129cfd1acedSGreg Clayton         {
130cfd1acedSGreg Clayton             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => %u",
131cfd1acedSGreg Clayton                          m_opaque_ptr, start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL, index);
132cfd1acedSGreg Clayton         }
133750cd175SCaroline Tice     }
134ceb6b139SCaroline Tice 
135cfd1acedSGreg Clayton     return index;
13630fdc8d8SChris Lattner }
13730fdc8d8SChris Lattner 
13830fdc8d8SChris Lattner bool
13930fdc8d8SChris Lattner SBCompileUnit::IsValid () const
14030fdc8d8SChris Lattner {
1416611103cSGreg Clayton     return m_opaque_ptr != NULL;
14230fdc8d8SChris Lattner }
14330fdc8d8SChris Lattner 
14430fdc8d8SChris Lattner bool
14530fdc8d8SChris Lattner SBCompileUnit::operator == (const SBCompileUnit &rhs) const
14630fdc8d8SChris Lattner {
1476611103cSGreg Clayton     return m_opaque_ptr == rhs.m_opaque_ptr;
14830fdc8d8SChris Lattner }
14930fdc8d8SChris Lattner 
15030fdc8d8SChris Lattner bool
15130fdc8d8SChris Lattner SBCompileUnit::operator != (const SBCompileUnit &rhs) const
15230fdc8d8SChris Lattner {
1536611103cSGreg Clayton     return m_opaque_ptr != rhs.m_opaque_ptr;
15430fdc8d8SChris Lattner }
15530fdc8d8SChris Lattner 
15630fdc8d8SChris Lattner const lldb_private::CompileUnit *
15730fdc8d8SChris Lattner SBCompileUnit::operator->() const
15830fdc8d8SChris Lattner {
1596611103cSGreg Clayton     return m_opaque_ptr;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
16230fdc8d8SChris Lattner const lldb_private::CompileUnit &
16330fdc8d8SChris Lattner SBCompileUnit::operator*() const
16430fdc8d8SChris Lattner {
1656611103cSGreg Clayton     return *m_opaque_ptr;
16630fdc8d8SChris Lattner }
167dde9cff3SCaroline Tice 
168750cd175SCaroline Tice const lldb_private::CompileUnit *
169750cd175SCaroline Tice SBCompileUnit::get () const
170750cd175SCaroline Tice {
171750cd175SCaroline Tice     return m_opaque_ptr;
172750cd175SCaroline Tice }
173750cd175SCaroline Tice 
174dde9cff3SCaroline Tice bool
175dde9cff3SCaroline Tice SBCompileUnit::GetDescription (SBStream &description)
176dde9cff3SCaroline Tice {
177dde9cff3SCaroline Tice     if (m_opaque_ptr)
178dde9cff3SCaroline Tice     {
179dac97f31SCaroline Tice         description.ref();
180dde9cff3SCaroline Tice         m_opaque_ptr->Dump (description.get(), false);
181dde9cff3SCaroline Tice     }
182dde9cff3SCaroline Tice     else
183dde9cff3SCaroline Tice         description.Printf ("No Value");
184dde9cff3SCaroline Tice 
185dde9cff3SCaroline Tice     return true;
186dde9cff3SCaroline Tice }
187