15ffd83dbSDimitry Andric //===-- SBModuleSpec.cpp --------------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #include "lldb/API/SBModuleSpec.h"
10*0b57cec5SDimitry Andric #include "Utils.h"
11*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
12*0b57cec5SDimitry Andric #include "lldb/Core/Module.h"
13*0b57cec5SDimitry Andric #include "lldb/Core/ModuleSpec.h"
14*0b57cec5SDimitry Andric #include "lldb/Host/Host.h"
15*0b57cec5SDimitry Andric #include "lldb/Symbol/ObjectFile.h"
1604eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
17*0b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
18*0b57cec5SDimitry Andric 
19*0b57cec5SDimitry Andric using namespace lldb;
20*0b57cec5SDimitry Andric using namespace lldb_private;
21*0b57cec5SDimitry Andric 
22*0b57cec5SDimitry Andric SBModuleSpec::SBModuleSpec() : m_opaque_up(new lldb_private::ModuleSpec()) {
2304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
24*0b57cec5SDimitry Andric }
25*0b57cec5SDimitry Andric 
2604eeddc0SDimitry Andric SBModuleSpec::SBModuleSpec(const SBModuleSpec &rhs) {
2704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
28*0b57cec5SDimitry Andric 
29*0b57cec5SDimitry Andric   m_opaque_up = clone(rhs.m_opaque_up);
30*0b57cec5SDimitry Andric }
31*0b57cec5SDimitry Andric 
32*0b57cec5SDimitry Andric const SBModuleSpec &SBModuleSpec::operator=(const SBModuleSpec &rhs) {
3304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
34*0b57cec5SDimitry Andric 
35*0b57cec5SDimitry Andric   if (this != &rhs)
36*0b57cec5SDimitry Andric     m_opaque_up = clone(rhs.m_opaque_up);
3704eeddc0SDimitry Andric   return *this;
38*0b57cec5SDimitry Andric }
39*0b57cec5SDimitry Andric 
405ffd83dbSDimitry Andric SBModuleSpec::~SBModuleSpec() = default;
41*0b57cec5SDimitry Andric 
42*0b57cec5SDimitry Andric bool SBModuleSpec::IsValid() const {
4304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
44*0b57cec5SDimitry Andric   return this->operator bool();
45*0b57cec5SDimitry Andric }
46*0b57cec5SDimitry Andric SBModuleSpec::operator bool() const {
4704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
48*0b57cec5SDimitry Andric 
49*0b57cec5SDimitry Andric   return m_opaque_up->operator bool();
50*0b57cec5SDimitry Andric }
51*0b57cec5SDimitry Andric 
52*0b57cec5SDimitry Andric void SBModuleSpec::Clear() {
5304eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
54*0b57cec5SDimitry Andric 
55*0b57cec5SDimitry Andric   m_opaque_up->Clear();
56*0b57cec5SDimitry Andric }
57*0b57cec5SDimitry Andric 
58*0b57cec5SDimitry Andric SBFileSpec SBModuleSpec::GetFileSpec() {
5904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
60*0b57cec5SDimitry Andric 
61*0b57cec5SDimitry Andric   SBFileSpec sb_spec(m_opaque_up->GetFileSpec());
6204eeddc0SDimitry Andric   return sb_spec;
63*0b57cec5SDimitry Andric }
64*0b57cec5SDimitry Andric 
65*0b57cec5SDimitry Andric void SBModuleSpec::SetFileSpec(const lldb::SBFileSpec &sb_spec) {
6604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, sb_spec);
67*0b57cec5SDimitry Andric 
68*0b57cec5SDimitry Andric   m_opaque_up->GetFileSpec() = *sb_spec;
69*0b57cec5SDimitry Andric }
70*0b57cec5SDimitry Andric 
71*0b57cec5SDimitry Andric lldb::SBFileSpec SBModuleSpec::GetPlatformFileSpec() {
7204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
73*0b57cec5SDimitry Andric 
7404eeddc0SDimitry Andric   return SBFileSpec(m_opaque_up->GetPlatformFileSpec());
75*0b57cec5SDimitry Andric }
76*0b57cec5SDimitry Andric 
77*0b57cec5SDimitry Andric void SBModuleSpec::SetPlatformFileSpec(const lldb::SBFileSpec &sb_spec) {
7804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, sb_spec);
79*0b57cec5SDimitry Andric 
80*0b57cec5SDimitry Andric   m_opaque_up->GetPlatformFileSpec() = *sb_spec;
81*0b57cec5SDimitry Andric }
82*0b57cec5SDimitry Andric 
83*0b57cec5SDimitry Andric lldb::SBFileSpec SBModuleSpec::GetSymbolFileSpec() {
8404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
85*0b57cec5SDimitry Andric 
8604eeddc0SDimitry Andric   return SBFileSpec(m_opaque_up->GetSymbolFileSpec());
87*0b57cec5SDimitry Andric }
88*0b57cec5SDimitry Andric 
89*0b57cec5SDimitry Andric void SBModuleSpec::SetSymbolFileSpec(const lldb::SBFileSpec &sb_spec) {
9004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, sb_spec);
91*0b57cec5SDimitry Andric 
92*0b57cec5SDimitry Andric   m_opaque_up->GetSymbolFileSpec() = *sb_spec;
93*0b57cec5SDimitry Andric }
94*0b57cec5SDimitry Andric 
95*0b57cec5SDimitry Andric const char *SBModuleSpec::GetObjectName() {
9604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
97*0b57cec5SDimitry Andric 
98*0b57cec5SDimitry Andric   return m_opaque_up->GetObjectName().GetCString();
99*0b57cec5SDimitry Andric }
100*0b57cec5SDimitry Andric 
101*0b57cec5SDimitry Andric void SBModuleSpec::SetObjectName(const char *name) {
10204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, name);
103*0b57cec5SDimitry Andric 
104*0b57cec5SDimitry Andric   m_opaque_up->GetObjectName().SetCString(name);
105*0b57cec5SDimitry Andric }
106*0b57cec5SDimitry Andric 
107*0b57cec5SDimitry Andric const char *SBModuleSpec::GetTriple() {
10804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
109*0b57cec5SDimitry Andric 
110*0b57cec5SDimitry Andric   std::string triple(m_opaque_up->GetArchitecture().GetTriple().str());
111*0b57cec5SDimitry Andric   // Unique the string so we don't run into ownership issues since the const
112*0b57cec5SDimitry Andric   // strings put the string into the string pool once and the strings never
113*0b57cec5SDimitry Andric   // comes out
114*0b57cec5SDimitry Andric   ConstString const_triple(triple.c_str());
115*0b57cec5SDimitry Andric   return const_triple.GetCString();
116*0b57cec5SDimitry Andric }
117*0b57cec5SDimitry Andric 
118*0b57cec5SDimitry Andric void SBModuleSpec::SetTriple(const char *triple) {
11904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, triple);
120*0b57cec5SDimitry Andric 
121*0b57cec5SDimitry Andric   m_opaque_up->GetArchitecture().SetTriple(triple);
122*0b57cec5SDimitry Andric }
123*0b57cec5SDimitry Andric 
124*0b57cec5SDimitry Andric const uint8_t *SBModuleSpec::GetUUIDBytes() {
12504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this)
126*0b57cec5SDimitry Andric   return m_opaque_up->GetUUID().GetBytes().data();
127*0b57cec5SDimitry Andric }
128*0b57cec5SDimitry Andric 
129*0b57cec5SDimitry Andric size_t SBModuleSpec::GetUUIDLength() {
13004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
131*0b57cec5SDimitry Andric 
132*0b57cec5SDimitry Andric   return m_opaque_up->GetUUID().GetBytes().size();
133*0b57cec5SDimitry Andric }
134*0b57cec5SDimitry Andric 
135*0b57cec5SDimitry Andric bool SBModuleSpec::SetUUIDBytes(const uint8_t *uuid, size_t uuid_len) {
13604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, uuid, uuid_len)
137*0b57cec5SDimitry Andric   m_opaque_up->GetUUID() = UUID::fromOptionalData(uuid, uuid_len);
138*0b57cec5SDimitry Andric   return m_opaque_up->GetUUID().IsValid();
139*0b57cec5SDimitry Andric }
140*0b57cec5SDimitry Andric 
141*0b57cec5SDimitry Andric bool SBModuleSpec::GetDescription(lldb::SBStream &description) {
14204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, description);
143*0b57cec5SDimitry Andric 
144*0b57cec5SDimitry Andric   m_opaque_up->Dump(description.ref());
145*0b57cec5SDimitry Andric   return true;
146*0b57cec5SDimitry Andric }
147*0b57cec5SDimitry Andric 
148*0b57cec5SDimitry Andric SBModuleSpecList::SBModuleSpecList() : m_opaque_up(new ModuleSpecList()) {
14904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
150*0b57cec5SDimitry Andric }
151*0b57cec5SDimitry Andric 
152*0b57cec5SDimitry Andric SBModuleSpecList::SBModuleSpecList(const SBModuleSpecList &rhs)
153*0b57cec5SDimitry Andric     : m_opaque_up(new ModuleSpecList(*rhs.m_opaque_up)) {
15404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
155*0b57cec5SDimitry Andric }
156*0b57cec5SDimitry Andric 
157*0b57cec5SDimitry Andric SBModuleSpecList &SBModuleSpecList::operator=(const SBModuleSpecList &rhs) {
15804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
159*0b57cec5SDimitry Andric 
160*0b57cec5SDimitry Andric   if (this != &rhs)
161*0b57cec5SDimitry Andric     *m_opaque_up = *rhs.m_opaque_up;
16204eeddc0SDimitry Andric   return *this;
163*0b57cec5SDimitry Andric }
164*0b57cec5SDimitry Andric 
1655ffd83dbSDimitry Andric SBModuleSpecList::~SBModuleSpecList() = default;
166*0b57cec5SDimitry Andric 
167*0b57cec5SDimitry Andric SBModuleSpecList SBModuleSpecList::GetModuleSpecifications(const char *path) {
16804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(path);
169*0b57cec5SDimitry Andric 
170*0b57cec5SDimitry Andric   SBModuleSpecList specs;
171*0b57cec5SDimitry Andric   FileSpec file_spec(path);
172*0b57cec5SDimitry Andric   FileSystem::Instance().Resolve(file_spec);
173*0b57cec5SDimitry Andric   Host::ResolveExecutableInBundle(file_spec);
174*0b57cec5SDimitry Andric   ObjectFile::GetModuleSpecifications(file_spec, 0, 0, *specs.m_opaque_up);
17504eeddc0SDimitry Andric   return specs;
176*0b57cec5SDimitry Andric }
177*0b57cec5SDimitry Andric 
178*0b57cec5SDimitry Andric void SBModuleSpecList::Append(const SBModuleSpec &spec) {
17904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, spec);
180*0b57cec5SDimitry Andric 
181*0b57cec5SDimitry Andric   m_opaque_up->Append(*spec.m_opaque_up);
182*0b57cec5SDimitry Andric }
183*0b57cec5SDimitry Andric 
184*0b57cec5SDimitry Andric void SBModuleSpecList::Append(const SBModuleSpecList &spec_list) {
18504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, spec_list);
186*0b57cec5SDimitry Andric 
187*0b57cec5SDimitry Andric   m_opaque_up->Append(*spec_list.m_opaque_up);
188*0b57cec5SDimitry Andric }
189*0b57cec5SDimitry Andric 
190*0b57cec5SDimitry Andric size_t SBModuleSpecList::GetSize() {
19104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
192*0b57cec5SDimitry Andric 
193*0b57cec5SDimitry Andric   return m_opaque_up->GetSize();
194*0b57cec5SDimitry Andric }
195*0b57cec5SDimitry Andric 
196*0b57cec5SDimitry Andric SBModuleSpec SBModuleSpecList::GetSpecAtIndex(size_t i) {
19704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, i);
198*0b57cec5SDimitry Andric 
199*0b57cec5SDimitry Andric   SBModuleSpec sb_module_spec;
200*0b57cec5SDimitry Andric   m_opaque_up->GetModuleSpecAtIndex(i, *sb_module_spec.m_opaque_up);
20104eeddc0SDimitry Andric   return sb_module_spec;
202*0b57cec5SDimitry Andric }
203*0b57cec5SDimitry Andric 
204*0b57cec5SDimitry Andric SBModuleSpec
205*0b57cec5SDimitry Andric SBModuleSpecList::FindFirstMatchingSpec(const SBModuleSpec &match_spec) {
20604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, match_spec);
207*0b57cec5SDimitry Andric 
208*0b57cec5SDimitry Andric   SBModuleSpec sb_module_spec;
209*0b57cec5SDimitry Andric   m_opaque_up->FindMatchingModuleSpec(*match_spec.m_opaque_up,
210*0b57cec5SDimitry Andric                                       *sb_module_spec.m_opaque_up);
21104eeddc0SDimitry Andric   return sb_module_spec;
212*0b57cec5SDimitry Andric }
213*0b57cec5SDimitry Andric 
214*0b57cec5SDimitry Andric SBModuleSpecList
215*0b57cec5SDimitry Andric SBModuleSpecList::FindMatchingSpecs(const SBModuleSpec &match_spec) {
21604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, match_spec);
217*0b57cec5SDimitry Andric 
218*0b57cec5SDimitry Andric   SBModuleSpecList specs;
219*0b57cec5SDimitry Andric   m_opaque_up->FindMatchingModuleSpecs(*match_spec.m_opaque_up,
220*0b57cec5SDimitry Andric                                        *specs.m_opaque_up);
22104eeddc0SDimitry Andric   return specs;
222*0b57cec5SDimitry Andric }
223*0b57cec5SDimitry Andric 
224*0b57cec5SDimitry Andric bool SBModuleSpecList::GetDescription(lldb::SBStream &description) {
22504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, description);
226*0b57cec5SDimitry Andric 
227*0b57cec5SDimitry Andric   m_opaque_up->Dump(description.ref());
228*0b57cec5SDimitry Andric   return true;
229*0b57cec5SDimitry Andric }
230