reference, declaration → definition definition → references, declarations, derived classes, virtual overrides reference to multiple definitions → definitions unreferenced
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
//===- PDBSymbolData.cpp - PDB data (e.g. variable) accessors ---*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/PDB/PDBSymbolData.h" #include "llvm/DebugInfo/PDB/IPDBSectionContrib.h" #include "llvm/DebugInfo/PDB/IPDBSession.h" #include "llvm/DebugInfo/PDB/PDBSymDumper.h" #include <utility> using namespace llvm; using namespace llvm::pdb; void PDBSymbolData::dump(PDBSymDumper &Dumper) const { Dumper.dump(*this); } std::unique_ptr<IPDBEnumLineNumbers> PDBSymbolData::getLineNumbers() const { auto Len = RawSymbol->getLength(); Len = Len ? Len : 1; if (auto RVA = RawSymbol->getRelativeVirtualAddress()) return Session.findLineNumbersByRVA(RVA, Len); if (auto Section = RawSymbol->getAddressSection()) return Session.findLineNumbersBySectOffset( Section, RawSymbol->getAddressOffset(), Len); return nullptr; } uint32_t PDBSymbolData::getCompilandId() const { if (auto Lines = getLineNumbers()) { if (auto FirstLine = Lines->getNext()) return FirstLine->getCompilandId(); } uint32_t DataSection = RawSymbol->getAddressSection(); uint32_t DataOffset = RawSymbol->getAddressOffset(); if (DataSection == 0) { if (auto RVA = RawSymbol->getRelativeVirtualAddress()) Session.addressForRVA(RVA, DataSection, DataOffset); } if (DataSection) { if (auto SecContribs = Session.getSectionContribs()) { while (auto Section = SecContribs->getNext()) { if (Section->getAddressSection() == DataSection && Section->getAddressOffset() <= DataOffset && (Section->getAddressOffset() + Section->getLength()) > DataOffset) return Section->getCompilandId(); } } } else { auto LexParentId = RawSymbol->getLexicalParentId(); while (auto LexParent = Session.getSymbolById(LexParentId)) { if (LexParent->getSymTag() == PDB_SymType::Exe) break; if (LexParent->getSymTag() == PDB_SymType::Compiland) return LexParentId; LexParentId = LexParent->getRawSymbol().getLexicalParentId(); } } return 0; }