summaryrefslogtreecommitdiff
path: root/bfd/vms.h
diff options
context:
space:
mode:
authorTristan Gingold <gingold@adacore.com>2009-02-23 09:28:43 +0000
committerTristan Gingold <gingold@adacore.com>2009-02-23 09:28:43 +0000
commitab69c0980be667be941b7ce2494c91c755f21345 (patch)
tree79cf18fbeae262f1df94541499d032d56d57dac1 /bfd/vms.h
parent9486c9ab65056ffbb73192a42e073d8bd41c7eb3 (diff)
downloadbinutils-redhat-ab69c0980be667be941b7ce2494c91c755f21345.tar.gz
2009-02-23 Tristan Gingold <gingold@adacore.com>
* 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.
Diffstat (limited to 'bfd/vms.h')
-rw-r--r--bfd/vms.h635
1 files changed, 434 insertions, 201 deletions
diff --git a/bfd/vms.h b/bfd/vms.h
index 223554086c..b7d9344cf9 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 */