18#ifndef LLVM_LIB_TARGET_SPIRV_SPIRVNONSEMANTICDEBUGHANDLER_H
19#define LLVM_LIB_TARGET_SPIRV_SPIRVNONSEMANTICDEBUGHANDLER_H
64 const SPIRVOptions &CLOpts;
66 static constexpr unsigned NSSet =
static_cast<unsigned>(
67 SPIRV::InstructionSet::NonSemantic_Shader_DebugInfo_100);
69 struct CompileUnitInfo {
72 unsigned SpirvSourceLanguage = 0;
76 int64_t DwarfVersion = 0;
87 enum class EmitStatus {
95 struct PreparedScope {
96 SPIRV::NonSemanticExtInst::NonSemanticExtInst Opcode{};
99 PreparedScope() =
default;
100 PreparedScope(SPIRV::NonSemanticExtInst::NonSemanticExtInst
Op,
109 template <
typename T>
struct EmitResult {
110 EmitStatus
Status = EmitStatus::Unsupported;
111 std::optional<T>
Value;
113 static EmitResult emitted(
T V) {
115 R.Status = EmitStatus::Emitted;
116 R.Value = std::move(
V);
120 static EmitResult inProgress() {
122 R.Status = EmitStatus::InProgress;
126 template <
typename U>
128 assert(!
Other &&
"failure() requires a non-emitted result");
130 R.Status =
Other.Status;
134 explicit operator bool()
const {
136 "payload is set exactly when the result is emitted");
137 if constexpr (std::is_same_v<T, MCRegister>)
139 return Status == EmitStatus::Emitted;
146 struct InProgressScope {
148 bool ForwardReferenced =
false;
156 bool HasRelaxedExtInst =
false;
168 struct GlobalVariableDebugInfo {
173 GlobalVariableDebugInfoMap;
214 bool NonSemanticOpStringsSectionEmitted =
false;
255 bool GlobalDIEmitted =
false;
259 bool GlobalNSDIEnabled =
false;
267 bool DebugFunctionDefinitionEmitted =
false;
283 SPIRV::NonSemanticExtInst::NonSemanticExtInst Opcode;
350 void emitDebugFunctionDefinition(
MCRegister DebugFunctionReg,
354 void resetPerFunctionDebugState();
362 std::optional<const MachineInstr *>
374 void emitMCInst(
MCInst &Inst);
399 getCachedScopePathOpStringReg(
const DIScope *Scope,
400 bool UseEmptyPathIfNullScope =
false);
408 MCRegister emitExtInst(SPIRV::NonSemanticExtInst::NonSemanticExtInst Opcode,
412 std::optional<MCRegister> ResultReg = std::nullopt);
437 EmitResult<MCRegister> getOrCreateDebugScope(
const DIScope *S);
441 EmitResult<PreparedScope> emitDebugScope(
const DIScope *S);
444 EmitResult<PreparedScope> emitDebugTypeForCompositeType(
449 EmitResult<PreparedScope>
456 EmitResult<PreparedScope> emitDebugTypeBasic(
const DIBasicType *
BT,
462 EmitResult<PreparedScope>
468 EmitResult<PreparedScope>
473 EmitResult<PreparedScope>
479 EmitResult<PreparedScope> emitDebugFunction(
const DISubprogram *SP,
497 std::optional<MCRegister>
519 std::optional<MCRegister> emitDebugGlobalVariable(
548 std::optional<MCRegister>
567 std::optional<MCRegister> emitDebugExpression(
const DIExpression *Expr,
592 void placeRecord(SPIRV::NonSemanticExtInst::NonSemanticExtInst Opcode,
600 std::optional<MCRegister> getConstantValueReg(
const MachineInstr &
MI)
const;
631 void emitDebugBinding(SPIRV::NonSemanticExtInst::NonSemanticExtInst Opcode,
640 EmitResult<PreparedScope> emitDebugTypeVector(
const DICompositeType *VT,
653 EmitResult<PreparedScope> emitDebugTypeArray(
const DICompositeType *AT,
663 EmitResult<PreparedScope> emitDebugTypeMember(
const DIDerivedType *M,
678 EmitResult<PreparedScope>
705 EmitResult<PreparedScope> emitDebugTypedef(
const DIDerivedType *TD,
723 EmitResult<MCRegister> mapDISignatureTypeToReg(
const DIType *Ty,
729 static unsigned toNSDISrcLang(
unsigned DwarfSrcLang);
757 EmitResult<MCRegister>
767 EmitResult<PreparedScope>
774 EmitResult<PreparedScope> emitDebugLexicalBlockDiscriminator(
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static NVPTX::Scope resolveScope(NVPTX::Scope S, const NVPTXSubtarget *T)
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class is intended to be used as a driving class for all asm writers.
Basic type, like 'int' or 'float'.
A lightweight wrapper around an expression operand.
Base class for scope-like contexts.
Subprogram description. Uses SubclassData1.
Type array for a subprogram.
DebugHandlerBase(AsmPrinter *A)
Implements a dense probed hash-table based set.
Instances of this class represent a single low-level machine instruction.
Wrapper class representing physical registers. Should be passed by value.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
Representation of each machine instruction.
This class implements a map that also provides access to all stored values in a deterministic order.
A Module instance is used to store all the information related to an LLVM module.
void beginInstruction(const MachineInstr *MI) override
Process beginning of an instruction.
void endModule() override
Emit all sections that should come after the content.
void emitNonSemanticDebugStrings(SPIRV::ModuleAnalysisInfo &MAI)
Emit OpString instructions for all NSDI file paths and basic type names into the debug section (secti...
void beginModule(Module *M) override
Collect compile-unit metadata from the module.
void endFunctionImpl(const MachineFunction *MF) override
void beginFunctionImpl(const MachineFunction *MF) override
void emitNonSemanticGlobalDebugInfo(SPIRV::ModuleAnalysisInfo &MAI)
Emit module-scope NSDI instructions (DebugSource, DebugCompilationUnit, DebugTypeBasic,...
void prepareModuleOutput(const SPIRVSubtarget &ST, SPIRV::ModuleAnalysisInfo &MAI)
Add SPV_KHR_non_semantic_info extension and NonSemantic.Shader.DebugInfo.100 ext inst set entry to MA...
SPIRVNonSemanticDebugHandler(AsmPrinter &AP)
void endInstruction() override
Process end of an instruction.
void notifyEntryLabelEmitted(const MachineFunction &MF)
Called after the synthesized entry OpLabel has been emitted.
A vector that has set insertion semantics.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Represent a constant reference to a string, i.e.
LLVM Value Representation.
This is an optimization pass for GlobalISel generic memory operations.
LogicalResult failure(bool IsFailure=true)
Utility function to generate a LogicalResult.
DWARFExpression::Operation Op