Use the syntax table for opcode to name mappings.
authorDavid Neto <dneto@google.com>
Mon, 2 Nov 2015 21:03:12 +0000 (16:03 -0500)
committerDavid Neto <dneto@google.com>
Tue, 10 Nov 2015 20:57:14 +0000 (15:57 -0500)
This method is more reliably complete.

source/opcode.cpp
source/opcode.h

index afb362b..555bfb7 100644 (file)
@@ -384,245 +384,17 @@ void spvInstructionCopy(const uint32_t* words, const SpvOp opcode,
 }
 
 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) {
index d9d9c60..d9689e1 100644 (file)
@@ -111,7 +111,7 @@ void spvInstructionCopy(const uint32_t* words, const SpvOp opcode,
                         const uint16_t wordCount, const spv_endianness_t endian,
                         spv_instruction_t* pInst);
 
-/// @brief Get the string of an OpCode
+/// @brief Get the name of an instruction, without the "Op" prefix.
 ///
 /// @param[in] opcode the opcode
 ///