Home | History | Annotate | Download | only in elf
      1 /* MMIX support for BFD.
      2    Copyright (C) 2001-2016 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 /* This file holds definitions specific to the MMIX ELF ABI.  */
     22 
     23 #ifndef ELF_MMIX_H
     24 #define ELF_MMIX_H
     25 
     26 #include "elf/reloc-macros.h"
     27 
     28 /* Relocations.  See the reloc table in bfd/elf64-mmix.c for details.  */
     29 START_RELOC_NUMBERS (elf_mmix_reloc_type)
     30   RELOC_NUMBER (R_MMIX_NONE, 0)
     31 
     32   /* Standard absolute relocations.  */
     33   RELOC_NUMBER (R_MMIX_8, 1)
     34   RELOC_NUMBER (R_MMIX_16, 2)
     35   RELOC_NUMBER (R_MMIX_24, 3)
     36   RELOC_NUMBER (R_MMIX_32, 4)
     37   RELOC_NUMBER (R_MMIX_64, 5)
     38 
     39   /* Standard relative relocations.  */
     40   RELOC_NUMBER (R_MMIX_PC_8, 6)
     41   RELOC_NUMBER (R_MMIX_PC_16, 7)
     42   RELOC_NUMBER (R_MMIX_PC_24, 8)
     43   RELOC_NUMBER (R_MMIX_PC_32, 9)
     44   RELOC_NUMBER (R_MMIX_PC_64, 10)
     45 
     46   /* GNU extensions for C++ vtables.  */
     47   RELOC_NUMBER (R_MMIX_GNU_VTINHERIT, 11)
     48   RELOC_NUMBER (R_MMIX_GNU_VTENTRY, 12)
     49 
     50   /* A GETA instruction.  */
     51   RELOC_NUMBER (R_MMIX_GETA, 13)
     52   RELOC_NUMBER (R_MMIX_GETA_1, 14)
     53   RELOC_NUMBER (R_MMIX_GETA_2, 15)
     54   RELOC_NUMBER (R_MMIX_GETA_3, 16)
     55 
     56   /* A conditional branch instruction.  */
     57   RELOC_NUMBER (R_MMIX_CBRANCH, 17)
     58   RELOC_NUMBER (R_MMIX_CBRANCH_J, 18)
     59   RELOC_NUMBER (R_MMIX_CBRANCH_1, 19)
     60   RELOC_NUMBER (R_MMIX_CBRANCH_2, 20)
     61   RELOC_NUMBER (R_MMIX_CBRANCH_3, 21)
     62 
     63   /* A PUSHJ instruction.  */
     64   RELOC_NUMBER (R_MMIX_PUSHJ, 22)
     65   RELOC_NUMBER (R_MMIX_PUSHJ_1, 23)
     66   RELOC_NUMBER (R_MMIX_PUSHJ_2, 24)
     67   RELOC_NUMBER (R_MMIX_PUSHJ_3, 25)
     68 
     69   /* A JMP instruction.  */
     70   RELOC_NUMBER (R_MMIX_JMP, 26)
     71   RELOC_NUMBER (R_MMIX_JMP_1, 27)
     72   RELOC_NUMBER (R_MMIX_JMP_2, 28)
     73   RELOC_NUMBER (R_MMIX_JMP_3, 29)
     74 
     75   /* A relative address such as in a GETA or a branch.  */
     76   RELOC_NUMBER (R_MMIX_ADDR19, 30)
     77 
     78   /* A relative address such as in a JMP (only).  */
     79   RELOC_NUMBER (R_MMIX_ADDR27, 31)
     80 
     81   /* A general register or a number 0..255.  */
     82   RELOC_NUMBER (R_MMIX_REG_OR_BYTE, 32)
     83 
     84   /* A general register. */
     85   RELOC_NUMBER (R_MMIX_REG, 33)
     86 
     87   /* A global register and an offset, the global register (allocated at
     88      link time) contents plus the offset made equivalent to the relocation
     89      expression at link time.  The relocation must point at the Y field of
     90      an instruction.  */
     91   RELOC_NUMBER (R_MMIX_BASE_PLUS_OFFSET, 34)
     92 
     93   /* A LOCAL assertion.  */
     94   RELOC_NUMBER (R_MMIX_LOCAL, 35)
     95 
     96   /* A PUSHJ instruction, generating a stub if it does not reach.  */
     97   RELOC_NUMBER (R_MMIX_PUSHJ_STUBBABLE, 36)
     98 END_RELOC_NUMBERS (R_MMIX_max)
     99 
    100 
    101 /* Section Attributes.  */
    102 /* A section containing necessary information for relaxation.  */
    103 #define SHF_MMIX_CANRELAX	0x80000000
    104 
    105 /* Symbol attributes.  */
    106 /* A symbol with this section-index is a register.  */
    107 #define SHN_REGISTER	SHN_LOPROC
    108 
    109 /* This section holds contents for each initialized register, at VMA
    110    regno*8.  A symbol relative to this section will be transformed to an
    111    absolute symbol with the value corresponding to the register number at
    112    final link time.  A symbol with a value outside the inclusive range
    113    32*8 .. 254*8 is an error.  It is highly recommended to only use an
    114    upper bound of 253*8 or lower as specified in the (currently
    115    unspecified) ABI.  */
    116 #define MMIX_REG_CONTENTS_SECTION_NAME ".MMIX.reg_contents"
    117 
    118 /* At link time, a section by this name is created, expected to be
    119    included in MMIX_REG_CONTENTS_SECTION_NAME in the output.  */
    120 #define MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME \
    121  ".MMIX.reg_contents.linker_allocated"
    122 
    123 /* This is a faked section holding symbols with SHN_REGISTER.  Don't
    124    confuse it with MMIX_REG_CONTENTS_SECTION_NAME; this one has no
    125    contents, just values.  It is an error for a value in this section to
    126    be outside the range 32..255 and it must never become an actual section
    127    in an object file.  */
    128 #define MMIX_REG_SECTION_NAME "*REG*"
    129 
    130 /* Appended with a number N=0..65535, this is a representation of the
    131    mmixal "BSPEC N" ... "ESPEC" directive pair; the contents go into an
    132    ELF section by name ".MMIX.spec_data.N".  */
    133 #define MMIX_OTHER_SPEC_SECTION_PREFIX ".MMIX.spec_data."
    134 
    135 /* A section SECNAME is noted to start at "__.MMIX.start.SECNAME" by the
    136    presence of this symbol.  Currently only implemented for ".text"
    137    through the symbol "__.MMIX.start..text".  */
    138 #define MMIX_LOC_SECTION_START_SYMBOL_PREFIX "__.MMIX.start."
    139 
    140 /* This symbol is always a function.  */
    141 #define MMIX_START_SYMBOL_NAME "Main"
    142 
    143 
    144 /* We smuggle in a few MMO specifics here.  We don't make a specific MMO
    145    file, since we can't reasonably support MMO without ELF; we have to
    146    include this file anyway.  */
    147 
    148 #define MMO_TEXT_SECTION_NAME ".text"
    149 #define MMO_DATA_SECTION_NAME ".data"
    150 
    151 /* A definition for the flags we put in spec data in files.  A copy of our
    152    own of some flags to keep immune to BFD flag changes.  See section.c of
    153    2001-07-18 for flag documentation.  */
    154 #define MMO_SEC_ALLOC      0x001
    155 #define MMO_SEC_LOAD       0x002
    156 #define MMO_SEC_RELOC      0x004
    157 #define MMO_SEC_READONLY   0x010
    158 #define MMO_SEC_CODE       0x020
    159 #define MMO_SEC_DATA       0x040
    160 #define MMO_SEC_NEVER_LOAD 0x400
    161 #define MMO_SEC_IS_COMMON 0x8000
    162 #define MMO_SEC_DEBUGGING 0x10000
    163 
    164 #ifdef BFD_ARCH_SIZE
    165 extern bfd_boolean _bfd_mmix_before_linker_allocation
    166   (bfd *, struct bfd_link_info *);
    167 extern bfd_boolean _bfd_mmix_after_linker_allocation
    168   (bfd *, struct bfd_link_info *);
    169 extern bfd_boolean _bfd_mmix_check_all_relocs
    170   (bfd *, struct bfd_link_info *);
    171 #endif
    172 
    173 #endif /* ELF_MMIX_H */
    174