blob: 9116a77ae61e62353cf0428abfb48d53c57097eb [file] [log] [blame] [edit]
///////////////////////////////////////////////////////////////////////////////
// //
// DxilDiaTableLineNumbers.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 <vector>
#include "dia2.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/Instruction.h"
#include "dxc/Support/Global.h"
#include "dxc/Support/microcom.h"
#include "DxilDia.h"
#include "DxilDiaTable.h"
namespace dxil_dia {
class Session;
class LineNumber : public IDiaLineNumber {
private:
DXC_MICROCOM_TM_REF_FIELDS()
CComPtr<Session> m_pSession;
const llvm::Instruction *m_inst;
public:
DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
STDMETHODIMP QueryInterface(REFIID iid, void **ppvObject) override {
return DoBasicQueryInterface<IDiaLineNumber>(this, iid, ppvObject);
}
LineNumber(
/* [in] */ IMalloc *pMalloc,
/* [in] */ Session *pSession,
/* [in] */ const llvm::Instruction *inst);
const llvm::DebugLoc &DL() const;
const llvm::Instruction *Inst() const { return m_inst; }
STDMETHODIMP get_compiland(
/* [retval][out] */ IDiaSymbol **pRetVal) override {
return ENotImpl();
}
STDMETHODIMP get_sourceFile(
/* [retval][out] */ IDiaSourceFile **pRetVal) override;
STDMETHODIMP get_lineNumber(
/* [retval][out] */ DWORD *pRetVal) override;
STDMETHODIMP get_lineNumberEnd(
/* [retval][out] */ DWORD *pRetVal) override;
STDMETHODIMP get_columnNumber(
/* [retval][out] */ DWORD *pRetVal) override;
STDMETHODIMP get_columnNumberEnd(
/* [retval][out] */ DWORD *pRetVal) override;
STDMETHODIMP get_addressSection(
/* [retval][out] */ DWORD *pRetVal) override {
return ENotImpl();
}
STDMETHODIMP get_addressOffset(
/* [retval][out] */ DWORD *pRetVal) override;
STDMETHODIMP get_relativeVirtualAddress(
/* [retval][out] */ DWORD *pRetVal) override;
STDMETHODIMP get_virtualAddress(
/* [retval][out] */ ULONGLONG *pRetVal) override {
return ENotImpl();
}
STDMETHODIMP get_length(
/* [retval][out] */ DWORD *pRetVal) override;
STDMETHODIMP get_sourceFileId(
/* [retval][out] */ DWORD *pRetVal) override;
STDMETHODIMP get_statement(
/* [retval][out] */ BOOL *pRetVal) override;
STDMETHODIMP get_compilandId(
/* [retval][out] */ DWORD *pRetVal) override;
};
class LineNumbersTable
: public impl::TableBase<IDiaEnumLineNumbers, IDiaLineNumber> {
public:
LineNumbersTable(
/* [in] */ IMalloc *pMalloc,
/* [in] */ Session *pSession);
LineNumbersTable(
/* [in] */ IMalloc *pMalloc,
/* [in] */ Session *pSession,
/* [in] */ std::vector<const llvm::Instruction *> &&instructions);
HRESULT GetItem(
/* [in] */ DWORD index,
/* [out] */ IDiaLineNumber **ppItem) override;
private:
// Keep a reference to the instructions that contain the line numbers.
const std::vector<const llvm::Instruction *> &m_instructions;
// Provide storage space for instructions for when the table contains
// a subset of all instructions.
std::vector<const llvm::Instruction *> m_instructionsStorage;
};
} // namespace dxil_dia