From 0c37646508ccd3222db567f20d0ed44a9c3ba1d2 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Mon, 23 Feb 2009 09:28:43 +0000 Subject: 2009-02-23 Tristan Gingold * vms.h: Update copyright year, fix comments, reorder declarations. (_bfd_save_vms_section): Remove the prototype. (EGPS_S_V_NO_SHIFT): New constant. (bfd_vms_set_section_flags): New prototype. (EGPS_S_B_ALIGN, EGPS_S_W_FLAGS, EGPS_S_L_ALLOC, EGPS_S_B_NAMLNG): New constants. (EGSY_S_W_FLAGS): Ditto. (EGSY_S_V_QUAD_VAL): Ditto. (ESDF_S_L_VALUE, ESDF_S_L_PSINDX, ESDF_S_B_NAMLNG): Ditto. (EGST_S_W_FLAGS, EGST_S_Q_LP_1, EGST_S_Q_LP_2, EGST_S_L_PSINDX, EGST_S_B_NAMLNG): Ditto. (ESRF_S_B_NAMLNG): Ditto. (ETIR_S_C_HEADER_SIZE): Ditto. (EGPS_S_V_ALLOC_64BIT): Ditto. (DST_S_C_EPILOG): Ditto. (DST_S_C_SRC_SETLNUM_L, DST_S_C_SRC_SETLNUM_W) : Ditto. (DST_S_C_SRC_INCRLNUM_B): Ditto. (DST_S_B_PCLINE_UNSBYTE, DST_S_W_PCLINE_UNSWORD): Ditto. (DST_S_L_PCLINE_UNSLONG): Ditto. (DST_S_B_MODBEG_NAME, DST_S_L_RTNBEG_ADDRESS) : Ditto (DST_S_B_RTNBEG_NAME, DST_S_L_RTNEND_SIZE): Ditto (DST_S_C_SOURCE_HEADER_SIZE): Ditto. (DST_S_B_SRC_DF_LENGTH, DST_S_W_SRC_DF_FILEID): Ditto. (DST_S_B_SRC_DF_FILENAME, DST_S_B_SRC_UNSBYTE): Ditto. (DST_S_B_SRC_UNSBYTE): Ditto. (DST_S_W_SRC_UNSWORD, DST_S_L_SRC_UNSLONG): Ditto. Add prototypes. (vms_section, vms_reloc): Remove types. (hdr_struc): Replaced by ... (hdr_struct): ... new type. (EMH_S_W_HDRTYP, EMH_S_B_STRLVL, EMH_S_L_ARCH1): New constants. (EMH_S_L_ARCH2, EMH_S_L_RECSIZ, EMH_S_B_NAMLNG): Ditto. (EMH_DATE_LENGTH): Ditto. (eom_struc): Replaced by ... (eom_struct): ... new type. (EEOM_S_L_TOTAL_LPS, EEOM_S_W_COMCOD, EEOM_S_B_TFRFLG): New constants. (EEOM_S_L_PSINDX, EEOM_S_L_TFRADR): Ditto. (EIHD_S_K_MAJORID, EIHD_S_K_MINORID, EIHD_S_K_EXE): Ditto. (EIHD_S_L_SIZE, EIHD_S_L_ISDOFF, EIHD_S_L_SYMDBGOFF): Ditto. (EIHD_S_Q_SYMVVA, EIHD_S_L_IMGTYPE): Ditto. (EISD_S_L_EISDSIZE, EISD_S_L_SECSIZE, EISD_S_Q_VIR_ADDR): Ditto. (EISD_S_L_FLAGS, EISD_S_L_VBN, EISD_S_R_CONTROL): Ditto. (EISD_S_L_IDENT, EISD_S_T_GBLNAM): Ditto. (EISD_S_M_GBL, EISD_S_M_CRF, EISD_S_M_DZRO, EISD_S_M_WRT): Ditto. (EISD_S_M_INITALCODE, EISD_S_M_BASED, EISD_S_M_FIXUPVEC): Ditto. (EISD_S_M_RESIDENT, EISD_S_M_VECTOR, EISD_S_M_PROTECT): Ditto. (EISD_S_M_LASTCLU, EISD_S_M_EXE, EISD_S_M_NONSHRADR): Ditto. (EISD_S_M_QUAD_LENGTH, EISD_S_M_ALLOC_64BIT): Ditto. (EIHS_S_L_DSTVBN, EIHS_S_L_DSTSIZE, EIHS_S_L_GSTVBN): Ditto. (EIHS_S_L_GSTSIZE, EIHS_S_L_DMTVBN, EIHS_S_L_DMTBYTES): Ditto. (DBG_S_L_DMT_MODBEG, DBG_S_L_DST_SIZE): Ditto. (DBG_S_W_DMT_PSECT_COUNT, DBG_S_C_DMT_HEADER_SIZE): Ditto. (DBG_S_L_DMT_PSECT_START, DBG_S_L_DMT_PSECT_LENGTH) (DBG_S_C_DMT_PSECT_SIZE): Ditto. (enum file_type_enum): New type. (struct location_struct): Removed. (struct fileinfo, struct srecinfo, struct lineinfo): New types. (struct funcinfo, struct module): Ditto. (struct vms_private_data_struct): Update fields. (struct vms_section_data_struct): New type. * vms.c: Update copyright year, fix comments, Fix includes for DECC, add prototypes. (vms_initialize): Use bfd_alloc instead of bfd_zalloc and remove some initializers. Use flavour to set is_vax, location_stack is removed. (struct pair): Declare. (fill_section_ptr): Initialize variables at declaration. Add guard to set SECTION_SYM flag, handlde und section. (vms_fixup_sections): Use struct pair for fill_section_ptr argument. (_bfd_vms_slurp_object_records): New function, replaces previous vms_object_p. (vms_slurp_module): New function. (vms_slurp_image): Ditto. (vms_object_p): Complete rewrite. (vms_mkobject): Use is_vax field to slect architecture. (free_reloc_stream): New function. (vms_convert_to_var): Ditto. (vms_convert_to_var_1): Ditto. (vms_convert_to_var_unix_filename): Ditto. (vms_close_and_cleanup): Call free_reloc_stream, convert file to VAR format on VMS. (vms_new_section_hook): Set alignment to 0, allocate private data. (vms_get_section_contents): Load content. (vms_get_symbol_info): Handle undefined section. (vms_find_nearest_line): Handle. (alloc_reloc_stream): New function. (vms_slurp_reloc_table): Ditto. (vms_get_reloc_upper_bound): Make it real. (vms_canonicalize_reloc): Do the real work. (alpha_howto_table): Add ALPHA_R_NOP, ALPHA_R_BSR, ALPHA_R_LDA, ALPHA_R_BOH. (vms_bfd_reloc_type_lookup): Handle NOP, BSR, LDA and BOH. (vms_set_arch_mach): Check arch. (vms_set_section_contents): Copy the content after allocation. (vms_alpha_vec): Update object flags. * vms-tir.c: Update copyright year, fix comments, add prototypes for new functions. (dst_define_location): New function. (dst_restore_location): New function. (dst_retrieve_location): New function. (dst_check_allocation): New function. (image_dump): Call dst_check_allocation. (image_write_b): Ditto. (image_write_w): Ditto. (image_write_l): Ditto. (image_write_q): Ditto. (cmd_name): Handle STA_LW, STA_QW, STO_OFF, STO_IMM, STO_IMMR, STO_LW, STO_QW, OPR_ADD, CTL_SETRB, STC_LP_PSB, CTL_DFLOC, CTL_STLOC, CTL_STKDL. Call error handler instead of abort if name is not known. (etir_sta): Add quarter_relocs argument and set it. Fix cast. (etir_sto): Ditto. (etir_opr): Ditto, return FALSE in case of error. (etir_ctl): Add quarter_relocs argument and set it, fix cast. Fix CTL_DFLOC, CTL_STLOC, CTL_STKDL. (etir_stc): Add quarter_relocs argument and set it, fix cast. Fix STC_LP, STC_LP_PSB, STC_GBL and STC_CGA. Handle STC_LP_PSB, STC_BSR_GBL, STC_LDA_GBL, STC_BOH_GBL. Move STC_NOP_PS, STC_BSR_PS, STC_LDA_PS, STC_BOH_PS, STC_NBH_PS. Return FALSE in case of error. (tir_sta): Change sign of psect. (tir_ctl): Ditto. (tir_cmd): Fix cast. Makes tir_table static const. (etir_cmd): Add quarter_relocs argument, makes etir_table const, add argument to explain. (analyze_etir): Initialize maxptr, add quarter_relocs declaration, move some declarations into inner scopes. Handle quarter_relocs and STO_IMM. (_bfd_vms_slurp_tir): Use constant instead of hard-coded values. (_bfd_vms_slurp_relocs): New function. (_bfd_vms_decode_relocs): New function. (sto_imm): Rewritten. (start_first_etbt_record): New function. (start_another_etbt_record): Ditto. (etir_output_check): Ditto. (defer_reloc_p): Ditto. (_bfd_vms_write_tir): Remove nextoffset, convert a while-loop to a for-loop. Correctly deals with contents, deals with .vmsdebug, rewritte relocations handling. (_bfd_vms_write_tbt): Removed. (_bfd_vms_write_dbg): Ditto. * vms-misc.c: Update copyright year, Fix comments. (_bfd_vms_get_header_values): Use 'size' instead of 'length'. (maybe_adjust_record_pointer_for_object): New function. (_bfd_vms_get_first_record): New function, replaces ... (_bfd_vms_get_record): .. removed. (_bfd_vms_get_object_record): New function. (_bfd_vms_get_object_record): New function. (vms_get_remaining_object_record): New function, replaces ... (_bfd_vms_get_next_record): ... removed. (add_new_contents): Removed. (_bfd_save_vms_section): Removed. (_bfd_get_vms_section): Removed. (_bfd_vms_output_flush): Write in VAR format. (new_symbol): Don't make UND section. * vms-hdr.c: Update copyright year, update list of record handled. (_bfd_vms_slurp_hdr): rec_length renamed to rec_size. (_bfd_vms_write_hdr): Strip vms and unix patches, add comments, truncate module name at 31 characters, use constants instead of hard-coded value, write BFD version instead of a fixed string. (_bfd_vms_slurp_ihd): New function. (_bfd_vms_slurp_isd): Ditto. (_bfd_vms_slurp_ihs): Ditto. (new_module): Ditto. (parse_module): Ditto (build_module_list): Ditto. (module_find_nearest_line): Ditto. (_bfd_vms_find_nearest_dst_line): Ditto. (vms_slurp_debug): Ditto. (_bfd_vms_slurp_dbg): Ditto. (_bfd_vms_slurp_tbt): Ditto. (_bfd_vms_write_dbg): Ditto. (_bfd_vms_write_tbt): Ditto. * vms-gsd.c: Update copyright year, update list of records handled. (EVAX_LITERALS_NAME): New macro. (evax_section_flags): Add an entry for EVAX_LITERALS_NAME. (gpsflagdesc, gsyflagdesc): Moved out of _bfd_vms_slurp_gsd. (register_universal_symbol): New function and prototype. (_bfd_vms_slurp_gsd): Fix indentations and casts, improve debug messages, use constants instead of hard-coded value, fix missing endianness conversion, handle global symbol (SYMG). (bfd_vms_set_section_flags): New function. (_bfd_vms_write_gsd): Don't write .vmsdebug section, handle section literals, fix indentation, handle section bfd and vms flags, don't output LIB$INITIALIZE symbol, fix handling of weak symbols, fix evax vs vax procedure descriptor, handle absolute symbols. * reloc.c (BFD_RELOC_ALPHA_NOP, BFD_RELOC_ALPHA_BSR, BFD_RELOC_ALPHA_LDA, BFD_RELOC_ALPHA_BOH): New relocations. * makefile.vms (DEFS): Fix flags for VMS. * bfdio.c (real_fopen): Handle multiple VMS fopen attributes. * bfd-in2.h: Regenerated. * libbfd.h: Regenerated. --- bfd/vms.h | 635 ++++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 434 insertions(+), 201 deletions(-) (limited to 'bfd/vms.h') diff --git a/bfd/vms.h b/bfd/vms.h index 2235540..b7d9344 100644 --- a/bfd/vms.h +++ b/bfd/vms.h @@ -1,6 +1,8 @@ /* vms.h -- Header file for VMS (Alpha and Vax) support. - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007 - Free Software Foundation, Inc. + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, + 2008, 2009 Free Software Foundation, Inc. + + Main header file. Written by Klaus K"ampf (kkaempf@rmi.de) @@ -25,9 +27,12 @@ #ifndef VMS_H #define VMS_H -/* Constants starting with 'Exxx_' are for openVMS/Alpha (EVAX object language) */ +/* Constants starting with 'Exxx_' are for openVMS/Alpha (EVAX object + language). */ + +#define VMS_BLOCK_SIZE 512 -/* VMS Text, information and relocation record (TIR/ETIR) definitions. */ +/* VMS Text Information and Relocation Records (TIR/ETIR). */ #define TIR_S_C_STA_GBL 0 #define TIR_S_C_STA_SB 1 @@ -107,7 +112,7 @@ #define ETIR_S_C_STA_GBL 0 /* Stack global symbol value. */ #define ETIR_S_C_STA_LW 1 /* Stack longword. */ #define ETIR_S_C_STA_QW 2 /* Stack quadword. */ -#define ETIR_S_C_STA_PQ 3 /* Stack psect base plus quadword offset. */ +#define ETIR_S_C_STA_PQ 3 /* Stack psect base + quadword off. */ #define ETIR_S_C_STA_LI 4 /* Stack literal. */ #define ETIR_S_C_STA_MOD 5 /* Stack module. */ #define ETIR_S_C_STA_CKARG 6 /* Check Arguments. */ @@ -173,7 +178,9 @@ #define ETIR_S_C_STC_NBH_PS 214 /* Store-conditional NOP,BSR or HINT at psect + offset. */ #define ETIR_S_C_MAXSTCCOD 214 /* Maximum store-conditional code. */ -/* VMS Global symbol definition record (GSD/EGSD). */ +#define ETIR_S_C_HEADER_SIZE 4 /* Size of the header of a command */ + +/* VMS Global Symbol Directory Records (GSD/EGSD). */ #define GSD_S_K_ENTRIES 1 #define GSD_S_C_ENTRIES 1 @@ -206,6 +213,7 @@ #define EGSD_S_C_SYMG 8 /* EGST - gst version of SYM. */ #define EGSD_S_C_MAXRECTYP 8 /* Maximum entry type defined. */ +/* Program Section Definition. */ #define GPS_S_M_PIC 1 #define GPS_S_M_LIB 2 #define GPS_S_M_OVR 4 @@ -219,31 +227,41 @@ #define GPS_S_K_NAME 9 #define GPS_S_C_NAME 9 -#define EGPS_S_V_PIC 0x0001 -#define EGPS_S_V_LIB 0x0002 -#define EGPS_S_V_OVR 0x0004 -#define EGPS_S_V_REL 0x0008 -#define EGPS_S_V_GBL 0x0010 -#define EGPS_S_V_SHR 0x0020 -#define EGPS_S_V_EXE 0x0040 -#define EGPS_S_V_RD 0x0080 -#define EGPS_S_V_WRT 0x0100 -#define EGPS_S_V_VEC 0x0200 -#define EGPS_S_V_NOMOD 0x0400 -#define EGPS_S_V_COM 0x0800 - +#define EGPS_S_B_ALIGN 4 +#define EGPS_S_W_FLAGS 6 +#define EGPS_S_L_ALLOC 8 +#define EGPS_S_B_NAMLNG 12 + +#define EGPS_S_V_PIC 0x0001 +#define EGPS_S_V_LIB 0x0002 +#define EGPS_S_V_OVR 0x0004 +#define EGPS_S_V_REL 0x0008 +#define EGPS_S_V_GBL 0x0010 +#define EGPS_S_V_SHR 0x0020 +#define EGPS_S_V_EXE 0x0040 +#define EGPS_S_V_RD 0x0080 +#define EGPS_S_V_WRT 0x0100 +#define EGPS_S_V_VEC 0x0200 +#define EGPS_S_V_NOMOD 0x0400 +#define EGPS_S_V_COM 0x0800 +#define EGPS_S_V_ALLOC_64BIT 0x1000 + +/* Symbol Defintion or Reference. */ #define GSY_S_M_WEAK 1 #define GSY_S_M_DEF 2 #define GSY_S_M_UNI 4 #define GSY_S_M_REL 8 -#define EGSY_S_V_WEAK 0x0001 -#define EGSY_S_V_DEF 0x0002 -#define EGSY_S_V_UNI 0x0004 -#define EGSY_S_V_REL 0x0008 -#define EGSY_S_V_COMM 0x0010 -#define EGSY_S_V_VECEP 0x0020 -#define EGSY_S_V_NORM 0x0040 +#define EGSY_S_W_FLAGS 6 + +#define EGSY_S_V_WEAK 0x0001 +#define EGSY_S_V_DEF 0x0002 +#define EGSY_S_V_UNI 0x0004 +#define EGSY_S_V_REL 0x0008 +#define EGSY_S_V_COMM 0x0010 +#define EGSY_S_V_VECEP 0x0020 +#define EGSY_S_V_NORM 0x0040 +#define EGSY_S_V_QUAD_VAL 0x0080 #define LSY_S_M_DEF 2 #define LSY_S_M_REL 8 @@ -251,10 +269,26 @@ #define ENV_S_M_DEF 1 #define ENV_S_M_NESTED 2 +/* Symbol Definition. */ +#define ESDF_S_L_VALUE 8 +#define ESDF_S_L_PSINDX 28 +#define ESDF_S_B_NAMLNG 32 + +/* Universal Symbol Definition. */ +#define EGST_S_W_FLAGS 6 +#define EGST_S_Q_LP_1 16 +#define EGST_S_Q_LP_2 24 +#define EGST_S_L_PSINDX 32 +#define EGST_S_B_NAMLNG 36 + +/* Symbol Reference. */ +#define ESRF_S_B_NAMLNG 8 + /* Debugger symbol definitions: These are done by hand, as no machine-readable version seems to be available. */ #define DST_S_C_C 7 /* Language == "C". */ #define DST_S_C_CXX 15 /* Language == "C++". */ +#define DST_S_C_EPILOG 127 #define DST_S_C_VERSION 153 #define DST_S_C_SOURCE 155 /* Source file. */ #define DST_S_C_PROLOG 162 @@ -269,15 +303,19 @@ #define DST_S_C_MODEND 189 /* End of module. */ #define DST_S_C_RTNBEG 190 /* Beginning of routine.*/ #define DST_S_C_RTNEND 191 /* End of routine. */ -#define DST_S_C_DELTA_PC_W 1 /* Incr PC. */ -#define DST_S_C_INCR_LINUM 2 /* Incr Line #. */ -#define DST_S_C_INCR_LINUM_W 3 /* Incr Line #. */ -#define DST_S_C_SET_LINUM_INCR 4 + +/* These are used with DST_S_C_LINE_NUM. */ +#define DST_S_C_LINE_NUM_HEADER_SIZE 4 + +#define DST_S_C_DELTA_PC_W 1 /* Incr PC. */ +#define DST_S_C_INCR_LINUM 2 /* Incr Line #. */ +#define DST_S_C_INCR_LINUM_W 3 /* Incr Line #. */ +#define DST_S_C_SET_LINUM_INCR 4 #define DST_S_C_SET_LINUM_INCR_W 5 #define DST_S_C_RESET_LINUM_INCR 6 -#define DST_S_C_BEG_STMT_MODE 7 -#define DST_S_C_END_STMT_MODE 8 -#define DST_S_C_SET_LINE_NUM 9 /* Set Line #. */ +#define DST_S_C_BEG_STMT_MODE 7 +#define DST_S_C_END_STMT_MODE 8 +#define DST_S_C_SET_LINE_NUM 9 /* Set Line #. */ #define DST_S_C_SET_PC 10 #define DST_S_C_SET_PC_W 11 #define DST_S_C_SET_PC_L 12 @@ -295,9 +333,32 @@ #define DST_S_C_SRC_SETFILE 2 /* Set source file. */ #define DST_S_C_SRC_SETREC_L 3 /* Set record, longword value. */ #define DST_S_C_SRC_SETREC_W 4 /* Set record, word value. */ +#define DST_S_C_SRC_SETLNUM_L 5 /* Set line, longword value. */ +#define DST_S_C_SRC_SETLNUM_W 6 /* Set line, word value. */ +#define DST_S_C_SRC_INCRLNUM_B 7 /* Increment line. */ #define DST_S_C_SRC_DEFLINES_W 10 /* # of line, word counter. */ #define DST_S_C_SRC_DEFLINES_B 11 /* # of line, byte counter. */ #define DST_S_C_SRC_FORMFEED 16 /* ^L counts as a record. */ + +#define DST_S_B_PCLINE_UNSBYTE 1 +#define DST_S_W_PCLINE_UNSWORD 1 +#define DST_S_L_PCLINE_UNSLONG 1 + +#define DST_S_B_MODBEG_NAME 14 +#define DST_S_L_RTNBEG_ADDRESS 5 +#define DST_S_B_RTNBEG_NAME 13 +#define DST_S_L_RTNEND_SIZE 5 + +/* These are used with DST_S_C_SOURCE. */ +#define DST_S_C_SOURCE_HEADER_SIZE 4 + +#define DST_S_B_SRC_DF_LENGTH 1 +#define DST_S_W_SRC_DF_FILEID 3 +#define DST_S_B_SRC_DF_FILENAME 20 +#define DST_S_B_SRC_UNSBYTE 1 +#define DST_S_W_SRC_UNSWORD 1 +#define DST_S_L_SRC_UNSLONG 1 + /* The following are the codes for the various data types. Anything not on the list is included under 'advanced_type'. */ #define DBG_S_C_UCHAR 0x02 @@ -328,6 +389,7 @@ #define DSC_K_CLASS_D 0x02 /* Dynamic string (not via malloc!). */ #define DSC_K_CLASS_A 0x04 /* Array. */ #define DSC_K_CLASS_UBS 0x0d /* Unaligned bit string. */ + /* These are the codes that are used to generate the definitions of struct union and enum records. */ #define DBG_S_C_ENUM_ITEM 0xa4 @@ -336,7 +398,7 @@ #define DBG_S_C_STRUCT_ITEM DST_K_VFLAGS_BITOFFS /* 0xff */ #define DBG_S_C_STRUCT_START 0xab #define DBG_S_C_STRUCT_END 0xac -#define DST_K_TYPSPEC 0xaf /* Type specification. */ +#define DST_K_TYPSPEC 0xaf /* Type specification. */ /* These codes are used in the generation of the symbol definition records. */ #define DST_K_VFLAGS_NOVAL 0x80 /* Struct definition only. */ #define DST_K_VFLAGS_DSC 0xfa /* Descriptor used. */ @@ -379,7 +441,7 @@ #define DBG_S_C_VOID DST_K_TS_PTR #define DBG_S_C_COMPLEX_ARRAY DST_K_TS_ARRAY -/* VMS Module header record (EMH) definitions. */ +/* VMS Module Header Records (MHD/EMH). */ #define MHD_S_C_MHD 0 #define MHD_S_C_LNM 1 @@ -402,48 +464,68 @@ /* vms.c. */ extern asymbol *_bfd_vms_make_empty_symbol (bfd *); +extern int _bfd_vms_slurp_object_records (bfd *abfd); /* vms-gsd.c. */ -extern int _bfd_vms_slurp_gsd (bfd *, int); -extern int _bfd_vms_write_gsd (bfd *, int); +extern int _bfd_vms_slurp_gsd (bfd *abfd, int objtype); +extern int _bfd_vms_write_gsd (bfd *abfd, int objtype); +extern int _bfd_vms_slurp_dbg (bfd *abfd, int objtype); +extern int _bfd_vms_write_dbg (bfd *abfd, int objtype); +extern int _bfd_vms_slurp_tbt (bfd *abfd, int objtype); +extern int _bfd_vms_write_tbt (bfd *abfd, int objtype); -/* vms-mhd.c. */ +/* vms-misc.c. */ -extern int _bfd_vms_slurp_hdr (bfd *, int); -extern int _bfd_vms_write_hdr (bfd *, int); -extern int _bfd_vms_slurp_eom (bfd *, int); -extern int _bfd_vms_write_eom (bfd *, int); +extern int _bfd_vms_get_object_record (bfd *abfd); +extern int _bfd_vms_get_first_record (bfd *abfd); + +/* vms-hdr.c. */ + +extern int _bfd_vms_slurp_hdr (bfd *abfd, int objtype); +extern int _bfd_vms_write_hdr (bfd *abfd, int objtype); +extern int _bfd_vms_slurp_eom (bfd *abfd, int objtype); +extern int _bfd_vms_write_eom (bfd *abfd, int objtype); +extern bfd_boolean _bfd_vms_find_nearest_dst_line + (bfd *abfd, asection *section, asymbol **symbols, bfd_vma offset, + const char **file, const char **func, unsigned int *line); +extern int _bfd_vms_slurp_ihd + (bfd *abfd, unsigned int *isd_offset, unsigned int *ihs_offset); +extern int _bfd_vms_slurp_isd (bfd *abfd, unsigned int offset); +extern int _bfd_vms_slurp_ihs (bfd *abfd, unsigned int offset); /* vms-tir.c. */ -extern int _bfd_vms_slurp_tir (bfd *, int); -extern int _bfd_vms_slurp_dbg (bfd *, int); -extern int _bfd_vms_slurp_tbt (bfd *, int); -extern int _bfd_vms_slurp_lnk (bfd *, int); - -extern int _bfd_vms_write_tir (bfd *, int); -extern int _bfd_vms_write_tbt (bfd *, int); -extern int _bfd_vms_write_dbg (bfd *, int); - -/* The r_type field in a reloc is one of he following values. */ -#define ALPHA_R_IGNORE 0 -#define ALPHA_R_REFQUAD 1 -#define ALPHA_R_BRADDR 2 -#define ALPHA_R_HINT 3 -#define ALPHA_R_SREL16 4 -#define ALPHA_R_SREL32 5 -#define ALPHA_R_SREL64 6 -#define ALPHA_R_OP_PUSH 7 -#define ALPHA_R_OP_STORE 8 -#define ALPHA_R_OP_PSUB 9 -#define ALPHA_R_OP_PRSHIFT 10 -#define ALPHA_R_LINKAGE 11 -#define ALPHA_R_REFLONG 12 -#define ALPHA_R_CODEADDR 13 - -/* Object language definitions. */ - +extern int _bfd_vms_slurp_tir (bfd *abfd, int objtype); +extern int _bfd_vms_write_tir (bfd *abfd, int objtype); +extern int _bfd_vms_slurp_lnk (bfd *abfd, int objtype); + +extern int _bfd_vms_slurp_relocs (bfd *abfd); +extern int _bfd_vms_decode_relocs + (bfd *abfd, arelent *relocs, asection *section, asymbol **symbols); + +/* The r_type field in a reloc is one of the following values. */ +#define ALPHA_R_IGNORE 0 +#define ALPHA_R_REFQUAD 1 +#define ALPHA_R_BRADDR 2 +#define ALPHA_R_HINT 3 +#define ALPHA_R_SREL16 4 +#define ALPHA_R_SREL32 5 +#define ALPHA_R_SREL64 6 +#define ALPHA_R_OP_PUSH 7 +#define ALPHA_R_OP_STORE 8 +#define ALPHA_R_OP_PSUB 9 +#define ALPHA_R_OP_PRSHIFT 10 +#define ALPHA_R_LINKAGE 11 +#define ALPHA_R_REFLONG 12 +#define ALPHA_R_CODEADDR 13 +#define ALPHA_R_NOP 14 +#define ALPHA_R_BSR 15 +#define ALPHA_R_LDA 16 +#define ALPHA_R_BOH 17 + +/* VMS Object Language (OBJ/EOBJ). */ + #define OBJ_S_C_HDR 0 /* VAX moule header record. */ #define OBJ_S_C_GSD 1 /* VAX glbal symbol definition record. */ #define OBJ_S_C_TIR 2 /* VAX tet information record. */ @@ -453,13 +535,15 @@ extern int _bfd_vms_write_dbg (bfd *, int); #define OBJ_S_C_LNK 6 /* VAX liker options record. */ #define OBJ_S_C_EOMW 7 /* VAX en of module word-psect record. */ #define OBJ_S_C_MAXRECTYP 7 /* VAX Lat assigned record type. */ + #define EOBJ_S_C_EMH 8 /* EVAX mdule header record. */ #define EOBJ_S_C_EEOM 9 /* EVAX ed of module record. */ -#define EOBJ_S_C_EGSD 10 /* EVAX gobal symbol definition record.*/ -#define EOBJ_S_C_ETIR 11 /* EVAX txt information record. */ +#define EOBJ_S_C_EGSD 10 /* EVAX gobal symbol definition record. */ +#define EOBJ_S_C_ETIR 11 /* EVAX txt information record. */ #define EOBJ_S_C_EDBG 12 /* EVAX Dbugger information record. */ #define EOBJ_S_C_ETBT 13 /* EVAX Taceback information record. */ #define EOBJ_S_C_MAXRECTYP 13 /* EVAX Lst assigned record type. */ + #define OBJ_S_K_SUBTYP 1 #define OBJ_S_C_SUBTYP 1 #define EOBJ_S_K_SUBTYP 4 @@ -475,8 +559,9 @@ extern int _bfd_vms_write_dbg (bfd *, int); #define EOBJ_S_C_STOREPLIM -1 /* Maximu repeat count on store commands. */ #define OBJ_S_C_PSCALILIM 9 /* Maximu p-sect alignment. */ #define EOBJ_S_C_PSCALILIM 16 /* Maximu p-sect alignment. */ - + #define EVAX_OFFSET 256 /* Type ofset for EVAX codes in switch. */ + /* Miscellaneous definitions. */ #if __GNUC__ @@ -484,140 +569,286 @@ typedef unsigned long long uquad; #else typedef unsigned long uquad; #endif - -#define MAX_OUTREC_SIZE 4096 -#define MIN_OUTREC_LUFT 64 - -typedef struct _vms_section -{ - unsigned char *contents; - bfd_vma offset; - bfd_size_type size; - struct _vms_section *next; -} vms_section; - -extern vms_section * _bfd_get_vms_section (bfd *, int); - -typedef struct _vms_reloc -{ - struct _vms_reloc *next; - arelent *reloc; - asection *section; -} vms_reloc; - + +#define MAX_OUTREC_SIZE 4096 +#define MIN_OUTREC_LUFT 64 + /* VMS module header. */ - -struct hdr_struc -{ - int hdr_b_strlvl; - long hdr_l_arch1; - long hdr_l_arch2; - long hdr_l_recsiz; - char * hdr_t_name; - char * hdr_t_version; - char * hdr_t_date; - char * hdr_c_lnm; - char * hdr_c_src; - char * hdr_c_ttl; -}; - -/* VMS end of module. */ - -struct eom_struc -{ - long eom_l_total_lps; - unsigned char eom_b_comcod; - bfd_boolean eom_has_transfer; - unsigned char eom_b_tfrflg; - long eom_l_psindx; - long eom_l_tfradr; -}; - -enum file_format_enum { FF_UNKNOWN, FF_FOREIGN, FF_NATIVE, FF_VAX }; - -typedef struct vms_symbol_struct -{ - struct bfd_hash_entry bfd_hash; - asymbol *symbol; -} vms_symbol_entry; - + +struct hdr_struct +{ + char hdr_b_strlvl; + int hdr_l_arch1; + int hdr_l_arch2; + int hdr_l_recsiz; + char *hdr_t_name; + char *hdr_t_version; + char *hdr_t_date; + char *hdr_c_lnm; + char *hdr_c_src; + char *hdr_c_ttl; + char *hdr_c_cpr; +}; + +#define EMH_S_W_HDRTYP 4 +#define EMH_S_B_STRLVL 6 +#define EMH_S_L_ARCH1 8 +#define EMH_S_L_ARCH2 12 +#define EH_S_L_RECSIZ 16 +#define EMH_S_B_NAMLNG 20 + +#define EMH_DATE_LENGTH 17 + +/* VMS End-Of-Module records (EOM/EEOM). */ + +struct eom_struct +{ + int eom_l_total_lps; + short eom_w_comcod; + bfd_boolean eom_has_transfer; + char eom_b_tfrflg; + int eom_l_psindx; + int eom_l_tfradr; +}; + +#define EEOM_S_L_TOTAL_LPS 4 +#define EEOM_S_W_COMCOD 8 +#define EEOM_S_B_TFRFLG 10 +#define EEOM_S_L_PSINDX 12 +#define EEOM_S_L_TFRADR 16 + +/* VMS Image Header Records (IHD/EIHD). */ + +#define EIHD_S_K_MAJORID 3 /* Major id constant */ +#define EIHD_S_K_MINORID 0 /* Minor id constant */ +#define EIHD_S_K_EXE 1 /* Executable image */ + +#define EIHD_S_L_SIZE 8 +#define EIHD_S_L_ISDOFF 12 +#define EIHD_S_L_SYMDBGOFF 20 +#define EIHD_S_Q_SYMVVA 40 +#define EIHD_S_L_IMGTYPE 52 + +/* VMS Image Section Description Records (ISD/EISD). */ + +#define EISD_S_L_EISDSIZE 8 +#define EISD_S_L_SECSIZE 12 +#define EISD_S_Q_VIR_ADDR 16 +#define EISD_S_L_FLAGS 24 +#define EISD_S_L_VBN 28 +#define EISD_S_R_CONTROL 32 +#define EISD_S_L_IDENT 36 +#define EISD_S_T_GBLNAM 40 + +#define EISD_S_M_GBL 0x0001 +#define EISD_S_M_CRF 0x0002 +#define EISD_S_M_DZRO 0x0004 +#define EISD_S_M_WRT 0x0008 +#define EISD_S_M_INITALCODE 0x0010 +#define EISD_S_M_BASED 0x0020 +#define EISD_S_M_FIXUPVEC 0x0040 +#define EISD_S_M_RESIDENT 0x0080 +#define EISD_S_M_VECTOR 0x0100 +#define EISD_S_M_PROTECT 0x0200 +#define EISD_S_M_LASTCLU 0x0400 +#define EISD_S_M_EXE 0x0800 +#define EISD_S_M_NONSHRADR 0x1000 +#define EISD_S_M_QUAD_LENGTH 0x2000 +#define EISD_S_M_ALLOC_64BIT 0x4000 + +/* VMS Image Header Symbol Records (IHS/EIHS). */ + +#define EIHS_S_L_DSTVBN 8 +#define EIHS_S_L_DSTSIZE 12 +#define EIHS_S_L_GSTVBN 16 +#define EIHS_S_L_GSTSIZE 20 +#define EIHS_S_L_DMTVBN 24 +#define EIHS_S_L_DMTBYTES 28 + +/* Debugger symbol definitions. */ + +#define DBG_S_L_DMT_MODBEG 0 +#define DBG_S_L_DST_SIZE 4 +#define DBG_S_W_DMT_PSECT_COUNT 8 +#define DBG_S_C_DMT_HEADER_SIZE 12 + +#define DBG_S_L_DMT_PSECT_START 0 +#define DBG_S_L_DMT_PSECT_LENGTH 4 +#define DBG_S_C_DMT_PSECT_SIZE 8 + + +enum file_format_enum { FF_UNKNOWN, FF_FOREIGN, FF_NATIVE }; +enum file_type_enum { FT_UNKNOWN, FT_MODULE, FT_IMAGE }; + +typedef struct vms_symbol_struct +{ + struct bfd_hash_entry bfd_hash; + asymbol *symbol; +} vms_symbol_entry; + /* Stack value for push/pop commands. */ - -struct stack_struct -{ - uquad value; - int psect; -}; -#define STACKSIZE 8192 - -/* location stack definitions for CTL_DFLC, CTL_STLOC, and CTL_STKDL */ - -struct location_struct -{ - unsigned long value; - int psect; -}; -#define LOCATION_SAVE_SIZE 32 - -#define VMS_SECTION_COUNT 1024 - -struct vms_private_data_struct -{ - bfd_boolean is_vax; + +struct stack_struct +{ + uquad value; + int psect; +}; + +#define STACKSIZE 8192 + +/* A minimal decoding of DST compilation units. We only decode + what's needed to get to the line number information. */ + +struct fileinfo +{ + char *name; + unsigned int srec; +}; + +struct srecinfo +{ + struct srecinfo *next; + unsigned int line; + unsigned int sfile; + unsigned int srec; +}; + +struct lineinfo +{ + struct lineinfo *next; + bfd_vma address; + unsigned int line; +}; + +struct funcinfo +{ + struct funcinfo *next; + char *name; + bfd_vma low; + bfd_vma high; +}; + +struct module +{ + /* Chain the previously read compilation unit. */ + struct module *next; + + /* The module name. */ + char *name; + + /* The start offset and size of debug info in the DST section. */ + unsigned int modbeg; + unsigned int size; + + /* The lowest and highest addresses contained in this compilation + unit as specified in the compilation unit header. */ + bfd_vma low; + bfd_vma high; + + /* The listing line table. */ + struct lineinfo *line_table; + + /* The source record table. */ + struct srecinfo *srec_table; + + /* A list of the functions found in this module. */ + struct funcinfo *func_table; + + /* Current allocation of file_table. */ + unsigned int file_table_count; + + /* An array of the files making up this module. */ + struct fileinfo *file_table; +}; + +struct vms_private_data_struct +{ + bfd_boolean is_vax; bfd_boolean fixup_done; /* Flag to indicate if all section pointers and PRIV(sections) are set up correctly. */ - unsigned char *vms_buf; /* Buffer to record. */ - int buf_size; /* Max size of buffer. */ - unsigned char *vms_rec; /* Actual record ptr. */ - int rec_length; /* Remaining record length. */ - int rec_size; /* Actual record size. */ - int rec_type; /* Actual record type. */ - enum file_format_enum file_format; - - struct hdr_struc hdr_data; /* Data from HDR/EMH record. */ - struct eom_struc eom_data; /* Data from EOM/EEOM record. */ - unsigned int section_count; /* # of sections in following array. */ - asection **sections; /* Array of GSD/EGSD sections. */ - int gsd_sym_count; /* # of GSD/EGSD symbols. */ - asymbol **symbols; /* Vector of GSD/EGSD symbols. */ - struct proc_value *procedure; - - struct stack_struct *stack; - int stackptr; - - vms_section *vms_section_table[VMS_SECTION_COUNT]; - + unsigned char *vms_buf; /* record buffer */ + unsigned int buf_size; /* size of record buffer */ + unsigned char *vms_rec; /* record pointer in record buffer */ + unsigned int rec_size; /* record size */ + enum file_format_enum file_format; + + struct hdr_struct hdr_data; /* data from HDR/EMH record */ + struct eom_struct eom_data; /* data from EOM/EEOM record */ + unsigned int section_count; /* # of sections in following array */ + asection **sections; /* array of GSD/EGSD sections */ + unsigned int gsd_sym_count; /* # of GSD/EGSD symbols */ + asymbol **symbols; /* vector of GSD/EGSD symbols */ + struct proc_value *procedure; + + struct stack_struct *stack; + int stackptr; + struct bfd_hash_table *vms_symbol_table; - struct bfd_symbol **symcache; - int symnum; - - struct location_struct *location_stack; - - asection *image_section; /* Section for image_ptr. */ - unsigned char *image_ptr; /* A pointer to section->contents. */ - - unsigned char pdsc[8]; /* Procedure descriptor. */ - - /* Output routine storage. */ - unsigned char *output_buf; /* Output data. */ - int push_level; - int pushed_size; - int length_pos; - int output_size; - int output_alignment; - - /* Linkage index counter - used by conditional store commands (TIR_S_C_STC_). */ - int vms_linkage_index; - - /* see tc-alpha.c of gas for a descripton. */ - int flag_hash_long_names; /* -+, hash instead of truncate. */ - int flag_show_after_trunc; /* -H, shw hashing/truncation. */ -}; - -#define PRIV(name) ((struct vms_private_data_struct *) abfd->tdata.any)->name - + struct bfd_symbol **symcache; + int symnum; + + asection *image_section; /* section for image_ptr */ + unsigned char *image_ptr; /* a pointer to section->contents */ + + unsigned char pdsc[8]; /* procedure descriptor */ + + struct module *modules; /* list of all compilation units */ + + struct dst_info *dst_info; + asection *dst_section; + unsigned char *dst_ptr_end; + unsigned int dst_ptr_offsets_count; /* # of offsets in following array */ + unsigned int *dst_ptr_offsets; /* array of saved image_ptr offsets */ + + /* Shared library support */ + bfd_vma symvva; /* relative virtual address of symbol vector */ + + /* Output routine storage */ + unsigned char *output_buf; /* output data */ + int push_level; + int pushed_size; + int length_pos; + int output_size; + int output_alignment; + + /* linkage index counter used by conditional store commands */ + int vms_linkage_index; + + /* see tc-alpha.c of gas for a description. */ + int flag_hash_long_names; /* -+, hash instead of truncate */ + int flag_show_after_trunc; /* -H, show hashing/truncation */ +}; + +#define PRIV(name) ((struct vms_private_data_struct *)abfd->tdata.any)->name + +/* Used to keep extra VMS specific information for a given section. + + reloc_size holds the size of the relocation stream, note this + is very different from the number of relocations as VMS relocations + are variable length. + + reloc_stream is the actual stream of relocation entries. */ + +struct vms_section_data_struct +{ + bfd_size_type reloc_size; + unsigned char *reloc_stream; + bfd_size_type reloc_offset; + flagword vflags; +}; + +#define vms_section_data(sec) \ + ((struct vms_section_data_struct *)sec->used_by_bfd) + +struct evax_private_udata_struct +{ + asymbol *bsym; + asymbol *enbsym; + char *origname; + int lkindex; +}; + #define SECTION_NAME_TEMPLATE "__SEC__%d" #if VMS_DEBUG @@ -635,7 +866,6 @@ extern char * _bfd_vms_save_sized_string (unsigned char *, int); extern char * _bfd_vms_save_counted_string (unsigned char *); extern void _bfd_vms_push (bfd *, uquad, int); extern uquad _bfd_vms_pop (bfd *, int *); -extern bfd_boolean _bfd_save_vms_section (bfd *, asection *, const void *, file_ptr, bfd_size_type); extern void _bfd_vms_output_begin (bfd *, int, int); extern void _bfd_vms_output_alignment (bfd *, int); extern void _bfd_vms_output_push (bfd *); @@ -653,4 +883,7 @@ extern void _bfd_vms_output_fill (bfd *, int, int); extern char * _bfd_vms_length_hash_symbol (bfd *, const char *, int); extern vms_symbol_entry * _bfd_vms_enter_symbol (bfd *, char *); +#define EGPS_S_V_NO_SHIFT 16 + +extern void bfd_vms_set_section_flags (bfd *, asection *, flagword); #endif /* VMS_H */ -- cgit v1.1