summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgcode.c29
-rw-r--r--cgcodep.h1
-rw-r--r--cginput.c1
3 files changed, 31 insertions, 0 deletions
diff --git a/cgcode.c b/cgcode.c
index cbf4ee9..4b8891f 100644
--- a/cgcode.c
+++ b/cgcode.c
@@ -9386,6 +9386,11 @@ void code_export (char *label_name)
enter_label (label_name,EXPORT_LABEL);
}
+#if defined (G_A64) && defined (LINUX)
+extern char **sl_mods;
+static int pic_sl_mod_import;
+#endif
+
void code_impdesc (char *label_name)
{
enter_label (label_name,IMPORT_LABEL | DATA_LABEL);
@@ -9414,6 +9419,27 @@ void code_implab (char *label_name)
/* enter_label (label_name,IMPORT_LABEL); */
}
+void code_impmod (char *module_name)
+{
+#if defined (G_A64) && defined (LINUX)
+ if (pic_flag){
+ if (!rts_got_flag){
+ pic_sl_mod_import = 1;
+ } else {
+ char **sl_mod;
+
+ for (sl_mod=sl_mods; *sl_mod!=NULL; ++sl_mod){
+ if (!strcmp (module_name,*sl_mod)){
+ pic_sl_mod_import = 1;
+ return;
+ }
+ }
+ pic_sl_mod_import = 0;
+ }
+ }
+#endif
+}
+
void code_o (int oa,int ob,ULONG vector[])
{
offered_a_stack_size=oa;
@@ -9991,6 +10017,9 @@ void initialize_coding (VOID)
last_instruction=NULL;
INT_label=BOOL_label=CHAR_label=REAL_label=FILE_label=_STRING__label=_ARRAY__label=NULL;
+#if defined (G_A64) && defined (LINUX)
+ pic_sl_mod_import=!rts_got_flag;
+#endif
halt_label=cat_string_label=NULL;
cmp_string_label=eqD_label=NULL;
diff --git a/cgcodep.h b/cgcodep.h
index 8519539..b5ee038 100644
--- a/cgcodep.h
+++ b/cgcodep.h
@@ -319,6 +319,7 @@ void code_export (char *label_name);
void code_impdesc (char *label_name);
void code_implab_node_entry (char *label_name,char *ea_label_name);
void code_implab (char *label_name);
+void code_impmod (char *module_name);
void code_keep (int a_offset_1,int a_offset_2);
void code_n (int number_of_arguments,char *descriptor_name,char *ea_label_name);
void code_nu (int a_size,int b_size,char *descriptor_name,char *ea_label_name);
diff --git a/cginput.c b/cginput.c
index 1412c5f..bc62e50 100644
--- a/cginput.c
+++ b/cginput.c
@@ -2587,6 +2587,7 @@ static void put_instructions_in_table2 (void)
put_instruction_name (".impdesc", parse_directive_label, code_impdesc );
put_instruction_name (".implab", parse_directive_implab, code_implab );
put_instruction_name (".implib", parse_directive_implib_impobj, code_dummy );
+ put_instruction_name (".impmod", parse_instruction_l, code_impmod );
put_instruction_name (".impobj", parse_directive_implib_impobj, code_dummy );
put_instruction_name (".module", parse_directive_module, code_module );
put_instruction_name (".n", parse_directive_n, code_n );