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