1 /* tc-avr.c -- Assembler code for the ATMEL AVR 2 3 Copyright (C) 1999-2016 Free Software Foundation, Inc. 4 Contributed by Denis Chertykov <denisc (at) overta.ru> 5 6 This file is part of GAS, the GNU Assembler. 7 8 GAS is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3, or (at your option) 11 any later version. 12 13 GAS is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GAS; see the file COPYING. If not, write to 20 the Free Software Foundation, 51 Franklin Street - Fifth Floor, 21 Boston, MA 02110-1301, USA. */ 22 23 #include "as.h" 24 #include "safe-ctype.h" 25 #include "subsegs.h" 26 #include "dwarf2dbg.h" 27 #include "dw2gencfi.h" 28 #include "elf/avr.h" 29 #include "elf32-avr.h" 30 31 /* For building a linked list of AVR_PROPERTY_RECORD structures. */ 32 struct avr_property_record_link 33 { 34 struct avr_property_record record; 35 struct avr_property_record_link *next; 36 }; 37 38 struct avr_opcodes_s 39 { 40 const char * name; 41 const char * constraints; 42 const char * opcode; 43 int insn_size; /* In words. */ 44 int isa; 45 unsigned int bin_opcode; 46 }; 47 48 #define AVR_INSN(NAME, CONSTR, OPCODE, SIZE, ISA, BIN) \ 49 {#NAME, CONSTR, OPCODE, SIZE, ISA, BIN}, 50 51 struct avr_opcodes_s avr_opcodes[] = 52 { 53 #include "opcode/avr.h" 54 {NULL, NULL, NULL, 0, 0, 0} 55 }; 56 57 const char comment_chars[] = ";"; 58 const char line_comment_chars[] = "#"; 59 const char line_separator_chars[] = "$"; 60 61 const char *md_shortopts = "m:"; 62 struct mcu_type_s 63 { 64 const char *name; 65 int isa; 66 int mach; 67 }; 68 69 /* XXX - devices that don't seem to exist (renamed, replaced with larger 70 ones, or planned but never produced), left here for compatibility. */ 71 72 static struct mcu_type_s mcu_types[] = 73 { 74 {"avr1", AVR_ISA_AVR1, bfd_mach_avr1}, 75 /* TODO: insruction set for avr2 architecture should be AVR_ISA_AVR2, 76 but set to AVR_ISA_AVR25 for some following version 77 of GCC (from 4.3) for backward compatibility. */ 78 {"avr2", AVR_ISA_AVR25, bfd_mach_avr2}, 79 {"avr25", AVR_ISA_AVR25, bfd_mach_avr25}, 80 /* TODO: insruction set for avr3 architecture should be AVR_ISA_AVR3, 81 but set to AVR_ISA_AVR3_ALL for some following version 82 of GCC (from 4.3) for backward compatibility. */ 83 {"avr3", AVR_ISA_AVR3_ALL, bfd_mach_avr3}, 84 {"avr31", AVR_ISA_AVR31, bfd_mach_avr31}, 85 {"avr35", AVR_ISA_AVR35, bfd_mach_avr35}, 86 {"avr4", AVR_ISA_AVR4, bfd_mach_avr4}, 87 /* TODO: insruction set for avr5 architecture should be AVR_ISA_AVR5, 88 but set to AVR_ISA_AVR51 for some following version 89 of GCC (from 4.3) for backward compatibility. */ 90 {"avr5", AVR_ISA_AVR51, bfd_mach_avr5}, 91 {"avr51", AVR_ISA_AVR51, bfd_mach_avr51}, 92 {"avr6", AVR_ISA_AVR6, bfd_mach_avr6}, 93 {"avrxmega1", AVR_ISA_XMEGA, bfd_mach_avrxmega1}, 94 {"avrxmega2", AVR_ISA_XMEGA, bfd_mach_avrxmega2}, 95 {"avrxmega3", AVR_ISA_XMEGA, bfd_mach_avrxmega3}, 96 {"avrxmega4", AVR_ISA_XMEGA, bfd_mach_avrxmega4}, 97 {"avrxmega5", AVR_ISA_XMEGA, bfd_mach_avrxmega5}, 98 {"avrxmega6", AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 99 {"avrxmega7", AVR_ISA_XMEGA, bfd_mach_avrxmega7}, 100 {"avrtiny", AVR_ISA_AVRTINY, bfd_mach_avrtiny}, 101 {"at90s1200", AVR_ISA_1200, bfd_mach_avr1}, 102 {"attiny11", AVR_ISA_AVR1, bfd_mach_avr1}, 103 {"attiny12", AVR_ISA_AVR1, bfd_mach_avr1}, 104 {"attiny15", AVR_ISA_AVR1, bfd_mach_avr1}, 105 {"attiny28", AVR_ISA_AVR1, bfd_mach_avr1}, 106 {"at90s2313", AVR_ISA_AVR2, bfd_mach_avr2}, 107 {"at90s2323", AVR_ISA_AVR2, bfd_mach_avr2}, 108 {"at90s2333", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 4433 */ 109 {"at90s2343", AVR_ISA_AVR2, bfd_mach_avr2}, 110 {"attiny22", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 2343 */ 111 {"attiny26", AVR_ISA_2xxe, bfd_mach_avr2}, 112 {"at90s4414", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 8515 */ 113 {"at90s4433", AVR_ISA_AVR2, bfd_mach_avr2}, 114 {"at90s4434", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 8535 */ 115 {"at90s8515", AVR_ISA_AVR2, bfd_mach_avr2}, 116 {"at90c8534", AVR_ISA_AVR2, bfd_mach_avr2}, 117 {"at90s8535", AVR_ISA_AVR2, bfd_mach_avr2}, 118 {"ata5272", AVR_ISA_AVR25, bfd_mach_avr25}, 119 {"attiny13", AVR_ISA_AVR25, bfd_mach_avr25}, 120 {"attiny13a", AVR_ISA_AVR25, bfd_mach_avr25}, 121 {"attiny2313", AVR_ISA_AVR25, bfd_mach_avr25}, 122 {"attiny2313a",AVR_ISA_AVR25, bfd_mach_avr25}, 123 {"attiny24", AVR_ISA_AVR25, bfd_mach_avr25}, 124 {"attiny24a", AVR_ISA_AVR25, bfd_mach_avr25}, 125 {"attiny4313", AVR_ISA_AVR25, bfd_mach_avr25}, 126 {"attiny44", AVR_ISA_AVR25, bfd_mach_avr25}, 127 {"attiny44a", AVR_ISA_AVR25, bfd_mach_avr25}, 128 {"attiny84", AVR_ISA_AVR25, bfd_mach_avr25}, 129 {"attiny84a", AVR_ISA_AVR25, bfd_mach_avr25}, 130 {"attiny25", AVR_ISA_AVR25, bfd_mach_avr25}, 131 {"attiny45", AVR_ISA_AVR25, bfd_mach_avr25}, 132 {"attiny85", AVR_ISA_AVR25, bfd_mach_avr25}, 133 {"attiny261", AVR_ISA_AVR25, bfd_mach_avr25}, 134 {"attiny261a", AVR_ISA_AVR25, bfd_mach_avr25}, 135 {"attiny461", AVR_ISA_AVR25, bfd_mach_avr25}, 136 {"attiny461a", AVR_ISA_AVR25, bfd_mach_avr25}, 137 {"attiny861", AVR_ISA_AVR25, bfd_mach_avr25}, 138 {"attiny861a", AVR_ISA_AVR25, bfd_mach_avr25}, 139 {"attiny87", AVR_ISA_AVR25, bfd_mach_avr25}, 140 {"attiny43u", AVR_ISA_AVR25, bfd_mach_avr25}, 141 {"attiny48", AVR_ISA_AVR25, bfd_mach_avr25}, 142 {"attiny88", AVR_ISA_AVR25, bfd_mach_avr25}, 143 {"attiny828", AVR_ISA_AVR25, bfd_mach_avr25}, 144 {"at86rf401", AVR_ISA_RF401, bfd_mach_avr25}, 145 {"at43usb355", AVR_ISA_AVR3, bfd_mach_avr3}, 146 {"at76c711", AVR_ISA_AVR3, bfd_mach_avr3}, 147 {"atmega103", AVR_ISA_AVR31, bfd_mach_avr31}, 148 {"at43usb320", AVR_ISA_AVR31, bfd_mach_avr31}, 149 {"attiny167", AVR_ISA_AVR35, bfd_mach_avr35}, 150 {"at90usb82", AVR_ISA_AVR35, bfd_mach_avr35}, 151 {"at90usb162", AVR_ISA_AVR35, bfd_mach_avr35}, 152 {"ata5505", AVR_ISA_AVR35, bfd_mach_avr35}, 153 {"atmega8u2", AVR_ISA_AVR35, bfd_mach_avr35}, 154 {"atmega16u2", AVR_ISA_AVR35, bfd_mach_avr35}, 155 {"atmega32u2", AVR_ISA_AVR35, bfd_mach_avr35}, 156 {"attiny1634", AVR_ISA_AVR35, bfd_mach_avr35}, 157 {"atmega8", AVR_ISA_M8, bfd_mach_avr4}, 158 {"ata6289", AVR_ISA_AVR4, bfd_mach_avr4}, 159 {"atmega8a", AVR_ISA_M8, bfd_mach_avr4}, 160 {"ata6285", AVR_ISA_AVR4, bfd_mach_avr4}, 161 {"ata6286", AVR_ISA_AVR4, bfd_mach_avr4}, 162 {"atmega48", AVR_ISA_AVR4, bfd_mach_avr4}, 163 {"atmega48a", AVR_ISA_AVR4, bfd_mach_avr4}, 164 {"atmega48pa", AVR_ISA_AVR4, bfd_mach_avr4}, 165 {"atmega48p", AVR_ISA_AVR4, bfd_mach_avr4}, 166 {"atmega88", AVR_ISA_AVR4, bfd_mach_avr4}, 167 {"atmega88a", AVR_ISA_AVR4, bfd_mach_avr4}, 168 {"atmega88p", AVR_ISA_AVR4, bfd_mach_avr4}, 169 {"atmega88pa", AVR_ISA_AVR4, bfd_mach_avr4}, 170 {"atmega8515", AVR_ISA_M8, bfd_mach_avr4}, 171 {"atmega8535", AVR_ISA_M8, bfd_mach_avr4}, 172 {"atmega8hva", AVR_ISA_AVR4, bfd_mach_avr4}, 173 {"at90pwm1", AVR_ISA_AVR4, bfd_mach_avr4}, 174 {"at90pwm2", AVR_ISA_AVR4, bfd_mach_avr4}, 175 {"at90pwm2b", AVR_ISA_AVR4, bfd_mach_avr4}, 176 {"at90pwm3", AVR_ISA_AVR4, bfd_mach_avr4}, 177 {"at90pwm3b", AVR_ISA_AVR4, bfd_mach_avr4}, 178 {"at90pwm81", AVR_ISA_AVR4, bfd_mach_avr4}, 179 {"at90pwm161", AVR_ISA_AVR5, bfd_mach_avr5}, 180 {"ata5790", AVR_ISA_AVR5, bfd_mach_avr5}, 181 {"ata5795", AVR_ISA_AVR5, bfd_mach_avr5}, 182 {"atmega16", AVR_ISA_AVR5, bfd_mach_avr5}, 183 {"atmega16a", AVR_ISA_AVR5, bfd_mach_avr5}, 184 {"atmega161", AVR_ISA_M161, bfd_mach_avr5}, 185 {"atmega162", AVR_ISA_AVR5, bfd_mach_avr5}, 186 {"atmega163", AVR_ISA_M161, bfd_mach_avr5}, 187 {"atmega164a", AVR_ISA_AVR5, bfd_mach_avr5}, 188 {"atmega164p", AVR_ISA_AVR5, bfd_mach_avr5}, 189 {"atmega164pa",AVR_ISA_AVR5, bfd_mach_avr5}, 190 {"atmega165", AVR_ISA_AVR5, bfd_mach_avr5}, 191 {"atmega165a", AVR_ISA_AVR5, bfd_mach_avr5}, 192 {"atmega165p", AVR_ISA_AVR5, bfd_mach_avr5}, 193 {"atmega165pa",AVR_ISA_AVR5, bfd_mach_avr5}, 194 {"atmega168", AVR_ISA_AVR5, bfd_mach_avr5}, 195 {"atmega168a", AVR_ISA_AVR5, bfd_mach_avr5}, 196 {"atmega168p", AVR_ISA_AVR5, bfd_mach_avr5}, 197 {"atmega168pa",AVR_ISA_AVR5, bfd_mach_avr5}, 198 {"atmega169", AVR_ISA_AVR5, bfd_mach_avr5}, 199 {"atmega169a", AVR_ISA_AVR5, bfd_mach_avr5}, 200 {"atmega169p", AVR_ISA_AVR5, bfd_mach_avr5}, 201 {"atmega169pa",AVR_ISA_AVR5, bfd_mach_avr5}, 202 {"atmega32", AVR_ISA_AVR5, bfd_mach_avr5}, 203 {"atmega32a", AVR_ISA_AVR5, bfd_mach_avr5}, 204 {"atmega323", AVR_ISA_AVR5, bfd_mach_avr5}, 205 {"atmega324a", AVR_ISA_AVR5, bfd_mach_avr5}, 206 {"atmega324p", AVR_ISA_AVR5, bfd_mach_avr5}, 207 {"atmega324pa",AVR_ISA_AVR5, bfd_mach_avr5}, 208 {"atmega325", AVR_ISA_AVR5, bfd_mach_avr5}, 209 {"atmega325a", AVR_ISA_AVR5, bfd_mach_avr5}, 210 {"atmega325p", AVR_ISA_AVR5, bfd_mach_avr5}, 211 {"atmega325pa",AVR_ISA_AVR5, bfd_mach_avr5}, 212 {"atmega3250", AVR_ISA_AVR5, bfd_mach_avr5}, 213 {"atmega3250a",AVR_ISA_AVR5, bfd_mach_avr5}, 214 {"atmega3250p",AVR_ISA_AVR5, bfd_mach_avr5}, 215 {"atmega3250pa",AVR_ISA_AVR5, bfd_mach_avr5}, 216 {"atmega328", AVR_ISA_AVR5, bfd_mach_avr5}, 217 {"atmega328p", AVR_ISA_AVR5, bfd_mach_avr5}, 218 {"atmega329", AVR_ISA_AVR5, bfd_mach_avr5}, 219 {"atmega329a", AVR_ISA_AVR5, bfd_mach_avr5}, 220 {"atmega329p", AVR_ISA_AVR5, bfd_mach_avr5}, 221 {"atmega329pa",AVR_ISA_AVR5, bfd_mach_avr5}, 222 {"atmega3290", AVR_ISA_AVR5, bfd_mach_avr5}, 223 {"atmega3290a",AVR_ISA_AVR5, bfd_mach_avr5}, 224 {"atmega3290p",AVR_ISA_AVR5, bfd_mach_avr5}, 225 {"atmega3290pa",AVR_ISA_AVR5, bfd_mach_avr5}, 226 {"atmega406", AVR_ISA_AVR5, bfd_mach_avr5}, 227 {"atmega64rfr2", AVR_ISA_AVR5, bfd_mach_avr5}, 228 {"atmega644rfr2",AVR_ISA_AVR5, bfd_mach_avr5}, 229 {"atmega64", AVR_ISA_AVR5, bfd_mach_avr5}, 230 {"atmega64a", AVR_ISA_AVR5, bfd_mach_avr5}, 231 {"atmega640", AVR_ISA_AVR5, bfd_mach_avr5}, 232 {"atmega644", AVR_ISA_AVR5, bfd_mach_avr5}, 233 {"atmega644a", AVR_ISA_AVR5, bfd_mach_avr5}, 234 {"atmega644p", AVR_ISA_AVR5, bfd_mach_avr5}, 235 {"atmega644pa",AVR_ISA_AVR5, bfd_mach_avr5}, 236 {"atmega645", AVR_ISA_AVR5, bfd_mach_avr5}, 237 {"atmega645a", AVR_ISA_AVR5, bfd_mach_avr5}, 238 {"atmega645p", AVR_ISA_AVR5, bfd_mach_avr5}, 239 {"atmega649", AVR_ISA_AVR5, bfd_mach_avr5}, 240 {"atmega649a", AVR_ISA_AVR5, bfd_mach_avr5}, 241 {"atmega649p", AVR_ISA_AVR5, bfd_mach_avr5}, 242 {"atmega6450", AVR_ISA_AVR5, bfd_mach_avr5}, 243 {"atmega6450a",AVR_ISA_AVR5, bfd_mach_avr5}, 244 {"atmega6450p",AVR_ISA_AVR5, bfd_mach_avr5}, 245 {"atmega6490", AVR_ISA_AVR5, bfd_mach_avr5}, 246 {"atmega6490a",AVR_ISA_AVR5, bfd_mach_avr5}, 247 {"atmega6490p",AVR_ISA_AVR5, bfd_mach_avr5}, 248 {"atmega64rfr2",AVR_ISA_AVR5, bfd_mach_avr5}, 249 {"atmega644rfr2",AVR_ISA_AVR5, bfd_mach_avr5}, 250 {"atmega16hva",AVR_ISA_AVR5, bfd_mach_avr5}, 251 {"atmega16hva2",AVR_ISA_AVR5, bfd_mach_avr5}, 252 {"atmega16hvb",AVR_ISA_AVR5, bfd_mach_avr5}, 253 {"atmega16hvbrevb",AVR_ISA_AVR5,bfd_mach_avr5}, 254 {"atmega32hvb",AVR_ISA_AVR5, bfd_mach_avr5}, 255 {"atmega32hvbrevb",AVR_ISA_AVR5,bfd_mach_avr5}, 256 {"atmega64hve",AVR_ISA_AVR5, bfd_mach_avr5}, 257 {"at90can32" , AVR_ISA_AVR5, bfd_mach_avr5}, 258 {"at90can64" , AVR_ISA_AVR5, bfd_mach_avr5}, 259 {"at90pwm161", AVR_ISA_AVR5, bfd_mach_avr5}, 260 {"at90pwm216", AVR_ISA_AVR5, bfd_mach_avr5}, 261 {"at90pwm316", AVR_ISA_AVR5, bfd_mach_avr5}, 262 {"atmega32c1", AVR_ISA_AVR5, bfd_mach_avr5}, 263 {"atmega64c1", AVR_ISA_AVR5, bfd_mach_avr5}, 264 {"atmega16m1", AVR_ISA_AVR5, bfd_mach_avr5}, 265 {"atmega32m1", AVR_ISA_AVR5, bfd_mach_avr5}, 266 {"atmega64m1", AVR_ISA_AVR5, bfd_mach_avr5}, 267 {"atmega16u4", AVR_ISA_AVR5, bfd_mach_avr5}, 268 {"atmega32u4", AVR_ISA_AVR5, bfd_mach_avr5}, 269 {"atmega32u6", AVR_ISA_AVR5, bfd_mach_avr5}, 270 {"at90usb646", AVR_ISA_AVR5, bfd_mach_avr5}, 271 {"at90usb647", AVR_ISA_AVR5, bfd_mach_avr5}, 272 {"at90scr100", AVR_ISA_AVR5, bfd_mach_avr5}, 273 {"at94k", AVR_ISA_94K, bfd_mach_avr5}, 274 {"m3000", AVR_ISA_AVR5, bfd_mach_avr5}, 275 {"atmega128", AVR_ISA_AVR51, bfd_mach_avr51}, 276 {"atmega128a", AVR_ISA_AVR51, bfd_mach_avr51}, 277 {"atmega1280", AVR_ISA_AVR51, bfd_mach_avr51}, 278 {"atmega1281", AVR_ISA_AVR51, bfd_mach_avr51}, 279 {"atmega1284", AVR_ISA_AVR51, bfd_mach_avr51}, 280 {"atmega1284p",AVR_ISA_AVR51, bfd_mach_avr51}, 281 {"atmega128rfa1",AVR_ISA_AVR51, bfd_mach_avr51}, 282 {"atmega128rfr2",AVR_ISA_AVR51, bfd_mach_avr51}, 283 {"atmega1284rfr2",AVR_ISA_AVR51, bfd_mach_avr51}, 284 {"at90can128", AVR_ISA_AVR51, bfd_mach_avr51}, 285 {"at90usb1286",AVR_ISA_AVR51, bfd_mach_avr51}, 286 {"at90usb1287",AVR_ISA_AVR51, bfd_mach_avr51}, 287 {"atmega2560", AVR_ISA_AVR6, bfd_mach_avr6}, 288 {"atmega2561", AVR_ISA_AVR6, bfd_mach_avr6}, 289 {"atmega256rfr2", AVR_ISA_AVR6, bfd_mach_avr6}, 290 {"atmega2564rfr2", AVR_ISA_AVR6, bfd_mach_avr6}, 291 {"atxmega16a4", AVR_ISA_XMEGA, bfd_mach_avrxmega2}, 292 {"atxmega16a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2}, 293 {"atxmega16c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2}, 294 {"atxmega16d4", AVR_ISA_XMEGA, bfd_mach_avrxmega2}, 295 {"atxmega32a4", AVR_ISA_XMEGA, bfd_mach_avrxmega2}, 296 {"atxmega32a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2}, 297 {"atxmega32c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2}, 298 {"atxmega32d4", AVR_ISA_XMEGA, bfd_mach_avrxmega2}, 299 {"atxmega32e5", AVR_ISA_XMEGA, bfd_mach_avrxmega2}, 300 {"atxmega16e5", AVR_ISA_XMEGA, bfd_mach_avrxmega2}, 301 {"atxmega8e5", AVR_ISA_XMEGA, bfd_mach_avrxmega2}, 302 {"atxmega32x1", AVR_ISA_XMEGA, bfd_mach_avrxmega2}, 303 {"atxmega64a3", AVR_ISA_XMEGA, bfd_mach_avrxmega4}, 304 {"atxmega64a3u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4}, 305 {"atxmega64a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4}, 306 {"atxmega64b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega4}, 307 {"atxmega64b3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4}, 308 {"atxmega64c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4}, 309 {"atxmega64d3", AVR_ISA_XMEGA, bfd_mach_avrxmega4}, 310 {"atxmega64d4", AVR_ISA_XMEGA, bfd_mach_avrxmega4}, 311 {"atxmega64a1", AVR_ISA_XMEGA, bfd_mach_avrxmega5}, 312 {"atxmega64a1u",AVR_ISA_XMEGAU, bfd_mach_avrxmega5}, 313 {"atxmega128a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 314 {"atxmega128a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6}, 315 {"atxmega128b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega6}, 316 {"atxmega128b3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6}, 317 {"atxmega128c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6}, 318 {"atxmega128d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 319 {"atxmega128d4", AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 320 {"atxmega192a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 321 {"atxmega192a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6}, 322 {"atxmega192c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega6}, 323 {"atxmega192d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 324 {"atxmega256a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 325 {"atxmega256a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6}, 326 {"atxmega256a3b",AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 327 {"atxmega256a3bu",AVR_ISA_XMEGAU, bfd_mach_avrxmega6}, 328 {"atxmega256c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6}, 329 {"atxmega256d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 330 {"atxmega384c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6}, 331 {"atxmega384d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6}, 332 {"atxmega128a1", AVR_ISA_XMEGA, bfd_mach_avrxmega7}, 333 {"atxmega128a1u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7}, 334 {"atxmega128a4u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7}, 335 {"attiny4", AVR_ISA_AVRTINY, bfd_mach_avrtiny}, 336 {"attiny5", AVR_ISA_AVRTINY, bfd_mach_avrtiny}, 337 {"attiny9", AVR_ISA_AVRTINY, bfd_mach_avrtiny}, 338 {"attiny10", AVR_ISA_AVRTINY, bfd_mach_avrtiny}, 339 {"attiny20", AVR_ISA_AVRTINY, bfd_mach_avrtiny}, 340 {"attiny40", AVR_ISA_AVRTINY, bfd_mach_avrtiny}, 341 {NULL, 0, 0} 342 }; 343 344 345 /* Current MCU type. */ 346 static struct mcu_type_s default_mcu = {"avr2", AVR_ISA_AVR2, bfd_mach_avr2}; 347 static struct mcu_type_s specified_mcu; 348 static struct mcu_type_s * avr_mcu = & default_mcu; 349 350 /* AVR target-specific switches. */ 351 struct avr_opt_s 352 { 353 int all_opcodes; /* -mall-opcodes: accept all known AVR opcodes. */ 354 int no_skip_bug; /* -mno-skip-bug: no warnings for skipping 2-word insns. */ 355 int no_wrap; /* -mno-wrap: reject rjmp/rcall with 8K wrap-around. */ 356 int no_link_relax; /* -mno-link-relax / -mlink-relax: generate (or not) 357 relocations for linker relaxation. */ 358 }; 359 360 static struct avr_opt_s avr_opt = { 0, 0, 0, 0 }; 361 362 const char EXP_CHARS[] = "eE"; 363 const char FLT_CHARS[] = "dD"; 364 365 static void avr_set_arch (int); 366 367 /* The target specific pseudo-ops which we support. */ 368 const pseudo_typeS md_pseudo_table[] = 369 { 370 {"arch", avr_set_arch, 0}, 371 { NULL, NULL, 0} 372 }; 373 374 #define LDI_IMMEDIATE(x) (((x) & 0xf) | (((x) << 4) & 0xf00)) 375 376 #define EXP_MOD_NAME(i) exp_mod[i].name 377 #define EXP_MOD_RELOC(i) exp_mod[i].reloc 378 #define EXP_MOD_NEG_RELOC(i) exp_mod[i].neg_reloc 379 #define HAVE_PM_P(i) exp_mod[i].have_pm 380 381 struct exp_mod_s 382 { 383 const char * name; 384 bfd_reloc_code_real_type reloc; 385 bfd_reloc_code_real_type neg_reloc; 386 int have_pm; 387 }; 388 389 static struct exp_mod_s exp_mod[] = 390 { 391 {"hh8", BFD_RELOC_AVR_HH8_LDI, BFD_RELOC_AVR_HH8_LDI_NEG, 1}, 392 {"pm_hh8", BFD_RELOC_AVR_HH8_LDI_PM, BFD_RELOC_AVR_HH8_LDI_PM_NEG, 0}, 393 {"hi8", BFD_RELOC_AVR_HI8_LDI, BFD_RELOC_AVR_HI8_LDI_NEG, 1}, 394 {"pm_hi8", BFD_RELOC_AVR_HI8_LDI_PM, BFD_RELOC_AVR_HI8_LDI_PM_NEG, 0}, 395 {"lo8", BFD_RELOC_AVR_LO8_LDI, BFD_RELOC_AVR_LO8_LDI_NEG, 1}, 396 {"pm_lo8", BFD_RELOC_AVR_LO8_LDI_PM, BFD_RELOC_AVR_LO8_LDI_PM_NEG, 0}, 397 {"hlo8", BFD_RELOC_AVR_HH8_LDI, BFD_RELOC_AVR_HH8_LDI_NEG, 0}, 398 {"hhi8", BFD_RELOC_AVR_MS8_LDI, BFD_RELOC_AVR_MS8_LDI_NEG, 0}, 399 }; 400 401 /* A union used to store indicies into the exp_mod[] array 402 in a hash table which expects void * data types. */ 403 typedef union 404 { 405 void * ptr; 406 int index; 407 } mod_index; 408 409 /* Opcode hash table. */ 410 static struct hash_control *avr_hash; 411 412 /* Reloc modifiers hash control (hh8,hi8,lo8,pm_xx). */ 413 static struct hash_control *avr_mod_hash; 414 415 #define OPTION_MMCU 'm' 416 enum options 417 { 418 OPTION_ALL_OPCODES = OPTION_MD_BASE + 1, 419 OPTION_NO_SKIP_BUG, 420 OPTION_NO_WRAP, 421 OPTION_ISA_RMW, 422 OPTION_LINK_RELAX, 423 OPTION_NO_LINK_RELAX 424 }; 425 426 struct option md_longopts[] = 427 { 428 { "mmcu", required_argument, NULL, OPTION_MMCU }, 429 { "mall-opcodes", no_argument, NULL, OPTION_ALL_OPCODES }, 430 { "mno-skip-bug", no_argument, NULL, OPTION_NO_SKIP_BUG }, 431 { "mno-wrap", no_argument, NULL, OPTION_NO_WRAP }, 432 { "mrmw", no_argument, NULL, OPTION_ISA_RMW }, 433 { "mlink-relax", no_argument, NULL, OPTION_LINK_RELAX }, 434 { "mno-link-relax", no_argument, NULL, OPTION_NO_LINK_RELAX }, 435 { NULL, no_argument, NULL, 0 } 436 }; 437 438 size_t md_longopts_size = sizeof (md_longopts); 439 440 /* Display nicely formatted list of known MCU names. */ 441 442 static void 443 show_mcu_list (FILE *stream) 444 { 445 int i, x; 446 447 fprintf (stream, _("Known MCU names:")); 448 x = 1000; 449 450 for (i = 0; mcu_types[i].name; i++) 451 { 452 int len = strlen (mcu_types[i].name); 453 454 x += len + 1; 455 456 if (x < 75) 457 fprintf (stream, " %s", mcu_types[i].name); 458 else 459 { 460 fprintf (stream, "\n %s", mcu_types[i].name); 461 x = len + 2; 462 } 463 } 464 465 fprintf (stream, "\n"); 466 } 467 468 static inline char * 469 skip_space (char *s) 470 { 471 while (*s == ' ' || *s == '\t') 472 ++s; 473 return s; 474 } 475 476 /* Extract one word from FROM and copy it to TO. */ 477 478 static char * 479 extract_word (char *from, char *to, int limit) 480 { 481 char *op_end; 482 int size = 0; 483 484 /* Drop leading whitespace. */ 485 from = skip_space (from); 486 *to = 0; 487 488 /* Find the op code end. */ 489 for (op_end = from; *op_end != 0 && is_part_of_name (*op_end);) 490 { 491 to[size++] = *op_end++; 492 if (size + 1 >= limit) 493 break; 494 } 495 496 to[size] = 0; 497 return op_end; 498 } 499 500 int 501 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED, 502 asection *seg ATTRIBUTE_UNUSED) 503 { 504 abort (); 505 return 0; 506 } 507 508 void 509 md_show_usage (FILE *stream) 510 { 511 fprintf (stream, 512 _("AVR Assembler options:\n" 513 " -mmcu=[avr-name] select microcontroller variant\n" 514 " [avr-name] can be:\n" 515 " avr1 - classic AVR core without data RAM\n" 516 " avr2 - classic AVR core with up to 8K program memory\n" 517 " avr25 - classic AVR core with up to 8K program memory\n" 518 " plus the MOVW instruction\n" 519 " avr3 - classic AVR core with up to 64K program memory\n" 520 " avr31 - classic AVR core with up to 128K program memory\n" 521 " avr35 - classic AVR core with up to 64K program memory\n" 522 " plus the MOVW instruction\n" 523 " avr4 - enhanced AVR core with up to 8K program memory\n" 524 " avr5 - enhanced AVR core with up to 64K program memory\n" 525 " avr51 - enhanced AVR core with up to 128K program memory\n" 526 " avr6 - enhanced AVR core with up to 256K program memory\n" 527 " avrxmega2 - XMEGA, > 8K, < 64K FLASH, < 64K RAM\n" 528 " avrxmega3 - XMEGA, > 8K, <= 64K FLASH, > 64K RAM\n" 529 " avrxmega4 - XMEGA, > 64K, <= 128K FLASH, <= 64K RAM\n" 530 " avrxmega5 - XMEGA, > 64K, <= 128K FLASH, > 64K RAM\n" 531 " avrxmega6 - XMEGA, > 128K, <= 256K FLASH, <= 64K RAM\n" 532 " avrxmega7 - XMEGA, > 128K, <= 256K FLASH, > 64K RAM\n" 533 " avrtiny - AVR Tiny core with 16 gp registers\n")); 534 fprintf (stream, 535 _(" -mall-opcodes accept all AVR opcodes, even if not supported by MCU\n" 536 " -mno-skip-bug disable warnings for skipping two-word instructions\n" 537 " (default for avr4, avr5)\n" 538 " -mno-wrap reject rjmp/rcall instructions with 8K wrap-around\n" 539 " (default for avr3, avr5)\n" 540 " -mrmw accept Read-Modify-Write instructions\n" 541 " -mlink-relax generate relocations for linker relaxation (default)\n" 542 " -mno-link-relax don't generate relocations for linker relaxation.\n" 543 )); 544 show_mcu_list (stream); 545 } 546 547 static void 548 avr_set_arch (int dummy ATTRIBUTE_UNUSED) 549 { 550 char str[20]; 551 552 input_line_pointer = extract_word (input_line_pointer, str, 20); 553 md_parse_option (OPTION_MMCU, str); 554 bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach); 555 } 556 557 int 558 md_parse_option (int c, const char *arg) 559 { 560 switch (c) 561 { 562 case OPTION_MMCU: 563 { 564 int i; 565 566 for (i = 0; mcu_types[i].name; ++i) 567 if (strcasecmp (mcu_types[i].name, arg) == 0) 568 break; 569 570 if (!mcu_types[i].name) 571 { 572 show_mcu_list (stderr); 573 as_fatal (_("unknown MCU: %s\n"), arg); 574 } 575 576 /* It is OK to redefine mcu type within the same avr[1-5] bfd machine 577 type - this for allows passing -mmcu=... via gcc ASM_SPEC as well 578 as .arch ... in the asm output at the same time. */ 579 if (avr_mcu == &default_mcu || avr_mcu->mach == mcu_types[i].mach) 580 { 581 specified_mcu.name = mcu_types[i].name; 582 specified_mcu.isa |= mcu_types[i].isa; 583 specified_mcu.mach = mcu_types[i].mach; 584 avr_mcu = &specified_mcu; 585 } 586 else 587 as_fatal (_("redefinition of mcu type `%s' to `%s'"), 588 avr_mcu->name, mcu_types[i].name); 589 return 1; 590 } 591 case OPTION_ALL_OPCODES: 592 avr_opt.all_opcodes = 1; 593 return 1; 594 case OPTION_NO_SKIP_BUG: 595 avr_opt.no_skip_bug = 1; 596 return 1; 597 case OPTION_NO_WRAP: 598 avr_opt.no_wrap = 1; 599 return 1; 600 case OPTION_ISA_RMW: 601 specified_mcu.isa |= AVR_ISA_RMW; 602 return 1; 603 case OPTION_LINK_RELAX: 604 avr_opt.no_link_relax = 0; 605 return 1; 606 case OPTION_NO_LINK_RELAX: 607 avr_opt.no_link_relax = 1; 608 return 1; 609 } 610 611 return 0; 612 } 613 614 symbolS * 615 md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 616 { 617 return NULL; 618 } 619 620 const char * 621 md_atof (int type, char *litP, int *sizeP) 622 { 623 return ieee_md_atof (type, litP, sizeP, FALSE); 624 } 625 626 void 627 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, 628 asection *sec ATTRIBUTE_UNUSED, 629 fragS *fragP ATTRIBUTE_UNUSED) 630 { 631 abort (); 632 } 633 634 void 635 md_begin (void) 636 { 637 unsigned int i; 638 struct avr_opcodes_s *opcode; 639 640 avr_hash = hash_new (); 641 642 /* Insert unique names into hash table. This hash table then provides a 643 quick index to the first opcode with a particular name in the opcode 644 table. */ 645 for (opcode = avr_opcodes; opcode->name; opcode++) 646 hash_insert (avr_hash, opcode->name, (char *) opcode); 647 648 avr_mod_hash = hash_new (); 649 650 for (i = 0; i < ARRAY_SIZE (exp_mod); ++i) 651 { 652 mod_index m; 653 654 m.index = i + 10; 655 hash_insert (avr_mod_hash, EXP_MOD_NAME (i), m.ptr); 656 } 657 658 bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach); 659 linkrelax = !avr_opt.no_link_relax; 660 } 661 662 /* Resolve STR as a constant expression and return the result. 663 If result greater than MAX then error. */ 664 665 static unsigned int 666 avr_get_constant (char *str, int max) 667 { 668 expressionS ex; 669 670 str = skip_space (str); 671 input_line_pointer = str; 672 expression (& ex); 673 674 if (ex.X_op != O_constant) 675 as_bad (_("constant value required")); 676 677 if (ex.X_add_number > max || ex.X_add_number < 0) 678 as_bad (_("number must be positive and less than %d"), max + 1); 679 680 return ex.X_add_number; 681 } 682 683 /* Parse for ldd/std offset. */ 684 685 static void 686 avr_offset_expression (expressionS *exp) 687 { 688 char *str = input_line_pointer; 689 char *tmp; 690 char op[8]; 691 692 tmp = str; 693 str = extract_word (str, op, sizeof (op)); 694 695 input_line_pointer = tmp; 696 expression (exp); 697 698 /* Warn about expressions that fail to use lo8 (). */ 699 if (exp->X_op == O_constant) 700 { 701 int x = exp->X_add_number; 702 703 if (x < -255 || x > 255) 704 as_warn (_("constant out of 8-bit range: %d"), x); 705 } 706 } 707 708 /* Parse ordinary expression. */ 709 710 static char * 711 parse_exp (char *s, expressionS *op) 712 { 713 input_line_pointer = s; 714 expression (op); 715 if (op->X_op == O_absent) 716 as_bad (_("missing operand")); 717 return input_line_pointer; 718 } 719 720 /* Parse special expressions (needed for LDI command): 721 xx8 (address) 722 xx8 (-address) 723 pm_xx8 (address) 724 pm_xx8 (-address) 725 where xx is: hh, hi, lo. */ 726 727 static bfd_reloc_code_real_type 728 avr_ldi_expression (expressionS *exp) 729 { 730 char *str = input_line_pointer; 731 char *tmp; 732 char op[8]; 733 int mod; 734 int linker_stubs_should_be_generated = 0; 735 736 tmp = str; 737 738 str = extract_word (str, op, sizeof (op)); 739 740 if (op[0]) 741 { 742 mod_index m; 743 744 m.ptr = hash_find (avr_mod_hash, op); 745 mod = m.index; 746 747 if (mod) 748 { 749 int closes = 0; 750 751 mod -= 10; 752 str = skip_space (str); 753 754 if (*str == '(') 755 { 756 bfd_reloc_code_real_type reloc_to_return; 757 int neg_p = 0; 758 759 ++str; 760 761 if (strncmp ("pm(", str, 3) == 0 762 || strncmp ("gs(",str,3) == 0 763 || strncmp ("-(gs(",str,5) == 0 764 || strncmp ("-(pm(", str, 5) == 0) 765 { 766 if (HAVE_PM_P (mod)) 767 { 768 ++mod; 769 ++closes; 770 } 771 else 772 as_bad (_("illegal expression")); 773 774 if (str[0] == 'g' || str[2] == 'g') 775 linker_stubs_should_be_generated = 1; 776 777 if (*str == '-') 778 { 779 neg_p = 1; 780 ++closes; 781 str += 5; 782 } 783 else 784 str += 3; 785 } 786 787 if (*str == '-' && *(str + 1) == '(') 788 { 789 neg_p ^= 1; 790 ++closes; 791 str += 2; 792 } 793 794 input_line_pointer = str; 795 expression (exp); 796 797 do 798 { 799 if (*input_line_pointer != ')') 800 { 801 as_bad (_("`)' required")); 802 break; 803 } 804 input_line_pointer++; 805 } 806 while (closes--); 807 808 reloc_to_return = 809 neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod); 810 if (linker_stubs_should_be_generated) 811 { 812 switch (reloc_to_return) 813 { 814 case BFD_RELOC_AVR_LO8_LDI_PM: 815 reloc_to_return = BFD_RELOC_AVR_LO8_LDI_GS; 816 break; 817 case BFD_RELOC_AVR_HI8_LDI_PM: 818 reloc_to_return = BFD_RELOC_AVR_HI8_LDI_GS; 819 break; 820 821 default: 822 /* PR 5523: Do not generate a warning here, 823 legitimate code can trigger this case. */ 824 break; 825 } 826 } 827 return reloc_to_return; 828 } 829 } 830 } 831 832 input_line_pointer = tmp; 833 expression (exp); 834 835 /* Warn about expressions that fail to use lo8 (). */ 836 if (exp->X_op == O_constant) 837 { 838 int x = exp->X_add_number; 839 840 if (x < -255 || x > 255) 841 as_warn (_("constant out of 8-bit range: %d"), x); 842 } 843 844 return BFD_RELOC_AVR_LDI; 845 } 846 847 /* Parse one instruction operand. 848 Return operand bitmask. Also fixups can be generated. */ 849 850 static unsigned int 851 avr_operand (struct avr_opcodes_s *opcode, 852 int where, 853 const char *op, 854 char **line) 855 { 856 expressionS op_expr; 857 unsigned int op_mask = 0; 858 char *str = skip_space (*line); 859 860 switch (*op) 861 { 862 /* Any register operand. */ 863 case 'w': 864 case 'd': 865 case 'r': 866 case 'a': 867 case 'v': 868 { 869 char * old_str = str; 870 char *lower; 871 char r_name[20]; 872 873 str = extract_word (str, r_name, sizeof (r_name)); 874 for (lower = r_name; *lower; ++lower) 875 { 876 if (*lower >= 'A' && *lower <= 'Z') 877 *lower += 'a' - 'A'; 878 } 879 880 if (r_name[0] == 'r' && ISDIGIT (r_name[1]) && r_name[2] == 0) 881 /* Single-digit register number, ie r0-r9. */ 882 op_mask = r_name[1] - '0'; 883 else if (r_name[0] == 'r' && ISDIGIT (r_name[1]) 884 && ISDIGIT (r_name[2]) && r_name[3] == 0) 885 /* Double-digit register number, ie r10 - r32. */ 886 op_mask = (r_name[1] - '0') * 10 + r_name[2] - '0'; 887 else if (r_name[0] >= 'x' && r_name[0] <= 'z' 888 && (r_name[1] == 'l' || r_name[1] == 'h') && r_name[2] == 0) 889 /* Registers r26-r31 referred to by name, ie xl, xh, yl, yh, zl, zh. */ 890 op_mask = (r_name[0] - 'x') * 2 + (r_name[1] == 'h') + 26; 891 else if ((*op == 'v' || *op == 'w') 892 && r_name[0] >= 'x' && r_name[0] <= 'z' && r_name[1] == 0) 893 /* For the movw and addiw instructions, refer to registers x, y and z by name. */ 894 op_mask = (r_name[0] - 'x') * 2 + 26; 895 else 896 { 897 /* Numeric or symbolic constant register number. */ 898 op_mask = avr_get_constant (old_str, 31); 899 str = input_line_pointer; 900 } 901 } 902 903 if (avr_mcu->mach == bfd_mach_avrtiny) 904 { 905 if (op_mask < 16 || op_mask > 31) 906 { 907 as_bad (_("register name or number from 16 to 31 required")); 908 break; 909 } 910 } 911 else if (op_mask > 31) 912 { 913 as_bad (_("register name or number from 0 to 31 required")); 914 break; 915 } 916 917 switch (*op) 918 { 919 case 'a': 920 if (op_mask < 16 || op_mask > 23) 921 as_bad (_("register r16-r23 required")); 922 op_mask -= 16; 923 break; 924 925 case 'd': 926 if (op_mask < 16) 927 as_bad (_("register number above 15 required")); 928 op_mask -= 16; 929 break; 930 931 case 'v': 932 if (op_mask & 1) 933 as_bad (_("even register number required")); 934 op_mask >>= 1; 935 break; 936 937 case 'w': 938 if ((op_mask & 1) || op_mask < 24) 939 as_bad (_("register r24, r26, r28 or r30 required")); 940 op_mask = (op_mask - 24) >> 1; 941 break; 942 } 943 break; 944 945 case 'e': 946 { 947 char c; 948 949 if (*str == '-') 950 { 951 str = skip_space (str + 1); 952 op_mask = 0x1002; 953 } 954 c = TOLOWER (*str); 955 if (c == 'x') 956 op_mask |= 0x100c; 957 else if (c == 'y') 958 op_mask |= 0x8; 959 else if (c != 'z') 960 as_bad (_("pointer register (X, Y or Z) required")); 961 962 str = skip_space (str + 1); 963 if (*str == '+') 964 { 965 ++str; 966 if (op_mask & 2) 967 as_bad (_("cannot both predecrement and postincrement")); 968 op_mask |= 0x1001; 969 } 970 971 /* avr1 can do "ld r,Z" and "st Z,r" but no other pointer 972 registers, no predecrement, no postincrement. */ 973 if (!avr_opt.all_opcodes && (op_mask & 0x100F) 974 && !(avr_mcu->isa & AVR_ISA_SRAM)) 975 as_bad (_("addressing mode not supported")); 976 } 977 break; 978 979 case 'z': 980 if (*str == '-') 981 as_bad (_("can't predecrement")); 982 983 if (! (*str == 'z' || *str == 'Z')) 984 as_bad (_("pointer register Z required")); 985 986 str = skip_space (str + 1); 987 988 if (*str == '+') 989 { 990 ++str; 991 const char *s; 992 for (s = opcode->opcode; *s; ++s) 993 { 994 if (*s == '+') 995 op_mask |= (1 << (15 - (s - opcode->opcode))); 996 } 997 } 998 999 /* attiny26 can do "lpm" and "lpm r,Z" but not "lpm r,Z+". */ 1000 if (!avr_opt.all_opcodes 1001 && (op_mask & 0x0001) 1002 && !(avr_mcu->isa & AVR_ISA_MOVW)) 1003 as_bad (_("postincrement not supported")); 1004 break; 1005 1006 case 'b': 1007 { 1008 char c = TOLOWER (*str++); 1009 1010 if (c == 'y') 1011 op_mask |= 0x8; 1012 else if (c != 'z') 1013 as_bad (_("pointer register (Y or Z) required")); 1014 str = skip_space (str); 1015 if (*str++ == '+') 1016 { 1017 input_line_pointer = str; 1018 avr_offset_expression (& op_expr); 1019 str = input_line_pointer; 1020 fix_new_exp (frag_now, where, 3, 1021 &op_expr, FALSE, BFD_RELOC_AVR_6); 1022 } 1023 } 1024 break; 1025 1026 case 'h': 1027 str = parse_exp (str, &op_expr); 1028 fix_new_exp (frag_now, where, opcode->insn_size * 2, 1029 &op_expr, FALSE, BFD_RELOC_AVR_CALL); 1030 break; 1031 1032 case 'L': 1033 str = parse_exp (str, &op_expr); 1034 fix_new_exp (frag_now, where, opcode->insn_size * 2, 1035 &op_expr, TRUE, BFD_RELOC_AVR_13_PCREL); 1036 break; 1037 1038 case 'l': 1039 str = parse_exp (str, &op_expr); 1040 fix_new_exp (frag_now, where, opcode->insn_size * 2, 1041 &op_expr, TRUE, BFD_RELOC_AVR_7_PCREL); 1042 break; 1043 1044 case 'i': 1045 str = parse_exp (str, &op_expr); 1046 fix_new_exp (frag_now, where + 2, opcode->insn_size * 2, 1047 &op_expr, FALSE, BFD_RELOC_16); 1048 break; 1049 1050 case 'j': 1051 str = parse_exp (str, &op_expr); 1052 fix_new_exp (frag_now, where, opcode->insn_size * 2, 1053 &op_expr, FALSE, BFD_RELOC_AVR_LDS_STS_16); 1054 break; 1055 1056 case 'M': 1057 { 1058 bfd_reloc_code_real_type r_type; 1059 1060 input_line_pointer = str; 1061 r_type = avr_ldi_expression (&op_expr); 1062 str = input_line_pointer; 1063 fix_new_exp (frag_now, where, 3, 1064 &op_expr, FALSE, r_type); 1065 } 1066 break; 1067 1068 case 'n': 1069 { 1070 unsigned int x; 1071 1072 x = ~avr_get_constant (str, 255); 1073 str = input_line_pointer; 1074 op_mask |= (x & 0xf) | ((x << 4) & 0xf00); 1075 } 1076 break; 1077 1078 case 'K': 1079 input_line_pointer = str; 1080 avr_offset_expression (& op_expr); 1081 str = input_line_pointer; 1082 fix_new_exp (frag_now, where, 3, 1083 & op_expr, FALSE, BFD_RELOC_AVR_6_ADIW); 1084 break; 1085 1086 case 'S': 1087 case 's': 1088 { 1089 unsigned int x; 1090 1091 x = avr_get_constant (str, 7); 1092 str = input_line_pointer; 1093 if (*op == 'S') 1094 x <<= 4; 1095 op_mask |= x; 1096 } 1097 break; 1098 1099 case 'P': 1100 str = parse_exp (str, &op_expr); 1101 fix_new_exp (frag_now, where, opcode->insn_size * 2, 1102 &op_expr, FALSE, BFD_RELOC_AVR_PORT6); 1103 break; 1104 1105 case 'p': 1106 str = parse_exp (str, &op_expr); 1107 fix_new_exp (frag_now, where, opcode->insn_size * 2, 1108 &op_expr, FALSE, BFD_RELOC_AVR_PORT5); 1109 break; 1110 1111 case 'E': 1112 { 1113 unsigned int x; 1114 1115 x = avr_get_constant (str, 15); 1116 str = input_line_pointer; 1117 op_mask |= (x << 4); 1118 } 1119 break; 1120 1121 case '?': 1122 break; 1123 1124 default: 1125 as_bad (_("unknown constraint `%c'"), *op); 1126 } 1127 1128 *line = str; 1129 return op_mask; 1130 } 1131 1132 /* Parse instruction operands. 1133 Return binary opcode. */ 1134 1135 static unsigned int 1136 avr_operands (struct avr_opcodes_s *opcode, char **line) 1137 { 1138 const char *op = opcode->constraints; 1139 unsigned int bin = opcode->bin_opcode; 1140 char *frag = frag_more (opcode->insn_size * 2); 1141 char *str = *line; 1142 int where = frag - frag_now->fr_literal; 1143 static unsigned int prev = 0; /* Previous opcode. */ 1144 1145 /* Opcode have operands. */ 1146 if (*op) 1147 { 1148 unsigned int reg1 = 0; 1149 unsigned int reg2 = 0; 1150 int reg1_present = 0; 1151 int reg2_present = 0; 1152 1153 /* Parse first operand. */ 1154 if (REGISTER_P (*op)) 1155 reg1_present = 1; 1156 reg1 = avr_operand (opcode, where, op, &str); 1157 ++op; 1158 1159 /* Parse second operand. */ 1160 if (*op) 1161 { 1162 if (*op == ',') 1163 ++op; 1164 1165 if (*op == '=') 1166 { 1167 reg2 = reg1; 1168 reg2_present = 1; 1169 } 1170 else 1171 { 1172 if (REGISTER_P (*op)) 1173 reg2_present = 1; 1174 1175 str = skip_space (str); 1176 if (*str++ != ',') 1177 as_bad (_("`,' required")); 1178 str = skip_space (str); 1179 1180 reg2 = avr_operand (opcode, where, op, &str); 1181 } 1182 1183 if (reg1_present && reg2_present) 1184 reg2 = (reg2 & 0xf) | ((reg2 << 5) & 0x200); 1185 else if (reg2_present) 1186 reg2 <<= 4; 1187 } 1188 if (reg1_present) 1189 reg1 <<= 4; 1190 bin |= reg1 | reg2; 1191 } 1192 1193 /* Detect undefined combinations (like ld r31,Z+). */ 1194 if (!avr_opt.all_opcodes && AVR_UNDEF_P (bin)) 1195 as_warn (_("undefined combination of operands")); 1196 1197 if (opcode->insn_size == 2) 1198 { 1199 /* Warn if the previous opcode was cpse/sbic/sbis/sbrc/sbrs 1200 (AVR core bug, fixed in the newer devices). */ 1201 if (!(avr_opt.no_skip_bug || 1202 (avr_mcu->isa & (AVR_ISA_MUL | AVR_ISA_MOVW))) 1203 && AVR_SKIP_P (prev)) 1204 as_warn (_("skipping two-word instruction")); 1205 1206 bfd_putl32 ((bfd_vma) bin, frag); 1207 } 1208 else 1209 bfd_putl16 ((bfd_vma) bin, frag); 1210 1211 prev = bin; 1212 *line = str; 1213 return bin; 1214 } 1215 1216 /* GAS will call this function for each section at the end of the assembly, 1217 to permit the CPU backend to adjust the alignment of a section. */ 1218 1219 valueT 1220 md_section_align (asection *seg, valueT addr) 1221 { 1222 int align = bfd_get_section_alignment (stdoutput, seg); 1223 return ((addr + (1 << align) - 1) & (-1UL << align)); 1224 } 1225 1226 /* If you define this macro, it should return the offset between the 1227 address of a PC relative fixup and the position from which the PC 1228 relative adjustment should be made. On many processors, the base 1229 of a PC relative instruction is the next instruction, so this 1230 macro would return the length of an instruction. */ 1231 1232 long 1233 md_pcrel_from_section (fixS *fixp, segT sec) 1234 { 1235 if (fixp->fx_addsy != (symbolS *) NULL 1236 && (!S_IS_DEFINED (fixp->fx_addsy) 1237 || (S_GET_SEGMENT (fixp->fx_addsy) != sec))) 1238 return 0; 1239 1240 return fixp->fx_frag->fr_address + fixp->fx_where; 1241 } 1242 1243 static bfd_boolean 1244 relaxable_section (asection *sec) 1245 { 1246 return ((sec->flags & SEC_DEBUGGING) == 0 1247 && (sec->flags & SEC_CODE) != 0 1248 && (sec->flags & SEC_ALLOC) != 0); 1249 } 1250 1251 /* Does whatever the xtensa port does. */ 1252 int 1253 avr_validate_fix_sub (fixS *fix) 1254 { 1255 segT add_symbol_segment, sub_symbol_segment; 1256 1257 /* The difference of two symbols should be resolved by the assembler when 1258 linkrelax is not set. If the linker may relax the section containing 1259 the symbols, then an Xtensa DIFF relocation must be generated so that 1260 the linker knows to adjust the difference value. */ 1261 if (!linkrelax || fix->fx_addsy == NULL) 1262 return 0; 1263 1264 /* Make sure both symbols are in the same segment, and that segment is 1265 "normal" and relaxable. If the segment is not "normal", then the 1266 fix is not valid. If the segment is not "relaxable", then the fix 1267 should have been handled earlier. */ 1268 add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy); 1269 if (! SEG_NORMAL (add_symbol_segment) || 1270 ! relaxable_section (add_symbol_segment)) 1271 return 0; 1272 1273 sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy); 1274 return (sub_symbol_segment == add_symbol_segment); 1275 } 1276 1277 /* TC_FORCE_RELOCATION hook */ 1278 1279 /* If linkrelax is turned on, and the symbol to relocate 1280 against is in a relaxable segment, don't compute the value - 1281 generate a relocation instead. */ 1282 int 1283 avr_force_relocation (fixS *fix) 1284 { 1285 if (linkrelax && fix->fx_addsy 1286 && relaxable_section (S_GET_SEGMENT (fix->fx_addsy))) 1287 return 1; 1288 1289 return generic_force_reloc (fix); 1290 } 1291 1292 /* GAS will call this for each fixup. It should store the correct 1293 value in the object file. */ 1294 1295 void 1296 md_apply_fix (fixS *fixP, valueT * valP, segT seg) 1297 { 1298 unsigned char *where; 1299 unsigned long insn; 1300 long value = *valP; 1301 1302 if (fixP->fx_addsy == (symbolS *) NULL) 1303 fixP->fx_done = 1; 1304 1305 else if (fixP->fx_pcrel) 1306 { 1307 segT s = S_GET_SEGMENT (fixP->fx_addsy); 1308 1309 if (s == seg || s == absolute_section) 1310 { 1311 value += S_GET_VALUE (fixP->fx_addsy); 1312 fixP->fx_done = 1; 1313 } 1314 } 1315 else if (linkrelax && fixP->fx_subsy) 1316 { 1317 /* For a subtraction relocation expression, generate one 1318 of the DIFF relocs, with the value being the difference. 1319 Note that a sym1 - sym2 expression is adjusted into a 1320 section_start_sym + sym4_offset_from_section_start - sym1 1321 expression. fixP->fx_addsy holds the section start symbol, 1322 fixP->fx_offset holds sym2's offset, and fixP->fx_subsy 1323 holds sym1. Calculate the current difference and write value, 1324 but leave fx_offset as is - during relaxation, 1325 fx_offset - value gives sym1's value. */ 1326 1327 switch (fixP->fx_r_type) 1328 { 1329 case BFD_RELOC_8: 1330 fixP->fx_r_type = BFD_RELOC_AVR_DIFF8; 1331 break; 1332 case BFD_RELOC_16: 1333 fixP->fx_r_type = BFD_RELOC_AVR_DIFF16; 1334 break; 1335 case BFD_RELOC_32: 1336 fixP->fx_r_type = BFD_RELOC_AVR_DIFF32; 1337 break; 1338 default: 1339 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex")); 1340 break; 1341 } 1342 1343 value = S_GET_VALUE (fixP->fx_addsy) + 1344 fixP->fx_offset - S_GET_VALUE (fixP->fx_subsy); 1345 *valP = value; 1346 1347 fixP->fx_subsy = NULL; 1348 } 1349 /* We don't actually support subtracting a symbol. */ 1350 if (fixP->fx_subsy != (symbolS *) NULL) 1351 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex")); 1352 1353 /* For the DIFF relocs, write the value into the object file while still 1354 keeping fx_done FALSE, as both the difference (recorded in the object file) 1355 and the sym offset (part of fixP) are needed at link relax time. */ 1356 where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where; 1357 switch (fixP->fx_r_type) 1358 { 1359 default: 1360 fixP->fx_no_overflow = 1; 1361 break; 1362 case BFD_RELOC_AVR_7_PCREL: 1363 case BFD_RELOC_AVR_13_PCREL: 1364 case BFD_RELOC_32: 1365 case BFD_RELOC_16: 1366 break; 1367 case BFD_RELOC_AVR_DIFF8: 1368 *where = value; 1369 break; 1370 case BFD_RELOC_AVR_DIFF16: 1371 bfd_putl16 ((bfd_vma) value, where); 1372 break; 1373 case BFD_RELOC_AVR_DIFF32: 1374 bfd_putl32 ((bfd_vma) value, where); 1375 break; 1376 case BFD_RELOC_AVR_CALL: 1377 break; 1378 } 1379 1380 if (fixP->fx_done) 1381 { 1382 /* Fetch the instruction, insert the fully resolved operand 1383 value, and stuff the instruction back again. */ 1384 where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where; 1385 insn = bfd_getl16 (where); 1386 1387 switch (fixP->fx_r_type) 1388 { 1389 case BFD_RELOC_AVR_7_PCREL: 1390 if (value & 1) 1391 as_bad_where (fixP->fx_file, fixP->fx_line, 1392 _("odd address operand: %ld"), value); 1393 1394 /* Instruction addresses are always right-shifted by 1. */ 1395 value >>= 1; 1396 --value; /* Correct PC. */ 1397 1398 if (value < -64 || value > 63) 1399 as_bad_where (fixP->fx_file, fixP->fx_line, 1400 _("operand out of range: %ld"), value); 1401 value = (value << 3) & 0x3f8; 1402 bfd_putl16 ((bfd_vma) (value | insn), where); 1403 break; 1404 1405 case BFD_RELOC_AVR_13_PCREL: 1406 if (value & 1) 1407 as_bad_where (fixP->fx_file, fixP->fx_line, 1408 _("odd address operand: %ld"), value); 1409 1410 /* Instruction addresses are always right-shifted by 1. */ 1411 value >>= 1; 1412 --value; /* Correct PC. */ 1413 1414 if (value < -2048 || value > 2047) 1415 { 1416 /* No wrap for devices with >8K of program memory. */ 1417 if ((avr_mcu->isa & AVR_ISA_MEGA) || avr_opt.no_wrap) 1418 as_bad_where (fixP->fx_file, fixP->fx_line, 1419 _("operand out of range: %ld"), value); 1420 } 1421 1422 value &= 0xfff; 1423 bfd_putl16 ((bfd_vma) (value | insn), where); 1424 break; 1425 1426 case BFD_RELOC_32: 1427 bfd_putl32 ((bfd_vma) value, where); 1428 break; 1429 1430 case BFD_RELOC_16: 1431 bfd_putl16 ((bfd_vma) value, where); 1432 break; 1433 1434 case BFD_RELOC_8: 1435 if (value > 255 || value < -128) 1436 as_warn_where (fixP->fx_file, fixP->fx_line, 1437 _("operand out of range: %ld"), value); 1438 *where = value; 1439 break; 1440 1441 case BFD_RELOC_AVR_16_PM: 1442 bfd_putl16 ((bfd_vma) (value >> 1), where); 1443 break; 1444 1445 case BFD_RELOC_AVR_LDI: 1446 if (value > 255) 1447 as_bad_where (fixP->fx_file, fixP->fx_line, 1448 _("operand out of range: %ld"), value); 1449 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where); 1450 break; 1451 1452 case BFD_RELOC_AVR_LDS_STS_16: 1453 if ((value < 0x40) || (value > 0xBF)) 1454 as_warn_where (fixP->fx_file, fixP->fx_line, 1455 _("operand out of range: 0x%lx"), 1456 (unsigned long)value); 1457 insn |= ((value & 0xF) | ((value & 0x30) << 5) | ((value & 0x40) << 2)); 1458 bfd_putl16 ((bfd_vma) insn, where); 1459 break; 1460 1461 case BFD_RELOC_AVR_6: 1462 if ((value > 63) || (value < 0)) 1463 as_bad_where (fixP->fx_file, fixP->fx_line, 1464 _("operand out of range: %ld"), value); 1465 bfd_putl16 ((bfd_vma) insn | ((value & 7) | ((value & (3 << 3)) << 7) 1466 | ((value & (1 << 5)) << 8)), where); 1467 break; 1468 1469 case BFD_RELOC_AVR_6_ADIW: 1470 if ((value > 63) || (value < 0)) 1471 as_bad_where (fixP->fx_file, fixP->fx_line, 1472 _("operand out of range: %ld"), value); 1473 bfd_putl16 ((bfd_vma) insn | (value & 0xf) | ((value & 0x30) << 2), where); 1474 break; 1475 1476 case BFD_RELOC_AVR_LO8_LDI: 1477 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where); 1478 break; 1479 1480 case BFD_RELOC_AVR_HI8_LDI: 1481 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 8), where); 1482 break; 1483 1484 case BFD_RELOC_AVR_MS8_LDI: 1485 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 24), where); 1486 break; 1487 1488 case BFD_RELOC_AVR_HH8_LDI: 1489 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 16), where); 1490 break; 1491 1492 case BFD_RELOC_AVR_LO8_LDI_NEG: 1493 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value), where); 1494 break; 1495 1496 case BFD_RELOC_AVR_HI8_LDI_NEG: 1497 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 8), where); 1498 break; 1499 1500 case BFD_RELOC_AVR_MS8_LDI_NEG: 1501 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 24), where); 1502 break; 1503 1504 case BFD_RELOC_AVR_HH8_LDI_NEG: 1505 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 16), where); 1506 break; 1507 1508 case BFD_RELOC_AVR_LO8_LDI_PM: 1509 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 1), where); 1510 break; 1511 1512 case BFD_RELOC_AVR_HI8_LDI_PM: 1513 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 9), where); 1514 break; 1515 1516 case BFD_RELOC_AVR_HH8_LDI_PM: 1517 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 17), where); 1518 break; 1519 1520 case BFD_RELOC_AVR_LO8_LDI_PM_NEG: 1521 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 1), where); 1522 break; 1523 1524 case BFD_RELOC_AVR_HI8_LDI_PM_NEG: 1525 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 9), where); 1526 break; 1527 1528 case BFD_RELOC_AVR_HH8_LDI_PM_NEG: 1529 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 17), where); 1530 break; 1531 1532 case BFD_RELOC_AVR_CALL: 1533 { 1534 unsigned long x; 1535 1536 x = bfd_getl16 (where); 1537 if (value & 1) 1538 as_bad_where (fixP->fx_file, fixP->fx_line, 1539 _("odd address operand: %ld"), value); 1540 value >>= 1; 1541 x |= ((value & 0x10000) | ((value << 3) & 0x1f00000)) >> 16; 1542 bfd_putl16 ((bfd_vma) x, where); 1543 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2); 1544 } 1545 break; 1546 1547 case BFD_RELOC_AVR_8_LO: 1548 *where = 0xff & value; 1549 break; 1550 1551 case BFD_RELOC_AVR_8_HI: 1552 *where = 0xff & (value >> 8); 1553 break; 1554 1555 case BFD_RELOC_AVR_8_HLO: 1556 *where = 0xff & (value >> 16); 1557 break; 1558 1559 default: 1560 as_fatal (_("line %d: unknown relocation type: 0x%x"), 1561 fixP->fx_line, fixP->fx_r_type); 1562 break; 1563 1564 case BFD_RELOC_AVR_PORT6: 1565 if (value > 63) 1566 as_bad_where (fixP->fx_file, fixP->fx_line, 1567 _("operand out of range: %ld"), value); 1568 bfd_putl16 ((bfd_vma) insn | ((value & 0x30) << 5) | (value & 0x0f), where); 1569 break; 1570 1571 case BFD_RELOC_AVR_PORT5: 1572 if (value > 31) 1573 as_bad_where (fixP->fx_file, fixP->fx_line, 1574 _("operand out of range: %ld"), value); 1575 bfd_putl16 ((bfd_vma) insn | ((value & 0x1f) << 3), where); 1576 break; 1577 } 1578 } 1579 else 1580 { 1581 switch ((int) fixP->fx_r_type) 1582 { 1583 case -BFD_RELOC_AVR_HI8_LDI_NEG: 1584 case -BFD_RELOC_AVR_HI8_LDI: 1585 case -BFD_RELOC_AVR_LO8_LDI_NEG: 1586 case -BFD_RELOC_AVR_LO8_LDI: 1587 as_bad_where (fixP->fx_file, fixP->fx_line, 1588 _("only constant expression allowed")); 1589 fixP->fx_done = 1; 1590 break; 1591 default: 1592 break; 1593 } 1594 } 1595 } 1596 1597 /* GAS will call this to generate a reloc, passing the resulting reloc 1598 to `bfd_install_relocation'. This currently works poorly, as 1599 `bfd_install_relocation' often does the wrong thing, and instances of 1600 `tc_gen_reloc' have been written to work around the problems, which 1601 in turns makes it difficult to fix `bfd_install_relocation'. */ 1602 1603 /* If while processing a fixup, a reloc really needs to be created 1604 then it is done here. */ 1605 1606 arelent * 1607 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, 1608 fixS *fixp) 1609 { 1610 arelent *reloc; 1611 bfd_reloc_code_real_type code = fixp->fx_r_type; 1612 1613 if (fixp->fx_subsy != NULL) 1614 { 1615 as_bad_where (fixp->fx_file, fixp->fx_line, _("expression too complex")); 1616 return NULL; 1617 } 1618 1619 reloc = XNEW (arelent); 1620 1621 reloc->sym_ptr_ptr = XNEW (asymbol *); 1622 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 1623 1624 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 1625 1626 if ((fixp->fx_r_type == BFD_RELOC_32) && (fixp->fx_pcrel)) 1627 { 1628 if (seg->use_rela_p) 1629 fixp->fx_offset -= md_pcrel_from_section (fixp, seg); 1630 else 1631 fixp->fx_offset = reloc->address; 1632 1633 code = BFD_RELOC_32_PCREL; 1634 } 1635 1636 reloc->addend = fixp->fx_offset; 1637 1638 reloc->howto = bfd_reloc_type_lookup (stdoutput, code); 1639 1640 if (reloc->howto == (reloc_howto_type *) NULL) 1641 { 1642 as_bad_where (fixp->fx_file, fixp->fx_line, 1643 _("reloc %d not supported by object file format"), 1644 (int) fixp->fx_r_type); 1645 return NULL; 1646 } 1647 1648 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT 1649 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 1650 reloc->address = fixp->fx_offset; 1651 1652 1653 return reloc; 1654 } 1655 1656 void 1657 md_assemble (char *str) 1658 { 1659 struct avr_opcodes_s *opcode; 1660 char op[11]; 1661 1662 str = skip_space (extract_word (str, op, sizeof (op))); 1663 1664 if (!op[0]) 1665 as_bad (_("can't find opcode ")); 1666 1667 opcode = (struct avr_opcodes_s *) hash_find (avr_hash, op); 1668 1669 if (opcode && !avr_opt.all_opcodes) 1670 { 1671 /* Check if the instruction's ISA bit is ON in the ISA bits of the part 1672 specified by the user. If not look for other instructions 1673 specifications with same mnemonic who's ISA bits matches. 1674 1675 This requires include/opcode/avr.h to have the instructions with 1676 same mnenomic to be specified in sequence. */ 1677 1678 while ((opcode->isa & avr_mcu->isa) != opcode->isa) 1679 { 1680 opcode++; 1681 1682 if (opcode->name && strcmp(op, opcode->name)) 1683 { 1684 as_bad (_("illegal opcode %s for mcu %s"), 1685 opcode->name, avr_mcu->name); 1686 return; 1687 } 1688 } 1689 } 1690 1691 if (opcode == NULL) 1692 { 1693 as_bad (_("unknown opcode `%s'"), op); 1694 return; 1695 } 1696 1697 /* Special case for opcodes with optional operands (lpm, elpm) - 1698 version with operands exists in avr_opcodes[] in the next entry. */ 1699 1700 if (*str && *opcode->constraints == '?') 1701 ++opcode; 1702 1703 dwarf2_emit_insn (0); 1704 1705 /* We used to set input_line_pointer to the result of get_operands, 1706 but that is wrong. Our caller assumes we don't change it. */ 1707 { 1708 char *t = input_line_pointer; 1709 1710 avr_operands (opcode, &str); 1711 if (*skip_space (str)) 1712 as_bad (_("garbage at end of line")); 1713 input_line_pointer = t; 1714 } 1715 } 1716 1717 const exp_mod_data_t exp_mod_data[] = 1718 { 1719 /* Default, must be first. */ 1720 { "", 0, BFD_RELOC_16, "" }, 1721 /* Divides by 2 to get word address. Generate Stub. */ 1722 { "gs", 2, BFD_RELOC_AVR_16_PM, "`gs' " }, 1723 { "pm", 2, BFD_RELOC_AVR_16_PM, "`pm' " }, 1724 /* The following are used together with avr-gcc's __memx address space 1725 in order to initialize a 24-bit pointer variable with a 24-bit address. 1726 For address in flash, hlo8 will contain the flash segment if the 1727 symbol is located in flash. If the symbol is located in RAM; hlo8 1728 will contain 0x80 which matches avr-gcc's notion of how 24-bit RAM/flash 1729 addresses linearize address space. */ 1730 { "lo8", 1, BFD_RELOC_AVR_8_LO, "`lo8' " }, 1731 { "hi8", 1, BFD_RELOC_AVR_8_HI, "`hi8' " }, 1732 { "hlo8", 1, BFD_RELOC_AVR_8_HLO, "`hlo8' " }, 1733 { "hh8", 1, BFD_RELOC_AVR_8_HLO, "`hh8' " }, 1734 }; 1735 1736 /* Parse special CONS expression: pm (expression) or alternatively 1737 gs (expression). These are used for addressing program memory. Moreover, 1738 define lo8 (expression), hi8 (expression) and hlo8 (expression). */ 1739 1740 const exp_mod_data_t * 1741 avr_parse_cons_expression (expressionS *exp, int nbytes) 1742 { 1743 char *tmp; 1744 unsigned int i; 1745 1746 tmp = input_line_pointer = skip_space (input_line_pointer); 1747 1748 /* The first entry of exp_mod_data[] contains an entry if no 1749 expression modifier is present. Skip it. */ 1750 1751 for (i = 0; i < ARRAY_SIZE (exp_mod_data); i++) 1752 { 1753 const exp_mod_data_t *pexp = &exp_mod_data[i]; 1754 int len = strlen (pexp->name); 1755 1756 if (nbytes == pexp->nbytes 1757 && strncasecmp (input_line_pointer, pexp->name, len) == 0) 1758 { 1759 input_line_pointer = skip_space (input_line_pointer + len); 1760 1761 if (*input_line_pointer == '(') 1762 { 1763 input_line_pointer = skip_space (input_line_pointer + 1); 1764 expression (exp); 1765 1766 if (*input_line_pointer == ')') 1767 { 1768 ++input_line_pointer; 1769 return pexp; 1770 } 1771 else 1772 { 1773 as_bad (_("`)' required")); 1774 return &exp_mod_data[0]; 1775 } 1776 } 1777 1778 input_line_pointer = tmp; 1779 1780 break; 1781 } 1782 } 1783 1784 expression (exp); 1785 return &exp_mod_data[0]; 1786 } 1787 1788 void 1789 avr_cons_fix_new (fragS *frag, 1790 int where, 1791 int nbytes, 1792 expressionS *exp, 1793 const exp_mod_data_t *pexp_mod_data) 1794 { 1795 int bad = 0; 1796 1797 switch (pexp_mod_data->reloc) 1798 { 1799 default: 1800 if (nbytes == 1) 1801 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_8); 1802 else if (nbytes == 2) 1803 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_16); 1804 else if (nbytes == 4) 1805 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_32); 1806 else 1807 bad = 1; 1808 break; 1809 1810 case BFD_RELOC_AVR_16_PM: 1811 case BFD_RELOC_AVR_8_LO: 1812 case BFD_RELOC_AVR_8_HI: 1813 case BFD_RELOC_AVR_8_HLO: 1814 if (nbytes == pexp_mod_data->nbytes) 1815 fix_new_exp (frag, where, nbytes, exp, FALSE, pexp_mod_data->reloc); 1816 else 1817 bad = 1; 1818 break; 1819 } 1820 1821 if (bad) 1822 as_bad (_("illegal %srelocation size: %d"), pexp_mod_data->error, nbytes); 1823 } 1824 1825 static bfd_boolean 1826 mcu_has_3_byte_pc (void) 1827 { 1828 int mach = avr_mcu->mach; 1829 1830 return mach == bfd_mach_avr6 1831 || mach == bfd_mach_avrxmega6 1832 || mach == bfd_mach_avrxmega7; 1833 } 1834 1835 void 1836 tc_cfi_frame_initial_instructions (void) 1837 { 1838 /* AVR6 pushes 3 bytes for calls. */ 1839 int return_size = (mcu_has_3_byte_pc () ? 3 : 2); 1840 1841 /* The CFA is the caller's stack location before the call insn. */ 1842 /* Note that the stack pointer is dwarf register number 32. */ 1843 cfi_add_CFA_def_cfa (32, return_size); 1844 1845 /* Note that AVR consistently uses post-decrement, which means that things 1846 do not line up the same way as for targers that use pre-decrement. */ 1847 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, 1-return_size); 1848 } 1849 1850 bfd_boolean 1851 avr_allow_local_subtract (expressionS * left, 1852 expressionS * right, 1853 segT section) 1854 { 1855 /* If we are not in relaxation mode, subtraction is OK. */ 1856 if (!linkrelax) 1857 return TRUE; 1858 1859 /* If the symbols are not in a code section then they are OK. */ 1860 if ((section->flags & SEC_CODE) == 0) 1861 return TRUE; 1862 1863 if (left->X_add_symbol == right->X_add_symbol) 1864 return TRUE; 1865 1866 /* We have to assume that there may be instructions between the 1867 two symbols and that relaxation may increase the distance between 1868 them. */ 1869 return FALSE; 1870 } 1871 1872 void 1873 avr_elf_final_processing (void) 1874 { 1875 if (linkrelax) 1876 elf_elfheader (stdoutput)->e_flags |= EF_AVR_LINKRELAX_PREPARED; 1877 } 1878 1879 /* Write out the header of a .avr.prop section into the area pointed to by 1880 DATA. The RECORD_COUNT will be placed in the header as the number of 1881 records that are to follow. 1882 The area DATA must be big enough the receive the header, which is 1883 AVR_PROPERTY_SECTION_HEADER_SIZE bytes long. */ 1884 1885 static char * 1886 avr_output_property_section_header (char *data, 1887 unsigned int record_count) 1888 { 1889 char *orig_data = data; 1890 1891 md_number_to_chars (data, AVR_PROPERTY_RECORDS_VERSION, 1); 1892 data++; 1893 /* There's space for a single byte flags field, but right now there's 1894 nothing to go in here, so just set the value to zero. */ 1895 md_number_to_chars (data, 0, 1); 1896 data++; 1897 md_number_to_chars (data, record_count, 2); 1898 data+=2; 1899 1900 gas_assert (data - orig_data == AVR_PROPERTY_SECTION_HEADER_SIZE); 1901 1902 return data; 1903 } 1904 1905 /* Return the number of bytes required to store RECORD into the .avr.prop 1906 section. The size returned is the compressed size that corresponds to 1907 how the record will be written out in AVR_OUTPUT_PROPERTY_RECORD. */ 1908 1909 static int 1910 avr_record_size (const struct avr_property_record *record) 1911 { 1912 /* The first 5 bytes are a 4-byte address, followed by a 1-byte type 1913 identifier. */ 1914 int size = 5; 1915 1916 switch (record->type) 1917 { 1918 case RECORD_ORG: 1919 size += 0; /* No extra information. */ 1920 break; 1921 1922 case RECORD_ORG_AND_FILL: 1923 size += 4; /* A 4-byte fill value. */ 1924 break; 1925 1926 case RECORD_ALIGN: 1927 size += 4; /* A 4-byte alignment value. */ 1928 break; 1929 1930 case RECORD_ALIGN_AND_FILL: 1931 size += 8; /* A 4-byte alignment, and 4-byte fill value. */ 1932 break; 1933 1934 default: 1935 as_fatal (_("unknown record type %d (in %s)"), 1936 record->type, __PRETTY_FUNCTION__); 1937 } 1938 1939 return size; 1940 } 1941 1942 /* Write out RECORD. FRAG_BASE points to the start of the data area setup 1943 to hold all of the .avr.prop content, FRAG_PTR points to the next 1944 writable location. The data area must be big enough to hold all of the 1945 records. The size of the data written out for this RECORD must match 1946 the size from AVR_RECORD_SIZE. */ 1947 1948 static char * 1949 avr_output_property_record (char * const frag_base, char *frag_ptr, 1950 const struct avr_property_record *record) 1951 { 1952 fixS *fix; 1953 int where; 1954 char *init_frag_ptr = frag_ptr; 1955 1956 where = frag_ptr - frag_base; 1957 fix = fix_new (frag_now, where, 4, 1958 section_symbol (record->section), 1959 record->offset, FALSE, BFD_RELOC_32); 1960 fix->fx_file = "<internal>"; 1961 fix->fx_line = 0; 1962 frag_ptr += 4; 1963 1964 md_number_to_chars (frag_ptr, (bfd_byte) record->type, 1); 1965 frag_ptr += 1; 1966 1967 /* Write out the rest of the data. */ 1968 switch (record->type) 1969 { 1970 case RECORD_ORG: 1971 break; 1972 1973 case RECORD_ORG_AND_FILL: 1974 md_number_to_chars (frag_ptr, record->data.org.fill, 4); 1975 frag_ptr += 4; 1976 break; 1977 1978 case RECORD_ALIGN: 1979 md_number_to_chars (frag_ptr, record->data.align.bytes, 4); 1980 frag_ptr += 4; 1981 break; 1982 1983 case RECORD_ALIGN_AND_FILL: 1984 md_number_to_chars (frag_ptr, record->data.align.bytes, 4); 1985 md_number_to_chars (frag_ptr + 4, record->data.align.fill, 4); 1986 frag_ptr += 8; 1987 break; 1988 1989 default: 1990 as_fatal (_("unknown record type %d (in %s)"), 1991 record->type, __PRETTY_FUNCTION__); 1992 } 1993 1994 gas_assert (frag_ptr - init_frag_ptr == avr_record_size (record)); 1995 1996 return frag_ptr; 1997 } 1998 1999 /* Create the section to hold the AVR property information. Return the 2000 section. */ 2001 2002 static asection * 2003 avr_create_property_section (void) 2004 { 2005 asection *sec; 2006 flagword flags = (SEC_RELOC | SEC_HAS_CONTENTS | SEC_READONLY); 2007 const char *section_name = AVR_PROPERTY_RECORD_SECTION_NAME; 2008 2009 sec = bfd_make_section (stdoutput, section_name); 2010 if (sec == NULL) 2011 as_fatal (_("Failed to create property section `%s'\n"), section_name); 2012 bfd_set_section_flags (stdoutput, sec, flags); 2013 sec->output_section = sec; 2014 return sec; 2015 } 2016 2017 /* This hook is called when alignment is performed, and allows us to 2018 capture the details of both .org and .align directives. */ 2019 2020 void 2021 avr_handle_align (fragS *fragP) 2022 { 2023 if (linkrelax) 2024 { 2025 /* Ignore alignment requests at FR_ADDRESS 0, these are at the very 2026 start of a section, and will be handled by the standard section 2027 alignment mechanism. */ 2028 if ((fragP->fr_type == rs_align 2029 || fragP->fr_type == rs_align_code) 2030 && fragP->fr_offset > 0) 2031 { 2032 char *p = fragP->fr_literal + fragP->fr_fix; 2033 2034 fragP->tc_frag_data.is_align = TRUE; 2035 fragP->tc_frag_data.alignment = fragP->fr_offset; 2036 fragP->tc_frag_data.fill = *p; 2037 fragP->tc_frag_data.has_fill = (fragP->tc_frag_data.fill != 0); 2038 } 2039 2040 if (fragP->fr_type == rs_org && fragP->fr_offset > 0) 2041 { 2042 char *p = fragP->fr_literal + fragP->fr_fix; 2043 2044 fragP->tc_frag_data.is_org = TRUE; 2045 fragP->tc_frag_data.fill = *p; 2046 fragP->tc_frag_data.has_fill = (fragP->tc_frag_data.fill != 0); 2047 } 2048 } 2049 } 2050 2051 /* Return TRUE if this section is not one for which we need to record 2052 information in the avr property section. */ 2053 2054 static bfd_boolean 2055 exclude_section_from_property_tables (segT sec) 2056 { 2057 /* Only generate property information for sections on which linker 2058 relaxation could be performed. */ 2059 return !relaxable_section (sec); 2060 } 2061 2062 /* Create a property record for fragment FRAGP from section SEC and place 2063 it into an AVR_PROPERTY_RECORD_LINK structure, which can then formed 2064 into a linked list by the caller. */ 2065 2066 static struct avr_property_record_link * 2067 create_record_for_frag (segT sec, fragS *fragP) 2068 { 2069 struct avr_property_record_link *prop_rec_link; 2070 2071 prop_rec_link = XCNEW (struct avr_property_record_link); 2072 gas_assert (fragP->fr_next != NULL); 2073 2074 if (fragP->tc_frag_data.is_org) 2075 { 2076 prop_rec_link->record.offset = fragP->fr_next->fr_address; 2077 prop_rec_link->record.section = sec; 2078 2079 if (fragP->tc_frag_data.has_fill) 2080 { 2081 prop_rec_link->record.data.org.fill = fragP->tc_frag_data.fill; 2082 prop_rec_link->record.type = RECORD_ORG_AND_FILL; 2083 } 2084 else 2085 prop_rec_link->record.type = RECORD_ORG; 2086 } 2087 else 2088 { 2089 prop_rec_link->record.offset = fragP->fr_next->fr_address; 2090 prop_rec_link->record.section = sec; 2091 2092 gas_assert (fragP->tc_frag_data.is_align); 2093 if (fragP->tc_frag_data.has_fill) 2094 { 2095 prop_rec_link->record.data.align.fill = fragP->tc_frag_data.fill; 2096 prop_rec_link->record.type = RECORD_ALIGN_AND_FILL; 2097 } 2098 else 2099 prop_rec_link->record.type = RECORD_ALIGN; 2100 prop_rec_link->record.data.align.bytes = fragP->tc_frag_data.alignment; 2101 } 2102 2103 return prop_rec_link; 2104 } 2105 2106 /* Build a list of AVR_PROPERTY_RECORD_LINK structures for section SEC, and 2107 merged them onto the list pointed to by NEXT_PTR. Return a pointer to 2108 the last list item created. */ 2109 2110 static struct avr_property_record_link ** 2111 append_records_for_section (segT sec, 2112 struct avr_property_record_link **next_ptr) 2113 { 2114 segment_info_type *seginfo = seg_info (sec); 2115 fragS *fragP; 2116 2117 if (seginfo && seginfo->frchainP) 2118 { 2119 for (fragP = seginfo->frchainP->frch_root; 2120 fragP; 2121 fragP = fragP->fr_next) 2122 { 2123 if (fragP->tc_frag_data.is_align 2124 || fragP->tc_frag_data.is_org) 2125 { 2126 /* Create a single new entry. */ 2127 struct avr_property_record_link *new_link 2128 = create_record_for_frag (sec, fragP); 2129 2130 *next_ptr = new_link; 2131 next_ptr = &new_link->next; 2132 } 2133 } 2134 } 2135 2136 return next_ptr; 2137 } 2138 2139 /* Create the AVR property section and fill it with records of .org and 2140 .align directives that were used. The section is only created if it 2141 will actually have any content. */ 2142 2143 static void 2144 avr_create_and_fill_property_section (void) 2145 { 2146 segT *seclist; 2147 asection *prop_sec; 2148 struct avr_property_record_link *r_list, **next_ptr; 2149 char *frag_ptr, *frag_base; 2150 bfd_size_type sec_size; 2151 struct avr_property_record_link *rec; 2152 unsigned int record_count; 2153 2154 /* First walk over all sections. For sections on which linker 2155 relaxation could be applied, extend the record list. The record list 2156 holds information that the linker will need to know. */ 2157 2158 prop_sec = NULL; 2159 r_list = NULL; 2160 next_ptr = &r_list; 2161 for (seclist = &stdoutput->sections; 2162 seclist && *seclist; 2163 seclist = &(*seclist)->next) 2164 { 2165 segT sec = *seclist; 2166 2167 if (exclude_section_from_property_tables (sec)) 2168 continue; 2169 2170 next_ptr = append_records_for_section (sec, next_ptr); 2171 } 2172 2173 /* Create property section and ensure the size is correct. We've already 2174 passed the point where gas could size this for us. */ 2175 sec_size = AVR_PROPERTY_SECTION_HEADER_SIZE; 2176 record_count = 0; 2177 for (rec = r_list; rec != NULL; rec = rec->next) 2178 { 2179 record_count++; 2180 sec_size += avr_record_size (&rec->record); 2181 } 2182 2183 if (record_count == 0) 2184 return; 2185 2186 prop_sec = avr_create_property_section (); 2187 bfd_set_section_size (stdoutput, prop_sec, sec_size); 2188 2189 subseg_set (prop_sec, 0); 2190 frag_base = frag_more (sec_size); 2191 2192 frag_ptr = 2193 avr_output_property_section_header (frag_base, record_count); 2194 2195 for (rec = r_list; rec != NULL; rec = rec->next) 2196 frag_ptr = avr_output_property_record (frag_base, frag_ptr, &rec->record); 2197 2198 frag_wane (frag_now); 2199 frag_new (0); 2200 frag_wane (frag_now); 2201 } 2202 2203 /* We're using this hook to build up the AVR property section. It's called 2204 late in the assembly process which suits our needs. */ 2205 void 2206 avr_post_relax_hook (void) 2207 { 2208 avr_create_and_fill_property_section (); 2209 } 2210