brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · e3872dc Raw
153 lines · cpp
1//===-- DWARFContext.cpp --------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "DWARFContext.h"10 11#include "lldb/Core/Section.h"12#include <optional>13 14using namespace lldb;15using namespace lldb_private;16using namespace lldb_private::plugin::dwarf;17 18static DWARFDataExtractor LoadSection(SectionList *section_list,19                                      SectionType section_type) {20  if (!section_list)21    return DWARFDataExtractor();22 23  auto section_sp = section_list->FindSectionByType(section_type, true);24  if (!section_sp)25    return DWARFDataExtractor();26 27  DWARFDataExtractor data;28  section_sp->GetSectionData(data);29  return data;30}31 32const DWARFDataExtractor &33DWARFContext::LoadOrGetSection(std::optional<SectionType> main_section_type,34                               std::optional<SectionType> dwo_section_type,35                               SectionData &data) {36  llvm::call_once(data.flag, [&] {37    if (dwo_section_type && isDwo())38      data.data = LoadSection(m_dwo_section_list, *dwo_section_type);39    else if (main_section_type)40      data.data = LoadSection(m_main_section_list, *main_section_type);41  });42  return data.data;43}44 45const DWARFDataExtractor &DWARFContext::getOrLoadCuIndexData() {46  return LoadOrGetSection(std::nullopt, eSectionTypeDWARFDebugCuIndex,47                          m_data_debug_cu_index);48}49 50const DWARFDataExtractor &DWARFContext::getOrLoadTuIndexData() {51  return LoadOrGetSection(std::nullopt, eSectionTypeDWARFDebugTuIndex,52                          m_data_debug_tu_index);53}54 55const DWARFDataExtractor &DWARFContext::getOrLoadAbbrevData() {56  return LoadOrGetSection(eSectionTypeDWARFDebugAbbrev,57                          eSectionTypeDWARFDebugAbbrevDwo, m_data_debug_abbrev);58}59 60const DWARFDataExtractor &DWARFContext::getOrLoadArangesData() {61  return LoadOrGetSection(eSectionTypeDWARFDebugAranges, std::nullopt,62                          m_data_debug_aranges);63}64 65const DWARFDataExtractor &DWARFContext::getOrLoadAddrData() {66  return LoadOrGetSection(eSectionTypeDWARFDebugAddr, std::nullopt,67                          m_data_debug_addr);68}69 70const DWARFDataExtractor &DWARFContext::getOrLoadDebugInfoData() {71  return LoadOrGetSection(eSectionTypeDWARFDebugInfo,72                          eSectionTypeDWARFDebugInfoDwo, m_data_debug_info);73}74 75const DWARFDataExtractor &DWARFContext::getOrLoadLineData() {76  return LoadOrGetSection(eSectionTypeDWARFDebugLine, std::nullopt,77                          m_data_debug_line);78}79 80const DWARFDataExtractor &DWARFContext::getOrLoadLineStrData() {81  return LoadOrGetSection(eSectionTypeDWARFDebugLineStr, std::nullopt,82                          m_data_debug_line_str);83}84 85const DWARFDataExtractor &DWARFContext::getOrLoadLocData() {86  return LoadOrGetSection(eSectionTypeDWARFDebugLoc,87                          eSectionTypeDWARFDebugLocDwo, m_data_debug_loc);88}89 90const DWARFDataExtractor &DWARFContext::getOrLoadLocListsData() {91  return LoadOrGetSection(eSectionTypeDWARFDebugLocLists,92                          eSectionTypeDWARFDebugLocListsDwo,93                          m_data_debug_loclists);94}95 96const DWARFDataExtractor &DWARFContext::getOrLoadMacroData() {97  return LoadOrGetSection(eSectionTypeDWARFDebugMacro, std::nullopt,98                          m_data_debug_macro);99}100 101const DWARFDataExtractor &DWARFContext::getOrLoadRangesData() {102  return LoadOrGetSection(eSectionTypeDWARFDebugRanges, std::nullopt,103                          m_data_debug_ranges);104}105 106const DWARFDataExtractor &DWARFContext::getOrLoadRngListsData() {107  return LoadOrGetSection(eSectionTypeDWARFDebugRngLists,108                          eSectionTypeDWARFDebugRngListsDwo,109                          m_data_debug_rnglists);110}111 112const DWARFDataExtractor &DWARFContext::getOrLoadStrData() {113  return LoadOrGetSection(eSectionTypeDWARFDebugStr,114                          eSectionTypeDWARFDebugStrDwo, m_data_debug_str);115}116 117const DWARFDataExtractor &DWARFContext::getOrLoadStrOffsetsData() {118  return LoadOrGetSection(eSectionTypeDWARFDebugStrOffsets,119                          eSectionTypeDWARFDebugStrOffsetsDwo,120                          m_data_debug_str_offsets);121}122 123const DWARFDataExtractor &DWARFContext::getOrLoadDebugTypesData() {124  return LoadOrGetSection(eSectionTypeDWARFDebugTypes,125                          eSectionTypeDWARFDebugTypesDwo, m_data_debug_types);126}127 128llvm::DWARFContext &DWARFContext::GetAsLLVM() {129  if (!m_llvm_context) {130    llvm::StringMap<std::unique_ptr<llvm::MemoryBuffer>> section_map;131    uint8_t addr_size = 0;132    auto AddSection = [&](llvm::StringRef name, DWARFDataExtractor data) {133      // Set the address size the first time we see it.134      if (addr_size == 0)135        addr_size = data.GetAddressByteSize();136 137      section_map.try_emplace(138          name, llvm::MemoryBuffer::getMemBuffer(toStringRef(data.GetData()),139                                                 name, false));140    };141 142    AddSection("debug_line_str", getOrLoadLineStrData());143    AddSection("debug_cu_index", getOrLoadCuIndexData());144    AddSection("debug_tu_index", getOrLoadTuIndexData());145    if (isDwo()) {146      AddSection("debug_info.dwo", getOrLoadDebugInfoData());147      AddSection("debug_types.dwo", getOrLoadDebugTypesData());148    }149    m_llvm_context = llvm::DWARFContext::create(section_map, addr_size);150  }151  return *m_llvm_context;152}153