/* * 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 // 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 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