DxcPixTypes.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxcPixTypes.h //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // Declares the classes implementing DxcPixType and its subinterfaces. These //
  9. // classes are used to interpret llvm::DITypes from the debug metadata. //
  10. // //
  11. ///////////////////////////////////////////////////////////////////////////////
  12. #pragma once
  13. #include "dxc/Support/WinIncludes.h"
  14. #include "DxcPixTypes.h"
  15. #include "DxcPixDxilDebugInfo.h"
  16. #include "dxc/Support/Global.h"
  17. #include "dxc/Support/microcom.h"
  18. #include "llvm/IR/DebugInfo.h"
  19. #include "llvm/IR/DebugInfoMetadata.h"
  20. namespace dxil_debug_info
  21. {
  22. HRESULT CreateDxcPixType(
  23. DxcPixDxilDebugInfo *ppDxilDebugInfo,
  24. llvm::DIType *diType,
  25. IDxcPixType **ppResult);
  26. class DxcPixConstType : public IDxcPixConstType
  27. {
  28. private:
  29. DXC_MICROCOM_TM_REF_FIELDS()
  30. CComPtr<DxcPixDxilDebugInfo> m_pDxilDebugInfo;
  31. llvm::DIDerivedType *m_pType;
  32. llvm::DIType *m_pBaseType;
  33. DxcPixConstType(
  34. IMalloc *pMalloc,
  35. DxcPixDxilDebugInfo *pDxilDebugInfo,
  36. llvm::DIDerivedType *pType)
  37. : m_pMalloc(pMalloc)
  38. , m_pDxilDebugInfo(pDxilDebugInfo)
  39. , m_pType(pType)
  40. {
  41. const llvm::DITypeIdentifierMap EmptyMap;
  42. m_pBaseType = m_pType->getBaseType().resolve(EmptyMap);
  43. }
  44. public:
  45. DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
  46. DXC_MICROCOM_TM_ALLOC(DxcPixConstType)
  47. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
  48. return DoBasicQueryInterface<IDxcPixConstType, IDxcPixType>(this, iid, ppvObject);
  49. }
  50. STDMETHODIMP GetName(
  51. _Outptr_result_z_ BSTR *Name) override;
  52. STDMETHODIMP GetSizeInBits(
  53. _Outptr_result_z_ DWORD * pSizeInBits) override;
  54. STDMETHODIMP UnAlias(
  55. _Outptr_result_z_ IDxcPixType **ppType) override;
  56. };
  57. class DxcPixTypedefType : public IDxcPixTypedefType
  58. {
  59. private:
  60. DXC_MICROCOM_TM_REF_FIELDS()
  61. CComPtr<DxcPixDxilDebugInfo> m_pDxilDebugInfo;
  62. llvm::DIDerivedType *m_pType;
  63. llvm::DIType *m_pBaseType;
  64. DxcPixTypedefType(
  65. IMalloc *pMalloc,
  66. DxcPixDxilDebugInfo *pDxilDebugInfo,
  67. llvm::DIDerivedType *pType)
  68. : m_pMalloc(pMalloc)
  69. , m_pDxilDebugInfo(pDxilDebugInfo)
  70. , m_pType(pType)
  71. {
  72. const llvm::DITypeIdentifierMap EmptyMap;
  73. m_pBaseType = m_pType->getBaseType().resolve(EmptyMap);
  74. }
  75. public:
  76. DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
  77. DXC_MICROCOM_TM_ALLOC(DxcPixTypedefType)
  78. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
  79. return DoBasicQueryInterface<IDxcPixTypedefType, IDxcPixType>(this, iid, ppvObject);
  80. }
  81. STDMETHODIMP GetName(
  82. _Outptr_result_z_ BSTR *Name) override;
  83. STDMETHODIMP GetSizeInBits(
  84. _Outptr_result_z_ DWORD *pSizeInBits) override;
  85. STDMETHODIMP UnAlias(
  86. _Outptr_result_z_ IDxcPixType **ppBaseType) override;
  87. };
  88. class DxcPixScalarType : public IDxcPixScalarType
  89. {
  90. private:
  91. DXC_MICROCOM_TM_REF_FIELDS()
  92. CComPtr<DxcPixDxilDebugInfo> m_pDxilDebugInfo;
  93. llvm::DIBasicType *m_pType;
  94. DxcPixScalarType(
  95. IMalloc *pMalloc,
  96. DxcPixDxilDebugInfo *pDxilDebugInfo,
  97. llvm::DIBasicType *pType)
  98. : m_pMalloc(pMalloc)
  99. , m_pDxilDebugInfo(pDxilDebugInfo)
  100. , m_pType(pType)
  101. {
  102. }
  103. public:
  104. DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
  105. DXC_MICROCOM_TM_ALLOC(DxcPixScalarType)
  106. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
  107. return DoBasicQueryInterface<IDxcPixScalarType, IDxcPixType>(this, iid, ppvObject);
  108. }
  109. STDMETHODIMP GetName(
  110. _Outptr_result_z_ BSTR *Name) override;
  111. STDMETHODIMP GetSizeInBits(
  112. _Outptr_result_z_ DWORD *pSizeInBits) override;
  113. STDMETHODIMP UnAlias(
  114. _Outptr_result_z_ IDxcPixType **ppBaseType) override;
  115. };
  116. class DxcPixArrayType : public IDxcPixArrayType
  117. {
  118. private:
  119. DXC_MICROCOM_TM_REF_FIELDS()
  120. CComPtr<DxcPixDxilDebugInfo> m_pDxilDebugInfo;
  121. llvm::DICompositeType *m_pArray;
  122. llvm::DIType *m_pBaseType;
  123. unsigned m_DimNum;
  124. DxcPixArrayType(
  125. IMalloc *pMalloc,
  126. DxcPixDxilDebugInfo *pDxilDebugInfo,
  127. llvm::DICompositeType *pArray,
  128. unsigned DimNum)
  129. : m_pMalloc(pMalloc)
  130. , m_pDxilDebugInfo(pDxilDebugInfo)
  131. , m_pArray(pArray)
  132. , m_DimNum(DimNum)
  133. {
  134. const llvm::DITypeIdentifierMap EmptyMap;
  135. m_pBaseType = m_pArray->getBaseType().resolve(EmptyMap);
  136. #ifndef NDEBUG
  137. assert(m_DimNum < m_pArray->getElements().size());
  138. for (auto *Dims : m_pArray->getElements())
  139. {
  140. assert(llvm::isa<llvm::DISubrange>(Dims));
  141. }
  142. #endif // !NDEBUG
  143. }
  144. public:
  145. DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
  146. DXC_MICROCOM_TM_ALLOC(DxcPixArrayType)
  147. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
  148. return DoBasicQueryInterface<IDxcPixArrayType, IDxcPixType>(this, iid, ppvObject);
  149. }
  150. STDMETHODIMP GetName(
  151. _Outptr_result_z_ BSTR *Name) override;
  152. STDMETHODIMP GetSizeInBits(
  153. _Outptr_result_z_ DWORD *pSizeInBits) override;
  154. STDMETHODIMP UnAlias(
  155. _Outptr_result_z_ IDxcPixType **ppBaseType) override;
  156. STDMETHODIMP GetNumElements(
  157. _Outptr_result_z_ DWORD *ppNumElements) override;
  158. STDMETHODIMP GetIndexedType(
  159. _Outptr_result_z_ IDxcPixType **ppElementType) override;
  160. STDMETHODIMP GetElementType(
  161. _Outptr_result_z_ IDxcPixType **ppElementType) override;
  162. };
  163. class DxcPixStructType : public IDxcPixStructType
  164. {
  165. private:
  166. DXC_MICROCOM_TM_REF_FIELDS()
  167. CComPtr<DxcPixDxilDebugInfo> m_pDxilDebugInfo;
  168. llvm::DICompositeType *m_pStruct;
  169. DxcPixStructType(
  170. IMalloc *pMalloc,
  171. DxcPixDxilDebugInfo *pDxilDebugInfo,
  172. llvm::DICompositeType *pStruct
  173. ) : m_pMalloc(pMalloc)
  174. , m_pDxilDebugInfo(pDxilDebugInfo)
  175. , m_pStruct(pStruct)
  176. {
  177. #ifndef NDEBUG
  178. for (auto *Node : m_pStruct->getElements())
  179. {
  180. assert(llvm::isa<llvm::DIDerivedType>(Node));
  181. }
  182. #endif // !NDEBUG
  183. }
  184. public:
  185. DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
  186. DXC_MICROCOM_TM_ALLOC(DxcPixStructType)
  187. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
  188. return DoBasicQueryInterface<IDxcPixStructType, IDxcPixType>(this, iid, ppvObject);
  189. }
  190. STDMETHODIMP GetName(
  191. _Outptr_result_z_ BSTR *Name) override;
  192. STDMETHODIMP GetSizeInBits(
  193. _Outptr_result_z_ DWORD *pSizeInBits) override;
  194. STDMETHODIMP UnAlias(
  195. _Outptr_result_z_ IDxcPixType **ppBaseType) override;
  196. STDMETHODIMP GetNumFields(
  197. _Outptr_result_z_ DWORD* ppNumFields) override;
  198. STDMETHODIMP GetFieldByIndex(
  199. DWORD dwIndex,
  200. _Outptr_result_z_ IDxcPixStructField **ppField) override;
  201. STDMETHODIMP GetFieldByName(
  202. _In_ LPCWSTR lpName,
  203. _Outptr_result_z_ IDxcPixStructField **ppField) override;
  204. };
  205. class DxcPixStructField : public IDxcPixStructField
  206. {
  207. private:
  208. DXC_MICROCOM_TM_REF_FIELDS()
  209. CComPtr<DxcPixDxilDebugInfo> m_pDxilDebugInfo;
  210. llvm::DIDerivedType *m_pField;
  211. llvm::DIType *m_pType;
  212. DxcPixStructField(
  213. IMalloc *pMalloc,
  214. DxcPixDxilDebugInfo *pDxilDebugInfo,
  215. llvm::DIDerivedType *pField)
  216. : m_pMalloc(pMalloc)
  217. , m_pDxilDebugInfo(pDxilDebugInfo)
  218. , m_pField(pField)
  219. {
  220. const llvm::DITypeIdentifierMap EmptyMap;
  221. m_pType = m_pField->getBaseType().resolve(EmptyMap);
  222. }
  223. public:
  224. DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
  225. DXC_MICROCOM_TM_ALLOC(DxcPixStructField)
  226. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
  227. return DoBasicQueryInterface<IDxcPixStructField>(this, iid, ppvObject);
  228. }
  229. STDMETHODIMP GetName(
  230. _Outptr_result_z_ BSTR *Name) override;
  231. STDMETHODIMP GetType(
  232. _Outptr_result_z_ IDxcPixType **ppType) override;
  233. STDMETHODIMP GetOffsetInBits(
  234. _Outptr_result_z_ DWORD *pOffsetInBits) override;
  235. };
  236. } // namespace dxil_debug_info