149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata//===-- SBDeclaration.cpp -----------------------------------------*- C++ -*-===//
249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata//
349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata//                     The LLVM Compiler Infrastructure
449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata//
549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata// This file is distributed under the University of Illinois Open Source
649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata// License. See LICENSE.TXT for details.
749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata//
849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata//===----------------------------------------------------------------------===//
949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
1049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata#include "lldb/API/SBDeclaration.h"
1149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata#include "lldb/API/SBStream.h"
1249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata#include "lldb/Core/Log.h"
1349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata#include "lldb/Core/Stream.h"
1449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata#include "lldb/Symbol/Declaration.h"
1549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
165e91e379b3be10738ab5aeae87b47001de16cd7cGreg Clayton#include <limits.h>
175e91e379b3be10738ab5aeae87b47001de16cd7cGreg Clayton
1849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatausing namespace lldb;
1949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatausing namespace lldb_private;
2049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
2149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
2249306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::SBDeclaration () :
2349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    m_opaque_ap ()
2449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
2549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
2649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
2749306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::SBDeclaration (const SBDeclaration &rhs) :
2849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    m_opaque_ap ()
2949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
3049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (rhs.IsValid())
3149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        ref() = rhs.ref();
3249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
3349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
3449306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::SBDeclaration (const lldb_private::Declaration *lldb_object_ptr) :
3549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    m_opaque_ap ()
3649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
3749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (lldb_object_ptr)
3849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        ref() = *lldb_object_ptr;
3949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
4049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
4149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granataconst SBDeclaration &
4249306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::operator = (const SBDeclaration &rhs)
4349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
4449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (this != &rhs)
4549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    {
4649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        if (rhs.IsValid())
4749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata            ref() = rhs.ref();
4849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        else
4949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata            m_opaque_ap.reset();
5049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    }
5149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return *this;
5249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
5349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
5449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatavoid
5549306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::SetDeclaration (const lldb_private::Declaration &lldb_object_ref)
5649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
5749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    ref() = lldb_object_ref;
5849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
5949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
6049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
6149306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::~SBDeclaration ()
6249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
6349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
6449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
6549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
6649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatabool
6749306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::IsValid () const
6849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
6949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return m_opaque_ap.get() && m_opaque_ap->IsValid();
7049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
7149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
7249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
7349306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBFileSpec
7449306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::GetFileSpec () const
7549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
76952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
7849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    SBFileSpec sb_file_spec;
7949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (m_opaque_ap.get() && m_opaque_ap->GetFile())
8049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        sb_file_spec.SetFileSpec(m_opaque_ap->GetFile());
8149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
8249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (log)
8349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    {
8449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        SBStream sstr;
8549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        sb_file_spec.GetDescription (sstr);
8649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        log->Printf ("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s", m_opaque_ap.get(),
8749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata                     sb_file_spec.get(), sstr.GetData());
8849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    }
8949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
9049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return sb_file_spec;
9149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
9249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
9349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatauint32_t
9449306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::GetLine () const
9549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
96952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
9849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    uint32_t line = 0;
9949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (m_opaque_ap.get())
10049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        line = m_opaque_ap->GetLine();
10149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
10249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (log)
10349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        log->Printf ("SBLineEntry(%p)::GetLine () => %u", m_opaque_ap.get(), line);
10449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
10549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return line;
10649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
10749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
10849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
10949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatauint32_t
11049306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::GetColumn () const
11149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
11249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (m_opaque_ap.get())
11349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        return m_opaque_ap->GetColumn();
11449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return 0;
11549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
11649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
11749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatavoid
11849306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::SetFileSpec (lldb::SBFileSpec filespec)
11949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
12049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (filespec.IsValid())
12149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        ref().SetFile(filespec.ref());
12249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    else
12349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        ref().SetFile(FileSpec());
12449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
12549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatavoid
12649306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::SetLine (uint32_t line)
12749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
12849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    ref().SetLine(line);
12949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
13049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
13149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatavoid
13249306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::SetColumn (uint32_t column)
13349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
13449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    ref().SetColumn(column);
13549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
13649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
13749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
13849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
13949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatabool
14049306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::operator == (const SBDeclaration &rhs) const
14149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
14249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
14349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
14449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
14549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (lhs_ptr && rhs_ptr)
14649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        return lldb_private::Declaration::Compare (*lhs_ptr, *rhs_ptr) == 0;
14749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
14849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return lhs_ptr == rhs_ptr;
14949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
15049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
15149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatabool
15249306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::operator != (const SBDeclaration &rhs) const
15349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
15449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
15549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
15649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
15749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (lhs_ptr && rhs_ptr)
15849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        return lldb_private::Declaration::Compare (*lhs_ptr, *rhs_ptr) != 0;
15949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
16049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return lhs_ptr != rhs_ptr;
16149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
16249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
16349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granataconst lldb_private::Declaration *
16449306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::operator->() const
16549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
16649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return m_opaque_ap.get();
16749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
16849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
16949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatalldb_private::Declaration &
17049306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::ref()
17149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
17249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (m_opaque_ap.get() == NULL)
17349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        m_opaque_ap.reset (new lldb_private::Declaration ());
17449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return *m_opaque_ap;
17549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
17649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
17749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granataconst lldb_private::Declaration &
17849306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::ref() const
17949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
18049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return *m_opaque_ap;
18149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
18249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
18349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatabool
18449306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::GetDescription (SBStream &description)
18549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
18649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    Stream &strm = description.ref();
18749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
18849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    if (m_opaque_ap.get())
18949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    {
19049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        char file_path[PATH_MAX*2];
19149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        m_opaque_ap->GetFile().GetPath (file_path, sizeof (file_path));
19249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        strm.Printf ("%s:%u", file_path, GetLine());
19349306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        if (GetColumn() > 0)
19449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata            strm.Printf (":%u", GetColumn());
19549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    }
19649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    else
19749306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata        strm.PutCString ("No value");
19849306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
19949306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return true;
20049306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
20149306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata
20249306144bb37f0b3423d992f17cdcc24703374b4Enrico Granatalldb_private::Declaration *
20349306144bb37f0b3423d992f17cdcc24703374b4Enrico GranataSBDeclaration::get ()
20449306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata{
20549306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata    return m_opaque_ap.get();
20649306144bb37f0b3423d992f17cdcc24703374b4Enrico Granata}
207