xref: /freebsd-src/contrib/llvm-project/llvm/lib/DebugInfo/PDB/DIA/DIAFrameData.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===- DIAFrameData.cpp - DIA impl. of IPDBFrameData -------------- C++ -*-===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIAFrameData.h"
10*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIASession.h"
11*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIAUtils.h"
12*0b57cec5SDimitry Andric 
13*0b57cec5SDimitry Andric using namespace llvm::pdb;
14*0b57cec5SDimitry Andric 
DIAFrameData(CComPtr<IDiaFrameData> DiaFrameData)15*0b57cec5SDimitry Andric DIAFrameData::DIAFrameData(CComPtr<IDiaFrameData> DiaFrameData)
16*0b57cec5SDimitry Andric     : FrameData(DiaFrameData) {}
17*0b57cec5SDimitry Andric 
18*0b57cec5SDimitry Andric template <typename ArgType>
19*0b57cec5SDimitry Andric ArgType
PrivateGetDIAValue(IDiaFrameData * FrameData,HRESULT (__stdcall IDiaFrameData::* Method)(ArgType *))20*0b57cec5SDimitry Andric PrivateGetDIAValue(IDiaFrameData *FrameData,
21*0b57cec5SDimitry Andric                    HRESULT (__stdcall IDiaFrameData::*Method)(ArgType *)) {
22*0b57cec5SDimitry Andric   ArgType Value;
23*0b57cec5SDimitry Andric   if (S_OK == (FrameData->*Method)(&Value))
24*0b57cec5SDimitry Andric     return static_cast<ArgType>(Value);
25*0b57cec5SDimitry Andric 
26*0b57cec5SDimitry Andric   return ArgType();
27*0b57cec5SDimitry Andric }
28*0b57cec5SDimitry Andric 
getAddressOffset() const29*0b57cec5SDimitry Andric uint32_t DIAFrameData::getAddressOffset() const {
30*0b57cec5SDimitry Andric   return PrivateGetDIAValue(FrameData, &IDiaFrameData::get_addressOffset);
31*0b57cec5SDimitry Andric }
32*0b57cec5SDimitry Andric 
getAddressSection() const33*0b57cec5SDimitry Andric uint32_t DIAFrameData::getAddressSection() const {
34*0b57cec5SDimitry Andric   return PrivateGetDIAValue(FrameData, &IDiaFrameData::get_addressSection);
35*0b57cec5SDimitry Andric }
36*0b57cec5SDimitry Andric 
getLengthBlock() const37*0b57cec5SDimitry Andric uint32_t DIAFrameData::getLengthBlock() const {
38*0b57cec5SDimitry Andric   return PrivateGetDIAValue(FrameData, &IDiaFrameData::get_lengthBlock);
39*0b57cec5SDimitry Andric }
40*0b57cec5SDimitry Andric 
getProgram() const41*0b57cec5SDimitry Andric std::string DIAFrameData::getProgram() const {
42*0b57cec5SDimitry Andric   return invokeBstrMethod(*FrameData, &IDiaFrameData::get_program);
43*0b57cec5SDimitry Andric }
44*0b57cec5SDimitry Andric 
getRelativeVirtualAddress() const45*0b57cec5SDimitry Andric uint32_t DIAFrameData::getRelativeVirtualAddress() const {
46*0b57cec5SDimitry Andric   return PrivateGetDIAValue(FrameData,
47*0b57cec5SDimitry Andric                             &IDiaFrameData::get_relativeVirtualAddress);
48*0b57cec5SDimitry Andric }
49*0b57cec5SDimitry Andric 
getVirtualAddress() const50*0b57cec5SDimitry Andric uint64_t DIAFrameData::getVirtualAddress() const {
51*0b57cec5SDimitry Andric   return PrivateGetDIAValue(FrameData, &IDiaFrameData::get_virtualAddress);
52*0b57cec5SDimitry Andric }
53