summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgcode.c138
-rw-r--r--cgcodep.h4
-rw-r--r--cginput.c28
3 files changed, 145 insertions, 25 deletions
diff --git a/cgcode.c b/cgcode.c
index 1de82dd..b7e1da6 100644
--- a/cgcode.c
+++ b/cgcode.c
@@ -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[])
{
diff --git a/cgcodep.h b/cgcodep.h
index d637531..849af36 100644
--- a/cgcodep.h
+++ b/cgcodep.h
@@ -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);
diff --git a/cginput.c b/cginput.c
index 06acd4f..878c006 100644
--- a/cginput.c
+++ b/cginput.c
@@ -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 );