Annotation of src/external/gpl3/binutils.old/dist/bfd/som.h, Revision 1.1
1.1 ! christos 1: /* HP PA-RISC SOM object file format: definitions internal to BFD.
! 2: Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001,
! 3: 2002, 2003, 2004, 2005, 2007, 2008, 2012 Free Software Foundation, Inc.
! 4:
! 5: Contributed by the Center for Software Science at the
! 6: University of Utah (pa-gdb-bugs@cs.utah.edu).
! 7:
! 8: This file is part of BFD, the Binary File Descriptor library.
! 9:
! 10: This program is free software; you can redistribute it and/or modify
! 11: it under the terms of the GNU General Public License as published by
! 12: the Free Software Foundation; either version 3 of the License, or
! 13: (at your option) any later version.
! 14:
! 15: This program is distributed in the hope that it will be useful,
! 16: but WITHOUT ANY WARRANTY; without even the implied warranty of
! 17: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 18: GNU General Public License for more details.
! 19:
! 20: You should have received a copy of the GNU General Public License
! 21: along with this program; if not, write to the Free Software
! 22: Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
! 23: 02110-1301, USA. */
! 24:
! 25: #ifndef _SOM_H
! 26: #define _SOM_H
! 27:
! 28: #include "libhppa.h"
! 29:
! 30: /* We want reloc.h to provide PA 2.0 defines. */
! 31: #define PA_2_0
! 32:
! 33: #include "som/aout.h"
! 34: #include "som/lst.h"
! 35: #include "som/internal.h"
! 36:
! 37: /* The SOM BFD backend doesn't currently use anything from these
! 38: two include files, but it's likely to need them in the future. */
! 39: #ifdef R_DLT_REL
! 40: #include <shl.h>
! 41: #include <dl.h>
! 42: #endif
! 43:
! 44: #if defined (HOST_HPPABSD) || defined (HOST_HPPAOSF)
! 45: /* BSD uses a completely different scheme for object file identification.
! 46: so for now, define _PA_RISC_ID to accept any random value for a model
! 47: number. */
! 48: #undef _PA_RISC_ID
! 49: #define _PA_RISC_ID(__m_num) 1
! 50: #endif /* HOST_HPPABSD */
! 51:
! 52: typedef struct som_symbol
! 53: {
! 54: asymbol symbol;
! 55: unsigned int som_type;
! 56:
! 57: /* Structured like the ELF tc_data union. Allows more code sharing
! 58: in GAS this way. */
! 59: union
! 60: {
! 61: struct
! 62: {
! 63: unsigned int hppa_arg_reloc;
! 64: unsigned int hppa_priv_level;
! 65: } ap;
! 66: void * any;
! 67: }
! 68: tc_data;
! 69:
! 70: /* Index of this symbol in the symbol table. Only used when
! 71: building relocation streams for incomplete objects. */
! 72: int index;
! 73:
! 74: /* How many times this symbol is used in a relocation. By sorting
! 75: the symbols from most used to least used we can significantly
! 76: reduce the size of the relocation stream for incomplete objects. */
! 77: int reloc_count;
! 78:
! 79: /* During object file writing, the offset of the name of this symbol
! 80: in the SOM string table. */
! 81: int stringtab_offset;
! 82: }
! 83: som_symbol_type;
! 84:
! 85: /* A structure containing all the magic information stored in a BFD's
! 86: private data which needs to be copied during an objcopy/strip run. */
! 87: struct som_exec_data
! 88: {
! 89: /* Sort-of a magic number. BSD uses it to distinguish between
! 90: native executables and hpux executables. */
! 91: short system_id;
! 92:
! 93: /* Magic exec flags. These control things like whether or not
! 94: null pointer dereferencing is allowed and the like. */
! 95: long exec_flags;
! 96:
! 97: /* We must preserve the version identifier too. Some versions
! 98: of the HP linker do not grok NEW_VERSION_ID for reasons unknown. */
! 99: unsigned int version_id;
! 100:
! 101: /* Add more stuff here as needed. Good examples of information
! 102: we might want to pass would be presumed_dp, entry_* and maybe
! 103: others from the file header. */
! 104: };
! 105:
! 106: struct somdata
! 107: {
! 108: /* All the magic information about an executable which lives
! 109: in the private BFD structure and needs to be copied from
! 110: the input bfd to the output bfd during an objcopy/strip. */
! 111: struct som_exec_data *exec_data;
! 112:
! 113: /* These three fields are only used when writing files and are
! 114: generated from scratch. They need not be copied for objcopy
! 115: or strip to work. */
! 116: struct som_header *file_hdr;
! 117: struct som_string_auxhdr *copyright_aux_hdr;
! 118: struct som_string_auxhdr *version_aux_hdr;
! 119: struct som_exec_auxhdr *exec_hdr;
! 120: struct som_compilation_unit *comp_unit;
! 121:
! 122: /* Pointers to a saved copy of the symbol and string tables. These
! 123: need not be copied for objcopy or strip to work. */
! 124: som_symbol_type *symtab;
! 125: char *stringtab;
! 126: asymbol **sorted_syms;
! 127:
! 128: /* We remember these offsets so that after check_file_format, we have
! 129: no dependencies on the particular format of the exec_hdr.
! 130: These offsets need not be copied for objcopy or strip to work. */
! 131:
! 132: file_ptr sym_filepos;
! 133: file_ptr str_filepos;
! 134: file_ptr reloc_filepos;
! 135: unsigned stringtab_size;
! 136: void * line_info;
! 137: };
! 138:
! 139: struct som_data_struct
! 140: {
! 141: struct somdata a;
! 142: };
! 143:
! 144: /* Substructure of som_section_data_struct used to hold information
! 145: which can't be represented by the generic BFD section structure,
! 146: but which must be copied during objcopy or strip. */
! 147: struct som_copyable_section_data_struct
! 148: {
! 149: /* Various fields in space and subspace headers that we need
! 150: to pass around. */
! 151: unsigned int sort_key : 8;
! 152: unsigned int access_control_bits : 7;
! 153: unsigned int is_defined : 1;
! 154: unsigned int is_private : 1;
! 155: unsigned int quadrant : 2;
! 156: unsigned int is_comdat : 1;
! 157: unsigned int is_common : 1;
! 158: unsigned int dup_common : 1;
! 159:
! 160: /* For subspaces, this points to the section which represents the
! 161: space in which the subspace is contained. For spaces it points
! 162: back to the section for this space. */
! 163: asection *container;
! 164:
! 165: /* The user-specified space number. It is wrong to use this as
! 166: an index since duplicates and holes are allowed. */
! 167: int space_number;
! 168:
! 169: /* Add more stuff here as needed. Good examples of information
! 170: we might want to pass would be initialization pointers,
! 171: and the many subspace flags we do not represent yet. */
! 172: };
! 173:
! 174: /* Used to keep extra SOM specific information for a given section.
! 175:
! 176: reloc_size holds the size of the relocation stream, note this
! 177: is very different from the number of relocations as SOM relocations
! 178: are variable length.
! 179:
! 180: reloc_stream is the actual stream of relocation entries. */
! 181:
! 182: struct som_section_data_struct
! 183: {
! 184: struct som_copyable_section_data_struct *copy_data;
! 185: unsigned int reloc_size;
! 186: unsigned char *reloc_stream;
! 187: struct som_space_dictionary_record *space_dict;
! 188: struct som_subspace_dictionary_record *subspace_dict;
! 189: };
! 190:
! 191: #define somdata(bfd) ((bfd)->tdata.som_data->a)
! 192: #define obj_som_exec_data(bfd) (somdata (bfd).exec_data)
! 193: #define obj_som_file_hdr(bfd) (somdata (bfd).file_hdr)
! 194: #define obj_som_exec_hdr(bfd) (somdata (bfd).exec_hdr)
! 195: #define obj_som_copyright_hdr(bfd) (somdata (bfd).copyright_aux_hdr)
! 196: #define obj_som_version_hdr(bfd) (somdata (bfd).version_aux_hdr)
! 197: #define obj_som_compilation_unit(bfd) (somdata (bfd).comp_unit)
! 198: #define obj_som_symtab(bfd) (somdata (bfd).symtab)
! 199: #define obj_som_stringtab(bfd) (somdata (bfd).stringtab)
! 200: #define obj_som_sym_filepos(bfd) (somdata (bfd).sym_filepos)
! 201: #define obj_som_str_filepos(bfd) (somdata (bfd).str_filepos)
! 202: #define obj_som_stringtab_size(bfd) (somdata (bfd).stringtab_size)
! 203: #define obj_som_reloc_filepos(bfd) (somdata (bfd).reloc_filepos)
! 204: #define obj_som_sorted_syms(bfd) (somdata (bfd).sorted_syms)
! 205: #define som_section_data(sec) ((struct som_section_data_struct *) sec->used_by_bfd)
! 206: #define som_symbol_data(symbol) ((som_symbol_type *) symbol)
! 207:
! 208: /* Defines groups of basic relocations. FIXME: These should
! 209: be the only basic relocations created by GAS. The rest
! 210: should be internal to the BFD backend.
! 211:
! 212: The idea is both SOM and ELF define these basic relocation
! 213: types so they map into a SOM or ELF specific relocation as
! 214: appropriate. This allows GAS to share much more code
! 215: between the two object formats. */
! 216:
! 217: #define R_HPPA_NONE R_NO_RELOCATION
! 218: #define R_HPPA R_CODE_ONE_SYMBOL
! 219: #define R_HPPA_PCREL_CALL R_PCREL_CALL
! 220: #define R_HPPA_ABS_CALL R_ABS_CALL
! 221: #define R_HPPA_GOTOFF R_DP_RELATIVE
! 222: #define R_HPPA_ENTRY R_ENTRY
! 223: #define R_HPPA_EXIT R_EXIT
! 224: #define R_HPPA_COMPLEX R_COMP1
! 225: #define R_HPPA_BEGIN_BRTAB R_BEGIN_BRTAB
! 226: #define R_HPPA_END_BRTAB R_END_BRTAB
! 227: #define R_HPPA_BEGIN_TRY R_BEGIN_TRY
! 228: #define R_HPPA_END_TRY R_END_TRY
! 229:
! 230: /* Exported functions, mostly for use by GAS. */
! 231: bfd_boolean bfd_som_set_section_attributes (asection *, int, int, unsigned int, int);
! 232: bfd_boolean bfd_som_set_subsection_attributes (asection *, asection *, int, unsigned int, int, int, int, int);
! 233: void bfd_som_set_symbol_type (asymbol *, unsigned int);
! 234: bfd_boolean bfd_som_attach_aux_hdr (bfd *, int, char *);
! 235: int ** hppa_som_gen_reloc_type (bfd *, int, int, enum hppa_reloc_field_selector_type_alt, int, asymbol *);
! 236: bfd_boolean bfd_som_attach_compilation_unit (bfd *, const char *, const char *, const char *, const char *);
! 237:
! 238: #endif /* _SOM_H */
CVSweb <webmaster@jp.NetBSD.org>