aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/config/obj-vms.c118
-rw-r--r--gas/config/obj-vms.h9
2 files changed, 56 insertions, 71 deletions
diff --git a/gas/config/obj-vms.c b/gas/config/obj-vms.c
index 83abd77..1889071 100644
--- a/gas/config/obj-vms.c
+++ b/gas/config/obj-vms.c
@@ -21,6 +21,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Modified by Eric Youngdale to write VMS debug records for program
variables */
#include "as.h"
+#include "config.h"
#include "subsegs.h"
#include "obstack.h"
@@ -36,7 +37,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
* Version string of the compiler that produced the code we are
* assembling. (And this assembler, if we do not have compiler info.)
*/
-extern const char version_string[];
char *compiler_version_string;
/* Flag that determines how we map names. This takes several values, and
@@ -489,6 +489,42 @@ const pseudo_typeS obj_pseudo_table[] =
}; /* obj_pseudo_table */
+int
+vms_resolve_symbol_redef (sym)
+ symbolS *sym;
+{
+ /*
+ * If the new symbol is .comm AND it has a size of zero,
+ * we ignore it (i.e. the old symbol overrides it)
+ */
+ if ((SEGMENT_TO_SYMBOL_TYPE ((int) now_seg) == (N_UNDF | N_EXT)) &&
+ ((obstack_next_free (&frags) - frag_now->fr_literal) == 0))
+ {
+ as_warn ("compiler emitted zero-size common symbol `%s' already defined",
+ S_GET_NAME (sym));
+ return 1;
+ }
+ /*
+ * If the old symbol is .comm and it has a size of zero,
+ * we override it with the new symbol value.
+ */
+ if (S_IS_EXTERNAL(sym) && S_IS_DEFINED(sym)
+ && (S_GET_VALUE(sym) == 0))
+ {
+ as_warn ("compiler redefined zero-size common symbol `%s'",
+ S_GET_NAME (sym));
+ sym->sy_frag = frag_now;
+ S_GET_OTHER(sym) = const_flag;
+ S_SET_VALUE(sym, obstack_next_free(& frags) - frag_now->fr_literal);
+ /* Keep N_EXT bit. */
+ sym->sy_symbol.n_type |= SEGMENT_TO_SYMBOL_TYPE((int) now_seg);
+ return 1;
+ }
+
+ return 0;
+}
+
+
void
obj_read_begin_hook ()
{
@@ -804,7 +840,8 @@ VMS_Set_Data (Psect_Index, Offset, Record_Type, Force)
* Make a debugger reference to a struct, union or enum.
*/
static
-VMS_Store_Struct (int Struct_Index)
+VMS_Store_Struct (Struct_Index)
+ int Struct_Index;
{
/*
* We are writing a "OBJ_S_C_DBG" record
@@ -831,7 +868,8 @@ VMS_Store_Struct (int Struct_Index)
* Make a debugger reference to partially define a struct, union or enum.
*/
static
-VMS_Def_Struct (int Struct_Index)
+VMS_Def_Struct (Struct_Index)
+ int Struct_Index;
{
/*
* We are writing a "OBJ_S_C_DBG" record
@@ -854,7 +892,8 @@ VMS_Def_Struct (int Struct_Index)
}
static
-VMS_Set_Struct (int Struct_Index)
+VMS_Set_Struct (Struct_Index)
+ int Struct_Index;
{ /* see previous functions for comments */
Set_VMS_Object_File_Record (OBJ_S_C_DBG);
if (Object_Record_Offset == 0)
@@ -1165,7 +1204,8 @@ VMS_TBT_Block_Begin (symbolP, Psect, Name)
* Write the Traceback Block End record
*/
static
-VMS_TBT_Block_End (int Size)
+VMS_TBT_Block_End (Size)
+ int Size;
{
char Local[16];
@@ -1921,7 +1961,7 @@ generate_suffix (spnt, dbx_type)
{
int ilen;
int i;
- CONST char pvoid[6] = {5, 0xaf, 0, 1, 0, 5};
+ static CONST char pvoid[6] = {5, 0xaf, 0, 1, 0, 5};
struct VMS_DBG_Symbol *spnt1;
Apoint = 0;
Lpnt = MAX_DEBUG_RECORD - 1;
@@ -3046,7 +3086,8 @@ VMS_DBG_Define_Routine (symbolP, Curr_Routine, Txt_Psect)
#include <time.h>
/* Manufacure a VMS like time on a unix based system. */
-get_VMS_time_on_unix (char *Now)
+get_VMS_time_on_unix (Now)
+ char *Now;
{
char *pnt;
time_t timeb;
@@ -3172,7 +3213,7 @@ Write_VMS_MHD_Records ()
cp = "GNU AS V";
while (*cp)
PUT_CHAR (*cp++);
- cp = strchr (&version_string, '.');
+ cp = strchr (GAS_VERSION, '.');
while (*cp != ' ')
cp--;
cp++;
@@ -3745,8 +3786,9 @@ VMS_Psect_Spec (Name, Size, Type, vsp)
default:
{
char Error_Line[256];
- sprintf (Error_Line, "Globalsymbol attribute for"
- " symbol %s was unexpected.\n", Name);
+ sprintf (Error_Line,
+ "Globalsymbol attribute for symbol %s was unexpected.\n",
+ Name);
error (Error_Line);
break;
};
@@ -4329,62 +4371,6 @@ VMS_Fix_Indirect_Reference (Text_Psect, Offset, fragP, text_frag_root)
}
}
-
-
-/*
- * This is a hacked _doprnt() for VAX-11 "C". It understands that
- * it is ONLY called by as_fatal(Format, Args) with a pointer to the
- * "Args" argument. From this we can make it all work right!
- */
-#if !defined(eunice) && defined(HO_VMS)
-_doprnt (Format, a, f)
- char *Format;
- FILE *f;
- char **a;
-{
- int Nargs = ((int *) a)[-2]; /* This understands as_fatal() */
-
- switch (Nargs)
- {
- default:
- fprintf (f, "_doprnt error on \"%s\"!!", Format);
- break;
- case 1:
- fprintf (f, Format);
- break;
- case 2:
- fprintf (f, Format, a[0]);
- break;
- case 3:
- fprintf (f, Format, a[0], a[1]);
- break;
- case 4:
- fprintf (f, Format, a[0], a[1], a[2]);
- break;
- case 5:
- fprintf (f, Format, a[0], a[1], a[2], a[3]);
- break;
- case 6:
- fprintf (f, Format, a[0], a[1], a[2], a[3], a[4]);
- break;
- case 7:
- fprintf (f, Format, a[0], a[1], a[2], a[3], a[4], a[5]);
- break;
- case 8:
- fprintf (f, Format, a[0], a[1], a[2], a[3], a[4], a[5], a[6]);
- break;
- case 9:
- fprintf (f, Format, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
- break;
- case 10:
- fprintf (f, Format, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
- break;
- }
-}
-
-#endif /* eunice */
-
-
/*
* If the procedure "main()" exists we have to add the instruction
* "jsb c$main_args" at the beginning to be compatible with VAX-11 "C".
diff --git a/gas/config/obj-vms.h b/gas/config/obj-vms.h
index c9906f5..46662f9 100644
--- a/gas/config/obj-vms.h
+++ b/gas/config/obj-vms.h
@@ -221,12 +221,11 @@ typedef struct nlist obj_symbol_type; /* Symbol table entry */
#define obj_symbol_new_hook(s) {;}
-#ifdef __STDC__
struct fix;
-void tc_aout_fix_to_chars (char *where, struct fix *fixP, relax_addressT segment_address);
-#else
-void tc_aout_fix_to_chars ();
-#endif /* __STDC__ */
+void tc_aout_fix_to_chars PARAMS ((char *where, struct fix *fixP, relax_addressT segment_address));
+
+extern int vms_resolve_symbol_redef ();
+#define RESOLVE_SYMBOL_REDEFINITION(X) vms_resolve_symbol_redef(X)
/* The rest of this file contains definitions for constants used within the actual
VMS object file. We do not use a $ in the symbols (as per usual VMS