summaryrefslogtreecommitdiff
path: root/src/cuda-sim/ptx_parser.h
diff options
context:
space:
mode:
authorTor Aamodt <[email protected]>2020-05-21 08:57:11 -0700
committerGitHub <[email protected]>2020-05-21 08:57:11 -0700
commit76217d80d9aa33126b4254f5e899f882bbc6f2fd (patch)
tree4f461a6f417f76956748fafcfb89b664f54bf6a9 /src/cuda-sim/ptx_parser.h
parente7fbfaa347c0acf8a6702c1e684a8e2ad8d3f733 (diff)
parente9e9fcf5957530ecb927aecb5ea238e4b78a4f45 (diff)
Merge pull request #178 from purdue-aalp/dev
Merging with the last few months of work at Purdue
Diffstat (limited to 'src/cuda-sim/ptx_parser.h')
-rw-r--r--src/cuda-sim/ptx_parser.h257
1 files changed, 173 insertions, 84 deletions
diff --git a/src/cuda-sim/ptx_parser.h b/src/cuda-sim/ptx_parser.h
index 7b6e3a2..96eadf6 100644
--- a/src/cuda-sim/ptx_parser.h
+++ b/src/cuda-sim/ptx_parser.h
@@ -7,99 +7,188 @@
//
// 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.
+// 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.
+// 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"
-extern const char *g_filename;
-extern int g_error_detected;
+#include "ptx_ir.h"
-#ifdef __cplusplus
-class symbol_table* init_parser(const char*);
-const class ptx_instruction *ptx_instruction_lookup( const char *filename, unsigned linenumber );
-#endif
+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<operand_info> g_operands;
+ std::list<int> g_options;
+ std::list<int> g_wmma_options;
+ std::list<int> 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<ptx_instruction *> 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<std::string, std::map<unsigned, const ptx_instruction *> >
+ g_inst_lookup;
+ // the program intermediate representation...
+ std::map<std::string, symbol_table *> g_sym_name_to_symbol_table;
+ // backward pointer
+ class gpgpu_context *gpgpu_ctx;
-const char *decode_token( int type );
-void read_parser_environment_variables();
-void start_function( int entry_point );
-void add_function_name( const char *fname );
-void init_directive_state();
-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);
+ // 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);
+};
-//Jin: handle instructino group for cdp
-void start_inst_group();
-void end_inst_group();
+const char *decode_token(int type);
+void read_parser_environment_variables();
#define NON_ARRAY_IDENTIFIER 1
#define ARRAY_IDENTIFIER_NO_DIM 2