18d48cd60SZachary Turner //===-- SBDeclaration.cpp ----------------------------------------*- C++-*-===// 210de0904SEnrico Granata // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 610de0904SEnrico Granata // 710de0904SEnrico Granata //===----------------------------------------------------------------------===// 810de0904SEnrico Granata 910de0904SEnrico Granata #include "lldb/API/SBDeclaration.h" 10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 11bd4bf82aSJonas Devlieghere #include "Utils.h" 1210de0904SEnrico Granata #include "lldb/API/SBStream.h" 138d48cd60SZachary Turner #include "lldb/Host/PosixApi.h" 1410de0904SEnrico Granata #include "lldb/Symbol/Declaration.h" 15bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 1610de0904SEnrico Granata 17df3df25aSGreg Clayton #include <limits.h> 18df3df25aSGreg Clayton 1910de0904SEnrico Granata using namespace lldb; 2010de0904SEnrico Granata using namespace lldb_private; 2110de0904SEnrico Granata 22baf5664fSJonas Devlieghere SBDeclaration::SBDeclaration() : m_opaque_up() { 23baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBDeclaration); 24baf5664fSJonas Devlieghere } 2510de0904SEnrico Granata 26d5b44036SJonas Devlieghere SBDeclaration::SBDeclaration(const SBDeclaration &rhs) : m_opaque_up() { 27baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBDeclaration, (const lldb::SBDeclaration &), rhs); 28baf5664fSJonas Devlieghere 29bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 3010de0904SEnrico Granata } 3110de0904SEnrico Granata 32b9c1b51eSKate Stone SBDeclaration::SBDeclaration(const lldb_private::Declaration *lldb_object_ptr) 33d5b44036SJonas Devlieghere : m_opaque_up() { 3410de0904SEnrico Granata if (lldb_object_ptr) 35bd4bf82aSJonas Devlieghere m_opaque_up = llvm::make_unique<Declaration>(*lldb_object_ptr); 3610de0904SEnrico Granata } 3710de0904SEnrico Granata 38b9c1b51eSKate Stone const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) { 39baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBDeclaration &, 40baf5664fSJonas Devlieghere SBDeclaration, operator=,(const lldb::SBDeclaration &), 41baf5664fSJonas Devlieghere rhs); 42baf5664fSJonas Devlieghere 43bd4bf82aSJonas Devlieghere if (this != &rhs) 44bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 45*306809f2SJonas Devlieghere return LLDB_RECORD_RESULT(*this); 4610de0904SEnrico Granata } 4710de0904SEnrico Granata 48b9c1b51eSKate Stone void SBDeclaration::SetDeclaration( 49b9c1b51eSKate Stone const lldb_private::Declaration &lldb_object_ref) { 5010de0904SEnrico Granata ref() = lldb_object_ref; 5110de0904SEnrico Granata } 5210de0904SEnrico Granata 53b9c1b51eSKate Stone SBDeclaration::~SBDeclaration() {} 5410de0904SEnrico Granata 55b9c1b51eSKate Stone bool SBDeclaration::IsValid() const { 56baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDeclaration, IsValid); 577f5237bcSPavel Labath return this->operator bool(); 587f5237bcSPavel Labath } 597f5237bcSPavel Labath SBDeclaration::operator bool() const { 607f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDeclaration, operator bool); 61baf5664fSJonas Devlieghere 62d5b44036SJonas Devlieghere return m_opaque_up.get() && m_opaque_up->IsValid(); 6310de0904SEnrico Granata } 6410de0904SEnrico Granata 65b9c1b51eSKate Stone SBFileSpec SBDeclaration::GetFileSpec() const { 66baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBDeclaration, 67baf5664fSJonas Devlieghere GetFileSpec); 68baf5664fSJonas Devlieghere 6910de0904SEnrico Granata 7010de0904SEnrico Granata SBFileSpec sb_file_spec; 71d5b44036SJonas Devlieghere if (m_opaque_up.get() && m_opaque_up->GetFile()) 72d5b44036SJonas Devlieghere sb_file_spec.SetFileSpec(m_opaque_up->GetFile()); 7310de0904SEnrico Granata 7410de0904SEnrico Granata 75baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_file_spec); 7610de0904SEnrico Granata } 7710de0904SEnrico Granata 78b9c1b51eSKate Stone uint32_t SBDeclaration::GetLine() const { 79baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDeclaration, GetLine); 80baf5664fSJonas Devlieghere 8110de0904SEnrico Granata 8210de0904SEnrico Granata uint32_t line = 0; 83d5b44036SJonas Devlieghere if (m_opaque_up) 84d5b44036SJonas Devlieghere line = m_opaque_up->GetLine(); 8510de0904SEnrico Granata 8610de0904SEnrico Granata 8710de0904SEnrico Granata return line; 8810de0904SEnrico Granata } 8910de0904SEnrico Granata 90b9c1b51eSKate Stone uint32_t SBDeclaration::GetColumn() const { 91baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDeclaration, GetColumn); 92baf5664fSJonas Devlieghere 93d5b44036SJonas Devlieghere if (m_opaque_up) 94d5b44036SJonas Devlieghere return m_opaque_up->GetColumn(); 9510de0904SEnrico Granata return 0; 9610de0904SEnrico Granata } 9710de0904SEnrico Granata 98b9c1b51eSKate Stone void SBDeclaration::SetFileSpec(lldb::SBFileSpec filespec) { 99baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDeclaration, SetFileSpec, (lldb::SBFileSpec), 100baf5664fSJonas Devlieghere filespec); 101baf5664fSJonas Devlieghere 10210de0904SEnrico Granata if (filespec.IsValid()) 10310de0904SEnrico Granata ref().SetFile(filespec.ref()); 10410de0904SEnrico Granata else 10510de0904SEnrico Granata ref().SetFile(FileSpec()); 10610de0904SEnrico Granata } 107baf5664fSJonas Devlieghere void SBDeclaration::SetLine(uint32_t line) { 108baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDeclaration, SetLine, (uint32_t), line); 10910de0904SEnrico Granata 110baf5664fSJonas Devlieghere ref().SetLine(line); 111baf5664fSJonas Devlieghere } 112baf5664fSJonas Devlieghere 113baf5664fSJonas Devlieghere void SBDeclaration::SetColumn(uint32_t column) { 114baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDeclaration, SetColumn, (uint32_t), column); 115baf5664fSJonas Devlieghere 116baf5664fSJonas Devlieghere ref().SetColumn(column); 117baf5664fSJonas Devlieghere } 11810de0904SEnrico Granata 119b9c1b51eSKate Stone bool SBDeclaration::operator==(const SBDeclaration &rhs) const { 120baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST( 121baf5664fSJonas Devlieghere bool, SBDeclaration, operator==,(const lldb::SBDeclaration &), rhs); 122baf5664fSJonas Devlieghere 123d5b44036SJonas Devlieghere lldb_private::Declaration *lhs_ptr = m_opaque_up.get(); 124d5b44036SJonas Devlieghere lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get(); 12510de0904SEnrico Granata 12610de0904SEnrico Granata if (lhs_ptr && rhs_ptr) 12710de0904SEnrico Granata return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) == 0; 12810de0904SEnrico Granata 12910de0904SEnrico Granata return lhs_ptr == rhs_ptr; 13010de0904SEnrico Granata } 13110de0904SEnrico Granata 132b9c1b51eSKate Stone bool SBDeclaration::operator!=(const SBDeclaration &rhs) const { 133baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST( 134baf5664fSJonas Devlieghere bool, SBDeclaration, operator!=,(const lldb::SBDeclaration &), rhs); 135baf5664fSJonas Devlieghere 136d5b44036SJonas Devlieghere lldb_private::Declaration *lhs_ptr = m_opaque_up.get(); 137d5b44036SJonas Devlieghere lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get(); 13810de0904SEnrico Granata 13910de0904SEnrico Granata if (lhs_ptr && rhs_ptr) 14010de0904SEnrico Granata return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) != 0; 14110de0904SEnrico Granata 14210de0904SEnrico Granata return lhs_ptr != rhs_ptr; 14310de0904SEnrico Granata } 14410de0904SEnrico Granata 145b9c1b51eSKate Stone const lldb_private::Declaration *SBDeclaration::operator->() const { 146d5b44036SJonas Devlieghere return m_opaque_up.get(); 14710de0904SEnrico Granata } 14810de0904SEnrico Granata 149b9c1b51eSKate Stone lldb_private::Declaration &SBDeclaration::ref() { 150d5b44036SJonas Devlieghere if (m_opaque_up == NULL) 151d5b44036SJonas Devlieghere m_opaque_up.reset(new lldb_private::Declaration()); 152d5b44036SJonas Devlieghere return *m_opaque_up; 15310de0904SEnrico Granata } 15410de0904SEnrico Granata 155b9c1b51eSKate Stone const lldb_private::Declaration &SBDeclaration::ref() const { 156d5b44036SJonas Devlieghere return *m_opaque_up; 15710de0904SEnrico Granata } 15810de0904SEnrico Granata 159b9c1b51eSKate Stone bool SBDeclaration::GetDescription(SBStream &description) { 160baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBDeclaration, GetDescription, (lldb::SBStream &), 161baf5664fSJonas Devlieghere description); 162baf5664fSJonas Devlieghere 16310de0904SEnrico Granata Stream &strm = description.ref(); 16410de0904SEnrico Granata 165d5b44036SJonas Devlieghere if (m_opaque_up) { 16610de0904SEnrico Granata char file_path[PATH_MAX * 2]; 167d5b44036SJonas Devlieghere m_opaque_up->GetFile().GetPath(file_path, sizeof(file_path)); 16810de0904SEnrico Granata strm.Printf("%s:%u", file_path, GetLine()); 16910de0904SEnrico Granata if (GetColumn() > 0) 17010de0904SEnrico Granata strm.Printf(":%u", GetColumn()); 171b9c1b51eSKate Stone } else 17210de0904SEnrico Granata strm.PutCString("No value"); 17310de0904SEnrico Granata 17410de0904SEnrico Granata return true; 17510de0904SEnrico Granata } 17610de0904SEnrico Granata 177d5b44036SJonas Devlieghere lldb_private::Declaration *SBDeclaration::get() { return m_opaque_up.get(); } 178ae211eceSMichal Gorny 179ae211eceSMichal Gorny namespace lldb_private { 180ae211eceSMichal Gorny namespace repro { 181ae211eceSMichal Gorny 182ae211eceSMichal Gorny template <> 183ae211eceSMichal Gorny void RegisterMethods<SBDeclaration>(Registry &R) { 184ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBDeclaration, ()); 185ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBDeclaration, (const lldb::SBDeclaration &)); 186ae211eceSMichal Gorny LLDB_REGISTER_METHOD( 187ae211eceSMichal Gorny const lldb::SBDeclaration &, 188ae211eceSMichal Gorny SBDeclaration, operator=,(const lldb::SBDeclaration &)); 189ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBDeclaration, IsValid, ()); 190ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBDeclaration, operator bool, ()); 191ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBDeclaration, GetFileSpec, 192ae211eceSMichal Gorny ()); 193ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBDeclaration, GetLine, ()); 194ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBDeclaration, GetColumn, ()); 195ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDeclaration, SetFileSpec, (lldb::SBFileSpec)); 196ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDeclaration, SetLine, (uint32_t)); 197ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDeclaration, SetColumn, (uint32_t)); 198ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST( 199ae211eceSMichal Gorny bool, SBDeclaration, operator==,(const lldb::SBDeclaration &)); 200ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST( 201ae211eceSMichal Gorny bool, SBDeclaration, operator!=,(const lldb::SBDeclaration &)); 202ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDeclaration, GetDescription, 203ae211eceSMichal Gorny (lldb::SBStream &)); 204ae211eceSMichal Gorny } 205ae211eceSMichal Gorny 206ae211eceSMichal Gorny } 207ae211eceSMichal Gorny } 208