xref: /freebsd/contrib/llvm-project/llvm/lib/DebugInfo/PDB/DIA/DIAFrameData.cpp (revision 5ca8e32633c4ffbbcd6762e5888b6a4ba0708c6c)
1 //===- DIAFrameData.cpp - DIA impl. of IPDBFrameData -------------- 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/DIA/DIAFrameData.h"
10 #include "llvm/DebugInfo/PDB/DIA/DIASession.h"
11 #include "llvm/DebugInfo/PDB/DIA/DIAUtils.h"
12 
13 using namespace llvm::pdb;
14 
15 DIAFrameData::DIAFrameData(CComPtr<IDiaFrameData> DiaFrameData)
16     : FrameData(DiaFrameData) {}
17 
18 template <typename ArgType>
19 ArgType
20 PrivateGetDIAValue(IDiaFrameData *FrameData,
21                    HRESULT (__stdcall IDiaFrameData::*Method)(ArgType *)) {
22   ArgType Value;
23   if (S_OK == (FrameData->*Method)(&Value))
24     return static_cast<ArgType>(Value);
25 
26   return ArgType();
27 }
28 
29 uint32_t DIAFrameData::getAddressOffset() const {
30   return PrivateGetDIAValue(FrameData, &IDiaFrameData::get_addressOffset);
31 }
32 
33 uint32_t DIAFrameData::getAddressSection() const {
34   return PrivateGetDIAValue(FrameData, &IDiaFrameData::get_addressSection);
35 }
36 
37 uint32_t DIAFrameData::getLengthBlock() const {
38   return PrivateGetDIAValue(FrameData, &IDiaFrameData::get_lengthBlock);
39 }
40 
41 std::string DIAFrameData::getProgram() const {
42   return invokeBstrMethod(*FrameData, &IDiaFrameData::get_program);
43 }
44 
45 uint32_t DIAFrameData::getRelativeVirtualAddress() const {
46   return PrivateGetDIAValue(FrameData,
47                             &IDiaFrameData::get_relativeVirtualAddress);
48 }
49 
50 uint64_t DIAFrameData::getVirtualAddress() const {
51   return PrivateGetDIAValue(FrameData, &IDiaFrameData::get_virtualAddress);
52 }
53