CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
1520 lines
43 KiB
C++
1520 lines
43 KiB
C++
#ifndef SPIRV_DEBUG_H
|
|
#define SPIRV_DEBUG_H
|
|
#include "SPIRVEnum.h"
|
|
#include "SPIRVUtil.h"
|
|
#include "spirv/unified1/spirv.hpp"
|
|
#include "spirv_internal.hpp"
|
|
#include "llvm/BinaryFormat/Dwarf.h"
|
|
#include "llvm/IR/DebugInfoMetadata.h"
|
|
|
|
#ifdef __has_include
|
|
#if __has_include("llvm/IR/DIExprOps.def")
|
|
#define SPIRV_HAS_DIOP_DIEXPRESSION
|
|
#endif
|
|
#endif
|
|
|
|
namespace SPIRVDebug {
|
|
|
|
const unsigned int DebugInfoVersion = 0x00010000;
|
|
static const std::string ProducerPrefix = {"Debug info producer: "};
|
|
static const std::string ChecksumKindPrefx = {"//__CSK_"};
|
|
|
|
// clang-format off
|
|
|
|
// Need to update hasDbgInstParentScopeIdx each time we add new instruction
|
|
// with ParentScopeIdx
|
|
enum Instruction {
|
|
DebugInfoNone = 0,
|
|
CompilationUnit = 1,
|
|
TypeBasic = 2,
|
|
TypePointer = 3,
|
|
TypeQualifier = 4,
|
|
TypeArray = 5,
|
|
TypeVector = 6,
|
|
Typedef = 7,
|
|
TypeFunction = 8,
|
|
TypeEnum = 9,
|
|
TypeComposite = 10,
|
|
TypeMember = 11,
|
|
TypeInheritance = 12,
|
|
TypePtrToMember = 13,
|
|
TypeTemplate = 14,
|
|
TypeTemplateParameter = 15,
|
|
TypeTemplateParameterPack = 16,
|
|
TypeTemplateTemplateParameter = 17,
|
|
GlobalVariable = 18,
|
|
FunctionDeclaration = 19,
|
|
Function = 20,
|
|
LexicalBlock = 21,
|
|
LexicalBlockDiscriminator = 22,
|
|
Scope = 23,
|
|
NoScope = 24,
|
|
InlinedAt = 25,
|
|
LocalVariable = 26,
|
|
InlinedVariable = 27,
|
|
Declare = 28,
|
|
Value = 29,
|
|
Operation = 30,
|
|
Expression = 31,
|
|
MacroDef = 32,
|
|
MacroUndef = 33,
|
|
ImportedEntity = 34,
|
|
Source = 35,
|
|
ModuleINTEL = 36,
|
|
InstCount = 37,
|
|
FunctionDefinition = 101,
|
|
SourceContinued = 102,
|
|
DebugLine = 103,
|
|
DebugNoLine = 104,
|
|
BuildIdentifier = 105,
|
|
StoragePath = 106,
|
|
EntryPoint = 107,
|
|
Module = 200,
|
|
TypeSubrange = 201,
|
|
TypeArrayDynamic = 202,
|
|
TypeString = 203
|
|
};
|
|
|
|
enum Flag {
|
|
FlagIsProtected = 1 << 0,
|
|
FlagIsPrivate = 1 << 1,
|
|
FlagIsPublic = FlagIsPrivate | FlagIsProtected,
|
|
FlagAccess = FlagIsPublic,
|
|
FlagIsLocal = 1 << 2,
|
|
FlagIsDefinition = 1 << 3,
|
|
FlagIsFwdDecl = 1 << 4,
|
|
FlagIsArtificial = 1 << 5,
|
|
FlagIsExplicit = 1 << 6,
|
|
FlagIsPrototyped = 1 << 7,
|
|
FlagIsObjectPointer = 1 << 8,
|
|
FlagIsStaticMember = 1 << 9,
|
|
FlagIsIndirectVariable = 1 << 10,
|
|
FlagIsLValueReference = 1 << 11,
|
|
FlagIsRValueReference = 1 << 12,
|
|
FlagIsOptimized = 1 << 13,
|
|
FlagIsEnumClass = 1 << 14,
|
|
FlagTypePassByValue = 1 << 15,
|
|
FlagTypePassByReference = 1 << 16,
|
|
FlagUnknownPhysicalLayout = 1 << 17,
|
|
FlagBitField = 1 << 18
|
|
};
|
|
|
|
enum EncodingTag {
|
|
Unspecified = 0,
|
|
Address = 1,
|
|
Boolean = 2,
|
|
Float = 3,
|
|
Signed = 4,
|
|
SignedChar = 5,
|
|
Unsigned = 6,
|
|
UnsignedChar = 7,
|
|
Complex = 8
|
|
};
|
|
|
|
enum CompositeTypeTag {
|
|
Class = 0,
|
|
Structure = 1,
|
|
Union = 2
|
|
};
|
|
|
|
enum TypeQualifierTag {
|
|
ConstType = 0,
|
|
VolatileType = 1,
|
|
RestrictType = 2,
|
|
AtomicType = 3
|
|
};
|
|
|
|
enum ExpressionOpCode {
|
|
Deref = 0,
|
|
Plus = 1,
|
|
Minus = 2,
|
|
PlusUconst = 3,
|
|
BitPiece = 4,
|
|
Swap = 5,
|
|
Xderef = 6,
|
|
StackValue = 7,
|
|
Constu = 8,
|
|
Fragment = 9,
|
|
Convert = 10,
|
|
Addr = 11,
|
|
Const1u = 12,
|
|
Const1s = 13,
|
|
Const2u = 14,
|
|
Const2s = 15,
|
|
Const4u = 16,
|
|
Const4s = 17,
|
|
Const8u = 18,
|
|
Const8s = 19,
|
|
Consts = 20,
|
|
Dup = 21,
|
|
Drop = 22,
|
|
Over = 23,
|
|
Pick = 24,
|
|
Rot = 25,
|
|
Abs = 26,
|
|
And = 27,
|
|
Div = 28,
|
|
Mod = 29,
|
|
Mul = 30,
|
|
Neg = 31,
|
|
Not = 32,
|
|
Or = 33,
|
|
Shl = 34,
|
|
Shr = 35,
|
|
Shra = 36,
|
|
Xor = 37,
|
|
Bra = 38,
|
|
Eq = 39,
|
|
Ge = 40,
|
|
Gt = 41,
|
|
Le = 42,
|
|
Lt = 43,
|
|
Ne = 44,
|
|
Skip = 45,
|
|
Lit0 = 46,
|
|
Lit1 = 47,
|
|
Lit2 = 48,
|
|
Lit3 = 49,
|
|
Lit4 = 50,
|
|
Lit5 = 51,
|
|
Lit6 = 52,
|
|
Lit7 = 53,
|
|
Lit8 = 54,
|
|
Lit9 = 55,
|
|
Lit10 = 56,
|
|
Lit11 = 57,
|
|
Lit12 = 58,
|
|
Lit13 = 59,
|
|
Lit14 = 60,
|
|
Lit15 = 61,
|
|
Lit16 = 62,
|
|
Lit17 = 63,
|
|
Lit18 = 64,
|
|
Lit19 = 65,
|
|
Lit20 = 66,
|
|
Lit21 = 67,
|
|
Lit22 = 68,
|
|
Lit23 = 69,
|
|
Lit24 = 70,
|
|
Lit25 = 71,
|
|
Lit26 = 72,
|
|
Lit27 = 73,
|
|
Lit28 = 74,
|
|
Lit29 = 75,
|
|
Lit30 = 76,
|
|
Lit31 = 77,
|
|
Reg0 = 78,
|
|
Reg1 = 79,
|
|
Reg2 = 80,
|
|
Reg3 = 81,
|
|
Reg4 = 82,
|
|
Reg5 = 83,
|
|
Reg6 = 84,
|
|
Reg7 = 85,
|
|
Reg8 = 86,
|
|
Reg9 = 87,
|
|
Reg10 = 88,
|
|
Reg11 = 89,
|
|
Reg12 = 90,
|
|
Reg13 = 91,
|
|
Reg14 = 92,
|
|
Reg15 = 93,
|
|
Reg16 = 94,
|
|
Reg17 = 95,
|
|
Reg18 = 96,
|
|
Reg19 = 97,
|
|
Reg20 = 98,
|
|
Reg21 = 99,
|
|
Reg22 = 100,
|
|
Reg23 = 101,
|
|
Reg24 = 102,
|
|
Reg25 = 103,
|
|
Reg26 = 104,
|
|
Reg27 = 105,
|
|
Reg28 = 106,
|
|
Reg29 = 107,
|
|
Reg30 = 108,
|
|
Reg31 = 109,
|
|
Breg0 = 110,
|
|
Breg1 = 111,
|
|
Breg2 = 112,
|
|
Breg3 = 113,
|
|
Breg4 = 114,
|
|
Breg5 = 115,
|
|
Breg6 = 116,
|
|
Breg7 = 117,
|
|
Breg8 = 118,
|
|
Breg9 = 119,
|
|
Breg10 = 120,
|
|
Breg11 = 121,
|
|
Breg12 = 122,
|
|
Breg13 = 123,
|
|
Breg14 = 124,
|
|
Breg15 = 125,
|
|
Breg16 = 126,
|
|
Breg17 = 127,
|
|
Breg18 = 128,
|
|
Breg19 = 129,
|
|
Breg20 = 130,
|
|
Breg21 = 131,
|
|
Breg22 = 132,
|
|
Breg23 = 133,
|
|
Breg24 = 134,
|
|
Breg25 = 135,
|
|
Breg26 = 136,
|
|
Breg27 = 137,
|
|
Breg28 = 138,
|
|
Breg29 = 139,
|
|
Breg30 = 140,
|
|
Breg31 = 141,
|
|
Regx = 142,
|
|
Fbreg = 143,
|
|
Bregx = 144,
|
|
Piece = 145,
|
|
DerefSize = 146,
|
|
XderefSize = 147,
|
|
Nop = 148,
|
|
PushObjectAddress = 149,
|
|
Call2 = 150,
|
|
Call4 = 151,
|
|
CallRef = 152,
|
|
FormTlsAddress = 153,
|
|
CallFrameCfa = 154,
|
|
ImplicitValue = 155,
|
|
ImplicitPointer = 156,
|
|
Addrx = 157,
|
|
Constx = 158,
|
|
EntryValue = 159,
|
|
ConstTypeOp = 160,
|
|
RegvalType = 161,
|
|
DerefType = 162,
|
|
XderefType = 163,
|
|
Reinterpret = 164,
|
|
LLVMArg = 165,
|
|
ImplicitPointerTag = 166,
|
|
TagOffset = 167,
|
|
|
|
#ifdef SPIRV_HAS_DIOP_DIEXPRESSION
|
|
// AMD-specific debug operations, padded.
|
|
Poisoned = 10000,
|
|
|
|
// DIOp-based debug operations
|
|
DIOp_Begin,
|
|
#define HANDLE_OP_NAME(Name) \
|
|
DIOp##Name = DIOp_Begin + llvm::DIOp::Name::getBitcodeID(),
|
|
#include "llvm/IR/DIExprOps.def"
|
|
#else
|
|
AMDExtensions_Begin = 10000,
|
|
#endif
|
|
};
|
|
|
|
enum ImportedEntityTag {
|
|
ImportedModule = 0,
|
|
ImportedDeclaration = 1,
|
|
};
|
|
|
|
enum FileChecksumKind {
|
|
MD5 = 0,
|
|
SHA1 = 1,
|
|
SHA256 = 2,
|
|
};
|
|
|
|
namespace Operand {
|
|
|
|
namespace CompilationUnit {
|
|
enum {
|
|
SPIRVDebugInfoVersionIdx = 0,
|
|
DWARFVersionIdx = 1,
|
|
SourceIdx = 2,
|
|
LanguageIdx = 3,
|
|
// For NonSemantic.Shader.DebugInfo.200
|
|
ProducerIdx = 4,
|
|
MinOperandCount = 4
|
|
};
|
|
}
|
|
|
|
namespace Source {
|
|
enum {
|
|
FileIdx = 0,
|
|
TextIdx = 1,
|
|
// For NonSemantic.Shader.DebugInfo.200
|
|
ChecksumKind = 1,
|
|
ChecksumValue = 2,
|
|
TextNonSemIdx = 3,
|
|
MinOperandCount = 1,
|
|
MaxOperandCount = 4
|
|
};
|
|
}
|
|
|
|
namespace BuildIdentifier {
|
|
enum {
|
|
IdentifierIdx = 0,
|
|
FlagsIdx = 1,
|
|
OperandCount = 2
|
|
};
|
|
}
|
|
|
|
namespace StoragePath {
|
|
enum {
|
|
PathIdx = 0,
|
|
OperandCount = 1
|
|
};
|
|
}
|
|
|
|
namespace TypeBasic {
|
|
enum {
|
|
NameIdx = 0,
|
|
SizeIdx = 1,
|
|
EncodingIdx = 2,
|
|
// For NonSemantic Specs
|
|
FlagsIdx = 3,
|
|
OperandCountOCL = 3,
|
|
OperandCountNonSemantic = 4
|
|
};
|
|
}
|
|
|
|
namespace TypePointer {
|
|
enum {
|
|
BaseTypeIdx = 0,
|
|
StorageClassIdx = 1,
|
|
FlagsIdx = 2,
|
|
OperandCount = 3
|
|
};
|
|
}
|
|
|
|
namespace TypeQualifier {
|
|
enum {
|
|
BaseTypeIdx = 0,
|
|
QualifierIdx = 1,
|
|
OperandCount = 2
|
|
};
|
|
}
|
|
|
|
namespace TypeArray {
|
|
enum {
|
|
BaseTypeIdx = 0,
|
|
ComponentCountIdx = 1,
|
|
SubrangesIdx = 1,
|
|
MinOperandCount = 2
|
|
};
|
|
}
|
|
|
|
namespace TypeArrayDynamic {
|
|
enum {
|
|
BaseTypeIdx = 0,
|
|
DataLocationIdx = 1,
|
|
AssociatedIdx = 2,
|
|
AllocatedIdx = 3,
|
|
RankIdx = 4,
|
|
SubrangesIdx = 5,
|
|
MinOperandCount = 6
|
|
};
|
|
}
|
|
|
|
namespace TypeVector = TypeArray;
|
|
|
|
namespace TypeSubrange {
|
|
enum {
|
|
LowerBoundIdx = 0,
|
|
UpperBoundIdx = 1,
|
|
CountIdx = 2,
|
|
StrideIdx = 3,
|
|
MinOperandCount = 3,
|
|
MaxOperandCount = 4
|
|
};
|
|
}
|
|
|
|
namespace TypeString {
|
|
enum {
|
|
NameIdx = 0,
|
|
BaseTypeIdx = 1,
|
|
DataLocationIdx = 2,
|
|
SizeIdx = 3,
|
|
LengthAddrIdx = 4,
|
|
LengthSizeIdx = 5,
|
|
MinOperandCount = 5
|
|
};
|
|
}
|
|
|
|
namespace Typedef {
|
|
enum {
|
|
NameIdx = 0,
|
|
BaseTypeIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
ParentIdx = 5,
|
|
OperandCount = 6
|
|
};
|
|
}
|
|
|
|
namespace TypeFunction {
|
|
enum {
|
|
FlagsIdx = 0,
|
|
ReturnTypeIdx = 1,
|
|
FirstParameterIdx = 2,
|
|
MinOperandCount = 2
|
|
};
|
|
}
|
|
|
|
namespace TypeEnum {
|
|
enum {
|
|
NameIdx = 0,
|
|
UnderlyingTypeIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
ParentIdx = 5,
|
|
SizeIdx = 6,
|
|
FlagsIdx = 7,
|
|
FirstEnumeratorIdx = 8,
|
|
MinOperandCount = 8
|
|
};
|
|
}
|
|
|
|
namespace TypeComposite {
|
|
enum {
|
|
NameIdx = 0,
|
|
TagIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
ParentIdx = 5,
|
|
LinkageNameIdx = 6,
|
|
SizeIdx = 7,
|
|
FlagsIdx = 8,
|
|
FirstMemberIdx = 9,
|
|
MinOperandCount = 9
|
|
};
|
|
}
|
|
|
|
namespace TypeMember {
|
|
namespace OpenCL {
|
|
enum {
|
|
NameIdx = 0,
|
|
TypeIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
ParentIdx = 5,
|
|
OffsetIdx = 6,
|
|
SizeIdx = 7,
|
|
FlagsIdx = 8,
|
|
ValueIdx = 9,
|
|
MinOperandCount = 9
|
|
};
|
|
}
|
|
|
|
namespace NonSemantic {
|
|
enum {
|
|
NameIdx = 0,
|
|
TypeIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
OffsetIdx = 5,
|
|
SizeIdx = 6,
|
|
FlagsIdx = 7,
|
|
ValueIdx = 8,
|
|
MinOperandCount = 8
|
|
};
|
|
}
|
|
} // namespace TypeMember
|
|
|
|
namespace TypeInheritance {
|
|
namespace NonSemantic {
|
|
enum {
|
|
ParentIdx = 0,
|
|
OffsetIdx = 1,
|
|
SizeIdx = 2,
|
|
FlagsIdx = 3,
|
|
OperandCount = 4
|
|
};
|
|
}
|
|
|
|
namespace OpenCL {
|
|
enum {
|
|
ChildIdx = 0,
|
|
ParentIdx = 1,
|
|
OffsetIdx = 2,
|
|
SizeIdx = 3,
|
|
FlagsIdx = 4,
|
|
OperandCount = 5
|
|
};
|
|
}
|
|
} // namespace TypeInheritance
|
|
|
|
namespace TypePtrToMember {
|
|
enum {
|
|
MemberTypeIdx = 0,
|
|
ParentIdx = 1,
|
|
OperandCount = 2
|
|
};
|
|
}
|
|
|
|
namespace TypeTemplate {
|
|
enum {
|
|
TargetIdx = 0,
|
|
FirstParameterIdx = 1,
|
|
MinOperandCount = 1
|
|
};
|
|
}
|
|
|
|
namespace TypeTemplateParameter {
|
|
enum {
|
|
NameIdx = 0,
|
|
TypeIdx = 1,
|
|
ValueIdx = 2,
|
|
SourceIdx = 3,
|
|
LineIdx = 4,
|
|
ColumnIdx = 5,
|
|
OperandCount = 6
|
|
};
|
|
}
|
|
|
|
namespace TypeTemplateTemplateParameter {
|
|
enum {
|
|
NameIdx = 0,
|
|
TemplateNameIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
OperandCount = 5
|
|
};
|
|
}
|
|
|
|
namespace TypeTemplateParameterPack {
|
|
enum {
|
|
NameIdx = 0,
|
|
SourceIdx = 1,
|
|
LineIdx = 2,
|
|
ColumnIdx = 3,
|
|
FirstParameterIdx = 4,
|
|
MinOperandCount = 4
|
|
};
|
|
}
|
|
|
|
namespace GlobalVariable {
|
|
enum {
|
|
NameIdx = 0,
|
|
TypeIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
ParentIdx = 5,
|
|
LinkageNameIdx = 6,
|
|
VariableIdx = 7,
|
|
FlagsIdx = 8,
|
|
StaticMemberDeclarationIdx = 9,
|
|
MinOperandCount = 9,
|
|
DIOpBasedExprIdx = 10,
|
|
MaxOperandCount = 11,
|
|
};
|
|
}
|
|
|
|
namespace FunctionDeclaration {
|
|
enum {
|
|
NameIdx = 0,
|
|
TypeIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
ParentIdx = 5,
|
|
LinkageNameIdx = 6,
|
|
FlagsIdx = 7,
|
|
OperandCount = 8
|
|
};
|
|
}
|
|
|
|
namespace Function {
|
|
enum {
|
|
NameIdx = 0,
|
|
TypeIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
ParentIdx = 5,
|
|
LinkageNameIdx = 6,
|
|
FlagsIdx = 7,
|
|
ScopeLineIdx = 8,
|
|
FunctionIdIdx = 9,
|
|
DeclarationIdx = 10,
|
|
MinOperandCount = 10,
|
|
|
|
// Only for NonSemantic.Shader.DebugInfo.*
|
|
// No operand FunctionId
|
|
DeclarationNonSemIdx = 9,
|
|
MinOperandCountNonSem = 9,
|
|
// Only for NonSemantic.Shader.DebugInfo.200
|
|
TargetFunctionNameIdx = 10,
|
|
};
|
|
}
|
|
|
|
namespace FunctionDefinition {
|
|
enum {
|
|
FunctionIdx = 0,
|
|
DefinitionIdx = 1,
|
|
OperandCount = 2
|
|
};
|
|
}
|
|
|
|
namespace SourceContinued {
|
|
enum {
|
|
TextIdx = 0,
|
|
OperandCount = 1
|
|
};
|
|
}
|
|
|
|
namespace DebugLine {
|
|
enum {
|
|
SourceIdx = 0,
|
|
StartIdx = 1,
|
|
EndIdx = 2,
|
|
ColumnStartIdx = 3,
|
|
ColumnEndIdx = 4,
|
|
OperandCount = 5
|
|
};
|
|
}
|
|
|
|
namespace DebugNoLine {
|
|
enum {
|
|
OperandCount = 0
|
|
};
|
|
}
|
|
|
|
namespace EntryPoint {
|
|
enum {
|
|
EntryPointIdx = 0,
|
|
CompilationUnitIdx = 1,
|
|
CompilerSignatureIdx = 2,
|
|
CommandLineArgsIdx = 3,
|
|
OperandCount = 4
|
|
};
|
|
}
|
|
|
|
namespace LexicalBlock {
|
|
enum {
|
|
SourceIdx = 0,
|
|
LineIdx = 1,
|
|
ColumnIdx = 2,
|
|
ParentIdx = 3,
|
|
MinOperandCount = 4,
|
|
NameIdx = 4,
|
|
InlineNamespaceIdx = 5,
|
|
};
|
|
}
|
|
|
|
namespace LexicalBlockDiscriminator {
|
|
enum {
|
|
SourceIdx = 0,
|
|
DiscriminatorIdx = 1,
|
|
ParentIdx = 2,
|
|
OperandCount = 3
|
|
};
|
|
}
|
|
|
|
namespace Scope {
|
|
enum {
|
|
ScopeIdx = 0,
|
|
InlinedAtIdx = 1,
|
|
MinOperandCount = 1
|
|
};
|
|
}
|
|
|
|
namespace NoScope {
|
|
// No operands
|
|
}
|
|
|
|
namespace InlinedAt {
|
|
namespace OpenCL {
|
|
enum {
|
|
LineIdx = 0,
|
|
ScopeIdx = 1,
|
|
InlinedIdx = 2,
|
|
MinOperandCount = 2
|
|
};
|
|
} // namespace OpenCL
|
|
|
|
namespace NonSemantic {
|
|
enum {
|
|
LineIdx = 0,
|
|
ColumnIdx = 1,
|
|
ScopeIdx = 2,
|
|
InlinedIdx = 3,
|
|
MinOperandCount = 3
|
|
};
|
|
} // namespace NonSemantic
|
|
} // namespace ImportedEntity
|
|
|
|
namespace LocalVariable {
|
|
enum {
|
|
NameIdx = 0,
|
|
TypeIdx = 1,
|
|
SourceIdx = 2,
|
|
LineIdx = 3,
|
|
ColumnIdx = 4,
|
|
ParentIdx = 5,
|
|
FlagsIdx = 6,
|
|
ArgNumberIdx = 7,
|
|
MinOperandCount = 7
|
|
};
|
|
}
|
|
|
|
namespace InlinedVariable {
|
|
enum {
|
|
VariableIdx = 0,
|
|
InlinedIdx = 1,
|
|
OperandCount = 2
|
|
};
|
|
}
|
|
|
|
namespace DebugDeclare {
|
|
enum {
|
|
DebugLocalVarIdx = 0,
|
|
VariableIdx = 1,
|
|
ExpressionIdx = 2,
|
|
OperandCount = 3
|
|
};
|
|
}
|
|
|
|
namespace DebugValue {
|
|
enum {
|
|
DebugLocalVarIdx = 0,
|
|
ValueIdx = 1,
|
|
ExpressionIdx = 2,
|
|
FirstIndexOperandIdx = 3,
|
|
MinOperandCount = 3
|
|
};
|
|
}
|
|
|
|
namespace Operation {
|
|
enum {
|
|
OpCodeIdx = 0
|
|
};
|
|
static std::unordered_map<ExpressionOpCode, unsigned> OpCountMap {
|
|
{ Deref, 1 },
|
|
{ Plus, 1 },
|
|
{ Minus, 1 },
|
|
{ PlusUconst, 2 },
|
|
{ BitPiece, 3 },
|
|
{ Swap, 1 },
|
|
{ Xderef, 1 },
|
|
{ StackValue, 1 },
|
|
{ Constu, 2 },
|
|
{ Fragment, 3 },
|
|
{ Convert, 3 },
|
|
{ Addr, 2 },
|
|
{ Const1u, 2 },
|
|
{ Const1s, 2 },
|
|
{ Const2u, 2 },
|
|
{ Const2s, 2 },
|
|
{ Const4u, 2 },
|
|
{ Const4s, 2 },
|
|
{ Const8u, 2 },
|
|
{ Const8s, 2 },
|
|
{ Consts, 2 },
|
|
{ Dup, 1 },
|
|
{ Drop, 1 },
|
|
{ Over, 1 },
|
|
{ Pick, 1 },
|
|
{ Rot, 1 },
|
|
{ Abs, 1 },
|
|
{ And, 1 },
|
|
{ Div, 1 },
|
|
{ Mod, 1 },
|
|
{ Mul, 1 },
|
|
{ Neg, 1 },
|
|
{ Not, 1 },
|
|
{ Or, 1 },
|
|
{ Shl, 1 },
|
|
{ Shr, 1 },
|
|
{ Shra, 1 },
|
|
{ Xor, 1 },
|
|
{ Bra, 2 },
|
|
{ Eq, 1 },
|
|
{ Ge, 1 },
|
|
{ Gt, 1 },
|
|
{ Le, 1 },
|
|
{ Lt, 1 },
|
|
{ Ne, 1 },
|
|
{ Skip, 2 },
|
|
{ Lit0, 1 },
|
|
{ Lit1, 1 },
|
|
{ Lit2, 1 },
|
|
{ Lit3, 1 },
|
|
{ Lit4, 1 },
|
|
{ Lit5, 1 },
|
|
{ Lit6, 1 },
|
|
{ Lit7, 1 },
|
|
{ Lit8, 1 },
|
|
{ Lit9, 1 },
|
|
{ Lit10, 1 },
|
|
{ Lit11, 1 },
|
|
{ Lit12, 1 },
|
|
{ Lit13, 1 },
|
|
{ Lit14, 1 },
|
|
{ Lit15, 1 },
|
|
{ Lit16, 1 },
|
|
{ Lit17, 1 },
|
|
{ Lit18, 1 },
|
|
{ Lit19, 1 },
|
|
{ Lit20, 1 },
|
|
{ Lit21, 1 },
|
|
{ Lit22, 1 },
|
|
{ Lit23, 1 },
|
|
{ Lit24, 1 },
|
|
{ Lit25, 1 },
|
|
{ Lit26, 1 },
|
|
{ Lit27, 1 },
|
|
{ Lit28, 1 },
|
|
{ Lit29, 1 },
|
|
{ Lit30, 1 },
|
|
{ Lit31, 1 },
|
|
{ Reg0, 1 },
|
|
{ Reg1, 1 },
|
|
{ Reg2, 1 },
|
|
{ Reg3, 1 },
|
|
{ Reg4, 1 },
|
|
{ Reg5, 1 },
|
|
{ Reg6, 1 },
|
|
{ Reg7, 1 },
|
|
{ Reg8, 1 },
|
|
{ Reg9, 1 },
|
|
{ Reg10, 1 },
|
|
{ Reg11, 1 },
|
|
{ Reg12, 1 },
|
|
{ Reg13, 1 },
|
|
{ Reg14, 1 },
|
|
{ Reg15, 1 },
|
|
{ Reg16, 1 },
|
|
{ Reg17, 1 },
|
|
{ Reg18, 1 },
|
|
{ Reg19, 1 },
|
|
{ Reg20, 1 },
|
|
{ Reg21, 1 },
|
|
{ Reg22, 1 },
|
|
{ Reg23, 1 },
|
|
{ Reg24, 1 },
|
|
{ Reg25, 1 },
|
|
{ Reg26, 1 },
|
|
{ Reg27, 1 },
|
|
{ Reg28, 1 },
|
|
{ Reg29, 1 },
|
|
{ Reg30, 1 },
|
|
{ Reg31, 1 },
|
|
{ Breg0, 2 },
|
|
{ Breg1, 2 },
|
|
{ Breg2, 2 },
|
|
{ Breg3, 2 },
|
|
{ Breg4, 2 },
|
|
{ Breg5, 2 },
|
|
{ Breg6, 2 },
|
|
{ Breg7, 2 },
|
|
{ Breg8, 2 },
|
|
{ Breg9, 2 },
|
|
{ Breg10, 2 },
|
|
{ Breg11, 2 },
|
|
{ Breg12, 2 },
|
|
{ Breg13, 2 },
|
|
{ Breg14, 2 },
|
|
{ Breg15, 2 },
|
|
{ Breg16, 2 },
|
|
{ Breg17, 2 },
|
|
{ Breg18, 2 },
|
|
{ Breg19, 2 },
|
|
{ Breg20, 2 },
|
|
{ Breg21, 2 },
|
|
{ Breg22, 2 },
|
|
{ Breg23, 2 },
|
|
{ Breg24, 2 },
|
|
{ Breg25, 2 },
|
|
{ Breg26, 2 },
|
|
{ Breg27, 2 },
|
|
{ Breg28, 2 },
|
|
{ Breg29, 2 },
|
|
{ Breg30, 2 },
|
|
{ Breg31, 2 },
|
|
{ Regx, 2 },
|
|
{ Fbreg, 1 },
|
|
{ Bregx, 3 },
|
|
{ Piece, 2 },
|
|
{ DerefSize, 2 },
|
|
{ XderefSize, 2 },
|
|
{ Nop, 1 },
|
|
{ PushObjectAddress, 1 },
|
|
{ Call2, 2 },
|
|
{ Call4, 2 },
|
|
{ CallRef, 2 },
|
|
{ FormTlsAddress, 1 },
|
|
{ CallFrameCfa, 1 },
|
|
{ ImplicitValue, 3 },
|
|
{ ImplicitPointer, 3 },
|
|
{ Addrx, 2 },
|
|
{ Constx, 2 },
|
|
{ EntryValue, 3 },
|
|
{ ConstTypeOp, 4 },
|
|
{ RegvalType, 3 },
|
|
{ DerefType, 3 },
|
|
{ XderefType, 3 },
|
|
{ Reinterpret, 2 },
|
|
{ LLVMArg, 2 },
|
|
{ ImplicitPointerTag, 2 },
|
|
{ TagOffset, 2 },
|
|
|
|
#ifdef SPIRV_HAS_DIOP_DIEXPRESSION
|
|
{ Poisoned, 1 },
|
|
|
|
#define HANDLE_OP0(NAME) { DIOp##NAME, 1 },
|
|
#define HANDLE_OP1(NAME, T1, N1) { DIOp##NAME, 2 },
|
|
#define HANDLE_OP2(NAME, T1, N1, T2, N2) { DIOp##NAME, 3 },
|
|
#include "llvm/IR/DIExprOps.def"
|
|
#endif
|
|
};
|
|
}
|
|
|
|
namespace ImportedEntity {
|
|
namespace OpenCL {
|
|
// it's bugged version, note 2nd index is missing
|
|
// FIXME: need to remove it after some graceful period
|
|
enum {
|
|
NameIdx = 0,
|
|
TagIdx = 1,
|
|
SourceIdx = 3,
|
|
EntityIdx = 4,
|
|
LineIdx = 5,
|
|
ColumnIdx = 6,
|
|
ParentIdx = 7,
|
|
OperandCount = 8
|
|
};
|
|
} // namespace OpenCL
|
|
namespace NonSemantic {
|
|
enum {
|
|
NameIdx = 0,
|
|
TagIdx = 1,
|
|
SourceIdx = 2,
|
|
EntityIdx = 3,
|
|
LineIdx = 4,
|
|
ColumnIdx = 5,
|
|
ParentIdx = 6,
|
|
OperandCount = 7
|
|
};
|
|
} // namespace NonSemantic
|
|
} // namespace ImportedEntity
|
|
|
|
namespace MacroDef {
|
|
enum {
|
|
SourceIdx = 0,
|
|
LineIdx = 1,
|
|
NameIdx = 2,
|
|
ValueIdx = 3,
|
|
MinOperandCount = 3
|
|
};
|
|
}
|
|
|
|
namespace MacroUndef {
|
|
enum {
|
|
SourceIdx = 0,
|
|
LineIdx = 1,
|
|
MacroIdx = 2,
|
|
OperandCount = 3
|
|
};
|
|
}
|
|
|
|
namespace ModuleINTEL {
|
|
enum {
|
|
NameIdx = 0,
|
|
SourceIdx = 1,
|
|
LineIdx = 2,
|
|
ParentIdx = 3,
|
|
ConfigMacrosIdx = 4,
|
|
IncludePathIdx = 5,
|
|
ApiNotesIdx = 6,
|
|
IsDeclIdx = 7,
|
|
OperandCount = 8
|
|
};
|
|
}
|
|
|
|
// helper function to get parent scope of debug instruction, to be used
|
|
// to determine with which compile unit the particular instruction relates
|
|
inline bool hasDbgInstParentScopeIdx(
|
|
const uint32_t Kind, uint32_t &ParentScopeIdx,
|
|
const SPIRV::SPIRVExtInstSetKind ExtKind = SPIRV::SPIRVEIS_OpenCL) {
|
|
switch (Kind) {
|
|
case SPIRVDebug::Typedef:
|
|
ParentScopeIdx = Typedef::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::TypeEnum:
|
|
ParentScopeIdx = TypeEnum::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::TypeComposite:
|
|
ParentScopeIdx = TypeMember::OpenCL::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::TypeInheritance:
|
|
if (ExtKind == SPIRV::SPIRVEIS_OpenCL_DebugInfo_100)
|
|
ParentScopeIdx = TypeInheritance::OpenCL::ParentIdx;
|
|
else
|
|
ParentScopeIdx = TypeInheritance::NonSemantic::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::TypePtrToMember:
|
|
ParentScopeIdx = TypePtrToMember::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::Function:
|
|
ParentScopeIdx = Function::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::EntryPoint:
|
|
ParentScopeIdx = EntryPoint::CompilationUnitIdx;
|
|
return true;
|
|
case SPIRVDebug::LexicalBlock:
|
|
ParentScopeIdx = LexicalBlock::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::LexicalBlockDiscriminator:
|
|
ParentScopeIdx = LexicalBlockDiscriminator::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::Scope:
|
|
ParentScopeIdx = Scope::ScopeIdx;
|
|
return true;
|
|
case SPIRVDebug::InlinedAt:
|
|
if (ExtKind == SPIRV::SPIRVEIS_NonSemantic_Shader_DebugInfo_200)
|
|
ParentScopeIdx = InlinedAt::NonSemantic::ScopeIdx;
|
|
else
|
|
ParentScopeIdx = InlinedAt::OpenCL::ScopeIdx;
|
|
return true;
|
|
case SPIRVDebug::LocalVariable:
|
|
ParentScopeIdx = LocalVariable::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::ImportedEntity:
|
|
if (ExtKind == SPIRV::SPIRVEIS_OpenCL_DebugInfo_100)
|
|
ParentScopeIdx = ImportedEntity::OpenCL::ParentIdx;
|
|
else
|
|
ParentScopeIdx = ImportedEntity::NonSemantic::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::ModuleINTEL:
|
|
ParentScopeIdx = ModuleINTEL::ParentIdx;
|
|
return true;
|
|
case SPIRVDebug::Module:
|
|
ParentScopeIdx = ModuleINTEL::ParentIdx;
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
} // namespace Operand
|
|
} // namespace SPIRVDebug
|
|
|
|
using namespace llvm;
|
|
|
|
inline spv::SourceLanguage convertDWARFSourceLangToSPIRV(dwarf::SourceLanguage DwarfLang) {
|
|
switch (DwarfLang) {
|
|
// When updating this function, make sure to also
|
|
// update convertSPIRVSourceLangToDWARF()
|
|
case dwarf::SourceLanguage::DW_LANG_C_plus_plus_17:
|
|
case dwarf::SourceLanguage::DW_LANG_C_plus_plus_14:
|
|
case dwarf::SourceLanguage::DW_LANG_C_plus_plus:
|
|
return spv::SourceLanguage::SourceLanguageCPP_for_OpenCL;
|
|
case dwarf::SourceLanguage::DW_LANG_C99:
|
|
case dwarf::SourceLanguage::DW_LANG_OpenCL:
|
|
return spv::SourceLanguage::SourceLanguageOpenCL_C;
|
|
default:
|
|
return spv::SourceLanguage::SourceLanguageUnknown;
|
|
}
|
|
}
|
|
|
|
inline bool isSPIRVSourceLangValid(unsigned SourceLang) {
|
|
switch (SourceLang) {
|
|
// When updating this function, make sure to also
|
|
// update convertSPIRVSourceLangToDWARF()
|
|
case spv::SourceLanguage::SourceLanguageOpenCL_CPP:
|
|
case spv::SourceLanguage::SourceLanguageCPP_for_OpenCL:
|
|
case spv::SourceLanguage::SourceLanguageOpenCL_C:
|
|
case spv::SourceLanguage::SourceLanguageESSL:
|
|
case spv::SourceLanguage::SourceLanguageGLSL:
|
|
case spv::SourceLanguage::SourceLanguageHLSL:
|
|
case spv::SourceLanguage::SourceLanguageUnknown:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
inline dwarf::SourceLanguage convertSPIRVSourceLangToDWARF(unsigned SourceLang) {
|
|
switch (SourceLang) {
|
|
// When updating this function, make sure to also
|
|
// update convertDWARFSourceLangToSPIRV()
|
|
case spv::SourceLanguage::SourceLanguageOpenCL_CPP:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus_14;
|
|
case spv::SourceLanguage::SourceLanguageCPP_for_OpenCL:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus_17;
|
|
case spv::SourceLanguage::SourceLanguageOpenCL_C:
|
|
case spv::SourceLanguage::SourceLanguageESSL:
|
|
case spv::SourceLanguage::SourceLanguageGLSL:
|
|
case spv::SourceLanguage::SourceLanguageHLSL:
|
|
case spv::SourceLanguage::SourceLanguageUnknown:
|
|
default:
|
|
return dwarf::DW_LANG_OpenCL;
|
|
}
|
|
}
|
|
|
|
inline spv::SourceLanguage convertDWARFSourceLangToSPIRVNonSemanticDbgInfo(
|
|
dwarf::SourceLanguage DwarfLang) {
|
|
switch (DwarfLang) {
|
|
// When updating this function, make sure to also
|
|
// update convertSPIRVSourceLangToDWARFNonSemanticDbgInfo()
|
|
case dwarf::SourceLanguage::DW_LANG_OpenCL:
|
|
return spv::SourceLanguage::SourceLanguageOpenCL_C;
|
|
|
|
case dwarf::SourceLanguage::DW_LANG_C_plus_plus_20:
|
|
return spv::internal::SourceLanguageCPP20;
|
|
case dwarf::SourceLanguage::DW_LANG_C_plus_plus_17:
|
|
return spv::internal::SourceLanguageCPP17;
|
|
case dwarf::SourceLanguage::DW_LANG_C_plus_plus_14:
|
|
return spv::internal::SourceLanguageCPP14;
|
|
case dwarf::SourceLanguage::DW_LANG_C_plus_plus_11:
|
|
return spv::internal::SourceLanguageCPP11;
|
|
case dwarf::SourceLanguage::DW_LANG_C_plus_plus_03:
|
|
return spv::internal::SourceLanguageCPP03;
|
|
case dwarf::SourceLanguage::DW_LANG_C_plus_plus:
|
|
return spv::internal::SourceLanguageCPP;
|
|
|
|
case dwarf::SourceLanguage::DW_LANG_C:
|
|
return spv::internal::SourceLanguageC;
|
|
case dwarf::SourceLanguage::DW_LANG_C99:
|
|
return spv::internal::SourceLanguageC99;
|
|
case dwarf::SourceLanguage::DW_LANG_C11:
|
|
return spv::internal::SourceLanguageC11;
|
|
case dwarf::SourceLanguage::DW_LANG_C17:
|
|
return spv::internal::SourceLanguageC17;
|
|
|
|
case dwarf::SourceLanguage::DW_LANG_Python:
|
|
return spv::internal::SourceLanguagePython;
|
|
case dwarf::SourceLanguage::DW_LANG_Julia:
|
|
return spv::internal::SourceLanguageJulia;
|
|
case dwarf::SourceLanguage::DW_LANG_Rust:
|
|
return spv::internal::SourceLanguageRust;
|
|
case dwarf::SourceLanguage::DW_LANG_D:
|
|
return spv::internal::SourceLanguageD;
|
|
|
|
case dwarf::SourceLanguage::DW_LANG_Fortran77:
|
|
return spv::internal::SourceLanguageFortran77;
|
|
case dwarf::SourceLanguage::DW_LANG_Fortran90:
|
|
return spv::internal::SourceLanguageFortran90;
|
|
case dwarf::SourceLanguage::DW_LANG_Fortran95:
|
|
return spv::internal::SourceLanguageFortran95;
|
|
case dwarf::SourceLanguage::DW_LANG_Fortran03:
|
|
return spv::internal::SourceLanguageFortran2003;
|
|
case dwarf::SourceLanguage::DW_LANG_Fortran08:
|
|
return spv::internal::SourceLanguageFortran2008;
|
|
case dwarf::SourceLanguage::DW_LANG_Fortran18:
|
|
return spv::internal::SourceLanguageFortran2018;
|
|
default:
|
|
return spv::SourceLanguage::SourceLanguageUnknown;
|
|
}
|
|
}
|
|
|
|
inline dwarf::SourceLanguage
|
|
convertSPIRVSourceLangToDWARFNonSemanticDbgInfo(unsigned SourceLang) {
|
|
switch (SourceLang) {
|
|
// When updating this function, make sure to also
|
|
// update convertDWARFSourceLangToSPIRVNonSemanticDbgInfo()
|
|
case spv::SourceLanguage::SourceLanguageOpenCL_CPP:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus_14;
|
|
case spv::SourceLanguage::SourceLanguageCPP_for_OpenCL:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus_17;
|
|
|
|
case spv::internal::SourceLanguageCPP20:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus_20;
|
|
case spv::internal::SourceLanguageCPP17:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus_17;
|
|
case spv::internal::SourceLanguageCPP14:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus_14;
|
|
case spv::internal::SourceLanguageCPP11:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus_11;
|
|
case spv::internal::SourceLanguageCPP03:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus_03;
|
|
case spv::internal::SourceLanguageCPP:
|
|
return dwarf::SourceLanguage::DW_LANG_C_plus_plus;
|
|
|
|
case spv::internal::SourceLanguageC:
|
|
return dwarf::SourceLanguage::DW_LANG_C;
|
|
case spv::internal::SourceLanguageC99:
|
|
return dwarf::SourceLanguage::DW_LANG_C99;
|
|
case spv::internal::SourceLanguageC11:
|
|
return dwarf::SourceLanguage::DW_LANG_C11;
|
|
case spv::internal::SourceLanguageC17:
|
|
return dwarf::SourceLanguage::DW_LANG_C17;
|
|
|
|
case spv::internal::SourceLanguagePython:
|
|
return dwarf::SourceLanguage::DW_LANG_Python;
|
|
case spv::internal::SourceLanguageJulia:
|
|
return dwarf::SourceLanguage::DW_LANG_Julia;
|
|
case spv::internal::SourceLanguageRust:
|
|
return dwarf::SourceLanguage::DW_LANG_Rust;
|
|
case spv::internal::SourceLanguageD:
|
|
return dwarf::SourceLanguage::DW_LANG_D;
|
|
|
|
case spv::internal::SourceLanguageFortran77:
|
|
return dwarf::SourceLanguage::DW_LANG_Fortran77;
|
|
case spv::internal::SourceLanguageFortran90:
|
|
return dwarf::SourceLanguage::DW_LANG_Fortran90;
|
|
case spv::internal::SourceLanguageFortran95:
|
|
return dwarf::SourceLanguage::DW_LANG_Fortran95;
|
|
case spv::internal::SourceLanguageFortran2003:
|
|
return dwarf::SourceLanguage::DW_LANG_Fortran03;
|
|
case spv::internal::SourceLanguageFortran2008:
|
|
return dwarf::SourceLanguage::DW_LANG_Fortran08;
|
|
case spv::internal::SourceLanguageFortran2018:
|
|
return dwarf::SourceLanguage::DW_LANG_Fortran18;
|
|
|
|
case spv::SourceLanguage::SourceLanguageOpenCL_C:
|
|
case spv::SourceLanguage::SourceLanguageESSL:
|
|
case spv::SourceLanguage::SourceLanguageGLSL:
|
|
case spv::SourceLanguage::SourceLanguageHLSL:
|
|
case spv::SourceLanguage::SourceLanguageUnknown:
|
|
default:
|
|
return dwarf::DW_LANG_OpenCL;
|
|
}
|
|
}
|
|
|
|
namespace SPIRV {
|
|
typedef SPIRVMap<dwarf::TypeKind, SPIRVDebug::EncodingTag> DbgEncodingMap;
|
|
template <>
|
|
inline void DbgEncodingMap::init() {
|
|
add(static_cast<dwarf::TypeKind>(0), SPIRVDebug::Unspecified);
|
|
add(dwarf::DW_ATE_address, SPIRVDebug::Address);
|
|
add(dwarf::DW_ATE_boolean, SPIRVDebug::Boolean);
|
|
add(dwarf::DW_ATE_float, SPIRVDebug::Float);
|
|
add(dwarf::DW_ATE_signed, SPIRVDebug::Signed);
|
|
add(dwarf::DW_ATE_signed_char, SPIRVDebug::SignedChar);
|
|
add(dwarf::DW_ATE_unsigned, SPIRVDebug::Unsigned);
|
|
add(dwarf::DW_ATE_unsigned_char, SPIRVDebug::UnsignedChar);
|
|
add(dwarf::DW_ATE_complex_float, SPIRVDebug::Complex);
|
|
}
|
|
|
|
typedef SPIRVMap<dwarf::Tag, SPIRVDebug::TypeQualifierTag> DbgTypeQulifierMap;
|
|
template <>
|
|
inline void DbgTypeQulifierMap::init() {
|
|
add(dwarf::DW_TAG_const_type, SPIRVDebug::ConstType);
|
|
add(dwarf::DW_TAG_volatile_type, SPIRVDebug::VolatileType);
|
|
add(dwarf::DW_TAG_restrict_type, SPIRVDebug::RestrictType);
|
|
add(dwarf::DW_TAG_atomic_type, SPIRVDebug::AtomicType);
|
|
}
|
|
|
|
typedef SPIRVMap<dwarf::Tag, SPIRVDebug::CompositeTypeTag> DbgCompositeTypeMap;
|
|
template <>
|
|
inline void DbgCompositeTypeMap::init() {
|
|
add(dwarf::DW_TAG_class_type, SPIRVDebug::Class);
|
|
add(dwarf::DW_TAG_structure_type, SPIRVDebug::Structure);
|
|
add(dwarf::DW_TAG_union_type, SPIRVDebug::Union);
|
|
}
|
|
|
|
typedef SPIRVMap<dwarf::LocationAtom, SPIRVDebug::ExpressionOpCode>
|
|
DbgExpressionOpCodeMap;
|
|
template <>
|
|
inline void DbgExpressionOpCodeMap::init() {
|
|
add(dwarf::DW_OP_deref, SPIRVDebug::Deref);
|
|
add(dwarf::DW_OP_plus, SPIRVDebug::Plus);
|
|
add(dwarf::DW_OP_minus, SPIRVDebug::Minus);
|
|
add(dwarf::DW_OP_plus_uconst, SPIRVDebug::PlusUconst);
|
|
add(dwarf::DW_OP_bit_piece, SPIRVDebug::BitPiece);
|
|
add(dwarf::DW_OP_swap, SPIRVDebug::Swap);
|
|
add(dwarf::DW_OP_xderef, SPIRVDebug::Xderef);
|
|
add(dwarf::DW_OP_stack_value, SPIRVDebug::StackValue);
|
|
add(dwarf::DW_OP_constu, SPIRVDebug::Constu);
|
|
add(dwarf::DW_OP_LLVM_fragment, SPIRVDebug::Fragment);
|
|
add(dwarf::DW_OP_LLVM_convert, SPIRVDebug::Convert);
|
|
add(dwarf::DW_OP_addr, SPIRVDebug::Addr);
|
|
add(dwarf::DW_OP_const1u, SPIRVDebug::Const1u);
|
|
add(dwarf::DW_OP_const1s, SPIRVDebug::Const1s);
|
|
add(dwarf::DW_OP_const2u, SPIRVDebug::Const2u);
|
|
add(dwarf::DW_OP_const2s, SPIRVDebug::Const2s);
|
|
add(dwarf::DW_OP_const4u, SPIRVDebug::Const4u);
|
|
add(dwarf::DW_OP_const4s, SPIRVDebug::Const4s);
|
|
add(dwarf::DW_OP_const8u, SPIRVDebug::Const8u);
|
|
add(dwarf::DW_OP_const8s, SPIRVDebug::Const8s);
|
|
add(dwarf::DW_OP_consts, SPIRVDebug::Consts);
|
|
add(dwarf::DW_OP_dup, SPIRVDebug::Dup);
|
|
add(dwarf::DW_OP_drop, SPIRVDebug::Drop);
|
|
add(dwarf::DW_OP_over, SPIRVDebug::Over);
|
|
add(dwarf::DW_OP_pick, SPIRVDebug::Pick);
|
|
add(dwarf::DW_OP_rot, SPIRVDebug::Rot);
|
|
add(dwarf::DW_OP_abs, SPIRVDebug::Abs);
|
|
add(dwarf::DW_OP_and, SPIRVDebug::And);
|
|
add(dwarf::DW_OP_div, SPIRVDebug::Div);
|
|
add(dwarf::DW_OP_mod, SPIRVDebug::Mod);
|
|
add(dwarf::DW_OP_mul, SPIRVDebug::Mul);
|
|
add(dwarf::DW_OP_neg, SPIRVDebug::Neg);
|
|
add(dwarf::DW_OP_not, SPIRVDebug::Not);
|
|
add(dwarf::DW_OP_or, SPIRVDebug::Or);
|
|
add(dwarf::DW_OP_shl, SPIRVDebug::Shl);
|
|
add(dwarf::DW_OP_shr, SPIRVDebug::Shr);
|
|
add(dwarf::DW_OP_shra, SPIRVDebug::Shra);
|
|
add(dwarf::DW_OP_xor, SPIRVDebug::Xor);
|
|
add(dwarf::DW_OP_bra, SPIRVDebug::Bra);
|
|
add(dwarf::DW_OP_eq, SPIRVDebug::Eq);
|
|
add(dwarf::DW_OP_ge, SPIRVDebug::Ge);
|
|
add(dwarf::DW_OP_gt, SPIRVDebug::Gt);
|
|
add(dwarf::DW_OP_le, SPIRVDebug::Le);
|
|
add(dwarf::DW_OP_lt, SPIRVDebug::Lt);
|
|
add(dwarf::DW_OP_ne, SPIRVDebug::Ne);
|
|
add(dwarf::DW_OP_skip, SPIRVDebug::Skip);
|
|
add(dwarf::DW_OP_lit0, SPIRVDebug::Lit0);
|
|
add(dwarf::DW_OP_lit1, SPIRVDebug::Lit1);
|
|
add(dwarf::DW_OP_lit2, SPIRVDebug::Lit2);
|
|
add(dwarf::DW_OP_lit3, SPIRVDebug::Lit3);
|
|
add(dwarf::DW_OP_lit4, SPIRVDebug::Lit4);
|
|
add(dwarf::DW_OP_lit5, SPIRVDebug::Lit5);
|
|
add(dwarf::DW_OP_lit6, SPIRVDebug::Lit6);
|
|
add(dwarf::DW_OP_lit7, SPIRVDebug::Lit7);
|
|
add(dwarf::DW_OP_lit8, SPIRVDebug::Lit8);
|
|
add(dwarf::DW_OP_lit9, SPIRVDebug::Lit9);
|
|
add(dwarf::DW_OP_lit10, SPIRVDebug::Lit10);
|
|
add(dwarf::DW_OP_lit11, SPIRVDebug::Lit11);
|
|
add(dwarf::DW_OP_lit12, SPIRVDebug::Lit12);
|
|
add(dwarf::DW_OP_lit13, SPIRVDebug::Lit13);
|
|
add(dwarf::DW_OP_lit14, SPIRVDebug::Lit14);
|
|
add(dwarf::DW_OP_lit15, SPIRVDebug::Lit15);
|
|
add(dwarf::DW_OP_lit16, SPIRVDebug::Lit16);
|
|
add(dwarf::DW_OP_lit17, SPIRVDebug::Lit17);
|
|
add(dwarf::DW_OP_lit18, SPIRVDebug::Lit18);
|
|
add(dwarf::DW_OP_lit19, SPIRVDebug::Lit19);
|
|
add(dwarf::DW_OP_lit20, SPIRVDebug::Lit20);
|
|
add(dwarf::DW_OP_lit21, SPIRVDebug::Lit21);
|
|
add(dwarf::DW_OP_lit22, SPIRVDebug::Lit22);
|
|
add(dwarf::DW_OP_lit23, SPIRVDebug::Lit23);
|
|
add(dwarf::DW_OP_lit24, SPIRVDebug::Lit24);
|
|
add(dwarf::DW_OP_lit25, SPIRVDebug::Lit25);
|
|
add(dwarf::DW_OP_lit26, SPIRVDebug::Lit26);
|
|
add(dwarf::DW_OP_lit27, SPIRVDebug::Lit27);
|
|
add(dwarf::DW_OP_lit28, SPIRVDebug::Lit28);
|
|
add(dwarf::DW_OP_lit29, SPIRVDebug::Lit29);
|
|
add(dwarf::DW_OP_lit30, SPIRVDebug::Lit30);
|
|
add(dwarf::DW_OP_lit31, SPIRVDebug::Lit31);
|
|
add(dwarf::DW_OP_reg0, SPIRVDebug::Reg0);
|
|
add(dwarf::DW_OP_reg1, SPIRVDebug::Reg1);
|
|
add(dwarf::DW_OP_reg2, SPIRVDebug::Reg2);
|
|
add(dwarf::DW_OP_reg3, SPIRVDebug::Reg3);
|
|
add(dwarf::DW_OP_reg4, SPIRVDebug::Reg4);
|
|
add(dwarf::DW_OP_reg5, SPIRVDebug::Reg5);
|
|
add(dwarf::DW_OP_reg6, SPIRVDebug::Reg6);
|
|
add(dwarf::DW_OP_reg7, SPIRVDebug::Reg7);
|
|
add(dwarf::DW_OP_reg8, SPIRVDebug::Reg8);
|
|
add(dwarf::DW_OP_reg9, SPIRVDebug::Reg9);
|
|
add(dwarf::DW_OP_reg10, SPIRVDebug::Reg10);
|
|
add(dwarf::DW_OP_reg11, SPIRVDebug::Reg11);
|
|
add(dwarf::DW_OP_reg12, SPIRVDebug::Reg12);
|
|
add(dwarf::DW_OP_reg13, SPIRVDebug::Reg13);
|
|
add(dwarf::DW_OP_reg14, SPIRVDebug::Reg14);
|
|
add(dwarf::DW_OP_reg15, SPIRVDebug::Reg15);
|
|
add(dwarf::DW_OP_reg16, SPIRVDebug::Reg16);
|
|
add(dwarf::DW_OP_reg17, SPIRVDebug::Reg17);
|
|
add(dwarf::DW_OP_reg18, SPIRVDebug::Reg18);
|
|
add(dwarf::DW_OP_reg19, SPIRVDebug::Reg19);
|
|
add(dwarf::DW_OP_reg20, SPIRVDebug::Reg20);
|
|
add(dwarf::DW_OP_reg21, SPIRVDebug::Reg21);
|
|
add(dwarf::DW_OP_reg22, SPIRVDebug::Reg22);
|
|
add(dwarf::DW_OP_reg23, SPIRVDebug::Reg23);
|
|
add(dwarf::DW_OP_reg24, SPIRVDebug::Reg24);
|
|
add(dwarf::DW_OP_reg25, SPIRVDebug::Reg25);
|
|
add(dwarf::DW_OP_reg26, SPIRVDebug::Reg26);
|
|
add(dwarf::DW_OP_reg27, SPIRVDebug::Reg27);
|
|
add(dwarf::DW_OP_reg28, SPIRVDebug::Reg28);
|
|
add(dwarf::DW_OP_reg29, SPIRVDebug::Reg29);
|
|
add(dwarf::DW_OP_reg30, SPIRVDebug::Reg30);
|
|
add(dwarf::DW_OP_reg31, SPIRVDebug::Reg31);
|
|
add(dwarf::DW_OP_breg0, SPIRVDebug::Breg0);
|
|
add(dwarf::DW_OP_breg1, SPIRVDebug::Breg1);
|
|
add(dwarf::DW_OP_breg2, SPIRVDebug::Breg2);
|
|
add(dwarf::DW_OP_breg3, SPIRVDebug::Breg3);
|
|
add(dwarf::DW_OP_breg4, SPIRVDebug::Breg4);
|
|
add(dwarf::DW_OP_breg5, SPIRVDebug::Breg5);
|
|
add(dwarf::DW_OP_breg6, SPIRVDebug::Breg6);
|
|
add(dwarf::DW_OP_breg7, SPIRVDebug::Breg7);
|
|
add(dwarf::DW_OP_breg8, SPIRVDebug::Breg8);
|
|
add(dwarf::DW_OP_breg9, SPIRVDebug::Breg9);
|
|
add(dwarf::DW_OP_breg10, SPIRVDebug::Breg10);
|
|
add(dwarf::DW_OP_breg11, SPIRVDebug::Breg11);
|
|
add(dwarf::DW_OP_breg12, SPIRVDebug::Breg12);
|
|
add(dwarf::DW_OP_breg13, SPIRVDebug::Breg13);
|
|
add(dwarf::DW_OP_breg14, SPIRVDebug::Breg14);
|
|
add(dwarf::DW_OP_breg15, SPIRVDebug::Breg15);
|
|
add(dwarf::DW_OP_breg16, SPIRVDebug::Breg16);
|
|
add(dwarf::DW_OP_breg17, SPIRVDebug::Breg17);
|
|
add(dwarf::DW_OP_breg18, SPIRVDebug::Breg18);
|
|
add(dwarf::DW_OP_breg19, SPIRVDebug::Breg19);
|
|
add(dwarf::DW_OP_breg20, SPIRVDebug::Breg20);
|
|
add(dwarf::DW_OP_breg21, SPIRVDebug::Breg21);
|
|
add(dwarf::DW_OP_breg22, SPIRVDebug::Breg22);
|
|
add(dwarf::DW_OP_breg23, SPIRVDebug::Breg23);
|
|
add(dwarf::DW_OP_breg24, SPIRVDebug::Breg24);
|
|
add(dwarf::DW_OP_breg25, SPIRVDebug::Breg25);
|
|
add(dwarf::DW_OP_breg26, SPIRVDebug::Breg26);
|
|
add(dwarf::DW_OP_breg27, SPIRVDebug::Breg27);
|
|
add(dwarf::DW_OP_breg28, SPIRVDebug::Breg28);
|
|
add(dwarf::DW_OP_breg29, SPIRVDebug::Breg29);
|
|
add(dwarf::DW_OP_breg30, SPIRVDebug::Breg30);
|
|
add(dwarf::DW_OP_breg31, SPIRVDebug::Breg31);
|
|
add(dwarf::DW_OP_regx, SPIRVDebug::Regx);
|
|
add(dwarf::DW_OP_bregx, SPIRVDebug::Bregx);
|
|
add(dwarf::DW_OP_piece, SPIRVDebug::Piece);
|
|
add(dwarf::DW_OP_deref_size, SPIRVDebug::DerefSize );
|
|
add(dwarf::DW_OP_xderef_size, SPIRVDebug::XderefSize );
|
|
add(dwarf::DW_OP_nop, SPIRVDebug::Nop);
|
|
add(dwarf::DW_OP_push_object_address, SPIRVDebug::PushObjectAddress );
|
|
|
|
|
|
add(dwarf::DW_OP_call2, SPIRVDebug::Call2);
|
|
add(dwarf::DW_OP_call4, SPIRVDebug::Call4);
|
|
add(dwarf::DW_OP_call_ref, SPIRVDebug::CallRef);
|
|
add(dwarf::DW_OP_form_tls_address, SPIRVDebug::FormTlsAddress);
|
|
add(dwarf::DW_OP_call_frame_cfa, SPIRVDebug::CallFrameCfa);
|
|
add(dwarf::DW_OP_implicit_value, SPIRVDebug::ImplicitValue);
|
|
add(dwarf::DW_OP_implicit_pointer, SPIRVDebug::ImplicitPointer);
|
|
add(dwarf::DW_OP_addrx, SPIRVDebug::Addrx);
|
|
add(dwarf::DW_OP_constx, SPIRVDebug::Constx);
|
|
add(dwarf::DW_OP_entry_value, SPIRVDebug::EntryValue);
|
|
add(dwarf::DW_OP_const_type, SPIRVDebug::ConstTypeOp);
|
|
add(dwarf::DW_OP_regval_type, SPIRVDebug::RegvalType);
|
|
add(dwarf::DW_OP_deref_type, SPIRVDebug::DerefType);
|
|
add(dwarf::DW_OP_xderef_type, SPIRVDebug::XderefType);
|
|
add(dwarf::DW_OP_reinterpret, SPIRVDebug::Reinterpret);
|
|
add(dwarf::DW_OP_LLVM_arg, SPIRVDebug::LLVMArg);
|
|
add(dwarf::DW_OP_LLVM_implicit_pointer, SPIRVDebug::ImplicitPointerTag);
|
|
add(dwarf::DW_OP_LLVM_tag_offset, SPIRVDebug::TagOffset);
|
|
|
|
#ifdef SPIRV_HAS_DIOP_DIEXPRESSION
|
|
add(dwarf::DW_OP_LLVM_poisoned, SPIRVDebug::Poisoned);
|
|
#endif
|
|
}
|
|
|
|
typedef SPIRVMap<unsigned, SPIRVDebug::ExpressionOpCode>
|
|
DbgExpressionDIOpBasedOpCodeMap;
|
|
template <>
|
|
inline void DbgExpressionDIOpBasedOpCodeMap::init() {
|
|
#ifdef SPIRV_HAS_DIOP_DIEXPRESSION
|
|
#define HANDLE_OP_NAME(NAME) \
|
|
add(llvm::DIOp::NAME::getBitcodeID(), SPIRVDebug::DIOp##NAME);
|
|
#include "llvm/IR/DIExprOps.def"
|
|
#endif
|
|
}
|
|
|
|
typedef SPIRVMap<dwarf::Tag, SPIRVDebug::ImportedEntityTag>
|
|
DbgImportedEntityMap;
|
|
template <>
|
|
inline void DbgImportedEntityMap::init() {
|
|
add(dwarf::DW_TAG_imported_module, SPIRVDebug::ImportedModule);
|
|
add(dwarf::DW_TAG_imported_declaration, SPIRVDebug::ImportedDeclaration);
|
|
}
|
|
|
|
typedef SPIRVMap<llvm::DIFile::ChecksumKind, SPIRVDebug::FileChecksumKind>
|
|
DbgChecksumKindMap;
|
|
template <>
|
|
inline void DbgChecksumKindMap::init() {
|
|
add(llvm::DIFile::CSK_MD5, SPIRVDebug::MD5);
|
|
add(llvm::DIFile::CSK_SHA1, SPIRVDebug::SHA1);
|
|
add(llvm::DIFile::CSK_SHA256, SPIRVDebug::SHA256);
|
|
}
|
|
|
|
} // namespace SPIRV
|
|
|
|
#endif // SPIRV_DEBUG_H
|