@@ -60,6 +60,18 @@ def FeatureSmallStack
6060 "The device has an 8-bit "
6161 "stack pointer">;
6262
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+
6375// The device supports the 16-bit GPR pair MOVW instruction.
6476def FeatureMOVW : SubtargetFeature<"movw", "HasMOVW", "true",
6577 "The device supports the 16-bit MOVW "
@@ -239,7 +251,7 @@ class Device<string Name, Family Fam, ELFArch Arch,
239251// in AVR binutils. We do not replicate this.
240252def : Device<"avr1", FamilyAVR1, ELFArchAVR1>;
241253def : Device<"avr2", FamilyAVR2, ELFArchAVR2>;
242- def : Device<"avr25", FamilyAVR25, ELFArchAVR25>;
254+ def : Device<"avr25", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
243255def : Device<"avr3", FamilyAVR3, ELFArchAVR3>;
244256def : Device<"avr31", FamilyAVR31, ELFArchAVR31>;
245257def : Device<"avr35", FamilyAVR35, ELFArchAVR35>;
@@ -274,11 +286,11 @@ def : Device<"at86rf401", FamilyAVR2, ELFArchAVR25, [FeatureMOVW, FeatureLPMX]>;
274286def : Device<"at90s4414", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
275287def : Device<"at90s4433", FamilyAVR2, ELFArchAVR2, [FeatureSmallStack]>;
276288def : 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] >;
282294def : Device<"attiny13", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
283295def : Device<"attiny13a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
284296def : Device<"attiny2313", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
@@ -288,24 +300,24 @@ def : Device<"attiny24a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
288300def : Device<"attiny4313", FamilyAVR25, ELFArchAVR25>;
289301def : Device<"attiny44", FamilyAVR25, ELFArchAVR25>;
290302def : 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] >;
293305def : Device<"attiny25", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
294306def : Device<"attiny45", FamilyAVR25, ELFArchAVR25>;
295- def : Device<"attiny85", FamilyAVR25, ELFArchAVR25>;
307+ def : Device<"attiny85", FamilyAVR25, ELFArchAVR25, [FeatureWrappingRjmp] >;
296308def : Device<"attiny261", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
297309def : Device<"attiny261a", FamilyAVR25, ELFArchAVR25, [FeatureSmallStack]>;
298310def : Device<"attiny441", FamilyAVR25, ELFArchAVR25>;
299311def : Device<"attiny461", FamilyAVR25, ELFArchAVR25>;
300312def : 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] >;
305317def : Device<"attiny43u", FamilyAVR25, ELFArchAVR25>;
306318def : 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] >;
309321def : Device<"at43usb355", FamilyAVR3, ELFArchAVR3>;
310322def : Device<"at76c711", FamilyAVR3, ELFArchAVR3>;
311323def : Device<"atmega103", FamilyAVR31, ELFArchAVR31>;
@@ -321,11 +333,11 @@ def : Device<"atmega16u2", FamilyAVR35, ELFArchAVR35>;
321333def : Device<"atmega32u2", FamilyAVR35, ELFArchAVR35>;
322334def : Device<"attiny1634", FamilyAVR35, ELFArchAVR35>;
323335def : Device<"atmega8", FamilyAVR2, ELFArchAVR4,
324- [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
336+ [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM, FeatureWrappingRjmp ]>;
325337def : Device<"ata6289", FamilyAVR4, ELFArchAVR4>;
326338def : 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] >;
329341def : Device<"ata6286", FamilyAVR4, ELFArchAVR4>;
330342def : Device<"ata6612c", FamilyAVR4, ELFArchAVR4>;
331343def : Device<"atmega48", FamilyAVR4, ELFArchAVR4>;
@@ -339,9 +351,9 @@ def : Device<"atmega88p", FamilyAVR4, ELFArchAVR4>;
339351def : Device<"atmega88pa", FamilyAVR4, ELFArchAVR4>;
340352def : Device<"atmega88pb", FamilyAVR4, ELFArchAVR4>;
341353def : Device<"atmega8515", FamilyAVR2, ELFArchAVR4,
342- [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
354+ [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM, FeatureWrappingRjmp ]>;
343355def : Device<"atmega8535", FamilyAVR2, ELFArchAVR4,
344- [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM]>;
356+ [FeatureMultiplication, FeatureMOVW, FeatureLPMX, FeatureSPM, FeatureWrappingRjmp ]>;
345357def : Device<"atmega8hva", FamilyAVR4, ELFArchAVR4>;
346358def : Device<"at90pwm1", FamilyAVR4, ELFArchAVR4>;
347359def : Device<"at90pwm2", FamilyAVR4, ELFArchAVR4>;
0 commit comments