// Copyright (c) 2009-2011, Tor M. Aamodt // The University of British Columbia // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // Redistributions in binary form must reproduce the above copyright notice, this // list of conditions and the following disclaimer in the documentation and/or // other materials provided with the distribution. // Neither the name of The University of British Columbia nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ptx_parser_INCLUDED #define ptx_parser_INCLUDED #include "../abstract_hardware_model.h" #include "ptx_ir.h" class gpgpu_context; typedef void * yyscan_t; class ptx_recognizer { public: ptx_recognizer( gpgpu_context* ctx ) : g_return_var(ctx) { scanner = NULL; g_size = -1; g_add_identifier_cached__identifier = NULL; g_alignment_spec = -1; g_var_type = NULL; g_opcode = -1; g_space_spec = undefined_space; g_ptr_spec = undefined_space; g_scalar_type_spec = -1; g_vector_spec = -1; g_extern_spec = 0; g_func_decl = 0; g_ident_add_uid = 0; g_const_alloc = 1; g_max_regs_per_thread = 0; g_global_symbol_table = NULL; g_current_symbol_table = NULL; g_last_symbol = NULL; g_error_detected = 0; g_entry_func_param_index=0; g_func_info = NULL; g_debug_ir_generation=false; gpgpu_ctx = ctx; } // global list yyscan_t scanner; #define PTX_LINEBUF_SIZE (4*1024) char linebuf[PTX_LINEBUF_SIZE]; unsigned col; int g_size; char *g_add_identifier_cached__identifier; int g_add_identifier_cached__array_dim; int g_add_identifier_cached__array_ident; int g_alignment_spec; // variable declaration stuff: type_info *g_var_type; // instruction definition stuff: const symbol *g_pred; int g_neg_pred; int g_pred_mod; symbol *g_label; int g_opcode; std::list g_operands; std::list g_options; std::list g_wmma_options; std::list g_scalar_type; // type specifier stuff: memory_space_t g_space_spec; memory_space_t g_ptr_spec; int g_scalar_type_spec; int g_vector_spec; int g_extern_spec; int g_func_decl; int g_ident_add_uid; unsigned g_const_alloc; unsigned g_max_regs_per_thread; symbol_table *g_global_symbol_table; symbol_table *g_current_symbol_table; symbol *g_last_symbol; std::list g_instructions; int g_error_detected; unsigned g_entry_func_param_index; function_info *g_func_info; operand_info g_return_var; bool g_debug_ir_generation; int g_entry_point; const struct core_config *g_shader_core_config; std::map > g_inst_lookup; // the program intermediate representation... std::map g_sym_name_to_symbol_table; // backward pointer class gpgpu_context* gpgpu_ctx; // member function list void init_directive_state(); void init_instruction_state(); void start_function( int entry_point ); void add_function_name( const char *fname ); void add_directive(); void end_function(); void add_identifier( const char *s, int array_dim, unsigned array_ident ); void add_function_arg(); void add_scalar_type_spec( int type_spec ); void add_scalar_operand( const char *identifier ); void add_neg_pred_operand( const char *identifier ); void add_variables(); void set_variable_type(); void add_opcode( int opcode ); void add_pred( const char *identifier, int negate, int predModifier ); void add_1vector_operand( const char *d1 ); void add_2vector_operand( const char *d1, const char *d2 ); void add_3vector_operand( const char *d1, const char *d2, const char *d3 ); void add_4vector_operand( const char *d1, const char *d2, const char *d3, const char *d4 ); void add_8vector_operand( const char *d1, const char *d2, const char *d3, const char *d4 ,const char *d5,const char *d6,const char *d7,const char *d8); void add_option(int option ); void add_wmma_option(int option ); void add_builtin_operand( int builtin, int dim_modifier ); void add_memory_operand( ); void add_literal_int( int value ); void add_literal_float( float value ); void add_literal_double( double value ); void add_address_operand( const char *identifier, int offset ); void add_address_operand2( int offset ); void add_label( const char *idenfiier ); void add_vector_spec(int spec ); void add_space_spec( enum _memory_space_t spec, int value ); void add_ptr_spec( enum _memory_space_t spec ); void add_extern_spec(); void add_instruction(); void set_return(); void add_alignment_spec( int spec ); void add_array_initializer(); void add_file( unsigned num, const char *filename ); void add_version_info( float ver, unsigned ext); void *reset_symtab(); void set_symtab(void*); void add_pragma( const char *str ); void func_header(const char* a); void func_header_info(const char* a); void func_header_info_int(const char* a, int b); void add_constptr(const char* identifier1, const char* identifier2, int offset); void target_header(char* a); void target_header2(char* a, char* b); void target_header3(char* a, char* b, char* c); void add_double_operand( const char *d1, const char *d2 ); void change_memory_addr_space( const char *identifier ); void change_operand_lohi( int lohi ); void change_double_operand_type( int addr_type ); void change_operand_neg( ); void set_immediate_operand_type( ); void version_header(double a); void maxnt_id(int x, int y, int z); void parse_error_impl( const char *file, unsigned line, const char *msg, ... ); void parse_assert_impl( int test_value, const char *file, unsigned line, const char *msg, ... ); //Jin: handle instructino group for cdp void start_inst_group(); void end_inst_group(); bool check_for_duplicates( const char *identifier ); void read_parser_environment_variables(); void set_ptx_warp_size(const struct core_config * warp_size); const class ptx_instruction *ptx_instruction_lookup( const char *filename, unsigned linenumber ); }; const char *decode_token( int type ); void read_parser_environment_variables(); #define NON_ARRAY_IDENTIFIER 1 #define ARRAY_IDENTIFIER_NO_DIM 2 #define ARRAY_IDENTIFIER 3 #endif