1179407Sobrien/* bfd back-end for mips support
2179407Sobrien   Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
3218822Sdim   2002, 2003, 2004, 2007 Free Software Foundation, Inc.
4179407Sobrien   Written by Steve Chamberlain of Cygnus Support.
5179407Sobrien
6179407SobrienThis file is part of BFD, the Binary File Descriptor library.
7179407Sobrien
8179407SobrienThis program is free software; you can redistribute it and/or modify
9179407Sobrienit under the terms of the GNU General Public License as published by
10179407Sobrienthe Free Software Foundation; either version 2 of the License, or
11179407Sobrien(at your option) any later version.
12179407Sobrien
13179407SobrienThis program is distributed in the hope that it will be useful,
14179407Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
15179407SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16179407SobrienGNU General Public License for more details.
17179407Sobrien
18179407SobrienYou should have received a copy of the GNU General Public License
19179407Sobrienalong with this program; if not, write to the Free Software
20208737SjmallettFoundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
21179407Sobrien
22218822Sdim#include "sysdep.h"
23179407Sobrien#include "bfd.h"
24179407Sobrien#include "libbfd.h"
25179407Sobrien
26179407Sobrienstatic const bfd_arch_info_type *mips_compatible
27179407Sobrien  (const bfd_arch_info_type *, const bfd_arch_info_type *);
28179407Sobrien
29179407Sobrien/* The default routine tests bits_per_word, which is wrong on mips as
30179407Sobrien   mips word size doesn't correlate with reloc size.  */
31179407Sobrien
32179407Sobrienstatic const bfd_arch_info_type *
33179407Sobrienmips_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b)
34179407Sobrien{
35179407Sobrien  if (a->arch != b->arch)
36179407Sobrien    return NULL;
37179407Sobrien
38179407Sobrien  /* Machine compatibility is checked in
39179407Sobrien     _bfd_mips_elf_merge_private_bfd_data.  */
40179407Sobrien
41179407Sobrien  return a;
42179407Sobrien}
43179407Sobrien
44179407Sobrien#define N(BITS_WORD, BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT)		\
45179407Sobrien  {							\
46179407Sobrien    BITS_WORD, /*  bits in a word */			\
47179407Sobrien    BITS_ADDR, /* bits in an address */			\
48179407Sobrien    8,	/* 8 bits in a byte */				\
49179407Sobrien    bfd_arch_mips,					\
50179407Sobrien    NUMBER,						\
51179407Sobrien    "mips",						\
52179407Sobrien    PRINT,						\
53179407Sobrien    3,							\
54179407Sobrien    DEFAULT,						\
55179407Sobrien    mips_compatible,					\
56179407Sobrien    bfd_default_scan,					\
57179407Sobrien    NEXT,						\
58179407Sobrien  }
59179407Sobrien
60179407Sobrienenum
61179407Sobrien{
62179407Sobrien  I_mips3000,
63179407Sobrien  I_mips3900,
64179407Sobrien  I_mips4000,
65179407Sobrien  I_mips4010,
66179407Sobrien  I_mips4100,
67179407Sobrien  I_mips4111,
68179407Sobrien  I_mips4120,
69179407Sobrien  I_mips4300,
70179407Sobrien  I_mips4400,
71179407Sobrien  I_mips4600,
72179407Sobrien  I_mips4650,
73179407Sobrien  I_mips5000,
74179407Sobrien  I_mips5400,
75179407Sobrien  I_mips5500,
76179407Sobrien  I_mips6000,
77179407Sobrien  I_mips7000,
78179407Sobrien  I_mips8000,
79208737Sjmallett  I_mips9000,
80179407Sobrien  I_mips10000,
81179407Sobrien  I_mips12000,
82179407Sobrien  I_mips16,
83179407Sobrien  I_mips5,
84179407Sobrien  I_mipsisa32,
85179407Sobrien  I_mipsisa32r2,
86179407Sobrien  I_mipsisa64,
87179407Sobrien  I_mipsisa64r2,
88208737Sjmallett  I_mipsocteon,
89179407Sobrien  I_sb1,
90179407Sobrien};
91179407Sobrien
92179407Sobrien#define NN(index) (&arch_info_struct[(index) + 1])
93179407Sobrien
94179407Sobrienstatic const bfd_arch_info_type arch_info_struct[] =
95179407Sobrien{
96179407Sobrien  N (32, 32, bfd_mach_mips3000, "mips:3000",      FALSE, NN(I_mips3000)),
97179407Sobrien  N (32, 32, bfd_mach_mips3900, "mips:3900",      FALSE, NN(I_mips3900)),
98179407Sobrien  N (64, 64, bfd_mach_mips4000, "mips:4000",      FALSE, NN(I_mips4000)),
99179407Sobrien  N (64, 64, bfd_mach_mips4010, "mips:4010",      FALSE, NN(I_mips4010)),
100179407Sobrien  N (64, 64, bfd_mach_mips4100, "mips:4100",      FALSE, NN(I_mips4100)),
101179407Sobrien  N (64, 64, bfd_mach_mips4111, "mips:4111",      FALSE, NN(I_mips4111)),
102179407Sobrien  N (64, 64, bfd_mach_mips4120, "mips:4120",      FALSE, NN(I_mips4120)),
103179407Sobrien  N (64, 64, bfd_mach_mips4300, "mips:4300",      FALSE, NN(I_mips4300)),
104179407Sobrien  N (64, 64, bfd_mach_mips4400, "mips:4400",      FALSE, NN(I_mips4400)),
105179407Sobrien  N (64, 64, bfd_mach_mips4600, "mips:4600",      FALSE, NN(I_mips4600)),
106179407Sobrien  N (64, 64, bfd_mach_mips4650, "mips:4650",      FALSE, NN(I_mips4650)),
107179407Sobrien  N (64, 64, bfd_mach_mips5000, "mips:5000",      FALSE, NN(I_mips5000)),
108179407Sobrien  N (64, 64, bfd_mach_mips5400, "mips:5400",      FALSE, NN(I_mips5400)),
109179407Sobrien  N (64, 64, bfd_mach_mips5500, "mips:5500",      FALSE, NN(I_mips5500)),
110179407Sobrien  N (32, 32, bfd_mach_mips6000, "mips:6000",      FALSE, NN(I_mips6000)),
111179407Sobrien  N (64, 64, bfd_mach_mips7000, "mips:7000",      FALSE, NN(I_mips7000)),
112179407Sobrien  N (64, 64, bfd_mach_mips8000, "mips:8000",      FALSE, NN(I_mips8000)),
113208737Sjmallett  N (64, 64, bfd_mach_mips9000, "mips:9000",      FALSE, NN(I_mips9000)),
114179407Sobrien  N (64, 64, bfd_mach_mips10000,"mips:10000",     FALSE, NN(I_mips10000)),
115179407Sobrien  N (64, 64, bfd_mach_mips12000,"mips:12000",     FALSE, NN(I_mips12000)),
116179407Sobrien  N (64, 64, bfd_mach_mips16,   "mips:16",        FALSE, NN(I_mips16)),
117179407Sobrien  N (64, 64, bfd_mach_mips5,    "mips:mips5",     FALSE, NN(I_mips5)),
118179407Sobrien  N (32, 32, bfd_mach_mipsisa32,  "mips:isa32",   FALSE, NN(I_mipsisa32)),
119179407Sobrien  N (32, 32, bfd_mach_mipsisa32r2,"mips:isa32r2", FALSE, NN(I_mipsisa32r2)),
120179407Sobrien  N (64, 64, bfd_mach_mipsisa64,  "mips:isa64",   FALSE, NN(I_mipsisa64)),
121179407Sobrien  N (64, 64, bfd_mach_mipsisa64r2,"mips:isa64r2", FALSE, NN(I_mipsisa64r2)),
122208737Sjmallett  N (64, 64, bfd_mach_mips_octeon,"mips:octeon",  FALSE, NN(I_mipsocteon)),
123179407Sobrien  N (64, 64, bfd_mach_mips_sb1, "mips:sb1",       FALSE, 0),
124179407Sobrien};
125179407Sobrien
126179407Sobrien/* The default architecture is mips:3000, but with a machine number of
127179407Sobrien   zero.  This lets the linker distinguish between a default setting
128179407Sobrien   of mips, and an explicit setting of mips:3000.  */
129179407Sobrien
130179407Sobrienconst bfd_arch_info_type bfd_mips_arch =
131179407SobrienN (32, 32, 0, "mips", TRUE, &arch_info_struct[0]);
132