1cac9c5f9SGreg Clayton //===-- SBSection.cpp -------------------------------------------*- C++ -*-===//
2cac9c5f9SGreg Clayton //
3cac9c5f9SGreg Clayton //                     The LLVM Compiler Infrastructure
4cac9c5f9SGreg Clayton //
5cac9c5f9SGreg Clayton // This file is distributed under the University of Illinois Open Source
6cac9c5f9SGreg Clayton // License. See LICENSE.TXT for details.
7cac9c5f9SGreg Clayton //
8cac9c5f9SGreg Clayton //===----------------------------------------------------------------------===//
9cac9c5f9SGreg Clayton 
10cac9c5f9SGreg Clayton #include "lldb/API/SBSection.h"
11cac9c5f9SGreg Clayton #include "lldb/API/SBStream.h"
12fed39aa6SGreg Clayton #include "lldb/API/SBTarget.h"
13cac9c5f9SGreg Clayton #include "lldb/Core/Module.h"
14d9dc52dcSGreg Clayton #include "lldb/Core/Section.h"
151f746071SGreg Clayton #include "lldb/Symbol/ObjectFile.h"
16666cc0b2SZachary Turner #include "lldb/Utility/DataBuffer.h"
17666cc0b2SZachary Turner #include "lldb/Utility/DataExtractor.h"
186f9e6901SZachary Turner #include "lldb/Utility/Log.h"
19bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
20cac9c5f9SGreg Clayton 
21cac9c5f9SGreg Clayton using namespace lldb;
22cac9c5f9SGreg Clayton using namespace lldb_private;
23cac9c5f9SGreg Clayton 
24b9c1b51eSKate Stone SBSection::SBSection() : m_opaque_wp() {}
25cac9c5f9SGreg Clayton 
26b9c1b51eSKate Stone SBSection::SBSection(const SBSection &rhs) : m_opaque_wp(rhs.m_opaque_wp) {}
27cac9c5f9SGreg Clayton 
28b9c1b51eSKate Stone SBSection::SBSection(const lldb::SectionSP &section_sp)
29b9c1b51eSKate Stone     : m_opaque_wp() // Don't init with section_sp otherwise this will throw if
30b9c1b51eSKate Stone                     // section_sp doesn't contain a valid Section *
31cac9c5f9SGreg Clayton {
32e72dfb32SGreg Clayton   if (section_sp)
33e72dfb32SGreg Clayton     m_opaque_wp = section_sp;
34cac9c5f9SGreg Clayton }
35cac9c5f9SGreg Clayton 
36b9c1b51eSKate Stone const SBSection &SBSection::operator=(const SBSection &rhs) {
37e72dfb32SGreg Clayton   m_opaque_wp = rhs.m_opaque_wp;
38cac9c5f9SGreg Clayton   return *this;
39cac9c5f9SGreg Clayton }
40cac9c5f9SGreg Clayton 
41b9c1b51eSKate Stone SBSection::~SBSection() {}
42cac9c5f9SGreg Clayton 
43b9c1b51eSKate Stone bool SBSection::IsValid() const {
44e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
45e72dfb32SGreg Clayton   return section_sp && section_sp->GetModule().get() != NULL;
46cac9c5f9SGreg Clayton }
47cac9c5f9SGreg Clayton 
48b9c1b51eSKate Stone const char *SBSection::GetName() {
49e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
50e72dfb32SGreg Clayton   if (section_sp)
51e72dfb32SGreg Clayton     return section_sp->GetName().GetCString();
52f644ddf4SGreg Clayton   return NULL;
53f644ddf4SGreg Clayton }
54f644ddf4SGreg Clayton 
55b9c1b51eSKate Stone lldb::SBSection SBSection::GetParent() {
561d4c5406SGreg Clayton   lldb::SBSection sb_section;
571d4c5406SGreg Clayton   SectionSP section_sp(GetSP());
58b9c1b51eSKate Stone   if (section_sp) {
591d4c5406SGreg Clayton     SectionSP parent_section_sp(section_sp->GetParent());
601d4c5406SGreg Clayton     if (parent_section_sp)
611d4c5406SGreg Clayton       sb_section.SetSP(parent_section_sp);
621d4c5406SGreg Clayton   }
631d4c5406SGreg Clayton   return sb_section;
641d4c5406SGreg Clayton }
651d4c5406SGreg Clayton 
66b9c1b51eSKate Stone lldb::SBSection SBSection::FindSubSection(const char *sect_name) {
67cac9c5f9SGreg Clayton   lldb::SBSection sb_section;
68b9c1b51eSKate Stone   if (sect_name) {
69e72dfb32SGreg Clayton     SectionSP section_sp(GetSP());
70b9c1b51eSKate Stone     if (section_sp) {
71cac9c5f9SGreg Clayton       ConstString const_sect_name(sect_name);
72b9c1b51eSKate Stone       sb_section.SetSP(
73b9c1b51eSKate Stone           section_sp->GetChildren().FindSectionByName(const_sect_name));
74e72dfb32SGreg Clayton     }
75cac9c5f9SGreg Clayton   }
76cac9c5f9SGreg Clayton   return sb_section;
77cac9c5f9SGreg Clayton }
78cac9c5f9SGreg Clayton 
79b9c1b51eSKate Stone size_t SBSection::GetNumSubSections() {
80e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
81e72dfb32SGreg Clayton   if (section_sp)
82e72dfb32SGreg Clayton     return section_sp->GetChildren().GetSize();
83cac9c5f9SGreg Clayton   return 0;
84cac9c5f9SGreg Clayton }
85cac9c5f9SGreg Clayton 
86b9c1b51eSKate Stone lldb::SBSection SBSection::GetSubSectionAtIndex(size_t idx) {
87cac9c5f9SGreg Clayton   lldb::SBSection sb_section;
88e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
89e72dfb32SGreg Clayton   if (section_sp)
90e72dfb32SGreg Clayton     sb_section.SetSP(section_sp->GetChildren().GetSectionAtIndex(idx));
91cac9c5f9SGreg Clayton   return sb_section;
92cac9c5f9SGreg Clayton }
93cac9c5f9SGreg Clayton 
94b9c1b51eSKate Stone lldb::SectionSP SBSection::GetSP() const { return m_opaque_wp.lock(); }
95cac9c5f9SGreg Clayton 
96b9c1b51eSKate Stone void SBSection::SetSP(const lldb::SectionSP &section_sp) {
97e72dfb32SGreg Clayton   m_opaque_wp = section_sp;
98cac9c5f9SGreg Clayton }
99cac9c5f9SGreg Clayton 
100b9c1b51eSKate Stone lldb::addr_t SBSection::GetFileAddress() {
101cac9c5f9SGreg Clayton   lldb::addr_t file_addr = LLDB_INVALID_ADDRESS;
102e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
103e72dfb32SGreg Clayton   if (section_sp)
104e72dfb32SGreg Clayton     return section_sp->GetFileAddress();
105cac9c5f9SGreg Clayton   return file_addr;
106cac9c5f9SGreg Clayton }
107cac9c5f9SGreg Clayton 
108b9c1b51eSKate Stone lldb::addr_t SBSection::GetLoadAddress(lldb::SBTarget &sb_target) {
109fed39aa6SGreg Clayton   TargetSP target_sp(sb_target.GetSP());
110b9c1b51eSKate Stone   if (target_sp) {
111fed39aa6SGreg Clayton     SectionSP section_sp(GetSP());
112fed39aa6SGreg Clayton     if (section_sp)
113fed39aa6SGreg Clayton       return section_sp->GetLoadBaseAddress(target_sp.get());
114fed39aa6SGreg Clayton   }
115fed39aa6SGreg Clayton   return LLDB_INVALID_ADDRESS;
116fed39aa6SGreg Clayton }
117fed39aa6SGreg Clayton 
118b9c1b51eSKate Stone lldb::addr_t SBSection::GetByteSize() {
119e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
120e72dfb32SGreg Clayton   if (section_sp)
121e72dfb32SGreg Clayton     return section_sp->GetByteSize();
122cac9c5f9SGreg Clayton   return 0;
123cac9c5f9SGreg Clayton }
124cac9c5f9SGreg Clayton 
125b9c1b51eSKate Stone uint64_t SBSection::GetFileOffset() {
126e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
127b9c1b51eSKate Stone   if (section_sp) {
128e72dfb32SGreg Clayton     ModuleSP module_sp(section_sp->GetModule());
129b9c1b51eSKate Stone     if (module_sp) {
130e72dfb32SGreg Clayton       ObjectFile *objfile = module_sp->GetObjectFile();
131cac9c5f9SGreg Clayton       if (objfile)
1325ce9c565SGreg Clayton         return objfile->GetFileOffset() + section_sp->GetFileOffset();
133cac9c5f9SGreg Clayton     }
134cac9c5f9SGreg Clayton   }
135e72dfb32SGreg Clayton   return UINT64_MAX;
136cac9c5f9SGreg Clayton }
137cac9c5f9SGreg Clayton 
138b9c1b51eSKate Stone uint64_t SBSection::GetFileByteSize() {
139e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
140e72dfb32SGreg Clayton   if (section_sp)
141e72dfb32SGreg Clayton     return section_sp->GetFileSize();
142cac9c5f9SGreg Clayton   return 0;
143cac9c5f9SGreg Clayton }
144cac9c5f9SGreg Clayton 
145b9c1b51eSKate Stone SBData SBSection::GetSectionData() { return GetSectionData(0, UINT64_MAX); }
146d9dc52dcSGreg Clayton 
147b9c1b51eSKate Stone SBData SBSection::GetSectionData(uint64_t offset, uint64_t size) {
148cac9c5f9SGreg Clayton   SBData sb_data;
149e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
150b9c1b51eSKate Stone   if (section_sp) {
151e72dfb32SGreg Clayton     const uint64_t sect_file_size = section_sp->GetFileSize();
152b9c1b51eSKate Stone     if (sect_file_size > 0) {
153e72dfb32SGreg Clayton       ModuleSP module_sp(section_sp->GetModule());
154b9c1b51eSKate Stone       if (module_sp) {
155e72dfb32SGreg Clayton         ObjectFile *objfile = module_sp->GetObjectFile();
156b9c1b51eSKate Stone         if (objfile) {
157b9c1b51eSKate Stone           const uint64_t sect_file_offset =
158b9c1b51eSKate Stone               objfile->GetFileOffset() + section_sp->GetFileOffset();
159cac9c5f9SGreg Clayton           const uint64_t file_offset = sect_file_offset + offset;
160cac9c5f9SGreg Clayton           uint64_t file_size = size;
161b9c1b51eSKate Stone           if (file_size == UINT64_MAX) {
162e72dfb32SGreg Clayton             file_size = section_sp->GetByteSize();
163cac9c5f9SGreg Clayton             if (file_size > offset)
164cac9c5f9SGreg Clayton               file_size -= offset;
165cac9c5f9SGreg Clayton             else
166cac9c5f9SGreg Clayton               file_size = 0;
167cac9c5f9SGreg Clayton           }
168*87e403aaSJonas Devlieghere           auto data_buffer_sp = FileSystem::Instance().CreateDataBuffer(
1697f6a7a37SZachary Turner               objfile->GetFileSpec().GetPath(), file_size, file_offset);
170b9c1b51eSKate Stone           if (data_buffer_sp && data_buffer_sp->GetByteSize() > 0) {
171b9c1b51eSKate Stone             DataExtractorSP data_extractor_sp(
172b9c1b51eSKate Stone                 new DataExtractor(data_buffer_sp, objfile->GetByteOrder(),
173cac9c5f9SGreg Clayton                                   objfile->GetAddressByteSize()));
174cac9c5f9SGreg Clayton 
175cac9c5f9SGreg Clayton             sb_data.SetOpaque(data_extractor_sp);
176cac9c5f9SGreg Clayton           }
177cac9c5f9SGreg Clayton         }
178cac9c5f9SGreg Clayton       }
179cac9c5f9SGreg Clayton     }
180cac9c5f9SGreg Clayton   }
181cac9c5f9SGreg Clayton   return sb_data;
182cac9c5f9SGreg Clayton }
183cac9c5f9SGreg Clayton 
184b9c1b51eSKate Stone SectionType SBSection::GetSectionType() {
185e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
186e72dfb32SGreg Clayton   if (section_sp.get())
187e72dfb32SGreg Clayton     return section_sp->GetType();
188cac9c5f9SGreg Clayton   return eSectionTypeInvalid;
189cac9c5f9SGreg Clayton }
190cac9c5f9SGreg Clayton 
1913c7f0709SAbhishek Aggarwal uint32_t
1923c7f0709SAbhishek Aggarwal SBSection::GetPermissions() const
1933c7f0709SAbhishek Aggarwal {
1943c7f0709SAbhishek Aggarwal     SectionSP section_sp(GetSP());
1953c7f0709SAbhishek Aggarwal     if (section_sp)
1963c7f0709SAbhishek Aggarwal         return section_sp->GetPermissions();
1973c7f0709SAbhishek Aggarwal     return 0;
1983c7f0709SAbhishek Aggarwal }
1993c7f0709SAbhishek Aggarwal 
200b9c1b51eSKate Stone uint32_t SBSection::GetTargetByteSize() {
201c928de3eSMatthew Gardiner   SectionSP section_sp(GetSP());
202c928de3eSMatthew Gardiner   if (section_sp.get())
203c928de3eSMatthew Gardiner     return section_sp->GetTargetByteSize();
204c928de3eSMatthew Gardiner   return 0;
205c928de3eSMatthew Gardiner }
206cac9c5f9SGreg Clayton 
207b9c1b51eSKate Stone bool SBSection::operator==(const SBSection &rhs) {
208e72dfb32SGreg Clayton   SectionSP lhs_section_sp(GetSP());
209e72dfb32SGreg Clayton   SectionSP rhs_section_sp(rhs.GetSP());
210e72dfb32SGreg Clayton   if (lhs_section_sp && rhs_section_sp)
211e72dfb32SGreg Clayton     return lhs_section_sp == rhs_section_sp;
212cac9c5f9SGreg Clayton   return false;
213cac9c5f9SGreg Clayton }
214cac9c5f9SGreg Clayton 
215b9c1b51eSKate Stone bool SBSection::operator!=(const SBSection &rhs) {
216e72dfb32SGreg Clayton   SectionSP lhs_section_sp(GetSP());
217e72dfb32SGreg Clayton   SectionSP rhs_section_sp(rhs.GetSP());
218e72dfb32SGreg Clayton   return lhs_section_sp != rhs_section_sp;
219cac9c5f9SGreg Clayton }
220cac9c5f9SGreg Clayton 
221b9c1b51eSKate Stone bool SBSection::GetDescription(SBStream &description) {
222da7bc7d0SGreg Clayton   Stream &strm = description.ref();
223da7bc7d0SGreg Clayton 
224e72dfb32SGreg Clayton   SectionSP section_sp(GetSP());
225b9c1b51eSKate Stone   if (section_sp) {
226e72dfb32SGreg Clayton     const addr_t file_addr = section_sp->GetFileAddress();
227b9c1b51eSKate Stone     strm.Printf("[0x%16.16" PRIx64 "-0x%16.16" PRIx64 ") ", file_addr,
228b9c1b51eSKate Stone                 file_addr + section_sp->GetByteSize());
229e72dfb32SGreg Clayton     section_sp->DumpName(&strm);
230b9c1b51eSKate Stone   } else {
231da7bc7d0SGreg Clayton     strm.PutCString("No value");
232cac9c5f9SGreg Clayton   }
233cac9c5f9SGreg Clayton 
234cac9c5f9SGreg Clayton   return true;
235cac9c5f9SGreg Clayton }
236