| /* |
| * Copyright © Microsoft Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice (including the next |
| * paragraph) shall be included in all copies or substantial portions of the |
| * Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
| * IN THE SOFTWARE. |
| */ |
| |
| #ifndef DXIL_INTERNAL_H |
| #define DXIL_INTERNAL_H |
| |
| #include "dxil_module.h" |
| |
| #include "util/list.h" |
| |
| #include <stdint.h> |
| |
| // Malloc.h defines a macro for alloca. Let's at least make sure that all includers |
| // of this header have the same definition of alloca. |
| #include <malloc.h> |
| |
| struct dxil_type_list { |
| struct dxil_type **types; |
| size_t num_types; |
| }; |
| |
| struct dxil_type { |
| enum type_type { |
| TYPE_VOID, |
| TYPE_INTEGER, |
| TYPE_FLOAT, |
| TYPE_POINTER, |
| TYPE_STRUCT, |
| TYPE_ARRAY, |
| TYPE_VECTOR, |
| TYPE_FUNCTION |
| } type; |
| |
| union { |
| unsigned int_bits; |
| unsigned float_bits; |
| const struct dxil_type *ptr_target_type; |
| struct { |
| const char *name; |
| struct dxil_type_list elem; |
| } struct_def; |
| struct { |
| const struct dxil_type *ret_type; |
| struct dxil_type_list args; |
| } function_def; |
| struct { |
| const struct dxil_type *elem_type; |
| size_t num_elems; |
| } array_or_vector_def; |
| }; |
| |
| struct list_head head; |
| unsigned id; |
| }; |
| |
| struct dxil_value { |
| int id; |
| const struct dxil_type *type; |
| }; |
| |
| struct dxil_gvar { |
| const char *name; |
| const struct dxil_type *type; |
| bool constant; |
| enum dxil_address_space as; |
| int align; |
| |
| const struct dxil_value *initializer; |
| struct dxil_value value; |
| struct list_head head; |
| }; |
| |
| struct dxil_func { |
| char *name; |
| const struct dxil_type *type; |
| bool decl; |
| unsigned attr_set; |
| |
| struct dxil_value value; |
| struct list_head head; |
| }; |
| |
| struct dxil_attrib { |
| enum { |
| DXIL_ATTR_ENUM |
| } type; |
| |
| union { |
| enum dxil_attr_kind kind; |
| }; |
| }; |
| |
| struct attrib_set { |
| struct dxil_attrib attrs[2]; |
| unsigned num_attrs; |
| struct list_head head; |
| }; |
| |
| struct dxil_instr_binop { |
| enum dxil_bin_opcode opcode; |
| const struct dxil_value *operands[2]; |
| enum dxil_opt_flags flags; |
| }; |
| |
| struct dxil_instr_cmp { |
| enum dxil_cmp_pred pred; |
| const struct dxil_value *operands[2]; |
| }; |
| |
| struct dxil_instr_select { |
| const struct dxil_value *operands[3]; |
| }; |
| |
| struct dxil_instr_cast { |
| enum dxil_cast_opcode opcode; |
| const struct dxil_type *type; |
| const struct dxil_value *value; |
| }; |
| |
| struct dxil_instr_call { |
| const struct dxil_func *func; |
| struct dxil_value **args; |
| size_t num_args; |
| }; |
| |
| struct dxil_instr_ret { |
| struct dxil_value *value; |
| }; |
| |
| struct dxil_instr_extractval { |
| const struct dxil_value *src; |
| const struct dxil_type *type; |
| unsigned int idx; |
| }; |
| |
| struct dxil_instr_br { |
| const struct dxil_value *cond; |
| unsigned succ[2]; |
| }; |
| |
| struct dxil_instr_phi { |
| const struct dxil_type *type; |
| struct dxil_phi_src { |
| const struct dxil_value *value; |
| unsigned block; |
| } incoming[127]; |
| size_t num_incoming; |
| }; |
| |
| struct dxil_instr_alloca { |
| const struct dxil_type *alloc_type; |
| const struct dxil_type *size_type; |
| const struct dxil_value *size; |
| unsigned align; |
| }; |
| |
| struct dxil_instr_gep { |
| bool inbounds; |
| const struct dxil_type *source_elem_type; |
| struct dxil_value **operands; |
| size_t num_operands; |
| }; |
| |
| struct dxil_instr_load { |
| const struct dxil_value *ptr; |
| const struct dxil_type *type; |
| unsigned align; |
| bool is_volatile; |
| }; |
| |
| struct dxil_instr_store { |
| const struct dxil_value *value, *ptr; |
| unsigned align; |
| bool is_volatile; |
| }; |
| |
| struct dxil_instr_atomicrmw { |
| const struct dxil_value *value, *ptr; |
| enum dxil_rmw_op op; |
| bool is_volatile; |
| enum dxil_atomic_ordering ordering; |
| enum dxil_sync_scope syncscope; |
| }; |
| |
| struct dxil_instr_cmpxchg { |
| const struct dxil_value *cmpval, *newval, *ptr; |
| bool is_volatile; |
| enum dxil_atomic_ordering ordering; |
| enum dxil_sync_scope syncscope; |
| }; |
| |
| struct dxil_instr { |
| enum instr_type { |
| INSTR_BINOP, |
| INSTR_CMP, |
| INSTR_SELECT, |
| INSTR_CAST, |
| INSTR_BR, |
| INSTR_PHI, |
| INSTR_CALL, |
| INSTR_RET, |
| INSTR_EXTRACTVAL, |
| INSTR_ALLOCA, |
| INSTR_GEP, |
| INSTR_LOAD, |
| INSTR_STORE, |
| INSTR_ATOMICRMW, |
| INSTR_CMPXCHG, |
| } type; |
| |
| union { |
| struct dxil_instr_binop binop; |
| struct dxil_instr_cmp cmp; |
| struct dxil_instr_select select; |
| struct dxil_instr_cast cast; |
| struct dxil_instr_call call; |
| struct dxil_instr_ret ret; |
| struct dxil_instr_extractval extractval; |
| struct dxil_instr_phi phi; |
| struct dxil_instr_br br; |
| struct dxil_instr_alloca alloca; |
| struct dxil_instr_gep gep; |
| struct dxil_instr_load load; |
| struct dxil_instr_store store; |
| struct dxil_instr_atomicrmw atomicrmw; |
| struct dxil_instr_cmpxchg cmpxchg; |
| }; |
| |
| bool has_value; |
| struct dxil_value value; |
| |
| struct list_head head; |
| }; |
| |
| struct dxil_const { |
| struct dxil_value value; |
| |
| bool undef; |
| union { |
| intmax_t int_value; |
| double float_value; |
| const struct dxil_value **array_values; |
| }; |
| |
| struct list_head head; |
| }; |
| |
| struct dxil_mdnode { |
| enum mdnode_type { |
| MD_STRING, |
| MD_VALUE, |
| MD_NODE |
| } type; |
| |
| union { |
| char *string; |
| |
| struct { |
| const struct dxil_type *type; |
| const struct dxil_value *value; |
| } value; |
| |
| struct { |
| const struct dxil_mdnode **subnodes; |
| size_t num_subnodes; |
| } node; |
| }; |
| |
| struct list_head head; |
| unsigned id; |
| }; |
| |
| struct dxil_named_node { |
| char *name; |
| const struct dxil_mdnode **subnodes; |
| size_t num_subnodes; |
| struct list_head head; |
| }; |
| |
| #endif // DXIL_INTERNAL_H |