123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- ///////////////////////////////////////////////////////////////////////////////
- // //
- // DxilDiaSession.h //
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- // This file is distributed under the University of Illinois Open Source //
- // License. See LICENSE.TXT for details. //
- // //
- // DIA API implementation for DXIL modules. //
- // //
- ///////////////////////////////////////////////////////////////////////////////
- #pragma once
- #include "dxc/Support/WinIncludes.h"
- #include <map>
- #include <memory>
- #include <unordered_map>
- #include <vector>
- #include "dia2.h"
- #include "dxc/dxcpix.h"
- #include "dxc/DXIL/DxilModule.h"
- #include "dxc/Support/Global.h"
- #include "dxc/Support/microcom.h"
- #include "DxilDia.h"
- #include "DxilDiaSymbolManager.h"
- namespace dxil_dia {
- class Session : public IDiaSession, public IDxcPixDxilDebugInfoFactory {
- public:
- using RVA = unsigned;
- using RVAMap = std::map<RVA, const llvm::Instruction *>;
- struct LineInfo {
- LineInfo(std::uint32_t start_col, RVA first, RVA last)
- : StartCol(start_col),
- First(first),
- Last(last) {}
- std::uint32_t StartCol = 0;
- RVA First = 0;
- RVA Last = 0;
- };
- using LineToInfoMap = std::unordered_map<std::uint32_t, LineInfo>;
- DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
- DXC_MICROCOM_TM_CTOR(Session)
- IMalloc *GetMallocNoRef() { return m_pMalloc.p; }
- void Init(std::shared_ptr<llvm::LLVMContext> context,
- std::shared_ptr<llvm::Module> mod,
- std::shared_ptr<llvm::DebugInfoFinder> finder);
- llvm::NamedMDNode *Contents() { return m_contents; }
- llvm::NamedMDNode *Defines() { return m_defines; }
- llvm::NamedMDNode *MainFileName() { return m_mainFileName; }
- llvm::NamedMDNode *Arguments() { return m_arguments; }
- hlsl::DxilModule &DxilModuleRef() { return *m_dxilModule.get(); }
- llvm::Module &ModuleRef() { return *m_module.get(); }
- llvm::DebugInfoFinder &InfoRef() { return *m_finder.get(); }
- const SymbolManager &SymMgr() const { return m_symsMgr; }
- const RVAMap &InstructionsRef() const { return m_instructions; }
- const std::vector<const llvm::Instruction *> &InstructionLinesRef() const { return m_instructionLines; }
- const std::unordered_map<const llvm::Instruction *, RVA> &RvaMapRef() const { return m_rvaMap; }
- const LineToInfoMap &LineToColumnStartMapRef() const { return m_lineToInfoMap; }
- HRESULT getSourceFileIdByName(llvm::StringRef fileName, DWORD *pRetVal);
- HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
- return DoBasicQueryInterface<IDiaSession, IDxcPixDxilDebugInfoFactory>(this, iid, ppvObject);
- }
- STDMETHODIMP get_loadAddress(
- /* [retval][out] */ ULONGLONG *pRetVal) override;
- STDMETHODIMP put_loadAddress(
- /* [in] */ ULONGLONG NewVal) override { return ENotImpl(); }
- STDMETHODIMP get_globalScope(
- /* [retval][out] */ IDiaSymbol **pRetVal) override;
- STDMETHODIMP getEnumTables(
- _COM_Outptr_ IDiaEnumTables **ppEnumTables) override;
- STDMETHODIMP getSymbolsByAddr(
- /* [out] */ IDiaEnumSymbolsByAddr **ppEnumbyAddr) override { return ENotImpl(); }
- STDMETHODIMP findChildren(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ enum SymTagEnum symtag,
- /* [in] */ LPCOLESTR name,
- /* [in] */ DWORD compareFlags,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findChildrenEx(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ enum SymTagEnum symtag,
- /* [in] */ LPCOLESTR name,
- /* [in] */ DWORD compareFlags,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findChildrenExByAddr(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ enum SymTagEnum symtag,
- /* [in] */ LPCOLESTR name,
- /* [in] */ DWORD compareFlags,
- /* [in] */ DWORD isect,
- /* [in] */ DWORD offset,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findChildrenExByVA(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ enum SymTagEnum symtag,
- /* [in] */ LPCOLESTR name,
- /* [in] */ DWORD compareFlags,
- /* [in] */ ULONGLONG va,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findChildrenExByRVA(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ enum SymTagEnum symtag,
- /* [in] */ LPCOLESTR name,
- /* [in] */ DWORD compareFlags,
- /* [in] */ DWORD rva,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findSymbolByAddr(
- /* [in] */ DWORD isect,
- /* [in] */ DWORD offset,
- /* [in] */ enum SymTagEnum symtag,
- /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
- STDMETHODIMP findSymbolByRVA(
- /* [in] */ DWORD rva,
- /* [in] */ enum SymTagEnum symtag,
- /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
- STDMETHODIMP findSymbolByVA(
- /* [in] */ ULONGLONG va,
- /* [in] */ enum SymTagEnum symtag,
- /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
- STDMETHODIMP findSymbolByToken(
- /* [in] */ ULONG token,
- /* [in] */ enum SymTagEnum symtag,
- /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
- STDMETHODIMP symsAreEquiv(
- /* [in] */ IDiaSymbol *symbolA,
- /* [in] */ IDiaSymbol *symbolB) override { return ENotImpl(); }
- STDMETHODIMP symbolById(
- /* [in] */ DWORD id,
- /* [out] */ IDiaSymbol **ppSymbol) override { return ENotImpl(); }
- STDMETHODIMP findSymbolByRVAEx(
- /* [in] */ DWORD rva,
- /* [in] */ enum SymTagEnum symtag,
- /* [out] */ IDiaSymbol **ppSymbol,
- /* [out] */ long *displacement) override { return ENotImpl(); }
- STDMETHODIMP findSymbolByVAEx(
- /* [in] */ ULONGLONG va,
- /* [in] */ enum SymTagEnum symtag,
- /* [out] */ IDiaSymbol **ppSymbol,
- /* [out] */ long *displacement) override { return ENotImpl(); }
- STDMETHODIMP findFile(
- /* [in] */ IDiaSymbol *pCompiland,
- /* [in] */ LPCOLESTR name,
- /* [in] */ DWORD compareFlags,
- /* [out] */ IDiaEnumSourceFiles **ppResult) override;
- STDMETHODIMP findFileById(
- /* [in] */ DWORD uniqueId,
- /* [out] */ IDiaSourceFile **ppResult) override;
- STDMETHODIMP findLines(
- /* [in] */ IDiaSymbol *compiland,
- /* [in] */ IDiaSourceFile *file,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findLinesByAddr(
- /* [in] */ DWORD seg,
- /* [in] */ DWORD offset,
- /* [in] */ DWORD length,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override;
- STDMETHODIMP findLinesByRVA(
- /* [in] */ DWORD rva,
- /* [in] */ DWORD length,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override;
- STDMETHODIMP findLinesByVA(
- /* [in] */ ULONGLONG va,
- /* [in] */ DWORD length,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findLinesByLinenum(
- /* [in] */ IDiaSymbol *compiland,
- /* [in] */ IDiaSourceFile *file,
- /* [in] */ DWORD linenum,
- /* [in] */ DWORD column,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override;
- STDMETHODIMP findInjectedSource(
- /* [in] */ LPCOLESTR srcFile,
- /* [out] */ IDiaEnumInjectedSources **ppResult) override;
- STDMETHODIMP getEnumDebugStreams(
- /* [out] */ IDiaEnumDebugStreams **ppEnumDebugStreams) override { return ENotImpl(); }
- STDMETHODIMP findInlineFramesByAddr(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ DWORD isect,
- /* [in] */ DWORD offset,
- /* [out] */ IDiaEnumSymbols **ppResult) override;
- STDMETHODIMP findInlineFramesByRVA(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ DWORD rva,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInlineFramesByVA(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ ULONGLONG va,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInlineeLines(
- /* [in] */ IDiaSymbol *parent,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInlineeLinesByAddr(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ DWORD isect,
- /* [in] */ DWORD offset,
- /* [in] */ DWORD length,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override;
- STDMETHODIMP findInlineeLinesByRVA(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ DWORD rva,
- /* [in] */ DWORD length,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInlineeLinesByVA(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ ULONGLONG va,
- /* [in] */ DWORD length,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInlineeLinesByLinenum(
- /* [in] */ IDiaSymbol *compiland,
- /* [in] */ IDiaSourceFile *file,
- /* [in] */ DWORD linenum,
- /* [in] */ DWORD column,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInlineesByName(
- /* [in] */ LPCOLESTR name,
- /* [in] */ DWORD option,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findAcceleratorInlineeLinesByLinenum(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ IDiaSourceFile *file,
- /* [in] */ DWORD linenum,
- /* [in] */ DWORD column,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findSymbolsForAcceleratorPointerTag(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ DWORD tagValue,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findSymbolsByRVAForAcceleratorPointerTag(
- /* [in] */ IDiaSymbol *parent,
- /* [in] */ DWORD tagValue,
- /* [in] */ DWORD rva,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findAcceleratorInlineesByName(
- /* [in] */ LPCOLESTR name,
- /* [in] */ DWORD option,
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP addressForVA(
- /* [in] */ ULONGLONG va,
- /* [out] */ DWORD *pISect,
- /* [out] */ DWORD *pOffset) override { return ENotImpl(); }
- STDMETHODIMP addressForRVA(
- /* [in] */ DWORD rva,
- /* [out] */ DWORD *pISect,
- /* [out] */ DWORD *pOffset) override { return ENotImpl(); }
- STDMETHODIMP findILOffsetsByAddr(
- /* [in] */ DWORD isect,
- /* [in] */ DWORD offset,
- /* [in] */ DWORD length,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findILOffsetsByRVA(
- /* [in] */ DWORD rva,
- /* [in] */ DWORD length,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findILOffsetsByVA(
- /* [in] */ ULONGLONG va,
- /* [in] */ DWORD length,
- /* [out] */ IDiaEnumLineNumbers **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInputAssemblyFiles(
- /* [out] */ IDiaEnumInputAssemblyFiles **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInputAssembly(
- /* [in] */ DWORD index,
- /* [out] */ IDiaInputAssemblyFile **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInputAssemblyById(
- /* [in] */ DWORD uniqueId,
- /* [out] */ IDiaInputAssemblyFile **ppResult) override { return ENotImpl(); }
- STDMETHODIMP getFuncMDTokenMapSize(
- /* [out] */ DWORD *pcb) override { return ENotImpl(); }
- STDMETHODIMP getFuncMDTokenMap(
- /* [in] */ DWORD cb,
- /* [out] */ DWORD *pcb,
- /* [size_is][out] */ BYTE *pb) override { return ENotImpl(); }
- STDMETHODIMP getTypeMDTokenMapSize(
- /* [out] */ DWORD *pcb) override { return ENotImpl(); }
- STDMETHODIMP getTypeMDTokenMap(
- /* [in] */ DWORD cb,
- /* [out] */ DWORD *pcb,
- /* [size_is][out] */ BYTE *pb) override { return ENotImpl(); }
- STDMETHODIMP getNumberOfFunctionFragments_VA(
- /* [in] */ ULONGLONG vaFunc,
- /* [in] */ DWORD cbFunc,
- /* [out] */ DWORD *pNumFragments) override { return ENotImpl(); }
- STDMETHODIMP getNumberOfFunctionFragments_RVA(
- /* [in] */ DWORD rvaFunc,
- /* [in] */ DWORD cbFunc,
- /* [out] */ DWORD *pNumFragments) override { return ENotImpl(); }
- STDMETHODIMP getFunctionFragments_VA(
- /* [in] */ ULONGLONG vaFunc,
- /* [in] */ DWORD cbFunc,
- /* [in] */ DWORD cFragments,
- /* [size_is][out] */ ULONGLONG *pVaFragment,
- /* [size_is][out] */ DWORD *pLenFragment) override { return ENotImpl(); }
- STDMETHODIMP getFunctionFragments_RVA(
- /* [in] */ DWORD rvaFunc,
- /* [in] */ DWORD cbFunc,
- /* [in] */ DWORD cFragments,
- /* [size_is][out] */ DWORD *pRvaFragment,
- /* [size_is][out] */ DWORD *pLenFragment) override { return ENotImpl(); }
- STDMETHODIMP getExports(
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP getHeapAllocationSites(
- /* [out] */ IDiaEnumSymbols **ppResult) override { return ENotImpl(); }
- STDMETHODIMP findInputAssemblyFile(
- /* [in] */ IDiaSymbol *pSymbol,
- /* [out] */ IDiaInputAssemblyFile **ppResult) override { return ENotImpl(); }
- STDMETHODIMP NewDxcPixDxilDebugInfo(
- _COM_Outptr_ IDxcPixDxilDebugInfo** ppDxilDebugInfo) override;
- private:
- DXC_MICROCOM_TM_REF_FIELDS()
- std::shared_ptr<llvm::LLVMContext> m_context;
- std::shared_ptr<llvm::Module> m_module;
- std::shared_ptr<llvm::DebugInfoFinder> m_finder;
- std::unique_ptr<hlsl::DxilModule> m_dxilModule;
- llvm::NamedMDNode *m_contents;
- llvm::NamedMDNode *m_defines;
- llvm::NamedMDNode *m_mainFileName;
- llvm::NamedMDNode *m_arguments;
- RVAMap m_instructions;
- std::vector<const llvm::Instruction *> m_instructionLines; // Instructions with line info.
- std::unordered_map<const llvm::Instruction *, RVA> m_rvaMap; // Map instruction to its RVA.
- LineToInfoMap m_lineToInfoMap;
- SymbolManager m_symsMgr;
- private:
- CComPtr<IDiaEnumTables> m_pEnumTables;
- };
- } // namespace dxil_dia
|