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*5160ce5cSGreg Clayton     Log *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 {
109*5160ce5cSGreg Clayton     Log *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 
146873a7a4bSJohnny Chen uint32_t
147873a7a4bSJohnny Chen SBCompileUnit::GetNumSupportFiles () const
148873a7a4bSJohnny Chen {
149873a7a4bSJohnny Chen     if (m_opaque_ptr)
150873a7a4bSJohnny Chen     {
151873a7a4bSJohnny Chen 	FileSpecList& support_files = m_opaque_ptr->GetSupportFiles ();
152873a7a4bSJohnny Chen 	return support_files.GetSize();
153873a7a4bSJohnny Chen     }
154873a7a4bSJohnny Chen     return 0;
155873a7a4bSJohnny Chen }
156873a7a4bSJohnny Chen 
157873a7a4bSJohnny Chen SBFileSpec
158873a7a4bSJohnny Chen SBCompileUnit::GetSupportFileAtIndex (uint32_t idx) const
159873a7a4bSJohnny Chen {
160*5160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
161873a7a4bSJohnny Chen 
162873a7a4bSJohnny Chen     SBFileSpec sb_file_spec;
163873a7a4bSJohnny Chen     if (m_opaque_ptr)
164873a7a4bSJohnny Chen     {
165873a7a4bSJohnny Chen 	FileSpecList &support_files = m_opaque_ptr->GetSupportFiles ();
166873a7a4bSJohnny Chen 	FileSpec file_spec = support_files.GetFileSpecAtIndex(idx);
167873a7a4bSJohnny Chen 	sb_file_spec.SetFileSpec(file_spec);
168873a7a4bSJohnny Chen     }
169873a7a4bSJohnny Chen 
170873a7a4bSJohnny Chen     if (log)
171873a7a4bSJohnny Chen     {
172873a7a4bSJohnny Chen         SBStream sstr;
173873a7a4bSJohnny Chen         sb_file_spec.GetDescription (sstr);
174873a7a4bSJohnny Chen         log->Printf ("SBCompileUnit(%p)::GetGetFileSpecAtIndex (idx=%u) => SBFileSpec(%p): '%s'",
175873a7a4bSJohnny Chen                      m_opaque_ptr, idx, sb_file_spec.get(), sstr.GetData());
176873a7a4bSJohnny Chen     }
177873a7a4bSJohnny Chen 
178873a7a4bSJohnny Chen     return sb_file_spec;
179873a7a4bSJohnny Chen }
180873a7a4bSJohnny Chen 
181873a7a4bSJohnny Chen uint32_t
182873a7a4bSJohnny Chen SBCompileUnit::FindSupportFileIndex (uint32_t start_idx, const SBFileSpec &sb_file, bool full)
183873a7a4bSJohnny Chen {
184873a7a4bSJohnny Chen     if (m_opaque_ptr)
185873a7a4bSJohnny Chen     {
186873a7a4bSJohnny Chen 	FileSpecList &support_files = m_opaque_ptr->GetSupportFiles ();
187873a7a4bSJohnny Chen 	return support_files.FindFileIndex(start_idx, sb_file.ref(), full);
188873a7a4bSJohnny Chen     }
189873a7a4bSJohnny Chen     return 0;
190873a7a4bSJohnny Chen }
191873a7a4bSJohnny Chen 
19230fdc8d8SChris Lattner bool
19330fdc8d8SChris Lattner SBCompileUnit::IsValid () const
19430fdc8d8SChris Lattner {
1956611103cSGreg Clayton     return m_opaque_ptr != NULL;
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
19830fdc8d8SChris Lattner bool
19930fdc8d8SChris Lattner SBCompileUnit::operator == (const SBCompileUnit &rhs) const
20030fdc8d8SChris Lattner {
2016611103cSGreg Clayton     return m_opaque_ptr == rhs.m_opaque_ptr;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner bool
20530fdc8d8SChris Lattner SBCompileUnit::operator != (const SBCompileUnit &rhs) const
20630fdc8d8SChris Lattner {
2076611103cSGreg Clayton     return m_opaque_ptr != rhs.m_opaque_ptr;
20830fdc8d8SChris Lattner }
20930fdc8d8SChris Lattner 
21030fdc8d8SChris Lattner const lldb_private::CompileUnit *
21130fdc8d8SChris Lattner SBCompileUnit::operator->() const
21230fdc8d8SChris Lattner {
2136611103cSGreg Clayton     return m_opaque_ptr;
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner const lldb_private::CompileUnit &
21730fdc8d8SChris Lattner SBCompileUnit::operator*() const
21830fdc8d8SChris Lattner {
2196611103cSGreg Clayton     return *m_opaque_ptr;
22030fdc8d8SChris Lattner }
221dde9cff3SCaroline Tice 
2228f7180b1SGreg Clayton lldb_private::CompileUnit *
2238f7180b1SGreg Clayton SBCompileUnit::get ()
224750cd175SCaroline Tice {
225750cd175SCaroline Tice     return m_opaque_ptr;
226750cd175SCaroline Tice }
22772eff18aSGreg Clayton 
22872eff18aSGreg Clayton void
22972eff18aSGreg Clayton SBCompileUnit::reset (lldb_private::CompileUnit *lldb_object_ptr)
23072eff18aSGreg Clayton {
23172eff18aSGreg Clayton     m_opaque_ptr = lldb_object_ptr;
23272eff18aSGreg Clayton }
23372eff18aSGreg Clayton 
234750cd175SCaroline Tice 
235dde9cff3SCaroline Tice bool
236dde9cff3SCaroline Tice SBCompileUnit::GetDescription (SBStream &description)
237dde9cff3SCaroline Tice {
238da7bc7d0SGreg Clayton     Stream &strm = description.ref();
239da7bc7d0SGreg Clayton 
240dde9cff3SCaroline Tice     if (m_opaque_ptr)
241dde9cff3SCaroline Tice     {
242da7bc7d0SGreg Clayton         m_opaque_ptr->Dump (&strm, false);
243dde9cff3SCaroline Tice     }
244dde9cff3SCaroline Tice     else
245da7bc7d0SGreg Clayton         strm.PutCString ("No value");
246dde9cff3SCaroline Tice 
247dde9cff3SCaroline Tice     return true;
248dde9cff3SCaroline Tice }
249