xref: /freebsd-src/contrib/llvm-project/lldb/source/API/SBModuleSpec.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
15ffd83dbSDimitry Andric //===-- SBModuleSpec.cpp --------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/API/SBModuleSpec.h"
100b57cec5SDimitry Andric #include "Utils.h"
110b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
120b57cec5SDimitry Andric #include "lldb/Core/Module.h"
130b57cec5SDimitry Andric #include "lldb/Core/ModuleSpec.h"
140b57cec5SDimitry Andric #include "lldb/Host/Host.h"
150b57cec5SDimitry Andric #include "lldb/Symbol/ObjectFile.h"
1604eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
170b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric using namespace lldb;
200b57cec5SDimitry Andric using namespace lldb_private;
210b57cec5SDimitry Andric 
SBModuleSpec()220b57cec5SDimitry Andric SBModuleSpec::SBModuleSpec() : m_opaque_up(new lldb_private::ModuleSpec()) {
2304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
240b57cec5SDimitry Andric }
250b57cec5SDimitry Andric 
SBModuleSpec(const SBModuleSpec & rhs)2604eeddc0SDimitry Andric SBModuleSpec::SBModuleSpec(const SBModuleSpec &rhs) {
2704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric   m_opaque_up = clone(rhs.m_opaque_up);
300b57cec5SDimitry Andric }
310b57cec5SDimitry Andric 
SBModuleSpec(const lldb_private::ModuleSpec & module_spec)32*06c3fb27SDimitry Andric SBModuleSpec::SBModuleSpec(const lldb_private::ModuleSpec &module_spec)
33*06c3fb27SDimitry Andric     : m_opaque_up(new lldb_private::ModuleSpec(module_spec)) {
34*06c3fb27SDimitry Andric   LLDB_INSTRUMENT_VA(this, module_spec);
35*06c3fb27SDimitry Andric }
36*06c3fb27SDimitry Andric 
operator =(const SBModuleSpec & rhs)370b57cec5SDimitry Andric const SBModuleSpec &SBModuleSpec::operator=(const SBModuleSpec &rhs) {
3804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
390b57cec5SDimitry Andric 
400b57cec5SDimitry Andric   if (this != &rhs)
410b57cec5SDimitry Andric     m_opaque_up = clone(rhs.m_opaque_up);
4204eeddc0SDimitry Andric   return *this;
430b57cec5SDimitry Andric }
440b57cec5SDimitry Andric 
455ffd83dbSDimitry Andric SBModuleSpec::~SBModuleSpec() = default;
460b57cec5SDimitry Andric 
IsValid() const470b57cec5SDimitry Andric bool SBModuleSpec::IsValid() const {
4804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
490b57cec5SDimitry Andric   return this->operator bool();
500b57cec5SDimitry Andric }
operator bool() const510b57cec5SDimitry Andric SBModuleSpec::operator bool() const {
5204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   return m_opaque_up->operator bool();
550b57cec5SDimitry Andric }
560b57cec5SDimitry Andric 
Clear()570b57cec5SDimitry Andric void SBModuleSpec::Clear() {
5804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   m_opaque_up->Clear();
610b57cec5SDimitry Andric }
620b57cec5SDimitry Andric 
GetFileSpec()630b57cec5SDimitry Andric SBFileSpec SBModuleSpec::GetFileSpec() {
6404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric   SBFileSpec sb_spec(m_opaque_up->GetFileSpec());
6704eeddc0SDimitry Andric   return sb_spec;
680b57cec5SDimitry Andric }
690b57cec5SDimitry Andric 
SetFileSpec(const lldb::SBFileSpec & sb_spec)700b57cec5SDimitry Andric void SBModuleSpec::SetFileSpec(const lldb::SBFileSpec &sb_spec) {
7104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, sb_spec);
720b57cec5SDimitry Andric 
730b57cec5SDimitry Andric   m_opaque_up->GetFileSpec() = *sb_spec;
740b57cec5SDimitry Andric }
750b57cec5SDimitry Andric 
GetPlatformFileSpec()760b57cec5SDimitry Andric lldb::SBFileSpec SBModuleSpec::GetPlatformFileSpec() {
7704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
780b57cec5SDimitry Andric 
7904eeddc0SDimitry Andric   return SBFileSpec(m_opaque_up->GetPlatformFileSpec());
800b57cec5SDimitry Andric }
810b57cec5SDimitry Andric 
SetPlatformFileSpec(const lldb::SBFileSpec & sb_spec)820b57cec5SDimitry Andric void SBModuleSpec::SetPlatformFileSpec(const lldb::SBFileSpec &sb_spec) {
8304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, sb_spec);
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric   m_opaque_up->GetPlatformFileSpec() = *sb_spec;
860b57cec5SDimitry Andric }
870b57cec5SDimitry Andric 
GetSymbolFileSpec()880b57cec5SDimitry Andric lldb::SBFileSpec SBModuleSpec::GetSymbolFileSpec() {
8904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
900b57cec5SDimitry Andric 
9104eeddc0SDimitry Andric   return SBFileSpec(m_opaque_up->GetSymbolFileSpec());
920b57cec5SDimitry Andric }
930b57cec5SDimitry Andric 
SetSymbolFileSpec(const lldb::SBFileSpec & sb_spec)940b57cec5SDimitry Andric void SBModuleSpec::SetSymbolFileSpec(const lldb::SBFileSpec &sb_spec) {
9504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, sb_spec);
960b57cec5SDimitry Andric 
970b57cec5SDimitry Andric   m_opaque_up->GetSymbolFileSpec() = *sb_spec;
980b57cec5SDimitry Andric }
990b57cec5SDimitry Andric 
GetObjectName()1000b57cec5SDimitry Andric const char *SBModuleSpec::GetObjectName() {
10104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1020b57cec5SDimitry Andric 
1030b57cec5SDimitry Andric   return m_opaque_up->GetObjectName().GetCString();
1040b57cec5SDimitry Andric }
1050b57cec5SDimitry Andric 
SetObjectName(const char * name)1060b57cec5SDimitry Andric void SBModuleSpec::SetObjectName(const char *name) {
10704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, name);
1080b57cec5SDimitry Andric 
1090b57cec5SDimitry Andric   m_opaque_up->GetObjectName().SetCString(name);
1100b57cec5SDimitry Andric }
1110b57cec5SDimitry Andric 
GetTriple()1120b57cec5SDimitry Andric const char *SBModuleSpec::GetTriple() {
11304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1140b57cec5SDimitry Andric 
1150b57cec5SDimitry Andric   std::string triple(m_opaque_up->GetArchitecture().GetTriple().str());
1160b57cec5SDimitry Andric   // Unique the string so we don't run into ownership issues since the const
1170b57cec5SDimitry Andric   // strings put the string into the string pool once and the strings never
1180b57cec5SDimitry Andric   // comes out
1190b57cec5SDimitry Andric   ConstString const_triple(triple.c_str());
1200b57cec5SDimitry Andric   return const_triple.GetCString();
1210b57cec5SDimitry Andric }
1220b57cec5SDimitry Andric 
SetTriple(const char * triple)1230b57cec5SDimitry Andric void SBModuleSpec::SetTriple(const char *triple) {
12404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, triple);
1250b57cec5SDimitry Andric 
1260b57cec5SDimitry Andric   m_opaque_up->GetArchitecture().SetTriple(triple);
1270b57cec5SDimitry Andric }
1280b57cec5SDimitry Andric 
GetUUIDBytes()1290b57cec5SDimitry Andric const uint8_t *SBModuleSpec::GetUUIDBytes() {
13004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this)
1310b57cec5SDimitry Andric   return m_opaque_up->GetUUID().GetBytes().data();
1320b57cec5SDimitry Andric }
1330b57cec5SDimitry Andric 
GetUUIDLength()1340b57cec5SDimitry Andric size_t SBModuleSpec::GetUUIDLength() {
13504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1360b57cec5SDimitry Andric 
1370b57cec5SDimitry Andric   return m_opaque_up->GetUUID().GetBytes().size();
1380b57cec5SDimitry Andric }
1390b57cec5SDimitry Andric 
SetUUIDBytes(const uint8_t * uuid,size_t uuid_len)1400b57cec5SDimitry Andric bool SBModuleSpec::SetUUIDBytes(const uint8_t *uuid, size_t uuid_len) {
14104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, uuid, uuid_len)
142bdd1243dSDimitry Andric   m_opaque_up->GetUUID() = UUID(uuid, uuid_len);
1430b57cec5SDimitry Andric   return m_opaque_up->GetUUID().IsValid();
1440b57cec5SDimitry Andric }
1450b57cec5SDimitry Andric 
GetDescription(lldb::SBStream & description)1460b57cec5SDimitry Andric bool SBModuleSpec::GetDescription(lldb::SBStream &description) {
14704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, description);
1480b57cec5SDimitry Andric 
1490b57cec5SDimitry Andric   m_opaque_up->Dump(description.ref());
1500b57cec5SDimitry Andric   return true;
1510b57cec5SDimitry Andric }
1520b57cec5SDimitry Andric 
GetObjectOffset()153*06c3fb27SDimitry Andric uint64_t SBModuleSpec::GetObjectOffset() {
154*06c3fb27SDimitry Andric   LLDB_INSTRUMENT_VA(this);
155*06c3fb27SDimitry Andric 
156*06c3fb27SDimitry Andric   return m_opaque_up->GetObjectOffset();
157*06c3fb27SDimitry Andric }
158*06c3fb27SDimitry Andric 
SetObjectOffset(uint64_t object_offset)159*06c3fb27SDimitry Andric void SBModuleSpec::SetObjectOffset(uint64_t object_offset) {
160*06c3fb27SDimitry Andric   LLDB_INSTRUMENT_VA(this, object_offset);
161*06c3fb27SDimitry Andric 
162*06c3fb27SDimitry Andric   m_opaque_up->SetObjectOffset(object_offset);
163*06c3fb27SDimitry Andric }
164*06c3fb27SDimitry Andric 
GetObjectSize()165*06c3fb27SDimitry Andric uint64_t SBModuleSpec::GetObjectSize() {
166*06c3fb27SDimitry Andric   LLDB_INSTRUMENT_VA(this);
167*06c3fb27SDimitry Andric 
168*06c3fb27SDimitry Andric   return m_opaque_up->GetObjectSize();
169*06c3fb27SDimitry Andric }
170*06c3fb27SDimitry Andric 
SetObjectSize(uint64_t object_size)171*06c3fb27SDimitry Andric void SBModuleSpec::SetObjectSize(uint64_t object_size) {
172*06c3fb27SDimitry Andric   LLDB_INSTRUMENT_VA(this, object_size);
173*06c3fb27SDimitry Andric 
174*06c3fb27SDimitry Andric   m_opaque_up->SetObjectSize(object_size);
175*06c3fb27SDimitry Andric }
176*06c3fb27SDimitry Andric 
SBModuleSpecList()1770b57cec5SDimitry Andric SBModuleSpecList::SBModuleSpecList() : m_opaque_up(new ModuleSpecList()) {
17804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1790b57cec5SDimitry Andric }
1800b57cec5SDimitry Andric 
SBModuleSpecList(const SBModuleSpecList & rhs)1810b57cec5SDimitry Andric SBModuleSpecList::SBModuleSpecList(const SBModuleSpecList &rhs)
1820b57cec5SDimitry Andric     : m_opaque_up(new ModuleSpecList(*rhs.m_opaque_up)) {
18304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
1840b57cec5SDimitry Andric }
1850b57cec5SDimitry Andric 
operator =(const SBModuleSpecList & rhs)1860b57cec5SDimitry Andric SBModuleSpecList &SBModuleSpecList::operator=(const SBModuleSpecList &rhs) {
18704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
1880b57cec5SDimitry Andric 
1890b57cec5SDimitry Andric   if (this != &rhs)
1900b57cec5SDimitry Andric     *m_opaque_up = *rhs.m_opaque_up;
19104eeddc0SDimitry Andric   return *this;
1920b57cec5SDimitry Andric }
1930b57cec5SDimitry Andric 
1945ffd83dbSDimitry Andric SBModuleSpecList::~SBModuleSpecList() = default;
1950b57cec5SDimitry Andric 
GetModuleSpecifications(const char * path)1960b57cec5SDimitry Andric SBModuleSpecList SBModuleSpecList::GetModuleSpecifications(const char *path) {
19704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(path);
1980b57cec5SDimitry Andric 
1990b57cec5SDimitry Andric   SBModuleSpecList specs;
2000b57cec5SDimitry Andric   FileSpec file_spec(path);
2010b57cec5SDimitry Andric   FileSystem::Instance().Resolve(file_spec);
2020b57cec5SDimitry Andric   Host::ResolveExecutableInBundle(file_spec);
2030b57cec5SDimitry Andric   ObjectFile::GetModuleSpecifications(file_spec, 0, 0, *specs.m_opaque_up);
20404eeddc0SDimitry Andric   return specs;
2050b57cec5SDimitry Andric }
2060b57cec5SDimitry Andric 
Append(const SBModuleSpec & spec)2070b57cec5SDimitry Andric void SBModuleSpecList::Append(const SBModuleSpec &spec) {
20804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, spec);
2090b57cec5SDimitry Andric 
2100b57cec5SDimitry Andric   m_opaque_up->Append(*spec.m_opaque_up);
2110b57cec5SDimitry Andric }
2120b57cec5SDimitry Andric 
Append(const SBModuleSpecList & spec_list)2130b57cec5SDimitry Andric void SBModuleSpecList::Append(const SBModuleSpecList &spec_list) {
21404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, spec_list);
2150b57cec5SDimitry Andric 
2160b57cec5SDimitry Andric   m_opaque_up->Append(*spec_list.m_opaque_up);
2170b57cec5SDimitry Andric }
2180b57cec5SDimitry Andric 
GetSize()2190b57cec5SDimitry Andric size_t SBModuleSpecList::GetSize() {
22004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
2210b57cec5SDimitry Andric 
2220b57cec5SDimitry Andric   return m_opaque_up->GetSize();
2230b57cec5SDimitry Andric }
2240b57cec5SDimitry Andric 
GetSpecAtIndex(size_t i)2250b57cec5SDimitry Andric SBModuleSpec SBModuleSpecList::GetSpecAtIndex(size_t i) {
22604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, i);
2270b57cec5SDimitry Andric 
2280b57cec5SDimitry Andric   SBModuleSpec sb_module_spec;
2290b57cec5SDimitry Andric   m_opaque_up->GetModuleSpecAtIndex(i, *sb_module_spec.m_opaque_up);
23004eeddc0SDimitry Andric   return sb_module_spec;
2310b57cec5SDimitry Andric }
2320b57cec5SDimitry Andric 
2330b57cec5SDimitry Andric SBModuleSpec
FindFirstMatchingSpec(const SBModuleSpec & match_spec)2340b57cec5SDimitry Andric SBModuleSpecList::FindFirstMatchingSpec(const SBModuleSpec &match_spec) {
23504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, match_spec);
2360b57cec5SDimitry Andric 
2370b57cec5SDimitry Andric   SBModuleSpec sb_module_spec;
2380b57cec5SDimitry Andric   m_opaque_up->FindMatchingModuleSpec(*match_spec.m_opaque_up,
2390b57cec5SDimitry Andric                                       *sb_module_spec.m_opaque_up);
24004eeddc0SDimitry Andric   return sb_module_spec;
2410b57cec5SDimitry Andric }
2420b57cec5SDimitry Andric 
2430b57cec5SDimitry Andric SBModuleSpecList
FindMatchingSpecs(const SBModuleSpec & match_spec)2440b57cec5SDimitry Andric SBModuleSpecList::FindMatchingSpecs(const SBModuleSpec &match_spec) {
24504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, match_spec);
2460b57cec5SDimitry Andric 
2470b57cec5SDimitry Andric   SBModuleSpecList specs;
2480b57cec5SDimitry Andric   m_opaque_up->FindMatchingModuleSpecs(*match_spec.m_opaque_up,
2490b57cec5SDimitry Andric                                        *specs.m_opaque_up);
25004eeddc0SDimitry Andric   return specs;
2510b57cec5SDimitry Andric }
2520b57cec5SDimitry Andric 
GetDescription(lldb::SBStream & description)2530b57cec5SDimitry Andric bool SBModuleSpecList::GetDescription(lldb::SBStream &description) {
25404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, description);
2550b57cec5SDimitry Andric 
2560b57cec5SDimitry Andric   m_opaque_up->Dump(description.ref());
2570b57cec5SDimitry Andric   return true;
2580b57cec5SDimitry Andric }
259