1cac9c5f9SGreg Clayton //===-- SBSection.cpp -------------------------------------------*- C++ -*-===// 2cac9c5f9SGreg Clayton // 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 6cac9c5f9SGreg Clayton // 7cac9c5f9SGreg Clayton //===----------------------------------------------------------------------===// 8cac9c5f9SGreg Clayton 9cac9c5f9SGreg Clayton #include "lldb/API/SBSection.h" 10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.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" 18bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h" 19cac9c5f9SGreg Clayton 20cac9c5f9SGreg Clayton using namespace lldb; 21cac9c5f9SGreg Clayton using namespace lldb_private; 22cac9c5f9SGreg Clayton 23baf5664fSJonas Devlieghere SBSection::SBSection() : m_opaque_wp() { 24baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBSection); 25baf5664fSJonas Devlieghere } 26cac9c5f9SGreg Clayton 27baf5664fSJonas Devlieghere SBSection::SBSection(const SBSection &rhs) : m_opaque_wp(rhs.m_opaque_wp) { 28baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBSection, (const lldb::SBSection &), rhs); 29baf5664fSJonas Devlieghere } 30cac9c5f9SGreg Clayton 31b9c1b51eSKate Stone SBSection::SBSection(const lldb::SectionSP §ion_sp) 32b9c1b51eSKate Stone : m_opaque_wp() // Don't init with section_sp otherwise this will throw if 33b9c1b51eSKate Stone // section_sp doesn't contain a valid Section * 34cac9c5f9SGreg Clayton { 35e72dfb32SGreg Clayton if (section_sp) 36e72dfb32SGreg Clayton m_opaque_wp = section_sp; 37cac9c5f9SGreg Clayton } 38cac9c5f9SGreg Clayton 39b9c1b51eSKate Stone const SBSection &SBSection::operator=(const SBSection &rhs) { 40baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBSection &, 41baf5664fSJonas Devlieghere SBSection, operator=,(const lldb::SBSection &), rhs); 42baf5664fSJonas Devlieghere 43e72dfb32SGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 44cac9c5f9SGreg Clayton return *this; 45cac9c5f9SGreg Clayton } 46cac9c5f9SGreg Clayton 47b9c1b51eSKate Stone SBSection::~SBSection() {} 48cac9c5f9SGreg Clayton 49b9c1b51eSKate Stone bool SBSection::IsValid() const { 50baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBSection, IsValid); 517f5237bcSPavel Labath return this->operator bool(); 527f5237bcSPavel Labath } 537f5237bcSPavel Labath SBSection::operator bool() const { 547f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBSection, operator bool); 55baf5664fSJonas Devlieghere 56e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 57e72dfb32SGreg Clayton return section_sp && section_sp->GetModule().get() != NULL; 58cac9c5f9SGreg Clayton } 59cac9c5f9SGreg Clayton 60b9c1b51eSKate Stone const char *SBSection::GetName() { 61baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBSection, GetName); 62baf5664fSJonas Devlieghere 63e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 64e72dfb32SGreg Clayton if (section_sp) 65e72dfb32SGreg Clayton return section_sp->GetName().GetCString(); 66f644ddf4SGreg Clayton return NULL; 67f644ddf4SGreg Clayton } 68f644ddf4SGreg Clayton 69b9c1b51eSKate Stone lldb::SBSection SBSection::GetParent() { 70baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBSection, SBSection, GetParent); 71baf5664fSJonas Devlieghere 721d4c5406SGreg Clayton lldb::SBSection sb_section; 731d4c5406SGreg Clayton SectionSP section_sp(GetSP()); 74b9c1b51eSKate Stone if (section_sp) { 751d4c5406SGreg Clayton SectionSP parent_section_sp(section_sp->GetParent()); 761d4c5406SGreg Clayton if (parent_section_sp) 771d4c5406SGreg Clayton sb_section.SetSP(parent_section_sp); 781d4c5406SGreg Clayton } 79baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_section); 801d4c5406SGreg Clayton } 811d4c5406SGreg Clayton 82b9c1b51eSKate Stone lldb::SBSection SBSection::FindSubSection(const char *sect_name) { 83baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSection, SBSection, FindSubSection, (const char *), 84baf5664fSJonas Devlieghere sect_name); 85baf5664fSJonas Devlieghere 86cac9c5f9SGreg Clayton lldb::SBSection sb_section; 87b9c1b51eSKate Stone if (sect_name) { 88e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 89b9c1b51eSKate Stone if (section_sp) { 90cac9c5f9SGreg Clayton ConstString const_sect_name(sect_name); 91b9c1b51eSKate Stone sb_section.SetSP( 92b9c1b51eSKate Stone section_sp->GetChildren().FindSectionByName(const_sect_name)); 93e72dfb32SGreg Clayton } 94cac9c5f9SGreg Clayton } 95baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_section); 96cac9c5f9SGreg Clayton } 97cac9c5f9SGreg Clayton 98b9c1b51eSKate Stone size_t SBSection::GetNumSubSections() { 99baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(size_t, SBSection, GetNumSubSections); 100baf5664fSJonas Devlieghere 101e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 102e72dfb32SGreg Clayton if (section_sp) 103e72dfb32SGreg Clayton return section_sp->GetChildren().GetSize(); 104cac9c5f9SGreg Clayton return 0; 105cac9c5f9SGreg Clayton } 106cac9c5f9SGreg Clayton 107b9c1b51eSKate Stone lldb::SBSection SBSection::GetSubSectionAtIndex(size_t idx) { 108baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSection, SBSection, GetSubSectionAtIndex, (size_t), 109baf5664fSJonas Devlieghere idx); 110baf5664fSJonas Devlieghere 111cac9c5f9SGreg Clayton lldb::SBSection sb_section; 112e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 113e72dfb32SGreg Clayton if (section_sp) 114e72dfb32SGreg Clayton sb_section.SetSP(section_sp->GetChildren().GetSectionAtIndex(idx)); 115baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_section); 116cac9c5f9SGreg Clayton } 117cac9c5f9SGreg Clayton 118b9c1b51eSKate Stone lldb::SectionSP SBSection::GetSP() const { return m_opaque_wp.lock(); } 119cac9c5f9SGreg Clayton 120b9c1b51eSKate Stone void SBSection::SetSP(const lldb::SectionSP §ion_sp) { 121e72dfb32SGreg Clayton m_opaque_wp = section_sp; 122cac9c5f9SGreg Clayton } 123cac9c5f9SGreg Clayton 124b9c1b51eSKate Stone lldb::addr_t SBSection::GetFileAddress() { 125baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::addr_t, SBSection, GetFileAddress); 126baf5664fSJonas Devlieghere 127cac9c5f9SGreg Clayton lldb::addr_t file_addr = LLDB_INVALID_ADDRESS; 128e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 129e72dfb32SGreg Clayton if (section_sp) 130e72dfb32SGreg Clayton return section_sp->GetFileAddress(); 131cac9c5f9SGreg Clayton return file_addr; 132cac9c5f9SGreg Clayton } 133cac9c5f9SGreg Clayton 134b9c1b51eSKate Stone lldb::addr_t SBSection::GetLoadAddress(lldb::SBTarget &sb_target) { 135baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::addr_t, SBSection, GetLoadAddress, 136baf5664fSJonas Devlieghere (lldb::SBTarget &), sb_target); 137baf5664fSJonas Devlieghere 138fed39aa6SGreg Clayton TargetSP target_sp(sb_target.GetSP()); 139b9c1b51eSKate Stone if (target_sp) { 140fed39aa6SGreg Clayton SectionSP section_sp(GetSP()); 141fed39aa6SGreg Clayton if (section_sp) 142fed39aa6SGreg Clayton return section_sp->GetLoadBaseAddress(target_sp.get()); 143fed39aa6SGreg Clayton } 144fed39aa6SGreg Clayton return LLDB_INVALID_ADDRESS; 145fed39aa6SGreg Clayton } 146fed39aa6SGreg Clayton 147b9c1b51eSKate Stone lldb::addr_t SBSection::GetByteSize() { 148baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::addr_t, SBSection, GetByteSize); 149baf5664fSJonas Devlieghere 150e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 151e72dfb32SGreg Clayton if (section_sp) 152e72dfb32SGreg Clayton return section_sp->GetByteSize(); 153cac9c5f9SGreg Clayton return 0; 154cac9c5f9SGreg Clayton } 155cac9c5f9SGreg Clayton 156b9c1b51eSKate Stone uint64_t SBSection::GetFileOffset() { 157baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint64_t, SBSection, GetFileOffset); 158baf5664fSJonas Devlieghere 159e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 160b9c1b51eSKate Stone if (section_sp) { 161e72dfb32SGreg Clayton ModuleSP module_sp(section_sp->GetModule()); 162b9c1b51eSKate Stone if (module_sp) { 163e72dfb32SGreg Clayton ObjectFile *objfile = module_sp->GetObjectFile(); 164cac9c5f9SGreg Clayton if (objfile) 1655ce9c565SGreg Clayton return objfile->GetFileOffset() + section_sp->GetFileOffset(); 166cac9c5f9SGreg Clayton } 167cac9c5f9SGreg Clayton } 168e72dfb32SGreg Clayton return UINT64_MAX; 169cac9c5f9SGreg Clayton } 170cac9c5f9SGreg Clayton 171b9c1b51eSKate Stone uint64_t SBSection::GetFileByteSize() { 172baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint64_t, SBSection, GetFileByteSize); 173baf5664fSJonas Devlieghere 174e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 175e72dfb32SGreg Clayton if (section_sp) 176e72dfb32SGreg Clayton return section_sp->GetFileSize(); 177cac9c5f9SGreg Clayton return 0; 178cac9c5f9SGreg Clayton } 179cac9c5f9SGreg Clayton 180baf5664fSJonas Devlieghere SBData SBSection::GetSectionData() { 181baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBData, SBSection, GetSectionData); 182baf5664fSJonas Devlieghere 183baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(GetSectionData(0, UINT64_MAX)); 184baf5664fSJonas Devlieghere } 185d9dc52dcSGreg Clayton 186b9c1b51eSKate Stone SBData SBSection::GetSectionData(uint64_t offset, uint64_t size) { 187baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBData, SBSection, GetSectionData, 188baf5664fSJonas Devlieghere (uint64_t, uint64_t), offset, size); 189baf5664fSJonas Devlieghere 190cac9c5f9SGreg Clayton SBData sb_data; 191e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 192b9c1b51eSKate Stone if (section_sp) { 193e72dfb32SGreg Clayton const uint64_t sect_file_size = section_sp->GetFileSize(); 194b9c1b51eSKate Stone if (sect_file_size > 0) { 195e72dfb32SGreg Clayton ModuleSP module_sp(section_sp->GetModule()); 196b9c1b51eSKate Stone if (module_sp) { 197e72dfb32SGreg Clayton ObjectFile *objfile = module_sp->GetObjectFile(); 198b9c1b51eSKate Stone if (objfile) { 199b9c1b51eSKate Stone const uint64_t sect_file_offset = 200b9c1b51eSKate Stone objfile->GetFileOffset() + section_sp->GetFileOffset(); 201cac9c5f9SGreg Clayton const uint64_t file_offset = sect_file_offset + offset; 202cac9c5f9SGreg Clayton uint64_t file_size = size; 203b9c1b51eSKate Stone if (file_size == UINT64_MAX) { 204e72dfb32SGreg Clayton file_size = section_sp->GetByteSize(); 205cac9c5f9SGreg Clayton if (file_size > offset) 206cac9c5f9SGreg Clayton file_size -= offset; 207cac9c5f9SGreg Clayton else 208cac9c5f9SGreg Clayton file_size = 0; 209cac9c5f9SGreg Clayton } 21087e403aaSJonas Devlieghere auto data_buffer_sp = FileSystem::Instance().CreateDataBuffer( 2117f6a7a37SZachary Turner objfile->GetFileSpec().GetPath(), file_size, file_offset); 212b9c1b51eSKate Stone if (data_buffer_sp && data_buffer_sp->GetByteSize() > 0) { 213b9c1b51eSKate Stone DataExtractorSP data_extractor_sp( 214b9c1b51eSKate Stone new DataExtractor(data_buffer_sp, objfile->GetByteOrder(), 215cac9c5f9SGreg Clayton objfile->GetAddressByteSize())); 216cac9c5f9SGreg Clayton 217cac9c5f9SGreg Clayton sb_data.SetOpaque(data_extractor_sp); 218cac9c5f9SGreg Clayton } 219cac9c5f9SGreg Clayton } 220cac9c5f9SGreg Clayton } 221cac9c5f9SGreg Clayton } 222cac9c5f9SGreg Clayton } 223baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_data); 224cac9c5f9SGreg Clayton } 225cac9c5f9SGreg Clayton 226b9c1b51eSKate Stone SectionType SBSection::GetSectionType() { 227baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SectionType, SBSection, GetSectionType); 228baf5664fSJonas Devlieghere 229e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 230e72dfb32SGreg Clayton if (section_sp.get()) 231e72dfb32SGreg Clayton return section_sp->GetType(); 232cac9c5f9SGreg Clayton return eSectionTypeInvalid; 233cac9c5f9SGreg Clayton } 234cac9c5f9SGreg Clayton 235baf5664fSJonas Devlieghere uint32_t SBSection::GetPermissions() const { 236baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBSection, GetPermissions); 237baf5664fSJonas Devlieghere 2383c7f0709SAbhishek Aggarwal SectionSP section_sp(GetSP()); 2393c7f0709SAbhishek Aggarwal if (section_sp) 2403c7f0709SAbhishek Aggarwal return section_sp->GetPermissions(); 2413c7f0709SAbhishek Aggarwal return 0; 2423c7f0709SAbhishek Aggarwal } 2433c7f0709SAbhishek Aggarwal 244b9c1b51eSKate Stone uint32_t SBSection::GetTargetByteSize() { 245baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBSection, GetTargetByteSize); 246baf5664fSJonas Devlieghere 247c928de3eSMatthew Gardiner SectionSP section_sp(GetSP()); 248c928de3eSMatthew Gardiner if (section_sp.get()) 249c928de3eSMatthew Gardiner return section_sp->GetTargetByteSize(); 250c928de3eSMatthew Gardiner return 0; 251c928de3eSMatthew Gardiner } 252cac9c5f9SGreg Clayton 253b9c1b51eSKate Stone bool SBSection::operator==(const SBSection &rhs) { 254baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBSection, operator==,(const lldb::SBSection &), 255baf5664fSJonas Devlieghere rhs); 256baf5664fSJonas Devlieghere 257e72dfb32SGreg Clayton SectionSP lhs_section_sp(GetSP()); 258e72dfb32SGreg Clayton SectionSP rhs_section_sp(rhs.GetSP()); 259e72dfb32SGreg Clayton if (lhs_section_sp && rhs_section_sp) 260e72dfb32SGreg Clayton return lhs_section_sp == rhs_section_sp; 261cac9c5f9SGreg Clayton return false; 262cac9c5f9SGreg Clayton } 263cac9c5f9SGreg Clayton 264b9c1b51eSKate Stone bool SBSection::operator!=(const SBSection &rhs) { 265baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBSection, operator!=,(const lldb::SBSection &), 266baf5664fSJonas Devlieghere rhs); 267baf5664fSJonas Devlieghere 268e72dfb32SGreg Clayton SectionSP lhs_section_sp(GetSP()); 269e72dfb32SGreg Clayton SectionSP rhs_section_sp(rhs.GetSP()); 270e72dfb32SGreg Clayton return lhs_section_sp != rhs_section_sp; 271cac9c5f9SGreg Clayton } 272cac9c5f9SGreg Clayton 273b9c1b51eSKate Stone bool SBSection::GetDescription(SBStream &description) { 274baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBSection, GetDescription, (lldb::SBStream &), 275baf5664fSJonas Devlieghere description); 276baf5664fSJonas Devlieghere 277da7bc7d0SGreg Clayton Stream &strm = description.ref(); 278da7bc7d0SGreg Clayton 279e72dfb32SGreg Clayton SectionSP section_sp(GetSP()); 280b9c1b51eSKate Stone if (section_sp) { 281e72dfb32SGreg Clayton const addr_t file_addr = section_sp->GetFileAddress(); 282b9c1b51eSKate Stone strm.Printf("[0x%16.16" PRIx64 "-0x%16.16" PRIx64 ") ", file_addr, 283b9c1b51eSKate Stone file_addr + section_sp->GetByteSize()); 284e72dfb32SGreg Clayton section_sp->DumpName(&strm); 285b9c1b51eSKate Stone } else { 286da7bc7d0SGreg Clayton strm.PutCString("No value"); 287cac9c5f9SGreg Clayton } 288cac9c5f9SGreg Clayton 289cac9c5f9SGreg Clayton return true; 290cac9c5f9SGreg Clayton } 291*ae211eceSMichal Gorny 292*ae211eceSMichal Gorny namespace lldb_private { 293*ae211eceSMichal Gorny namespace repro { 294*ae211eceSMichal Gorny 295*ae211eceSMichal Gorny template <> 296*ae211eceSMichal Gorny void RegisterMethods<SBSection>(Registry &R) { 297*ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBSection, ()); 298*ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBSection, (const lldb::SBSection &)); 299*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const lldb::SBSection &, 300*ae211eceSMichal Gorny SBSection, operator=,(const lldb::SBSection &)); 301*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBSection, IsValid, ()); 302*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBSection, operator bool, ()); 303*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const char *, SBSection, GetName, ()); 304*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBSection, SBSection, GetParent, ()); 305*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBSection, SBSection, FindSubSection, 306*ae211eceSMichal Gorny (const char *)); 307*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(size_t, SBSection, GetNumSubSections, ()); 308*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBSection, SBSection, GetSubSectionAtIndex, 309*ae211eceSMichal Gorny (size_t)); 310*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::addr_t, SBSection, GetFileAddress, ()); 311*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::addr_t, SBSection, GetLoadAddress, 312*ae211eceSMichal Gorny (lldb::SBTarget &)); 313*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::addr_t, SBSection, GetByteSize, ()); 314*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint64_t, SBSection, GetFileOffset, ()); 315*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint64_t, SBSection, GetFileByteSize, ()); 316*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBData, SBSection, GetSectionData, ()); 317*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBData, SBSection, GetSectionData, 318*ae211eceSMichal Gorny (uint64_t, uint64_t)); 319*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SectionType, SBSection, GetSectionType, ()); 320*ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBSection, GetPermissions, ()); 321*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint32_t, SBSection, GetTargetByteSize, ()); 322*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBSection, operator==,(const lldb::SBSection &)); 323*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBSection, operator!=,(const lldb::SBSection &)); 324*ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBSection, GetDescription, (lldb::SBStream &)); 325*ae211eceSMichal Gorny } 326*ae211eceSMichal Gorny 327*ae211eceSMichal Gorny } 328*ae211eceSMichal Gorny } 329