diff options
-rw-r--r-- | cgcode.c | 138 | ||||
-rw-r--r-- | cgcodep.h | 4 | ||||
-rw-r--r-- | cginput.c | 28 |
3 files changed, 145 insertions, 25 deletions
@@ -6180,6 +6180,39 @@ void code_push_r_args (int a_offset,int a_size,int b_size) push_record_arguments (graph_1,a_size,b_size); } +void code_push_r_arg_D (VOID) +{ + INSTRUCTION_GRAPH graph_1,graph_2; + + graph_1=s_pop_b(); + graph_2=s_get_b (0); + graph_1=g_and (g_load_i (-4),g_add (g_load_i (4-1),graph_1)); +#if defined (G_AI64) +# if defined (MACH_O64) || defined (LINUX) +# ifdef LINUX + if (pic_flag) +# endif + { + graph_1=g_add (g_lsl (g_load_i (3),graph_2),graph_1); + graph_2=g_load_id (0,graph_1); + } +# ifdef LINUX + else +# endif +# endif +# ifndef MACH_O64 + { + graph_1=g_add (g_lsl (g_load_i (2),graph_2),graph_1); + graph_2=g_load_sqb_id (0,graph_1); + } +# endif +#else + graph_1=g_add (g_lsl (g_load_i (2),graph_2),graph_1); + graph_2=g_load_id (0,graph_1); +#endif + s_put_b (0,graph_2); +} + void code_push_r_arg_t (VOID) { INSTRUCTION_GRAPH graph_1,graph_2; @@ -9549,30 +9582,11 @@ void code_descs (char label_name[],char node_entry_label_name[],char *result_des } #endif -void code_record (char record_label_name[],char type[],int a_size,int b_size,char record_name[],int record_name_length) +static void code_record_descriptor (LABEL *label,int string_code_label_id,char type[],int a_size,int b_size) { - LABEL *label; - int string_code_label_id; LABEL *string_label; - label=enter_label (record_label_name,LOCAL_LABEL | DATA_LABEL); - if (label->label_id>=0) - error_s ("Label %d defined twice\n",record_label_name); - label->label_id=next_label_id++; - -#ifdef FUNCTION_LEVEL_LINKING - as_new_data_module(); - if (assembly_flag) - w_as_new_data_module(); -#endif - - string_code_label_id=next_label_id++; - string_label=new_local_label (0 -#ifdef G_POWER - | DATA_LABEL -#endif - ); - label->label_descriptor=string_label; + string_label=label->label_descriptor; #ifndef M68000 /* not for 68k to maintain long word alignment */ @@ -9652,14 +9666,94 @@ void code_record (char record_label_name[],char type[],int a_size,int b_size,cha if (assembly_flag) w_as_c_string_in_data_section (type,length); } +} + +void code_record (char record_label_name[],char type[],int a_size,int b_size,char record_name[],int record_name_length) +{ + LABEL *label,*string_label; + int string_code_label_id; + + label=enter_label (record_label_name,LOCAL_LABEL | DATA_LABEL); + if (label->label_id>=0) + error_s ("Label %d defined twice\n",record_label_name); + label->label_id=next_label_id++; + +#ifdef FUNCTION_LEVEL_LINKING + as_new_data_module(); + if (assembly_flag) + w_as_new_data_module(); +#endif + + string_code_label_id=next_label_id++; + string_label=new_local_label (0 +#ifdef G_POWER + | DATA_LABEL +#endif + ); + label->label_descriptor=string_label; + + code_record_descriptor (label,string_code_label_id,type,a_size,b_size); #ifdef NO_CONSTRUCTOR_NAMES record_name_length=0; #endif - w_descriptor_string (record_name,record_name_length,string_code_label_id,string_label); } +static int record_end_string_code_label_id; +static LABEL *record_end_string_label; + +void code_record_start (char record_label_name[],char type[],int a_size,int b_size) +{ + LABEL *label,*string_label; + int string_code_label_id; + + label=enter_label (record_label_name,LOCAL_LABEL | DATA_LABEL); + if (label->label_id>=0) + error_s ("Label %d defined twice\n",record_label_name); + label->label_id=next_label_id++; + +#ifdef FUNCTION_LEVEL_LINKING + as_new_data_module(); + if (assembly_flag) + w_as_new_data_module(); +#endif + + string_code_label_id=next_label_id++; + string_label=new_local_label (0 +#ifdef G_POWER + | DATA_LABEL +#endif + ); + label->label_descriptor=string_label; + + record_end_string_code_label_id = string_code_label_id; + record_end_string_label = string_label; + + code_record_descriptor (label,string_code_label_id,type,a_size,b_size); +} + +void code_record_descriptor_label (char descriptor_name[]) +{ + LABEL *label; + + label=enter_label (descriptor_name,0); + +# ifdef GEN_OBJ + store_label_in_data_section (label); +# endif + if (assembly_flag) + w_as_label_in_data_section (label->label_name); +} + +void code_record_end (char record_name[],int record_name_length) +{ +#ifdef NO_CONSTRUCTOR_NAMES + record_name_length=0; +#endif + w_descriptor_string (record_name,record_name_length,record_end_string_code_label_id,record_end_string_label); +} + /* static void show_vector (int n,unsigned int vector[]) { @@ -247,6 +247,7 @@ void code_push_arraysize (char *element_descriptor,int a_size,int b_size); void code_pushcaf (char *label_name,int a_size,int b_size); void code_push_node (char *label_name,int n_arguments); void code_push_node_u (char *label_name,int a_size,int b_size); +void code_push_r_arg_D (VOID); void code_push_r_arg_t (VOID); void code_push_r_arg_u (int a_offset,int a_size,int b_size,int a_arg_offset,int a_arg_size,int b_arg_offset,int b_arg_size); void code_pushZ (char *integer_string,int length); @@ -316,6 +317,9 @@ void code_descexp (char *s1,char *s2,char *s3,int n,int lazy_record_flag,char *s void code_descs (char *s1,char *s2,char *s3,int offset1,int offset2,char *s4,int l); #endif void code_record (char *s1,char *s2,int n1,int n2,char *s3,int s3_length); +void code_record_start (char record_label_name[],char type[],int a_size,int b_size); +void code_record_descriptor_label (char descriptor_name[]); +void code_record_end (char record_name[],int record_name_length); void code_depend (char *module_name,int module_name_length); void code_export (char *label_name); void code_impdesc (char *label_name); @@ -1951,11 +1951,32 @@ static int parse_directive_record (InstructionP instruction) parse_label (a1); parse_record_field_types (a2); - if (!parse_unsigned_integer (&n1) || !parse_unsigned_integer (&n2) || !parse_descriptor_string (s,&l)) + if (!parse_unsigned_integer (&n1) || !parse_unsigned_integer (&n2)) return 0; - instruction->instruction_code_function (a1,a2,(int)n1,(int)n2,s,l); - return 1; + if (last_char=='"'){ + if (!parse_descriptor_string (s,&l)) + return 0; + + instruction->instruction_code_function (a1,a2,(int)n1,(int)n2,s,l); + return 1; + } else { + code_record_start (a1,a2,(int)n1,(int)n2); + + do { + STRING a3; + + parse_label (a3); + + code_record_descriptor_label (a3); + } while (last_char!='"'); + + if (!parse_descriptor_string (s,&l)) + return 0; + + code_record_end (s,l); + return 1; + } } static int parse_directive_module (InstructionP instruction) @@ -2500,6 +2521,7 @@ static void put_instructions_in_table2 (void) put_instruction_name ("push_r_args_a", parse_instruction_n_n_n_n_n, code_push_r_args_a ); put_instruction_name ("push_r_args_b", parse_instruction_n_n_n_n_n, code_push_r_args_b ); put_instruction_name ("push_r_args_u", parse_instruction_n_n_n, code_push_r_args_u ); + put_instruction_name ("push_r_arg_D", parse_instruction, code_push_r_arg_D ); put_instruction_name ("push_r_arg_t", parse_instruction, code_push_r_arg_t ); put_instruction_name ("push_r_arg_u", parse_instruction_n_n_n_n_n_n_n, code_push_r_arg_u ); put_instruction_name ("push_wl_args", parse_instruction_n_n_n, code_push_args ); |