]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/cpu-avr.c
Update the config.guess and config.sub files from the master repository and regenerat...
[thirdparty/binutils-gdb.git] / bfd / cpu-avr.c
CommitLineData
adde6300 1/* BFD library support routines for the AVR architecture.
a2c58332 2 Copyright (C) 1999-2022 Free Software Foundation, Inc.
adde6300
AM
3 Contributed by Denis Chertykov <denisc@overta.ru>
4
4cdc7696 5 This file is part of BFD, the Binary File Descriptor library.
adde6300 6
4cdc7696
NC
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
4cdc7696 10 (at your option) any later version.
adde6300 11
4cdc7696
NC
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
adde6300 16
4cdc7696
NC
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
adde6300 21
adde6300 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
adde6300
AM
24#include "libbfd.h"
25
adde6300
AM
26/* This routine is provided two arch_infos and works out which AVR
27 machine which would be compatible with both and returns a pointer
28 to its info structure. */
29
30static const bfd_arch_info_type *
4cdc7696
NC
31compatible (const bfd_arch_info_type * a,
32 const bfd_arch_info_type * b)
adde6300
AM
33{
34 /* If a & b are for different architectures we can do nothing. */
35 if (a->arch != b->arch)
36 return NULL;
37
7b21ac3f
EW
38 if (a->mach == b->mach)
39 return a;
adde6300 40
3e22044a
TG
41 /* avr-6 is compatible only with itself as its call convention is not
42 compatible with other avr (the mcu saves the return address on 3 bytes
43 instead of 2). */
44 if (a->mach == bfd_mach_avr6 || b->mach == bfd_mach_avr6)
45 return NULL;
46
47 if (a->mach < bfd_mach_avr6 && b->mach < bfd_mach_avr6)
7b21ac3f
EW
48 {
49 /* Special case for ATmega[16]03 (avr:3) and ATmega83 (avr:4). */
50 if ((a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr4)
07d6d2b8 51 || (a->mach == bfd_mach_avr4 && b->mach == bfd_mach_avr3))
7b21ac3f
EW
52 return NULL;
53
54 if (a->mach <= b->mach)
55 return b;
68ffbac6 56
7b21ac3f
EW
57 if (a->mach >= b->mach)
58 return a;
59 }
60
61 if (a->mach == bfd_mach_avr2 && b->mach == bfd_mach_avr25)
62 return a;
63 if (a->mach == bfd_mach_avr25 && b->mach == bfd_mach_avr2)
64 return b;
68ffbac6 65
7b21ac3f
EW
66 if (a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr31)
67 return a;
68 if (a->mach == bfd_mach_avr31 && b->mach == bfd_mach_avr3)
adde6300 69 return b;
7b21ac3f 70 if (a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr35)
65aa24b6 71 return a;
7b21ac3f
EW
72 if (a->mach == bfd_mach_avr35 && b->mach == bfd_mach_avr3)
73 return b;
74
75 if (a->mach == bfd_mach_avr5 && b->mach == bfd_mach_avr51)
76 return a;
77 if (a->mach == bfd_mach_avr51 && b->mach == bfd_mach_avr5)
78 return b;
79
adde6300
AM
80 return NULL;
81}
4cdc7696
NC
82
83#define N(addr_bits, machine, print, default, next) \
84{ \
aebcfb76
NC
85 8, /* Bits in a word. */ \
86 addr_bits, /* Bits in an address. */ \
87 8, /* Bits in a byte. */ \
4cdc7696
NC
88 bfd_arch_avr, \
89 machine, /* Machine number. */ \
90 "avr", /* Architecture name. */ \
91 print, /* Printable name. */ \
92 1, /* Section align power. */ \
93 default, /* Is this the default ? */ \
94 compatible, \
95 bfd_default_scan, \
b7761f11 96 bfd_arch_default_fill, \
aebcfb76
NC
97 next, \
98 0 /* Maximum offset of a reloc from the start of an insn. */ \
4cdc7696
NC
99}
100
101static const bfd_arch_info_type arch_info_struct[] =
102{
7b21ac3f 103 /* Assembler only. */
0a1b45a2 104 N (16, bfd_mach_avr1, "avr:1", false, & arch_info_struct[1]),
4cdc7696 105
7b21ac3f 106 /* Classic, <= 8K. */
0a1b45a2 107 N (16, bfd_mach_avr2, "avr:2", false, & arch_info_struct[2]),
4cdc7696 108
7b21ac3f 109 /* Classic + MOVW, <= 8K. */
0a1b45a2 110 N (16, bfd_mach_avr25, "avr:25", false, & arch_info_struct[3]),
7b21ac3f
EW
111
112 /* Classic, > 8K, <= 64K. */
68ffbac6 113 /* TODO: addr_bits should be 16, but set to 22 for some following
7b21ac3f 114 version of GCC (from 4.3) for backward compatibility. */
0a1b45a2 115 N (22, bfd_mach_avr3, "avr:3", false, & arch_info_struct[4]),
7b21ac3f
EW
116
117 /* Classic, == 128K. */
0a1b45a2 118 N (22, bfd_mach_avr31, "avr:31", false, & arch_info_struct[5]),
7b21ac3f
EW
119
120 /* Classic + MOVW + JMP/CALL, > 8K, <= 64K. */
0a1b45a2 121 N (16, bfd_mach_avr35, "avr:35", false, & arch_info_struct[6]),
4cdc7696 122
7b21ac3f 123 /* Enhanced, <= 8K. */
0a1b45a2 124 N (16, bfd_mach_avr4, "avr:4", false, & arch_info_struct[7]),
4cdc7696 125
7b21ac3f 126 /* Enhanced, > 8K, <= 64K. */
68ffbac6 127 /* TODO: addr_bits should be 16, but set to 22 for some following
7b21ac3f 128 version of GCC (from 4.3) for backward compatibility. */
0a1b45a2 129 N (22, bfd_mach_avr5, "avr:5", false, & arch_info_struct[8]),
68ffbac6 130
7b21ac3f 131 /* Enhanced, == 128K. */
0a1b45a2 132 N (22, bfd_mach_avr51, "avr:51", false, & arch_info_struct[9]),
28c9d252 133
7b21ac3f 134 /* 3-Byte PC. */
0a1b45a2 135 N (22, bfd_mach_avr6, "avr:6", false, & arch_info_struct[10]),
68ffbac6 136
f36e8886 137 /* Tiny core (AVR Tiny). */
0a1b45a2 138 N (16, bfd_mach_avrtiny, "avr:100", false, & arch_info_struct[11]),
f36e8886
BS
139
140 /* Xmega 1. */
0a1b45a2 141 N (24, bfd_mach_avrxmega1, "avr:101", false, & arch_info_struct[12]),
f36e8886
BS
142
143 /* Xmega 2. */
0a1b45a2 144 N (24, bfd_mach_avrxmega2, "avr:102", false, & arch_info_struct[13]),
1b786873 145
f36e8886 146 /* Xmega 3. */
0a1b45a2 147 N (24, bfd_mach_avrxmega3, "avr:103", false, & arch_info_struct[14]),
1b786873 148
f36e8886 149 /* Xmega 4. */
0a1b45a2 150 N (24, bfd_mach_avrxmega4, "avr:104", false, & arch_info_struct[15]),
1b786873 151
f36e8886 152 /* Xmega 5. */
0a1b45a2 153 N (24, bfd_mach_avrxmega5, "avr:105", false, & arch_info_struct[16]),
1b786873 154
f36e8886 155 /* Xmega 6. */
0a1b45a2 156 N (24, bfd_mach_avrxmega6, "avr:106", false, & arch_info_struct[17]),
1b786873 157
f36e8886 158 /* Xmega 7. */
0a1b45a2 159 N (24, bfd_mach_avrxmega7, "avr:107", false, NULL)
68ffbac6 160
4cdc7696
NC
161};
162
163const bfd_arch_info_type bfd_avr_arch =
0a1b45a2 164 N (16, bfd_mach_avr2, "avr", true, & arch_info_struct[0]);