From bdc82d81031549e8db59953358066bc7cd68fdfe Mon Sep 17 00:00:00 2001 From: Ken Raeburn Date: Wed, 9 Aug 1995 01:39:47 +0000 Subject: [PATCH] yet more vms work from pat rankin --- gas/ChangeLog | 10 ++ gas/config/obj-vms.c | 262 ++++++++++++++++++------------------------- 2 files changed, 119 insertions(+), 153 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 8983742993c..3c3fde1d50b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,15 @@ Tue Aug 8 17:27:17 1995 Ken Raeburn + * config/obj-vms.c: Some whitespace changes from Pat Rankin. + + Wed Aug 2 18:54:37 1995 Pat Rankin + + * config/obj-vms.c (Flush_VMS_Object_Record_Buffer, + Close_VMS_Object_File): Reorganize the `#if !VMS' cross-assmebler + support code. + (Close_VMS_Object_File): Call Set_VMS_Object_File_Record to flush + output buffer--just in case--before closing the file. + * as.h (alloca): If __STDC__, declare void* instead of char*. Tue Aug 8 13:07:05 1995 Ian Lance Taylor diff --git a/gas/config/obj-vms.c b/gas/config/obj-vms.c index bdc4874bde9..18326571466 100644 --- a/gas/config/obj-vms.c +++ b/gas/config/obj-vms.c @@ -51,7 +51,7 @@ extern int flag_show_after_trunc; /* -H */ extern int flag_no_hash_mixed_case; /* -h NUM */ /* Flag that determines how we map names. This takes several values, and - * is set with the -h switch. A value of zero implies names should be + * is set with the -h switch. A value of zero implies names should be * upper case, and the presence of the -h switch inhibits the case hack. * No -h switch at all sets vms_name_mapping to 0, and allows case hacking. * A value of 2 (set with -h2) implies names should be @@ -192,7 +192,7 @@ static const char *symbol_name; static structure_count = 0; /* This variable is used to indicate that we are making the last attempt to - parse the stabs, and that we should define as much as we can, and ignore + parse the stabs, and that we should define as much as we can, and ignore the rest */ static int final_pass; @@ -269,7 +269,7 @@ static int Current_Object_Record_Type; /* Type of record in above */ #define COPY_SHORT(dest,val) md_number_to_chars ((dest), (val), 2) #endif /* - * Macros for placing data into the object record buffer + * Macros for placing data into the object record buffer. */ #define PUT_LONG(val) \ ( COPY_LONG (&Object_Record_Buffer[Object_Record_Offset], (val)), \ @@ -416,8 +416,7 @@ static void vms_build_DST PARAMS ((unsigned)); /* The following code defines the special types of pseudo-ops that we - * use with VMS. - */ + use with VMS. */ unsigned char const_flag = IN_DEFAULT_SECTION; @@ -476,13 +475,14 @@ vms_resolve_symbol_redef (sym) return 0; } + /* `tc_frob_label' handler for colon(symbols.c), used to examine the dummy label(s) gcc inserts at the beginning of each file it generates. - gcc 1.x put "gcc_compiled."; gcc 2.x (as of 2.6) puts "gcc2_compiled." + gcc 1.x put "gcc_compiled."; gcc 2.x (as of 2.7) puts "gcc2_compiled." and "__gnu_language_" and possibly "__vax__doubles". */ void -vms_check_for_special_label (symbolP) +vms_check_for_special_label (symbolP) symbolS *symbolP; { /* Special labels only occur prior to explicit section directives. */ @@ -509,12 +509,14 @@ symbolS *symbolP; return; } -void + +void obj_read_begin_hook () { return; } + void obj_crawl_symbol_chain (headers) object_headers *headers; @@ -569,125 +571,118 @@ obj_crawl_symbol_chain (headers) /****** VMS OBJECT FILE HACKING ROUTINES *******/ -/* - * Create the VMS object file - */ +/* Create the VMS object file. */ + static void Create_VMS_Object_File () { #if defined(eunice) || !defined(VMS) VMS_Object_File_FD = creat (out_file_name, 0777, "var"); #else /* eunice */ - VMS_Object_File_FD = creat (out_file_name, 0, "rfm=var", - "mbc=16", "deq=64", "fop=tef", "shr=nil"); + VMS_Object_File_FD = creat (out_file_name, 0, "rfm=var", + "mbc=16", "deq=64", "fop=tef", "shr=nil"); #endif /* eunice */ - /* - * Deal with errors - */ + /* Deal with errors. */ if (VMS_Object_File_FD < 0) as_fatal ("Couldn't create VMS object file \"%s\"", out_file_name); - /* - * Initialize object file hacking variables - */ + /* Initialize object file hacking variables. */ Object_Record_Offset = 0; Current_Object_Record_Type = -1; } - -/* - * Flush the object record buffer to the object file - */ + +/* Flush the object record buffer to the object file. */ + static void Flush_VMS_Object_Record_Buffer () { - int i; -#ifndef VMS - short int zero; - int RecLen; -#endif - - /* - * If the buffer is empty, we are done - */ + /* If the buffer is empty, there's nothing to do. */ if (Object_Record_Offset == 0) return; - /* - * Write the data to the file - */ + #ifndef VMS /* For cross-assembly purposes. */ - md_number_to_chars ((char *) &RecLen, Object_Record_Offset, 2); - i = write (VMS_Object_File_FD, &RecLen, 2); + { + char RecLen[2]; + + /* "Variable-length record" files have a two byte length field + prepended to each record. It's normally out-of-band, and native + VMS output will insert it automatically for this type of file. + When cross-assembling, we must write it explicitly. */ + md_number_to_chars (RecLen, Object_Record_Offset, 2); + if (write (VMS_Object_File_FD, RecLen, 2) != 2) + error ("I/O error writing VMS object file (length prefix)"); + /* We also need to force the actual record to be an even number of + bytes. For native output, that's automatic; when cross-assembling, + pad with a NUL byte if length is odd. Do so _after_ writing the + pre-padded length. Since our buffer is defined with even size, + an odd offset implies that it has some room left. */ + if ((Object_Record_Offset & 1) != 0) + Object_Record_Buffer[Object_Record_Offset++] = '\0'; + } #endif /* not VMS */ - i = write (VMS_Object_File_FD, - Object_Record_Buffer, - Object_Record_Offset); - if (i != Object_Record_Offset) + + /* Write the data to the file. */ + if (write (VMS_Object_File_FD, Object_Record_Buffer, Object_Record_Offset) + != Object_Record_Offset) error ("I/O error writing VMS object file"); -#ifndef VMS /* When cross-assembling, we need to pad the record to an even - number of bytes. */ - /* pad it if needed */ - zero = 0; - if ((Object_Record_Offset & 1) != 0) - write (VMS_Object_File_FD, &zero, 1); -#endif /* not VMS */ - /* - * The buffer is now empty - */ + + /* The buffer is now empty. */ Object_Record_Offset = 0; } - -/* - * Declare a particular type of object file record - */ + +/* Declare a particular type of object file record. */ + static void Set_VMS_Object_File_Record (Type) int Type; { - /* - * If the type matches, we are done - */ + /* If the type matches, we are done. */ if (Type == Current_Object_Record_Type) return; - /* - * Otherwise: flush the buffer - */ + /* Otherwise: flush the buffer. */ Flush_VMS_Object_Record_Buffer (); - /* - * Set the new type - */ + /* Remember the new type. */ Current_Object_Record_Type = Type; } - -/* - * Close the VMS Object file - */ +/* Close the VMS Object file. */ + static void Close_VMS_Object_File () { -#ifndef VMS /* For cross-assembly purposes. */ - short int m_one = -1; + /* Flush (should never be necessary) and reset saved record-type context. */ + Set_VMS_Object_File_Record (-1); - /* Write a record-length field of 0xffff into the file, which means - end-of-file when read later. It is only needed for variable-length - record files transferred to VMS as fixed-length record files - (typical for binary ftp). */ - write (VMS_Object_File_FD, &m_one, 2); +#ifndef VMS /* For cross-assembly purposes. */ + { + char RecLen[2]; + int minus_one = -1; + + /* Write a 2 byte record-length field of -1 into the file, which + means end-of-block when read, hence end-of-file when occurring + in the file's last block. It is only needed for variable-length + record files transferred to VMS as fixed-length record files + (typical for binary FTP; NFS shouldn't need it, but it won't hurt). */ + md_number_to_chars (RecLen, minus_one, 2); + write (VMS_Object_File_FD, RecLen, 2); + } #else - /* When written on a VMS system, the file header (cf inode) will record - the actual end-of-file position and no inline marker is needed. */ + /* When written on a VMS system, the file header (cf inode) will record + the actual end-of-file position and no inline marker is needed. */ #endif close (VMS_Object_File_FD); } -/* - * Stack Psect base followed by signed, varying-sized offset. - * Common to several object records. - */ + /****** Text Information and Relocation routines ******/ + + +/* Stack Psect base followed by signed, varying-sized offset. + Common to several object records. */ + static void vms_tir_stack_psect (Psect_Index, Offset, Force) int Psect_Index; @@ -731,9 +726,9 @@ vms_tir_stack_psect (Psect_Index, Offset, Force) #undef Sta_P } -/* - * Store immediate data in current Psect - */ + +/* Store immediate data in current Psect. */ + static void VMS_Store_Immediate_Data (Pointer, Size, Record_Type) const char *Pointer; @@ -742,51 +737,35 @@ VMS_Store_Immediate_Data (Pointer, Size, Record_Type) { register int i; - /* - * We are writing a "Record_Type" record - */ Set_VMS_Object_File_Record (Record_Type); - /* - * We can only store 128 bytes at a time - */ + /* We can only store as most 128 bytes at a time due to the way that + TIR commands are encoded. */ while (Size > 0) { - /* - * Store a maximum of 128 bytes - */ i = (Size > 128) ? 128 : Size; Size -= i; - /* - * If we cannot accommodate this record, flush the - * buffer. - */ - if ((Object_Record_Offset + i + 1) >= sizeof (Object_Record_Buffer)) + /* If we cannot accommodate this record, flush the buffer. */ + if ((Object_Record_Offset + i + 1) >= sizeof Object_Record_Buffer) Flush_VMS_Object_Record_Buffer (); - /* - * If the buffer is empty we must insert record type - */ + /* If the buffer is empty we must insert record type. */ if (Object_Record_Offset == 0) PUT_CHAR (Record_Type); - /* - * Store the count - */ - PUT_CHAR (-i & 0xff); - /* - * Store the data - */ + /* Store the count. The Store Immediate TIR command is implied by + a negative command byte, and the length of the immediate data + is abs(command_byte). So, we write the negated length value. */ + PUT_CHAR ((char) (-i & 0xff)); + /* Now store the data. */ while (--i >= 0) PUT_CHAR (*Pointer++); } - /* - * Flush the buffer if it is more than 75% full. - */ + /* Flush the buffer if it is more than 75% full. */ if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) Flush_VMS_Object_Record_Buffer (); } -/* - * Make a data reference - */ + +/* Make a data reference. */ + static void VMS_Set_Data (Psect_Index, Offset, Record_Type, Force) int Psect_Index; @@ -794,79 +773,56 @@ VMS_Set_Data (Psect_Index, Offset, Record_Type, Force) int Record_Type; int Force; { - /* - * We are writing a "Record_Type" record - */ Set_VMS_Object_File_Record (Record_Type); - /* - * If the buffer is empty we must insert the record type - */ + /* If the buffer is empty we must insert the record type. */ if (Object_Record_Offset == 0) PUT_CHAR (Record_Type); - /* - * Stack the Psect base with its offset - */ + /* Stack the Psect base with its offset. */ vms_tir_stack_psect (Psect_Index, Offset, Force); - /* - * Set relocation base - */ + /* Set relocation base. */ PUT_CHAR (TIR_S_C_STO_PIDR); - /* - * Flush the buffer if it is more than 75% full - */ + /* Flush the buffer if it is more than 75% full. */ if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) Flush_VMS_Object_Record_Buffer (); } -/* - * Make a debugger reference to a struct, union or enum. - */ + +/* Make a debugger reference to a struct, union or enum. */ + static void VMS_Store_Struct (Struct_Index) int Struct_Index; { - /* - * We are writing a "OBJ_S_C_DBG" record - */ + /* We are writing a debug record. */ Set_VMS_Object_File_Record (OBJ_S_C_DBG); - /* - * If the buffer is empty we must insert the record type - */ + /* If the buffer is empty we must insert the record type. */ if (Object_Record_Offset == 0) PUT_CHAR (OBJ_S_C_DBG); PUT_CHAR (TIR_S_C_STA_UW); PUT_SHORT (Struct_Index); PUT_CHAR (TIR_S_C_CTL_STKDL); PUT_CHAR (TIR_S_C_STO_L); - /* - * Flush the buffer if it is more than 75% full - */ + /* Flush the buffer if it is more than 75% full. */ if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) Flush_VMS_Object_Record_Buffer (); } -/* - * Make a debugger reference to partially define a struct, union or enum. - */ + +/* Make a debugger reference to partially define a struct, union or enum. */ + static void VMS_Def_Struct (Struct_Index) int Struct_Index; { - /* - * We are writing a "OBJ_S_C_DBG" record - */ + /* We are writing a debug record. */ Set_VMS_Object_File_Record (OBJ_S_C_DBG); - /* - * If the buffer is empty we must insert the record type - */ + /* If the buffer is empty we must insert the record type. */ if (Object_Record_Offset == 0) PUT_CHAR (OBJ_S_C_DBG); PUT_CHAR (TIR_S_C_STA_UW); PUT_SHORT (Struct_Index); PUT_CHAR (TIR_S_C_CTL_DFLOC); - /* - * Flush the buffer if it is more than 75% full - */ + /* Flush the buffer if it is more than 75% full. */ if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) Flush_VMS_Object_Record_Buffer (); } -- 2.30.2