126 lines · cpp
1//===- DIASectionContrib.cpp - DIA impl. of IPDBSectionContrib ---- C++ -*-===//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 "llvm/DebugInfo/PDB/DIA/DIASectionContrib.h"10#include "llvm/DebugInfo/PDB/DIA/DIARawSymbol.h"11#include "llvm/DebugInfo/PDB/DIA/DIASession.h"12#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"13 14using namespace llvm;15using namespace llvm::pdb;16 17DIASectionContrib::DIASectionContrib(const DIASession &PDBSession,18 CComPtr<IDiaSectionContrib> DiaSection)19 : Session(PDBSession), Section(DiaSection) {}20 21std::unique_ptr<PDBSymbolCompiland> DIASectionContrib::getCompiland() const {22 CComPtr<IDiaSymbol> Symbol;23 if (FAILED(Section->get_compiland(&Symbol)))24 return nullptr;25 26 auto RawSymbol = std::make_unique<DIARawSymbol>(Session, Symbol);27 return PDBSymbol::createAs<PDBSymbolCompiland>(Session, std::move(RawSymbol));28}29 30template <typename ArgType>31ArgType32PrivateGetDIAValue(IDiaSectionContrib *Section,33 HRESULT (__stdcall IDiaSectionContrib::*Method)(ArgType *)) {34 ArgType Value;35 if (S_OK == (Section->*Method)(&Value))36 return static_cast<ArgType>(Value);37 38 return ArgType();39}40 41uint32_t DIASectionContrib::getAddressSection() const {42 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_addressSection);43}44 45uint32_t DIASectionContrib::getAddressOffset() const {46 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_addressOffset);47}48 49uint64_t DIASectionContrib::getVirtualAddress() const {50 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_virtualAddress);51}52 53uint32_t DIASectionContrib::getRelativeVirtualAddress() const {54 return PrivateGetDIAValue(Section,55 &IDiaSectionContrib::get_relativeVirtualAddress);56}57 58uint32_t DIASectionContrib::getLength() const {59 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_length);60}61 62bool DIASectionContrib::isNotPaged() const {63 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_notPaged);64}65 66bool DIASectionContrib::hasCode() const {67 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_code);68}69 70bool DIASectionContrib::hasCode16Bit() const {71 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_code16bit);72}73 74bool DIASectionContrib::hasInitializedData() const {75 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_initializedData);76}77 78bool DIASectionContrib::hasUninitializedData() const {79 return PrivateGetDIAValue(Section,80 &IDiaSectionContrib::get_uninitializedData);81}82 83bool DIASectionContrib::isRemoved() const {84 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_remove);85}86 87bool DIASectionContrib::hasComdat() const {88 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_comdat);89}90 91bool DIASectionContrib::isDiscardable() const {92 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_discardable);93}94 95bool DIASectionContrib::isNotCached() const {96 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_notCached);97}98 99bool DIASectionContrib::isShared() const {100 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_share);101}102 103bool DIASectionContrib::isExecutable() const {104 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_execute);105}106 107bool DIASectionContrib::isReadable() const {108 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_read);109}110 111bool DIASectionContrib::isWritable() const {112 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_write);113}114 115uint32_t DIASectionContrib::getDataCrc32() const {116 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_dataCrc);117}118 119uint32_t DIASectionContrib::getRelocationsCrc32() const {120 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_relocationsCrc);121}122 123uint32_t DIASectionContrib::getCompilandId() const {124 return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_compilandId);125}126