1*3d8817e4Smiod /* CR16C ELF support for BFD. 2*3d8817e4Smiod Copyright 2004 Free Software Foundation, Inc. 3*3d8817e4Smiod 4*3d8817e4Smiod This file is part of BFD, the Binary File Descriptor library. 5*3d8817e4Smiod 6*3d8817e4Smiod This program is free software; you can redistribute it and/or modify 7*3d8817e4Smiod it under the terms of the GNU General Public License as published by 8*3d8817e4Smiod the Free Software Foundation; either version 2 of the License, or 9*3d8817e4Smiod (at your option) any later version. 10*3d8817e4Smiod 11*3d8817e4Smiod This program is distributed in the hope that it will be useful, 12*3d8817e4Smiod but WITHOUT ANY WARRANTY; without even the implied warranty of 13*3d8817e4Smiod MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*3d8817e4Smiod GNU General Public License for more details. 15*3d8817e4Smiod 16*3d8817e4Smiod You should have received a copy of the GNU General Public License 17*3d8817e4Smiod along with this program; if not, write to the Free Software Foundation, 18*3d8817e4Smiod Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 19*3d8817e4Smiod 20*3d8817e4Smiod #ifndef _ELF_CR16C_H 21*3d8817e4Smiod #define _ELF_CR16C_H 22*3d8817e4Smiod 23*3d8817e4Smiod #include "bfd.h" 24*3d8817e4Smiod #include "elf/reloc-macros.h" 25*3d8817e4Smiod 26*3d8817e4Smiod /* Creating indices for reloc_map_index array. */ 27*3d8817e4Smiod START_RELOC_NUMBERS (elf_cr16c_reloc_type) 28*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_NUM08, 0) 29*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_NUM08_C, 1) 30*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_NUM16, 2) 31*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_NUM16_C, 3) 32*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_NUM32, 4) 33*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_NUM32_C, 5) 34*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP04, 6) 35*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP04_C, 7) 36*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP08, 8) 37*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP08_C, 9) 38*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP16, 10) 39*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP16_C, 11) 40*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP24, 12) 41*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP24_C, 13) 42*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP24a, 14) 43*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_DISP24a_C, 15) 44*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG04, 16) 45*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG04_C, 17) 46*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG04a, 18) 47*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG04a_C, 19) 48*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG14, 20) 49*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG14_C, 21) 50*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG16, 22) 51*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG16_C, 23) 52*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG20, 24) 53*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_REG20_C, 25) 54*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_ABS20, 26) 55*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_ABS20_C, 27) 56*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_ABS24, 28) 57*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_ABS24_C, 29) 58*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM04, 30) 59*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM04_C, 31) 60*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM16, 32) 61*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM16_C, 33) 62*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM20, 34) 63*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM20_C, 35) 64*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM24, 36) 65*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM24_C, 37) 66*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM32, 38) 67*3d8817e4Smiod RELOC_NUMBER (RINDEX_16C_IMM32_C, 39) 68*3d8817e4Smiod END_RELOC_NUMBERS (RINDEX_16C_MAX) 69*3d8817e4Smiod 70*3d8817e4Smiod /* CR16C Relocation Types ('cr_reloc_type' entry in the reloc_map structure). 71*3d8817e4Smiod The relocation constant name is determined as follows : 72*3d8817e4Smiod 73*3d8817e4Smiod R_16C_<format><size>[_C] 74*3d8817e4Smiod 75*3d8817e4Smiod Where : 76*3d8817e4Smiod 77*3d8817e4Smiod <format> is one of the following: 78*3d8817e4Smiod NUM - R_NUMBER mnemonic, 79*3d8817e4Smiod DISP - R_16C_DISPL mnemonic, 80*3d8817e4Smiod REG - R_16C_REGREL mnemonic, 81*3d8817e4Smiod ABS - R_16C_ABS mnemonic, 82*3d8817e4Smiod IMM - R_16C_IMMED mnemonic, 83*3d8817e4Smiod <size> stands for R_S_16C_<size> 84*3d8817e4Smiod _C means 'code label' and is only added when R_ADDRTYPE subfield 85*3d8817e4Smiod is of type R_CODE_ADDR. */ 86*3d8817e4Smiod 87*3d8817e4Smiod /* The table below shows what the hex digits in the definition of the 88*3d8817e4Smiod relocation type constants correspond to. 89*3d8817e4Smiod ------------------------------------------------------------------ 90*3d8817e4Smiod R_SIZESP R_FORMAT R_RELTO R_ADDRTYPE 91*3d8817e4Smiod ------------------------------------------------------------------ */ 92*3d8817e4Smiod /* R_S_16C_08 R_NUMBER R_ABS R_ADDRESS */ 93*3d8817e4Smiod #define R_16C_NUM08 0X0001 94*3d8817e4Smiod 95*3d8817e4Smiod /* R_S_16C_08 R_NUMBER R_ABS R_CODE_ADDR */ 96*3d8817e4Smiod #define R_16C_NUM08_C 0X0006 97*3d8817e4Smiod 98*3d8817e4Smiod /* R_S_16C_16 R_NUMBER R_ABS R_ADDRESS */ 99*3d8817e4Smiod #define R_16C_NUM16 0X1001 100*3d8817e4Smiod 101*3d8817e4Smiod /* R_S_16C_16 R_NUMBER R_ABS R_CODE_ADDR */ 102*3d8817e4Smiod #define R_16C_NUM16_C 0X1006 103*3d8817e4Smiod 104*3d8817e4Smiod /* R_S_16C_32 R_NUMBER R_ABS R_ADDRESS */ 105*3d8817e4Smiod #define R_16C_NUM32 0X2001 106*3d8817e4Smiod 107*3d8817e4Smiod /* R_S_16C_32 R_NUMBER R_ABS R_CODE_ADDR */ 108*3d8817e4Smiod #define R_16C_NUM32_C 0X2006 109*3d8817e4Smiod 110*3d8817e4Smiod /* R_S_16C_04 R_16C_DISPL R_PCREL R_ADDRESS */ 111*3d8817e4Smiod #define R_16C_DISP04 0X5411 112*3d8817e4Smiod 113*3d8817e4Smiod /* R_S_16C_04 R_16C_DISPL R_PCREL R_CODE_ADDR */ 114*3d8817e4Smiod #define R_16C_DISP04_C 0X5416 115*3d8817e4Smiod 116*3d8817e4Smiod /* R_S_16C_08 R_16C_DISPL R_PCREL R_ADDRESS */ 117*3d8817e4Smiod #define R_16C_DISP08 0X0411 118*3d8817e4Smiod 119*3d8817e4Smiod /* R_S_16C_08 R_16C_DISPL R_PCREL R_CODE_ADDR */ 120*3d8817e4Smiod #define R_16C_DISP08_C 0X0416 121*3d8817e4Smiod 122*3d8817e4Smiod /* R_S_16C_16 R_16C_DISPL R_PCREL R_ADDRESS */ 123*3d8817e4Smiod #define R_16C_DISP16 0X1411 124*3d8817e4Smiod 125*3d8817e4Smiod /* R_S_16C_16 R_16C_DISPL R_PCREL R_CODE_ADDR */ 126*3d8817e4Smiod #define R_16C_DISP16_C 0X1416 127*3d8817e4Smiod 128*3d8817e4Smiod /* R_S_16C_24 R_16C_DISPL R_PCREL R_ADDRESS */ 129*3d8817e4Smiod #define R_16C_DISP24 0X7411 130*3d8817e4Smiod 131*3d8817e4Smiod /* R_S_16C_24 R_16C_DISPL R_PCREL R_CODE_ADDR */ 132*3d8817e4Smiod #define R_16C_DISP24_C 0X7416 133*3d8817e4Smiod 134*3d8817e4Smiod /* R_S_16C_24a R_16C_DISPL R_PCREL R_ADDRESS */ 135*3d8817e4Smiod #define R_16C_DISP24a 0X6411 136*3d8817e4Smiod 137*3d8817e4Smiod /* R_S_16C_24a R_16C_DISPL R_PCREL R_CODE_ADDR */ 138*3d8817e4Smiod #define R_16C_DISP24a_C 0X6416 139*3d8817e4Smiod 140*3d8817e4Smiod /* R_S_16C_04 R_16C_REGREL R_ABS R_ADDRESS */ 141*3d8817e4Smiod #define R_16C_REG04 0X5201 142*3d8817e4Smiod 143*3d8817e4Smiod /* R_S_16C_04 R_16C_REGREL R_ABS R_CODE_ADDR */ 144*3d8817e4Smiod #define R_16C_REG04_C 0X5206 145*3d8817e4Smiod 146*3d8817e4Smiod /* R_S_16C_04_a R_16C_REGREL R_ABS R_ADDRESS */ 147*3d8817e4Smiod #define R_16C_REG04a 0X4201 148*3d8817e4Smiod 149*3d8817e4Smiod /* R_S_16C_04_a R_16C_REGREL R_ABS R_CODE_ADDR */ 150*3d8817e4Smiod #define R_16C_REG04a_C 0X4206 151*3d8817e4Smiod 152*3d8817e4Smiod /* R_S_16C_14 R_16C_REGREL R_ABS R_ADDRESS */ 153*3d8817e4Smiod #define R_16C_REG14 0X3201 154*3d8817e4Smiod 155*3d8817e4Smiod /* R_S_16C_14 R_16C_REGREL R_ABS R_CODE_ADDR */ 156*3d8817e4Smiod #define R_16C_REG14_C 0X3206 157*3d8817e4Smiod 158*3d8817e4Smiod /* R_S_16C_16 R_16C_REGREL R_ABS R_ADDRESS */ 159*3d8817e4Smiod #define R_16C_REG16 0X1201 160*3d8817e4Smiod 161*3d8817e4Smiod /* R_S_16C_16 R_16C_REGREL R_ABS R_CODE_ADDR */ 162*3d8817e4Smiod #define R_16C_REG16_C 0X1206 163*3d8817e4Smiod 164*3d8817e4Smiod /* R_S_16C_20 R_16C_REGREL R_ABS R_ADDRESS */ 165*3d8817e4Smiod #define R_16C_REG20 0X8201 166*3d8817e4Smiod 167*3d8817e4Smiod /* R_S_16C_20 R_16C_REGREL R_ABS R_CODE_ADDR */ 168*3d8817e4Smiod #define R_16C_REG20_C 0X8206 169*3d8817e4Smiod 170*3d8817e4Smiod /* R_S_16C_20 R_16C_ABS R_ABS R_ADDRESS */ 171*3d8817e4Smiod #define R_16C_ABS20 0X8101 172*3d8817e4Smiod 173*3d8817e4Smiod /* R_S_16C_20 R_16C_ABS R_ABS R_CODE_ADDR */ 174*3d8817e4Smiod #define R_16C_ABS20_C 0X8106 175*3d8817e4Smiod 176*3d8817e4Smiod /* R_S_16C_24 R_16C_ABS R_ABS R_ADDRESS */ 177*3d8817e4Smiod #define R_16C_ABS24 0X7101 178*3d8817e4Smiod 179*3d8817e4Smiod /* R_S_16C_24 R_16C_ABS R_ABS R_CODE_ADDR */ 180*3d8817e4Smiod #define R_16C_ABS24_C 0X7106 181*3d8817e4Smiod 182*3d8817e4Smiod /* R_S_16C_04 R_16C_IMMED R_ABS R_ADDRESS */ 183*3d8817e4Smiod #define R_16C_IMM04 0X5301 184*3d8817e4Smiod 185*3d8817e4Smiod /* R_S_16C_04 R_16C_IMMED R_ABS R_CODE_ADDR */ 186*3d8817e4Smiod #define R_16C_IMM04_C 0X5306 187*3d8817e4Smiod 188*3d8817e4Smiod /* R_S_16C_16 R_16C_IMMED R_ABS R_ADDRESS */ 189*3d8817e4Smiod #define R_16C_IMM16 0X1301 190*3d8817e4Smiod 191*3d8817e4Smiod /* R_S_16C_16 R_16C_IMMED R_ABS R_CODE_ADDR */ 192*3d8817e4Smiod #define R_16C_IMM16_C 0X1306 193*3d8817e4Smiod 194*3d8817e4Smiod /* R_S_16C_20 R_16C_IMMED R_ABS R_ADDRESS */ 195*3d8817e4Smiod #define R_16C_IMM20 0X8301 196*3d8817e4Smiod 197*3d8817e4Smiod /* R_S_16C_20 R_16C_IMMED R_ABS R_CODE_ADDR */ 198*3d8817e4Smiod #define R_16C_IMM20_C 0X8306 199*3d8817e4Smiod 200*3d8817e4Smiod /* R_S_16C_24 R_16C_IMMED R_ABS R_ADDRESS */ 201*3d8817e4Smiod #define R_16C_IMM24 0X7301 202*3d8817e4Smiod 203*3d8817e4Smiod /* R_S_16C_24 R_16C_IMMED R_ABS R_CODE_ADDR */ 204*3d8817e4Smiod #define R_16C_IMM24_C 0X7306 205*3d8817e4Smiod 206*3d8817e4Smiod /* R_S_16C_32 R_16C_IMMED R_ABS R_ADDRESS */ 207*3d8817e4Smiod #define R_16C_IMM32 0X2301 208*3d8817e4Smiod 209*3d8817e4Smiod /* R_S_16C_32 R_16C_IMMED R_ABS R_CODE_ADDR */ 210*3d8817e4Smiod #define R_16C_IMM32_C 0X2306 211*3d8817e4Smiod 212*3d8817e4Smiod 213*3d8817e4Smiod /* Relocation item type. */ 214*3d8817e4Smiod #define R_ADDRTYPE 0x000f 215*3d8817e4Smiod #define R_ADDRESS 0x0001 /* Take address of symbol. */ 216*3d8817e4Smiod #define R_CODE_ADDR 0x0006 /* Take address of symbol divided by 2. */ 217*3d8817e4Smiod 218*3d8817e4Smiod /* Relocation action. */ 219*3d8817e4Smiod #define R_RELTO 0x00f0 220*3d8817e4Smiod #define R_ABS 0x0000 /* Keep symbol's address as such. */ 221*3d8817e4Smiod #define R_PCREL 0x0010 /* Subtract the pc address of hole. */ 222*3d8817e4Smiod 223*3d8817e4Smiod /* Relocation item data format. */ 224*3d8817e4Smiod #define R_FORMAT 0x0f00 225*3d8817e4Smiod #define R_NUMBER 0x0000 /* Retain as two's complement value. */ 226*3d8817e4Smiod #define R_16C_DISPL 0x0400 /* CR16C displacement type. */ 227*3d8817e4Smiod #define R_16C_ABS 0x0100 /* CR16C absolute type. */ 228*3d8817e4Smiod #define R_16C_REGREL 0x0200 /* CR16C register-relative type. */ 229*3d8817e4Smiod #define R_16C_IMMED 0x0300 /* CR16C immediate type. */ 230*3d8817e4Smiod 231*3d8817e4Smiod /* Relocation item size. */ 232*3d8817e4Smiod #define R_SIZESP 0xf000 233*3d8817e4Smiod #define R_S_16C_04 0x5000 234*3d8817e4Smiod #define R_S_16C_04_a 0x4000 235*3d8817e4Smiod #define R_S_16C_08 0x0000 236*3d8817e4Smiod #define R_S_16C_14 0x3000 237*3d8817e4Smiod #define R_S_16C_16 0x1000 238*3d8817e4Smiod #define R_S_16C_20 0x8000 239*3d8817e4Smiod #define R_S_16C_24_a 0x6000 240*3d8817e4Smiod #define R_S_16C_24 0x7000 241*3d8817e4Smiod #define R_S_16C_32 0x2000 242*3d8817e4Smiod 243*3d8817e4Smiod 244*3d8817e4Smiod /* Processor specific section indices. These sections do not actually 245*3d8817e4Smiod exist. Symbols with a st_shndx field corresponding to one of these 246*3d8817e4Smiod values have a special meaning. */ 247*3d8817e4Smiod 248*3d8817e4Smiod /* Far common symbol. */ 249*3d8817e4Smiod #define SHN_CR16C_FCOMMON 0xff00 250*3d8817e4Smiod #define SHN_CR16C_NCOMMON 0xff01 251*3d8817e4Smiod 252*3d8817e4Smiod typedef struct reloc_map 253*3d8817e4Smiod { 254*3d8817e4Smiod unsigned short cr_reloc_type; /* CR relocation type. */ 255*3d8817e4Smiod bfd_reloc_code_real_type bfd_reloc_enum; /* BFD relocation enum. */ 256*3d8817e4Smiod } RELOC_MAP; 257*3d8817e4Smiod 258*3d8817e4Smiod #endif /* _ELF_CR16C_H */ 259