[PATCH] D77221: [AVR] Rework MCU family detection to support more AVR MCUs

Dylan McKay via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat May 16 21:44:09 PDT 2020


dylanmckay added a comment.

@aykevl

> A thought: should the AVR family be included in the target triple? Like avr5-unknown-unknown (similar to armv6m-none-eabi, armv7m-none-eabi, etc).
>  The different variations do sometimes change the architecture in incompatible ways, such as with the call instruction which pushes a return address of two or three bytes depending on the architecture variant (and thus makes it impossible to pass parameters on the stack reliably).

I've thought about this a few years ago, I suspect it is not possible. It seems like we really do need to compile a sysroot/stdlib/runtime libraries for each and every distinct MCU.

https://github.com/rust-lang/rust/issues/44036#issuecomment-324330757

>> Does each device have a subtly different ISA?
> 
> **tl;dr** Sometimes, yes
> 
> In general, all devices can be _more or less_ grouped into families.
> 
> For example, `avr1`, `avr2`, `avr25`, ... `avr5`, `avr51`, are all family names. These families each define an subset of the full AVR ISA.
> 
> You can find the AVR backend's definition of these families in AVRDevices.td <https://github.com/llvm-mirror/llvm/blob/master/lib/Target/AVR/AVRDevices.td#L153>. You can see that in general, the families build up on top of each other in terms of supported instructions/features.
> 
> The problem is that not every realised ISA can be cleanly separated into a family.
> 
> For example, the ATtiny26 <https://github.com/llvm-mirror/llvm/blob/master/lib/Target/AVR/AVRDevices.td#L255> is a part of the `avr2` family, but it also happens to support the "LPMX" set of instructions
> 
> Another example is the ATMega8515 <https://github.com/llvm-mirror/llvm/blob/master/lib/Target/AVR/AVRDevices.td#L315>, which _almost_ implements all of `avr4`, but not quite all, and so the linked definition bases the device off `avr2` and adds the extra features explicitly.
> 
>> Does the backend need to know about peripherals?
> 
> No
> 
>> Or why do you want the LLVM backend to know when it's targeting, for example, "atmega328"?
> 
> Solely for deciding what subset of the ISA is supported.All device-specific information required (or used) by the backend can be found inside AVRDevices.td <https://github.com/llvm-mirror/llvm/blob/master/lib/Target/AVR/AVRDevices.td>.

There is a bunch of other related discussion on https://github.com/rust-lang/rust/issues/44036 too.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D77221/new/

https://reviews.llvm.org/D77221





More information about the cfe-commits mailing list