diff options
| -rw-r--r-- | src/cuda-sim/ptx.l | 10 | ||||
| -rw-r--r-- | src/cuda-sim/ptx.y | 3 | ||||
| -rw-r--r-- | src/cuda-sim/ptx_ir.cc | 21 | ||||
| -rw-r--r-- | src/cuda-sim/ptx_ir.h | 2 |
4 files changed, 28 insertions, 8 deletions
diff --git a/src/cuda-sim/ptx.l b/src/cuda-sim/ptx.l index 0ab7522..0d66bfd 100644 --- a/src/cuda-sim/ptx.l +++ b/src/cuda-sim/ptx.l @@ -174,8 +174,8 @@ xor TC; ptx_lval.int_value = XOR_OP; return OPCODE; \.const TC; return CONST_DIRECTIVE; \.entry TC; return ENTRY_DIRECTIVE; \.extern TC; return EXTERN_DIRECTIVE; -\.file TC; return FILE_DIRECTIVE; -\.func TC; return FUNC_DIRECTIVE; +\.file TC; BEGIN(INITIAL); return FILE_DIRECTIVE; +\.func TC; BEGIN(NOT_OPCODE); return FUNC_DIRECTIVE; \.global TC; return GLOBAL_DIRECTIVE; \.local TC; return LOCAL_DIRECTIVE; \.loc TC; return LOC_DIRECTIVE; @@ -220,8 +220,8 @@ xor TC; ptx_lval.int_value = XOR_OP; return OPCODE; "%warpid" TC; ptx_lval.int_value = WARPID_REG; return SPECIAL_REGISTER; "WARP_SZ" TC; ptx_lval.int_value = WARPSZ_REG; return SPECIAL_REGISTER; -[a-zA-Z][a-zA-Z0-9_$]* TC; ptx_lval.string_value = strdup(yytext); return IDENTIFIER; -[_$%][a-zA-Z0-9_$]+ TC; ptx_lval.string_value = strdup(yytext); return IDENTIFIER; +[a-zA-Z_][a-zA-Z0-9_$]* TC; ptx_lval.string_value = strdup(yytext); return IDENTIFIER; +[$%][a-zA-Z0-9_$]+ TC; ptx_lval.string_value = strdup(yytext); return IDENTIFIER; [0-9]+\.[0-9]+ TC; sscanf(yytext,"%lf", &ptx_lval.double_value); return DOUBLE_OPERAND; @@ -340,7 +340,7 @@ xor TC; ptx_lval.int_value = XOR_OP; return OPCODE; ";" TC; BEGIN(INITIAL); return SEMI_COLON; "!" TC; return EXCLAMATION; "=" TC; return EQUALS; -"{" TC; return LEFT_BRACE; +"{" TC; BEGIN(INITIAL); return LEFT_BRACE; "}" TC; return RIGHT_BRACE; \. TC; return PERIOD; diff --git a/src/cuda-sim/ptx.y b/src/cuda-sim/ptx.y index dd69fe5..9ddb214 100644 --- a/src/cuda-sim/ptx.y +++ b/src/cuda-sim/ptx.y @@ -217,7 +217,7 @@ input: /* empty */ | input function_decl ; -function_defn: function_decl { set_symtab($1); } LEFT_BRACE statement_list RIGHT_BRACE { end_function(); } +function_defn: function_decl { set_symtab($1); start_function_definition(); } LEFT_BRACE statement_list RIGHT_BRACE { end_function(); } | function_decl { set_symtab($1); } block_spec LEFT_BRACE statement_list RIGHT_BRACE { end_function(); } ; @@ -255,6 +255,7 @@ directive_statement: variable_declaration SEMI_COLON | TARGET_DIRECTIVE IDENTIFIER | FILE_DIRECTIVE INT_OPERAND STRING { add_file($2,$3); } | LOC_DIRECTIVE INT_OPERAND INT_OPERAND INT_OPERAND + | PRAGMA_DIRECTIVE STRING SEMI_COLON { add_pragma($2); } ; variable_declaration: variable_spec identifier_list { add_variables(); } diff --git a/src/cuda-sim/ptx_ir.cc b/src/cuda-sim/ptx_ir.cc index 542426a..c981802 100644 --- a/src/cuda-sim/ptx_ir.cc +++ b/src/cuda-sim/ptx_ir.cc @@ -181,6 +181,14 @@ void start_function( int entry_point ) g_entry_func_param_index=0; } +static bool g_in_function_definition = false; + +void start_function_definition() +{ + DPRINTF("start_function_definition"); + g_in_function_definition = true; +} + char *g_add_identifier_cached__identifier = NULL; int g_add_identifier_cached__array_dim; int g_add_identifier_cached__array_ident; @@ -222,12 +230,14 @@ void end_function() { DPRINTF("end_function"); + g_in_function_definition = false; init_directive_state(); init_instruction_state(); g_max_regs_per_thread = mymax( g_max_regs_per_thread, (g_current_symbol_table->next_reg_num()-1)); g_func_info->add_inst( g_instructions ); g_instructions.clear(); gpgpu_ptx_assemble( g_func_info->get_name(), g_func_info ); + g_current_symbol_table = g_global_symbol_table; DPRINTF("function %s, PC = %d\n", g_func_info->get_name().c_str(), g_func_info->get_start_PC()); } @@ -472,8 +482,10 @@ void add_identifier( const char *identifier, int array_dim, unsigned array_ident if ( ti.is_param() ) { - g_func_info->add_param_name_and_type(g_entry_func_param_index,identifier, ti.scalar_type() ); - g_entry_func_param_index++; + if( !g_in_function_definition ) { + g_func_info->add_param_name_and_type(g_entry_func_param_index,identifier, ti.scalar_type() ); + g_entry_func_param_index++; + } } } @@ -1268,6 +1280,11 @@ extern "C" void set_symtab(void*symtab) g_current_symbol_table = (symbol_table*)symtab; } +extern "C" void add_pragma( const char *str ) +{ + printf("GPGPU-Sim: Warning -- ignoring pragma '%s'\n", str ); +} + unsigned ptx_kernel_shmem_size( void *kernel_impl ) { function_info *f = (function_info*)kernel_impl; diff --git a/src/cuda-sim/ptx_ir.h b/src/cuda-sim/ptx_ir.h index 82d5b4c..aca3556 100644 --- a/src/cuda-sim/ptx_ir.h +++ b/src/cuda-sim/ptx_ir.h @@ -1176,6 +1176,7 @@ extern "C" { #endif void start_function( int entry_point ); + void start_function_definition(); void add_function_name( const char *fname ); void init_directive_state(); void add_directive(); @@ -1210,6 +1211,7 @@ extern "C" { void add_file( unsigned num, const char *filename ); void *reset_symtab(); void set_symtab(void*); + void add_pragma( const char *str ); #define NON_ARRAY_IDENTIFIER 1 |
