Use the syntax table for opcode to name mappings.
This method is more reliably complete.
diff --git a/source/opcode.cpp b/source/opcode.cpp
index afb362b..555bfb7 100644
--- a/source/opcode.cpp
+++ b/source/opcode.cpp
@@ -384,245 +384,17 @@
}
const char* spvOpcodeString(const SpvOp opcode) {
-#define CASE(OPCODE) \
- case Spv##OPCODE: \
- return #OPCODE;
+ // Use the syntax table so it's sure to be complete.
+#define Instruction(Name, ...) \
+ case SpvOp##Name: \
+ return #Name;
switch (opcode) {
- CASE(OpNop)
- CASE(OpSource)
- CASE(OpSourceExtension)
- CASE(OpExtension)
- CASE(OpExtInstImport)
- CASE(OpMemoryModel)
- CASE(OpEntryPoint)
- CASE(OpExecutionMode)
- CASE(OpTypeVoid)
- CASE(OpTypeBool)
- CASE(OpTypeInt)
- CASE(OpTypeFloat)
- CASE(OpTypeVector)
- CASE(OpTypeMatrix)
- CASE(OpTypeSampler)
- CASE(OpTypeArray)
- CASE(OpTypeRuntimeArray)
- CASE(OpTypeStruct)
- CASE(OpTypeOpaque)
- CASE(OpTypePointer)
- CASE(OpTypeFunction)
- CASE(OpTypeEvent)
- CASE(OpTypeDeviceEvent)
- CASE(OpTypeReserveId)
- CASE(OpTypeQueue)
- CASE(OpTypePipe)
- CASE(OpConstantTrue)
- CASE(OpConstantFalse)
- CASE(OpConstant)
- CASE(OpConstantComposite)
- CASE(OpConstantSampler)
- CASE(OpConstantNull)
- CASE(OpSpecConstantTrue)
- CASE(OpSpecConstantFalse)
- CASE(OpSpecConstant)
- CASE(OpSpecConstantComposite)
- CASE(OpVariable)
- CASE(OpFunction)
- CASE(OpFunctionParameter)
- CASE(OpFunctionEnd)
- CASE(OpFunctionCall)
- CASE(OpExtInst)
- CASE(OpUndef)
- CASE(OpLoad)
- CASE(OpStore)
- CASE(OpPhi)
- CASE(OpDecorationGroup)
- CASE(OpDecorate)
- CASE(OpMemberDecorate)
- CASE(OpGroupDecorate)
- CASE(OpGroupMemberDecorate)
- CASE(OpName)
- CASE(OpMemberName)
- CASE(OpString)
- CASE(OpLine)
- CASE(OpVectorExtractDynamic)
- CASE(OpVectorInsertDynamic)
- CASE(OpVectorShuffle)
- CASE(OpCompositeConstruct)
- CASE(OpCompositeExtract)
- CASE(OpCompositeInsert)
- CASE(OpCopyObject)
- CASE(OpCopyMemory)
- CASE(OpCopyMemorySized)
- CASE(OpAccessChain)
- CASE(OpInBoundsAccessChain)
- CASE(OpSNegate)
- CASE(OpFNegate)
- CASE(OpNot)
- CASE(OpAny)
- CASE(OpAll)
- CASE(OpConvertFToU)
- CASE(OpConvertFToS)
- CASE(OpConvertSToF)
- CASE(OpConvertUToF)
- CASE(OpUConvert)
- CASE(OpSConvert)
- CASE(OpFConvert)
- CASE(OpConvertPtrToU)
- CASE(OpConvertUToPtr)
- CASE(OpPtrCastToGeneric)
- CASE(OpGenericCastToPtr)
- CASE(OpBitcast)
- CASE(OpTranspose)
- CASE(OpIsNan)
- CASE(OpIsInf)
- CASE(OpIsFinite)
- CASE(OpIsNormal)
- CASE(OpSignBitSet)
- CASE(OpLessOrGreater)
- CASE(OpOrdered)
- CASE(OpUnordered)
- CASE(OpArrayLength)
- CASE(OpIAdd)
- CASE(OpFAdd)
- CASE(OpISub)
- CASE(OpFSub)
- CASE(OpIMul)
- CASE(OpFMul)
- CASE(OpUDiv)
- CASE(OpSDiv)
- CASE(OpFDiv)
- CASE(OpUMod)
- CASE(OpSRem)
- CASE(OpSMod)
- CASE(OpFRem)
- CASE(OpFMod)
- CASE(OpVectorTimesScalar)
- CASE(OpMatrixTimesScalar)
- CASE(OpVectorTimesMatrix)
- CASE(OpMatrixTimesVector)
- CASE(OpMatrixTimesMatrix)
- CASE(OpOuterProduct)
- CASE(OpDot)
- CASE(OpShiftRightLogical)
- CASE(OpShiftRightArithmetic)
- CASE(OpShiftLeftLogical)
- CASE(OpLogicalOr)
- CASE(OpLogicalAnd)
- CASE(OpBitwiseOr)
- CASE(OpBitwiseXor)
- CASE(OpBitwiseAnd)
- CASE(OpSelect)
- CASE(OpIEqual)
- CASE(OpFOrdEqual)
- CASE(OpFUnordEqual)
- CASE(OpINotEqual)
- CASE(OpFOrdNotEqual)
- CASE(OpFUnordNotEqual)
- CASE(OpULessThan)
- CASE(OpSLessThan)
- CASE(OpFOrdLessThan)
- CASE(OpFUnordLessThan)
- CASE(OpUGreaterThan)
- CASE(OpSGreaterThan)
- CASE(OpFOrdGreaterThan)
- CASE(OpFUnordGreaterThan)
- CASE(OpULessThanEqual)
- CASE(OpSLessThanEqual)
- CASE(OpFOrdLessThanEqual)
- CASE(OpFUnordLessThanEqual)
- CASE(OpUGreaterThanEqual)
- CASE(OpSGreaterThanEqual)
- CASE(OpFOrdGreaterThanEqual)
- CASE(OpFUnordGreaterThanEqual)
- CASE(OpDPdx)
- CASE(OpDPdy)
- CASE(OpFwidth)
- CASE(OpDPdxFine)
- CASE(OpDPdyFine)
- CASE(OpFwidthFine)
- CASE(OpDPdxCoarse)
- CASE(OpDPdyCoarse)
- CASE(OpFwidthCoarse)
- CASE(OpEmitVertex)
- CASE(OpEndPrimitive)
- CASE(OpEmitStreamVertex)
- CASE(OpEndStreamPrimitive)
- CASE(OpControlBarrier)
- CASE(OpMemoryBarrier)
- CASE(OpAtomicLoad)
- CASE(OpAtomicStore)
- CASE(OpAtomicExchange)
- CASE(OpAtomicCompareExchange)
- CASE(OpAtomicCompareExchangeWeak)
- CASE(OpAtomicIIncrement)
- CASE(OpAtomicIDecrement)
- CASE(OpAtomicIAdd)
- CASE(OpAtomicISub)
- CASE(OpAtomicUMin)
- CASE(OpAtomicUMax)
- CASE(OpAtomicAnd)
- CASE(OpAtomicOr)
- CASE(OpAtomicXor)
- CASE(OpLoopMerge)
- CASE(OpSelectionMerge)
- CASE(OpLabel)
- CASE(OpBranch)
- CASE(OpBranchConditional)
- CASE(OpSwitch)
- CASE(OpKill)
- CASE(OpReturn)
- CASE(OpReturnValue)
- CASE(OpUnreachable)
- CASE(OpLifetimeStart)
- CASE(OpLifetimeStop)
- CASE(OpAsyncGroupCopy)
- CASE(OpWaitGroupEvents)
- CASE(OpGroupAll)
- CASE(OpGroupAny)
- CASE(OpGroupBroadcast)
- CASE(OpGroupIAdd)
- CASE(OpGroupFAdd)
- CASE(OpGroupFMin)
- CASE(OpGroupUMin)
- CASE(OpGroupSMin)
- CASE(OpGroupFMax)
- CASE(OpGroupUMax)
- CASE(OpGroupSMax)
- CASE(OpGenericCastToPtrExplicit)
- CASE(OpGenericPtrMemSemantics)
- CASE(OpReadPipe)
- CASE(OpWritePipe)
- CASE(OpReservedReadPipe)
- CASE(OpReservedWritePipe)
- CASE(OpReserveReadPipePackets)
- CASE(OpReserveWritePipePackets)
- CASE(OpCommitReadPipe)
- CASE(OpCommitWritePipe)
- CASE(OpIsValidReserveId)
- CASE(OpGetNumPipePackets)
- CASE(OpGetMaxPipePackets)
- CASE(OpGroupReserveReadPipePackets)
- CASE(OpGroupReserveWritePipePackets)
- CASE(OpGroupCommitReadPipe)
- CASE(OpGroupCommitWritePipe)
- CASE(OpEnqueueMarker)
- CASE(OpEnqueueKernel)
- CASE(OpGetKernelNDrangeSubGroupCount)
- CASE(OpGetKernelNDrangeMaxSubGroupSize)
- CASE(OpGetKernelWorkGroupSize)
- CASE(OpGetKernelPreferredWorkGroupSizeMultiple)
- CASE(OpRetainEvent)
- CASE(OpReleaseEvent)
- CASE(OpCreateUserEvent)
- CASE(OpIsValidEvent)
- CASE(OpSetUserEventStatus)
- CASE(OpCaptureEventProfilingInfo)
- CASE(OpGetDefaultQueue)
- CASE(OpBuildNDRange)
+#include "opcode.inc"
default:
assert(0 && "Unreachable!");
}
-#undef CASE
return "unknown";
+#undef Instruction
}
int32_t spvOpcodeIsScalarType(const SpvOp opcode) {