xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/cpu-mips.c (revision e992f068c547fd6e84b3f104dc2340adcc955732)
175fd0b74Schristos /* bfd back-end for mips support
2*e992f068Schristos    Copyright (C) 1990-2022 Free Software Foundation, Inc.
375fd0b74Schristos    Written by Steve Chamberlain of Cygnus Support.
475fd0b74Schristos 
575fd0b74Schristos    This file is part of BFD, the Binary File Descriptor library.
675fd0b74Schristos 
775fd0b74Schristos    This program is free software; you can redistribute it and/or modify
875fd0b74Schristos    it under the terms of the GNU General Public License as published by
975fd0b74Schristos    the Free Software Foundation; either version 3 of the License, or
1075fd0b74Schristos    (at your option) any later version.
1175fd0b74Schristos 
1275fd0b74Schristos    This program is distributed in the hope that it will be useful,
1375fd0b74Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
1475fd0b74Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1575fd0b74Schristos    GNU General Public License for more details.
1675fd0b74Schristos 
1775fd0b74Schristos    You should have received a copy of the GNU General Public License
1875fd0b74Schristos    along with this program; if not, write to the Free Software
1975fd0b74Schristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
2075fd0b74Schristos    MA 02110-1301, USA.  */
2175fd0b74Schristos 
2275fd0b74Schristos #include "sysdep.h"
2375fd0b74Schristos #include "bfd.h"
2475fd0b74Schristos #include "libbfd.h"
2575fd0b74Schristos 
2675fd0b74Schristos static const bfd_arch_info_type *mips_compatible
2775fd0b74Schristos   (const bfd_arch_info_type *, const bfd_arch_info_type *);
2875fd0b74Schristos 
2975fd0b74Schristos /* The default routine tests bits_per_word, which is wrong on mips as
3075fd0b74Schristos    mips word size doesn't correlate with reloc size.  */
3175fd0b74Schristos 
3275fd0b74Schristos static const bfd_arch_info_type *
mips_compatible(const bfd_arch_info_type * a,const bfd_arch_info_type * b)3375fd0b74Schristos mips_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b)
3475fd0b74Schristos {
3575fd0b74Schristos   if (a->arch != b->arch)
3675fd0b74Schristos     return NULL;
3775fd0b74Schristos 
3875fd0b74Schristos   /* Machine compatibility is checked in
3975fd0b74Schristos      _bfd_mips_elf_merge_private_bfd_data.  */
4075fd0b74Schristos 
4175fd0b74Schristos   return a;
4275fd0b74Schristos }
4375fd0b74Schristos 
4475fd0b74Schristos #define N(BITS_WORD, BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT)		\
4575fd0b74Schristos   {							\
46012573ebSchristos     BITS_WORD,  /* Bits in a word.  */			\
47012573ebSchristos     BITS_ADDR,  /* Bits in an address.  */		\
48012573ebSchristos     8,	        /* Bits in a byte.  */			\
4975fd0b74Schristos     bfd_arch_mips,					\
5075fd0b74Schristos     NUMBER,						\
5175fd0b74Schristos     "mips",						\
5275fd0b74Schristos     PRINT,						\
5375fd0b74Schristos     3,							\
5475fd0b74Schristos     DEFAULT,						\
5575fd0b74Schristos     mips_compatible,					\
5675fd0b74Schristos     bfd_default_scan,					\
5775fd0b74Schristos     bfd_arch_default_fill,				\
5875fd0b74Schristos     NEXT,						\
59012573ebSchristos     0 /* Maximum offset of a reloc from the start of an insn.  */ \
6075fd0b74Schristos   }
6175fd0b74Schristos 
6275fd0b74Schristos enum
6375fd0b74Schristos {
6475fd0b74Schristos   I_mips3000,
6575fd0b74Schristos   I_mips3900,
6675fd0b74Schristos   I_mips4000,
6775fd0b74Schristos   I_mips4010,
6875fd0b74Schristos   I_mips4100,
6975fd0b74Schristos   I_mips4111,
7075fd0b74Schristos   I_mips4120,
7175fd0b74Schristos   I_mips4300,
7275fd0b74Schristos   I_mips4400,
7375fd0b74Schristos   I_mips4600,
7475fd0b74Schristos   I_mips4650,
7575fd0b74Schristos   I_mips5000,
7675fd0b74Schristos   I_mips5400,
7775fd0b74Schristos   I_mips5500,
7875fd0b74Schristos   I_mips5900,
7975fd0b74Schristos   I_mips6000,
8075fd0b74Schristos   I_mips7000,
8175fd0b74Schristos   I_mips8000,
8275fd0b74Schristos   I_mips9000,
8375fd0b74Schristos   I_mips10000,
8475fd0b74Schristos   I_mips12000,
8575fd0b74Schristos   I_mips14000,
8675fd0b74Schristos   I_mips16000,
8775fd0b74Schristos   I_mips16,
8875fd0b74Schristos   I_mips5,
8975fd0b74Schristos   I_mipsisa32,
9075fd0b74Schristos   I_mipsisa32r2,
9175fd0b74Schristos   I_mipsisa32r3,
9275fd0b74Schristos   I_mipsisa32r5,
9375fd0b74Schristos   I_mipsisa32r6,
9475fd0b74Schristos   I_mipsisa64,
9575fd0b74Schristos   I_mipsisa64r2,
9675fd0b74Schristos   I_mipsisa64r3,
9775fd0b74Schristos   I_mipsisa64r5,
9875fd0b74Schristos   I_mipsisa64r6,
9975fd0b74Schristos   I_sb1,
10075fd0b74Schristos   I_loongson_2e,
10175fd0b74Schristos   I_loongson_2f,
102012573ebSchristos   I_gs464,
103012573ebSchristos   I_gs464e,
104012573ebSchristos   I_gs264e,
10575fd0b74Schristos   I_mipsocteon,
10675fd0b74Schristos   I_mipsocteonp,
10775fd0b74Schristos   I_mipsocteon2,
10875fd0b74Schristos   I_mipsocteon3,
10975fd0b74Schristos   I_xlr,
110ede78133Schristos   I_interaptiv_mr2,
11175fd0b74Schristos   I_micromips
11275fd0b74Schristos };
11375fd0b74Schristos 
11475fd0b74Schristos #define NN(index) (&arch_info_struct[(index) + 1])
11575fd0b74Schristos 
11675fd0b74Schristos static const bfd_arch_info_type arch_info_struct[] =
11775fd0b74Schristos {
118*e992f068Schristos   N (32, 32, bfd_mach_mips3000, "mips:3000",	  false, NN(I_mips3000)),
119*e992f068Schristos   N (32, 32, bfd_mach_mips3900, "mips:3900",	  false, NN(I_mips3900)),
120*e992f068Schristos   N (64, 64, bfd_mach_mips4000, "mips:4000",	  false, NN(I_mips4000)),
121*e992f068Schristos   N (32, 32, bfd_mach_mips4010, "mips:4010",	  false, NN(I_mips4010)),
122*e992f068Schristos   N (64, 64, bfd_mach_mips4100, "mips:4100",	  false, NN(I_mips4100)),
123*e992f068Schristos   N (64, 64, bfd_mach_mips4111, "mips:4111",	  false, NN(I_mips4111)),
124*e992f068Schristos   N (64, 64, bfd_mach_mips4120, "mips:4120",	  false, NN(I_mips4120)),
125*e992f068Schristos   N (64, 64, bfd_mach_mips4300, "mips:4300",	  false, NN(I_mips4300)),
126*e992f068Schristos   N (64, 64, bfd_mach_mips4400, "mips:4400",	  false, NN(I_mips4400)),
127*e992f068Schristos   N (64, 64, bfd_mach_mips4600, "mips:4600",	  false, NN(I_mips4600)),
128*e992f068Schristos   N (64, 64, bfd_mach_mips4650, "mips:4650",	  false, NN(I_mips4650)),
129*e992f068Schristos   N (64, 64, bfd_mach_mips5000, "mips:5000",	  false, NN(I_mips5000)),
130*e992f068Schristos   N (64, 64, bfd_mach_mips5400, "mips:5400",	  false, NN(I_mips5400)),
131*e992f068Schristos   N (64, 64, bfd_mach_mips5500, "mips:5500",	  false, NN(I_mips5500)),
132*e992f068Schristos   N (64, 32, bfd_mach_mips5900, "mips:5900",	  false, NN(I_mips5900)),
133*e992f068Schristos   N (32, 32, bfd_mach_mips6000, "mips:6000",	  false, NN(I_mips6000)),
134*e992f068Schristos   N (64, 64, bfd_mach_mips7000, "mips:7000",	  false, NN(I_mips7000)),
135*e992f068Schristos   N (64, 64, bfd_mach_mips8000, "mips:8000",	  false, NN(I_mips8000)),
136*e992f068Schristos   N (64, 64, bfd_mach_mips9000, "mips:9000",	  false, NN(I_mips9000)),
137*e992f068Schristos   N (64, 64, bfd_mach_mips10000,"mips:10000",	  false, NN(I_mips10000)),
138*e992f068Schristos   N (64, 64, bfd_mach_mips12000,"mips:12000",	  false, NN(I_mips12000)),
139*e992f068Schristos   N (64, 64, bfd_mach_mips14000,"mips:14000",	  false, NN(I_mips14000)),
140*e992f068Schristos   N (64, 64, bfd_mach_mips16000,"mips:16000",	  false, NN(I_mips16000)),
141*e992f068Schristos   N (64, 64, bfd_mach_mips16,	"mips:16",	  false, NN(I_mips16)),
142*e992f068Schristos   N (64, 64, bfd_mach_mips5,	"mips:mips5",	  false, NN(I_mips5)),
143*e992f068Schristos   N (32, 32, bfd_mach_mipsisa32,  "mips:isa32",	  false, NN(I_mipsisa32)),
144*e992f068Schristos   N (32, 32, bfd_mach_mipsisa32r2,"mips:isa32r2", false, NN(I_mipsisa32r2)),
145*e992f068Schristos   N (32, 32, bfd_mach_mipsisa32r3,"mips:isa32r3", false, NN(I_mipsisa32r3)),
146*e992f068Schristos   N (32, 32, bfd_mach_mipsisa32r5,"mips:isa32r5", false, NN(I_mipsisa32r5)),
147*e992f068Schristos   N (32, 32, bfd_mach_mipsisa32r6,"mips:isa32r6", false, NN(I_mipsisa32r6)),
148*e992f068Schristos   N (64, 64, bfd_mach_mipsisa64,  "mips:isa64",	  false, NN(I_mipsisa64)),
149*e992f068Schristos   N (64, 64, bfd_mach_mipsisa64r2,"mips:isa64r2", false, NN(I_mipsisa64r2)),
150*e992f068Schristos   N (64, 64, bfd_mach_mipsisa64r3,"mips:isa64r3", false, NN(I_mipsisa64r3)),
151*e992f068Schristos   N (64, 64, bfd_mach_mipsisa64r5,"mips:isa64r5", false, NN(I_mipsisa64r5)),
152*e992f068Schristos   N (64, 64, bfd_mach_mipsisa64r6,"mips:isa64r6", false, NN(I_mipsisa64r6)),
153*e992f068Schristos   N (64, 64, bfd_mach_mips_sb1, "mips:sb1",	  false, NN(I_sb1)),
154*e992f068Schristos   N (64, 64, bfd_mach_mips_loongson_2e, "mips:loongson_2e", false, NN(I_loongson_2e)),
155*e992f068Schristos   N (64, 64, bfd_mach_mips_loongson_2f, "mips:loongson_2f", false, NN(I_loongson_2f)),
156*e992f068Schristos   N (64, 64, bfd_mach_mips_gs464, "mips:gs464",	  false, NN(I_gs464)),
157*e992f068Schristos   N (64, 64, bfd_mach_mips_gs464e, "mips:gs464e", false, NN(I_gs464e)),
158*e992f068Schristos   N (64, 64, bfd_mach_mips_gs264e, "mips:gs264e", false, NN(I_gs264e)),
159*e992f068Schristos   N (64, 64, bfd_mach_mips_octeon,"mips:octeon",  false, NN(I_mipsocteon)),
160*e992f068Schristos   N (64, 64, bfd_mach_mips_octeonp,"mips:octeon+", false, NN(I_mipsocteonp)),
161*e992f068Schristos   N (64, 64, bfd_mach_mips_octeon2,"mips:octeon2", false, NN(I_mipsocteon2)),
162*e992f068Schristos   N (64, 64, bfd_mach_mips_octeon3, "mips:octeon3", false, NN(I_mipsocteon3)),
163*e992f068Schristos   N (64, 64, bfd_mach_mips_xlr, "mips:xlr",	   false, NN(I_xlr)),
164*e992f068Schristos   N (32, 32, bfd_mach_mips_interaptiv_mr2, "mips:interaptiv-mr2", false,
165ede78133Schristos      NN(I_interaptiv_mr2)),
166*e992f068Schristos   N (64, 64, bfd_mach_mips_micromips, "mips:micromips", false, NULL)
16775fd0b74Schristos };
16875fd0b74Schristos 
16975fd0b74Schristos /* The default architecture is mips:3000, but with a machine number of
17075fd0b74Schristos    zero.  This lets the linker distinguish between a default setting
17175fd0b74Schristos    of mips, and an explicit setting of mips:3000.  */
17275fd0b74Schristos 
17375fd0b74Schristos const bfd_arch_info_type bfd_mips_arch =
174*e992f068Schristos N (32, 32, 0, "mips", true, &arch_info_struct[0]);
175