Home | History | Annotate | Download | only in source
      1 // Copyright (c) 2015-2016 The Khronos Group Inc.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #ifndef SOURCE_TABLE_H_
     16 #define SOURCE_TABLE_H_
     17 
     18 #include "source/latest_version_spirv_header.h"
     19 
     20 #include "source/extensions.h"
     21 #include "spirv-tools/libspirv.hpp"
     22 
     23 typedef struct spv_opcode_desc_t {
     24   const char* name;
     25   const SpvOp opcode;
     26   const uint32_t numCapabilities;
     27   const SpvCapability* capabilities;
     28   // operandTypes[0..numTypes-1] describe logical operands for the instruction.
     29   // The operand types include result id and result-type id, followed by
     30   // the types of arguments.
     31   const uint16_t numTypes;
     32   spv_operand_type_t operandTypes[16];  // TODO: Smaller/larger?
     33   const bool hasResult;  // Does the instruction have a result ID operand?
     34   const bool hasType;    // Does the instruction have a type ID operand?
     35   // A set of extensions that enable this feature. If empty then this operand
     36   // value is in core and its availability is subject to minVersion. The
     37   // assembler, binary parser, and disassembler ignore this rule, so you can
     38   // freely process invalid modules.
     39   const uint32_t numExtensions;
     40   const spvtools::Extension* extensions;
     41   // Minimal core SPIR-V version required for this feature, if without
     42   // extensions. ~0u means reserved for future use. ~0u and non-empty extension
     43   // lists means only available in extensions.
     44   const uint32_t minVersion;
     45 } spv_opcode_desc_t;
     46 
     47 typedef struct spv_operand_desc_t {
     48   const char* name;
     49   const uint32_t value;
     50   const uint32_t numCapabilities;
     51   const SpvCapability* capabilities;
     52   // A set of extensions that enable this feature. If empty then this operand
     53   // value is in core and its availability is subject to minVersion. The
     54   // assembler, binary parser, and disassembler ignore this rule, so you can
     55   // freely process invalid modules.
     56   const uint32_t numExtensions;
     57   const spvtools::Extension* extensions;
     58   const spv_operand_type_t operandTypes[16];  // TODO: Smaller/larger?
     59   // Minimal core SPIR-V version required for this feature, if without
     60   // extensions. ~0u means reserved for future use. ~0u and non-empty extension
     61   // lists means only available in extensions.
     62   const uint32_t minVersion;
     63 } spv_operand_desc_t;
     64 
     65 typedef struct spv_operand_desc_group_t {
     66   const spv_operand_type_t type;
     67   const uint32_t count;
     68   const spv_operand_desc_t* entries;
     69 } spv_operand_desc_group_t;
     70 
     71 typedef struct spv_ext_inst_desc_t {
     72   const char* name;
     73   const uint32_t ext_inst;
     74   const uint32_t numCapabilities;
     75   const SpvCapability* capabilities;
     76   const spv_operand_type_t operandTypes[16];  // TODO: Smaller/larger?
     77 } spv_ext_inst_desc_t;
     78 
     79 typedef struct spv_ext_inst_group_t {
     80   const spv_ext_inst_type_t type;
     81   const uint32_t count;
     82   const spv_ext_inst_desc_t* entries;
     83 } spv_ext_inst_group_t;
     84 
     85 typedef struct spv_opcode_table_t {
     86   const uint32_t count;
     87   const spv_opcode_desc_t* entries;
     88 } spv_opcode_table_t;
     89 
     90 typedef struct spv_operand_table_t {
     91   const uint32_t count;
     92   const spv_operand_desc_group_t* types;
     93 } spv_operand_table_t;
     94 
     95 typedef struct spv_ext_inst_table_t {
     96   const uint32_t count;
     97   const spv_ext_inst_group_t* groups;
     98 } spv_ext_inst_table_t;
     99 
    100 typedef const spv_opcode_desc_t* spv_opcode_desc;
    101 typedef const spv_operand_desc_t* spv_operand_desc;
    102 typedef const spv_ext_inst_desc_t* spv_ext_inst_desc;
    103 
    104 typedef const spv_opcode_table_t* spv_opcode_table;
    105 typedef const spv_operand_table_t* spv_operand_table;
    106 typedef const spv_ext_inst_table_t* spv_ext_inst_table;
    107 
    108 struct spv_context_t {
    109   const spv_target_env target_env;
    110   const spv_opcode_table opcode_table;
    111   const spv_operand_table operand_table;
    112   const spv_ext_inst_table ext_inst_table;
    113   spvtools::MessageConsumer consumer;
    114 };
    115 
    116 namespace spvtools {
    117 
    118 // Sets the message consumer to |consumer| in the given |context|. The original
    119 // message consumer will be overwritten.
    120 void SetContextMessageConsumer(spv_context context, MessageConsumer consumer);
    121 }  // namespace spvtools
    122 
    123 // Populates *table with entries for env.
    124 spv_result_t spvOpcodeTableGet(spv_opcode_table* table, spv_target_env env);
    125 
    126 // Populates *table with entries for env.
    127 spv_result_t spvOperandTableGet(spv_operand_table* table, spv_target_env env);
    128 
    129 // Populates *table with entries for env.
    130 spv_result_t spvExtInstTableGet(spv_ext_inst_table* table, spv_target_env env);
    131 
    132 #endif  // SOURCE_TABLE_H_
    133