
To resolve symbol context at a particular address, we need to determine the compiland for the address. We are able to determine the parent compiland of PDBSymbolFunc, PDBSymbolTypeUDT, PDBSymbolTypeEnum symbols indirectly through line information. However no such information is availabile for PDBSymbolData, i.e. variables. The Section Contribution table from PDBs has information about each compiland's contribution to sections by address. For example, a piece of a contribution looks like, VA RelativeVA Sect No. Offset Length Compiland 14000087B0 000087B0 0001 000077B0 000000BB exe_main.obj So given an address, it's possible to determine its compiland with this information. llvm-svn: 328178
136 lines
4.3 KiB
C++
136 lines
4.3 KiB
C++
//===- DIASectionContrib.cpp - DIA impl. of IPDBSectionContrib ---- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/DebugInfo/PDB/DIA/DIARawSymbol.h"
|
|
#include "llvm/DebugInfo/PDB/DIA/DIASectionContrib.h"
|
|
#include "llvm/DebugInfo/PDB/DIA/DIASession.h"
|
|
#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::pdb;
|
|
|
|
DIASectionContrib::DIASectionContrib(const DIASession &PDBSession,
|
|
CComPtr<IDiaSectionContrib> DiaSection)
|
|
: Session(PDBSession), Section(DiaSection) {}
|
|
|
|
std::unique_ptr<PDBSymbolCompiland> DIASectionContrib::getCompiland() const {
|
|
CComPtr<IDiaSymbol> Symbol;
|
|
if (FAILED(Section->get_compiland(&Symbol)))
|
|
return nullptr;
|
|
|
|
auto RawSymbol = llvm::make_unique<DIARawSymbol>(Session, Symbol);
|
|
return llvm::make_unique<PDBSymbolCompiland>(Session, std::move(RawSymbol));
|
|
}
|
|
|
|
template <typename ArgType>
|
|
ArgType PrivateGetDIAValue(
|
|
IDiaSectionContrib *Section,
|
|
HRESULT(__stdcall IDiaSectionContrib::*Method)(ArgType *)) {
|
|
ArgType Value;
|
|
if (S_OK == (Section->*Method)(&Value))
|
|
return static_cast<ArgType>(Value);
|
|
|
|
return ArgType();
|
|
}
|
|
|
|
template <typename ArgType, typename RetType>
|
|
RetType PrivateGetDIAValue(
|
|
IDiaSectionContrib *Section,
|
|
HRESULT(__stdcall IDiaSectionContrib::*Method)(ArgType *)) {
|
|
ArgType Value;
|
|
if (S_OK == (Section->*Method)(&Value))
|
|
return static_cast<RetType>(Value);
|
|
|
|
return RetType();
|
|
}
|
|
|
|
uint32_t DIASectionContrib::getAddressSection() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_addressSection);
|
|
}
|
|
|
|
uint32_t DIASectionContrib::getAddressOffset() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_addressOffset);
|
|
}
|
|
|
|
uint64_t DIASectionContrib::getVirtualAddress() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_virtualAddress);
|
|
}
|
|
|
|
uint32_t DIASectionContrib::getRelativeVirtualAddress() const {
|
|
return PrivateGetDIAValue(Section,
|
|
&IDiaSectionContrib::get_relativeVirtualAddress);
|
|
}
|
|
uint32_t DIASectionContrib::getLength() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_length);
|
|
}
|
|
|
|
bool DIASectionContrib::isNotPaged() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_notPaged);
|
|
}
|
|
|
|
bool DIASectionContrib::hasCode() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_code);
|
|
}
|
|
|
|
bool DIASectionContrib::hasCode16Bit() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_code16bit);
|
|
}
|
|
|
|
bool DIASectionContrib::hasInitializedData() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_initializedData);
|
|
}
|
|
|
|
bool DIASectionContrib::hasUninitializedData() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_uninitializedData);
|
|
}
|
|
|
|
bool DIASectionContrib::isRemoved() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_remove);
|
|
}
|
|
|
|
bool DIASectionContrib::hasComdat() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_comdat);
|
|
}
|
|
|
|
bool DIASectionContrib::isDiscardable() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_discardable);
|
|
}
|
|
|
|
bool DIASectionContrib::isNotCached() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_notCached);
|
|
}
|
|
|
|
bool DIASectionContrib::isShared() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_share);
|
|
}
|
|
|
|
bool DIASectionContrib::isExecutable() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_execute);
|
|
}
|
|
|
|
bool DIASectionContrib::isReadable() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_read);
|
|
}
|
|
|
|
bool DIASectionContrib::isWritable() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_write);
|
|
}
|
|
|
|
uint32_t DIASectionContrib::getDataCrc32() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_dataCrc);
|
|
}
|
|
|
|
uint32_t DIASectionContrib::getRelocationsCrc32() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_relocationsCrc);
|
|
}
|
|
|
|
uint32_t DIASectionContrib::getCompilandId() const {
|
|
return PrivateGetDIAValue(Section, &IDiaSectionContrib::get_compilandId);
|
|
}
|