@@ -60,6 +60,18 @@ def FeatureSmallStack
60
60
"The device has an 8-bit "
61
61
"stack pointer">;
62
62
63
+ // The device potentially requires emitting rjmp that wraps across the flash
64
+ // boundary.
65
+ //
66
+ // We enable this for devices that have exactly 8 kB of flash memory and don't
67
+ // support the `jmp` instruction - with this feature enabled, we try to convert
68
+ // out-of-bounds relative jumps into in-bounds by wrapping the offset, e.g.
69
+ // `rjmp +5000` becomes `rjmp -3192`.
70
+ def FeatureWrappingRjmp
71
+ : SubtargetFeature<"wrappingrjmp", "HasWrappingRjmp", "true",
72
+ "The device potentially requires emitting rjmp that "
73
+ "wraps across the flash boundary">;
74
+
63
75
// The device supports the 16-bit GPR pair MOVW instruction.
64
76
def FeatureMOVW : SubtargetFeature<"movw", "HasMOVW", "true",
65
77
"The device supports the 16-bit MOVW "
@@ -239,7 +251,7 @@ class Device<string Name, Family Fam, ELFArch Arch,
239
251
// in AVR binutils. We do not replicate this.
240
252
def : Device<"avr1", FamilyAVR1, ELFArchAVR1>;
241
253
def : Device<"avr2", FamilyAVR2, ELFArchAVR2>;
242
- def : Device<"avr25", FamilyAVR25, ELFArchAVR25>;
254
+ def : Device<"avr25", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
243
255
def : Device<"avr3", FamilyAVR3, ELFArchAVR3>;
244
256
def : Device<"avr31", FamilyAVR31, ELFArchAVR31>;
245
257
def : Device<"avr35", FamilyAVR35, ELFArchAVR35>;
@@ -274,11 +286,11 @@ def : Device<"at86rf401", FamilyAVR2, ELFArchAVR25, [FeatureMOVW, FeatureLPMX]>;
274
286
def : Device<"at90s4414", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
275
287
def : Device<"at90s4433", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
276
288
def : Device<"at90s4434", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
277
- def : Device<"at90s8515", FamilyAVR2, ELFArchAVR2>;
278
- def : Device<"at90c8534", FamilyAVR2, ELFArchAVR2>;
279
- def : Device<"at90s8535", FamilyAVR2, ELFArchAVR2>;
280
- def : Device<"ata5272", FamilyAVR25, ELFArchAVR25>;
281
- def : Device<"ata6616c", FamilyAVR25, ELFArchAVR25>;
289
+ def : Device<"at90s8515", FamilyAVR2, ELFArchAVR2, [FeatureWrappingRjmp] >;
290
+ def : Device<"at90c8534", FamilyAVR2, ELFArchAVR2, [FeatureWrappingRjmp] >;
291
+ def : Device<"at90s8535", FamilyAVR2, ELFArchAVR2, [FeatureWrappingRjmp] >;
292
+ def : Device<"ata5272", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
293
+ def : Device<"ata6616c", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
282
294
def : Device<"attiny13", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
283
295
def : Device<"attiny13a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
284
296
def : Device<"attiny2313", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
@@ -288,24 +300,24 @@ def : Device<"attiny24a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
288
300
def : Device<"attiny4313", FamilyAVR25, ELFArchAVR25>;
289
301
def : Device<"attiny44", FamilyAVR25, ELFArchAVR25>;
290
302
def : Device<"attiny44a", FamilyAVR25, ELFArchAVR25>;
291
- def : Device<"attiny84", FamilyAVR25, ELFArchAVR25>;
292
- def : Device<"attiny84a", FamilyAVR25, ELFArchAVR25>;
303
+ def : Device<"attiny84", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
304
+ def : Device<"attiny84a", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
293
305
def : Device<"attiny25", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
294
306
def : Device<"attiny45", FamilyAVR25, ELFArchAVR25>;
295
- def : Device<"attiny85", FamilyAVR25, ELFArchAVR25>;
307
+ def : Device<"attiny85", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
296
308
def : Device<"attiny261", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
297
309
def : Device<"attiny261a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
298
310
def : Device<"attiny441", FamilyAVR25, ELFArchAVR25>;
299
311
def : Device<"attiny461", FamilyAVR25, ELFArchAVR25>;
300
312
def : Device<"attiny461a", FamilyAVR25, ELFArchAVR25>;
301
- def : Device<"attiny841", FamilyAVR25, ELFArchAVR25>;
302
- def : Device<"attiny861", FamilyAVR25, ELFArchAVR25>;
303
- def : Device<"attiny861a", FamilyAVR25, ELFArchAVR25>;
304
- def : Device<"attiny87", FamilyAVR25, ELFArchAVR25>;
313
+ def : Device<"attiny841", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
314
+ def : Device<"attiny861", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
315
+ def : Device<"attiny861a", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
316
+ def : Device<"attiny87", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
305
317
def : Device<"attiny43u", FamilyAVR25, ELFArchAVR25>;
306
318
def : Device<"attiny48", FamilyAVR25, ELFArchAVR25>;
307
- def : Device<"attiny88", FamilyAVR25, ELFArchAVR25>;
308
- def : Device<"attiny828", FamilyAVR25, ELFArchAVR25>;
319
+ def : Device<"attiny88", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
320
+ def : Device<"attiny828", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
309
321
def : Device<"at43usb355", FamilyAVR3, ELFArchAVR3>;
310
322
def : Device<"at76c711", FamilyAVR3, ELFArchAVR3>;
311
323
def : Device<"atmega103", FamilyAVR31, ELFArchAVR31>;
@@ -321,11 +333,11 @@ def : Device<"atmega16u2", FamilyAVR35, ELFArchAVR35>;
321
333
def : Device<"atmega32u2", FamilyAVR35, ELFArchAVR35>;
322
334
def : Device<"attiny1634", FamilyAVR35, ELFArchAVR35>;
323
335
def : Device<"atmega8", FamilyAVR2, ELFArchAVR4,
324
- [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
336
+ [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM, FeatureWrappingRjmp ]>;
325
337
def : Device<"ata6289", FamilyAVR4, ELFArchAVR4>;
326
338
def : Device<"atmega8a", FamilyAVR2, ELFArchAVR4,
327
- [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
328
- def : Device<"ata6285", FamilyAVR4, ELFArchAVR4>;
339
+ [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM, FeatureWrappingRjmp ]>;
340
+ def : Device<"ata6285", FamilyAVR4, ELFArchAVR4, [FeatureWrappingRjmp] >;
329
341
def : Device<"ata6286", FamilyAVR4, ELFArchAVR4>;
330
342
def : Device<"ata6612c", FamilyAVR4, ELFArchAVR4>;
331
343
def : Device<"atmega48", FamilyAVR4, ELFArchAVR4>;
@@ -339,9 +351,9 @@ def : Device<"atmega88p", FamilyAVR4, ELFArchAVR4>;
339
351
def : Device<"atmega88pa", FamilyAVR4, ELFArchAVR4>;
340
352
def : Device<"atmega88pb", FamilyAVR4, ELFArchAVR4>;
341
353
def : Device<"atmega8515", FamilyAVR2, ELFArchAVR4,
342
- [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
354
+ [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM, FeatureWrappingRjmp ]>;
343
355
def : Device<"atmega8535", FamilyAVR2, ELFArchAVR4,
344
- [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
356
+ [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM, FeatureWrappingRjmp ]>;
345
357
def : Device<"atmega8hva", FamilyAVR4, ELFArchAVR4>;
346
358
def : Device<"at90pwm1", FamilyAVR4, ELFArchAVR4>;
347
359
def : Device<"at90pwm2", FamilyAVR4, ELFArchAVR4>;
0 commit comments