1//===- PDBSymbolData.cpp - PDB data (e.g. variable) accessors ---*- 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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
10#include "llvm/DebugInfo/PDB/IPDBLineNumber.h"
11#include "llvm/DebugInfo/PDB/IPDBSectionContrib.h"
12#include "llvm/DebugInfo/PDB/IPDBSession.h"
13#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
14
15using namespace llvm;
16using namespace llvm::pdb;
17
18void PDBSymbolData::dump(PDBSymDumper &Dumper) const { Dumper.dump(Symbol: *this); }
19
20std::unique_ptr<IPDBEnumLineNumbers> PDBSymbolData::getLineNumbers() const {
21 auto Len = RawSymbol->getLength();
22 Len = Len ? Len : 1;
23 if (auto RVA = RawSymbol->getRelativeVirtualAddress())
24 return Session.findLineNumbersByRVA(RVA, Length: Len);
25
26 if (auto Section = RawSymbol->getAddressSection())
27 return Session.findLineNumbersBySectOffset(
28 Section, Offset: RawSymbol->getAddressOffset(), Length: Len);
29
30 return nullptr;
31}
32
33uint32_t PDBSymbolData::getCompilandId() const {
34 if (auto Lines = getLineNumbers()) {
35 if (auto FirstLine = Lines->getNext())
36 return FirstLine->getCompilandId();
37 }
38
39 uint32_t DataSection = RawSymbol->getAddressSection();
40 uint32_t DataOffset = RawSymbol->getAddressOffset();
41 if (DataSection == 0) {
42 if (auto RVA = RawSymbol->getRelativeVirtualAddress())
43 Session.addressForRVA(RVA, Section&: DataSection, Offset&: DataOffset);
44 }
45
46 if (DataSection) {
47 if (auto SecContribs = Session.getSectionContribs()) {
48 while (auto Section = SecContribs->getNext()) {
49 if (Section->getAddressSection() == DataSection &&
50 Section->getAddressOffset() <= DataOffset &&
51 (Section->getAddressOffset() + Section->getLength()) > DataOffset)
52 return Section->getCompilandId();
53 }
54 }
55 } else {
56 auto LexParentId = RawSymbol->getLexicalParentId();
57 while (auto LexParent = Session.getSymbolById(SymbolId: LexParentId)) {
58 if (LexParent->getSymTag() == PDB_SymType::Exe)
59 break;
60 if (LexParent->getSymTag() == PDB_SymType::Compiland)
61 return LexParentId;
62 LexParentId = LexParent->getRawSymbol().getLexicalParentId();
63 }
64 }
65
66 return 0;
67}
68