DxilDiaSession.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilDiaSession.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. // DIA API implementation for DXIL modules. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #pragma once
  12. #include "dxc/Support/WinIncludes.h"
  13. #include <map>
  14. #include <memory>
  15. #include <unordered_map>
  16. #include <vector>
  17. #include "dia2.h"
  18. #include "dxc/dxcpix.h"
  19. #include "dxc/DXIL/DxilModule.h"
  20. #include "dxc/Support/Global.h"
  21. #include "dxc/Support/microcom.h"
  22. #include "DxilDia.h"
  23. #include "DxilDiaSymbolManager.h"
  24. namespace dxil_dia {
  25. class Session : public IDiaSession, public IDxcPixDxilDebugInfoFactory {
  26. public:
  27. using RVA = unsigned;
  28. using RVAMap = std::map<RVA, const llvm::Instruction *>;
  29. struct LineInfo {
  30. LineInfo(std::uint32_t start_col, RVA first, RVA last)
  31. : StartCol(start_col),
  32. First(first),
  33. Last(last) {}
  34. std::uint32_t StartCol = 0;
  35. RVA First = 0;
  36. RVA Last = 0;
  37. };
  38. using LineToInfoMap = std::unordered_map<std::uint32_t, LineInfo>;
  39. DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
  40. DXC_MICROCOM_TM_CTOR(Session)
  41. IMalloc *GetMallocNoRef() { return m_pMalloc.p; }
  42. void Init(std::shared_ptr<llvm::LLVMContext> context,
  43. std::shared_ptr<llvm::Module> mod,
  44. std::shared_ptr<llvm::DebugInfoFinder> finder);
  45. llvm::NamedMDNode *Contents() { return m_contents; }
  46. llvm::NamedMDNode *Defines() { return m_defines; }
  47. llvm::NamedMDNode *MainFileName() { return m_mainFileName; }
  48. llvm::NamedMDNode *Arguments() { return m_arguments; }
  49. hlsl::DxilModule &DxilModuleRef() { return *m_dxilModule.get(); }
  50. llvm::Module &ModuleRef() { return *m_module.get(); }
  51. llvm::DebugInfoFinder &InfoRef() { return *m_finder.get(); }
  52. const SymbolManager &SymMgr() const { return m_symsMgr; }
  53. const RVAMap &InstructionsRef() const { return m_instructions; }
  54. const std::vector<const llvm::Instruction *> &InstructionLinesRef() const { return m_instructionLines; }
  55. const std::unordered_map<const llvm::Instruction *, RVA> &RvaMapRef() const { return m_rvaMap; }
  56. const LineToInfoMap &LineToColumnStartMapRef() const { return m_lineToInfoMap; }
  57. HRESULT getSourceFileIdByName(llvm::StringRef fileName, DWORD *pRetVal);
  58. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
  59. return DoBasicQueryInterface<IDiaSession, IDxcPixDxilDebugInfoFactory>(this, iid, ppvObject);
  60. }
  61. STDMETHODIMP get_loadAddress(
  62. /* [retval][out] */ ULONGLONG *pRetVal) override;
  63. STDMETHODIMP put_loadAddress(
  64. /* [in] */ ULONGLONG NewVal) override { return ENotImpl(); }
  65. STDMETHODIMP get_globalScope(
  66. /* [retval][out] */ IDiaSymbol **pRetVal) override;
  67. STDMETHODIMP getEnumTables(
  68. _COM_Outptr_ IDiaEnumTables **ppEnumTables) override;
  69. STDMETHODIMP getSymbolsByAddr(
  70. /* [out] */ IDiaEnumSymbolsByAddr **ppEnumbyAddr) override { return ENotImpl(); }
  71. STDMETHODIMP findChildren(
  72. /* [in] */ IDiaSymbol *parent,
  73. /* [in] */ enum SymTagEnum symtag,
  74. /* [in] */ LPCOLESTR name,
  75. /* [in] */ DWORD compareFlags,
  76. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  77. STDMETHODIMP findChildrenEx(
  78. /* [in] */ IDiaSymbol *parent,
  79. /* [in] */ enum SymTagEnum symtag,
  80. /* [in] */ LPCOLESTR name,
  81. /* [in] */ DWORD compareFlags,
  82. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  83. STDMETHODIMP findChildrenExByAddr(
  84. /* [in] */ IDiaSymbol *parent,
  85. /* [in] */ enum SymTagEnum symtag,
  86. /* [in] */ LPCOLESTR name,
  87. /* [in] */ DWORD compareFlags,
  88. /* [in] */ DWORD isect,
  89. /* [in] */ DWORD offset,
  90. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  91. STDMETHODIMP findChildrenExByVA(
  92. /* [in] */ IDiaSymbol *parent,
  93. /* [in] */ enum SymTagEnum symtag,
  94. /* [in] */ LPCOLESTR name,
  95. /* [in] */ DWORD compareFlags,
  96. /* [in] */ ULONGLONG va,
  97. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  98. STDMETHODIMP findChildrenExByRVA(
  99. /* [in] */ IDiaSymbol *parent,
  100. /* [in] */ enum SymTagEnum symtag,
  101. /* [in] */ LPCOLESTR name,
  102. /* [in] */ DWORD compareFlags,
  103. /* [in] */ DWORD rva,
  104. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  105. STDMETHODIMP findSymbolByAddr(
  106. /* [in] */ DWORD isect,
  107. /* [in] */ DWORD offset,
  108. /* [in] */ enum SymTagEnum symtag,
  109. /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
  110. STDMETHODIMP findSymbolByRVA(
  111. /* [in] */ DWORD rva,
  112. /* [in] */ enum SymTagEnum symtag,
  113. /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
  114. STDMETHODIMP findSymbolByVA(
  115. /* [in] */ ULONGLONG va,
  116. /* [in] */ enum SymTagEnum symtag,
  117. /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
  118. STDMETHODIMP findSymbolByToken(
  119. /* [in] */ ULONG token,
  120. /* [in] */ enum SymTagEnum symtag,
  121. /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
  122. STDMETHODIMP symsAreEquiv(
  123. /* [in] */ IDiaSymbol *symbolA,
  124. /* [in] */ IDiaSymbol *symbolB) override { return ENotImpl(); }
  125. STDMETHODIMP symbolById(
  126. /* [in] */ DWORD id,
  127. /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
  128. STDMETHODIMP findSymbolByRVAEx(
  129. /* [in] */ DWORD rva,
  130. /* [in] */ enum SymTagEnum symtag,
  131. /* [out] */ IDiaSymbol **ppSymbol,
  132. /* [out] */ long *displacement) override { return ENotImpl(); }
  133. STDMETHODIMP findSymbolByVAEx(
  134. /* [in] */ ULONGLONG va,
  135. /* [in] */ enum SymTagEnum symtag,
  136. /* [out] */ IDiaSymbol **ppSymbol,
  137. /* [out] */ long *displacement) override { return ENotImpl(); }
  138. STDMETHODIMP findFile(
  139. /* [in] */ IDiaSymbol *pCompiland,
  140. /* [in] */ LPCOLESTR name,
  141. /* [in] */ DWORD compareFlags,
  142. /* [out] */ IDiaEnumSourceFiles **ppResult) override;
  143. STDMETHODIMP findFileById(
  144. /* [in] */ DWORD uniqueId,
  145. /* [out] */ IDiaSourceFile **ppResult) override;
  146. STDMETHODIMP findLines(
  147. /* [in] */ IDiaSymbol *compiland,
  148. /* [in] */ IDiaSourceFile *file,
  149. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  150. STDMETHODIMP findLinesByAddr(
  151. /* [in] */ DWORD seg,
  152. /* [in] */ DWORD offset,
  153. /* [in] */ DWORD length,
  154. /* [out] */ IDiaEnumLineNumbers **ppResult) override;
  155. STDMETHODIMP findLinesByRVA(
  156. /* [in] */ DWORD rva,
  157. /* [in] */ DWORD length,
  158. /* [out] */ IDiaEnumLineNumbers **ppResult) override;
  159. STDMETHODIMP findLinesByVA(
  160. /* [in] */ ULONGLONG va,
  161. /* [in] */ DWORD length,
  162. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  163. STDMETHODIMP findLinesByLinenum(
  164. /* [in] */ IDiaSymbol *compiland,
  165. /* [in] */ IDiaSourceFile *file,
  166. /* [in] */ DWORD linenum,
  167. /* [in] */ DWORD column,
  168. /* [out] */ IDiaEnumLineNumbers **ppResult) override;
  169. STDMETHODIMP findInjectedSource(
  170. /* [in] */ LPCOLESTR srcFile,
  171. /* [out] */ IDiaEnumInjectedSources **ppResult) override;
  172. STDMETHODIMP getEnumDebugStreams(
  173. /* [out] */ IDiaEnumDebugStreams **ppEnumDebugStreams) override { return ENotImpl(); }
  174. STDMETHODIMP findInlineFramesByAddr(
  175. /* [in] */ IDiaSymbol *parent,
  176. /* [in] */ DWORD isect,
  177. /* [in] */ DWORD offset,
  178. /* [out] */ IDiaEnumSymbols **ppResult) override;
  179. STDMETHODIMP findInlineFramesByRVA(
  180. /* [in] */ IDiaSymbol *parent,
  181. /* [in] */ DWORD rva,
  182. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  183. STDMETHODIMP findInlineFramesByVA(
  184. /* [in] */ IDiaSymbol *parent,
  185. /* [in] */ ULONGLONG va,
  186. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  187. STDMETHODIMP findInlineeLines(
  188. /* [in] */ IDiaSymbol *parent,
  189. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  190. STDMETHODIMP findInlineeLinesByAddr(
  191. /* [in] */ IDiaSymbol *parent,
  192. /* [in] */ DWORD isect,
  193. /* [in] */ DWORD offset,
  194. /* [in] */ DWORD length,
  195. /* [out] */ IDiaEnumLineNumbers **ppResult) override;
  196. STDMETHODIMP findInlineeLinesByRVA(
  197. /* [in] */ IDiaSymbol *parent,
  198. /* [in] */ DWORD rva,
  199. /* [in] */ DWORD length,
  200. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  201. STDMETHODIMP findInlineeLinesByVA(
  202. /* [in] */ IDiaSymbol *parent,
  203. /* [in] */ ULONGLONG va,
  204. /* [in] */ DWORD length,
  205. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  206. STDMETHODIMP findInlineeLinesByLinenum(
  207. /* [in] */ IDiaSymbol *compiland,
  208. /* [in] */ IDiaSourceFile *file,
  209. /* [in] */ DWORD linenum,
  210. /* [in] */ DWORD column,
  211. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  212. STDMETHODIMP findInlineesByName(
  213. /* [in] */ LPCOLESTR name,
  214. /* [in] */ DWORD option,
  215. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  216. STDMETHODIMP findAcceleratorInlineeLinesByLinenum(
  217. /* [in] */ IDiaSymbol *parent,
  218. /* [in] */ IDiaSourceFile *file,
  219. /* [in] */ DWORD linenum,
  220. /* [in] */ DWORD column,
  221. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  222. STDMETHODIMP findSymbolsForAcceleratorPointerTag(
  223. /* [in] */ IDiaSymbol *parent,
  224. /* [in] */ DWORD tagValue,
  225. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  226. STDMETHODIMP findSymbolsByRVAForAcceleratorPointerTag(
  227. /* [in] */ IDiaSymbol *parent,
  228. /* [in] */ DWORD tagValue,
  229. /* [in] */ DWORD rva,
  230. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  231. STDMETHODIMP findAcceleratorInlineesByName(
  232. /* [in] */ LPCOLESTR name,
  233. /* [in] */ DWORD option,
  234. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  235. STDMETHODIMP addressForVA(
  236. /* [in] */ ULONGLONG va,
  237. /* [out] */ DWORD *pISect,
  238. /* [out] */ DWORD *pOffset) override { return ENotImpl(); }
  239. STDMETHODIMP addressForRVA(
  240. /* [in] */ DWORD rva,
  241. /* [out] */ DWORD *pISect,
  242. /* [out] */ DWORD *pOffset) override { return ENotImpl(); }
  243. STDMETHODIMP findILOffsetsByAddr(
  244. /* [in] */ DWORD isect,
  245. /* [in] */ DWORD offset,
  246. /* [in] */ DWORD length,
  247. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  248. STDMETHODIMP findILOffsetsByRVA(
  249. /* [in] */ DWORD rva,
  250. /* [in] */ DWORD length,
  251. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  252. STDMETHODIMP findILOffsetsByVA(
  253. /* [in] */ ULONGLONG va,
  254. /* [in] */ DWORD length,
  255. /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
  256. STDMETHODIMP findInputAssemblyFiles(
  257. /* [out] */ IDiaEnumInputAssemblyFiles **ppResult) override { return ENotImpl(); }
  258. STDMETHODIMP findInputAssembly(
  259. /* [in] */ DWORD index,
  260. /* [out] */ IDiaInputAssemblyFile **ppResult) override { return ENotImpl(); }
  261. STDMETHODIMP findInputAssemblyById(
  262. /* [in] */ DWORD uniqueId,
  263. /* [out] */ IDiaInputAssemblyFile **ppResult) override { return ENotImpl(); }
  264. STDMETHODIMP getFuncMDTokenMapSize(
  265. /* [out] */ DWORD *pcb) override { return ENotImpl(); }
  266. STDMETHODIMP getFuncMDTokenMap(
  267. /* [in] */ DWORD cb,
  268. /* [out] */ DWORD *pcb,
  269. /* [size_is][out] */ BYTE *pb) override { return ENotImpl(); }
  270. STDMETHODIMP getTypeMDTokenMapSize(
  271. /* [out] */ DWORD *pcb) override { return ENotImpl(); }
  272. STDMETHODIMP getTypeMDTokenMap(
  273. /* [in] */ DWORD cb,
  274. /* [out] */ DWORD *pcb,
  275. /* [size_is][out] */ BYTE *pb) override { return ENotImpl(); }
  276. STDMETHODIMP getNumberOfFunctionFragments_VA(
  277. /* [in] */ ULONGLONG vaFunc,
  278. /* [in] */ DWORD cbFunc,
  279. /* [out] */ DWORD *pNumFragments) override { return ENotImpl(); }
  280. STDMETHODIMP getNumberOfFunctionFragments_RVA(
  281. /* [in] */ DWORD rvaFunc,
  282. /* [in] */ DWORD cbFunc,
  283. /* [out] */ DWORD *pNumFragments) override { return ENotImpl(); }
  284. STDMETHODIMP getFunctionFragments_VA(
  285. /* [in] */ ULONGLONG vaFunc,
  286. /* [in] */ DWORD cbFunc,
  287. /* [in] */ DWORD cFragments,
  288. /* [size_is][out] */ ULONGLONG *pVaFragment,
  289. /* [size_is][out] */ DWORD *pLenFragment) override { return ENotImpl(); }
  290. STDMETHODIMP getFunctionFragments_RVA(
  291. /* [in] */ DWORD rvaFunc,
  292. /* [in] */ DWORD cbFunc,
  293. /* [in] */ DWORD cFragments,
  294. /* [size_is][out] */ DWORD *pRvaFragment,
  295. /* [size_is][out] */ DWORD *pLenFragment) override { return ENotImpl(); }
  296. STDMETHODIMP getExports(
  297. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  298. STDMETHODIMP getHeapAllocationSites(
  299. /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
  300. STDMETHODIMP findInputAssemblyFile(
  301. /* [in] */ IDiaSymbol *pSymbol,
  302. /* [out] */ IDiaInputAssemblyFile **ppResult) override { return ENotImpl(); }
  303. STDMETHODIMP NewDxcPixDxilDebugInfo(
  304. _COM_Outptr_ IDxcPixDxilDebugInfo** ppDxilDebugInfo) override;
  305. private:
  306. DXC_MICROCOM_TM_REF_FIELDS()
  307. std::shared_ptr<llvm::LLVMContext> m_context;
  308. std::shared_ptr<llvm::Module> m_module;
  309. std::shared_ptr<llvm::DebugInfoFinder> m_finder;
  310. std::unique_ptr<hlsl::DxilModule> m_dxilModule;
  311. llvm::NamedMDNode *m_contents;
  312. llvm::NamedMDNode *m_defines;
  313. llvm::NamedMDNode *m_mainFileName;
  314. llvm::NamedMDNode *m_arguments;
  315. RVAMap m_instructions;
  316. std::vector<const llvm::Instruction *> m_instructionLines; // Instructions with line info.
  317. std::unordered_map<const llvm::Instruction *, RVA> m_rvaMap; // Map instruction to its RVA.
  318. LineToInfoMap m_lineToInfoMap;
  319. SymbolManager m_symsMgr;
  320. private:
  321. CComPtr<IDiaEnumTables> m_pEnumTables;
  322. };
  323. } // namespace dxil_dia