[llvm-dev] How to add new AVR targets?

Wilhelm Meier via llvm-dev llvm-dev at lists.llvm.org
Fri Mar 27 22:26:29 PDT 2020


Hi Dylan,

the following code

volatile uint8_t v1;
volatile uint8_t v2;

__attribute__((interrupt)) void __vector_21(void)  {
    v2 = v1;
}

produces in C mode:

00000092 <__vector_21>:
92:   80 91 61 00     lds     r24, 0x0061     ; 0x800061 <v1>
96:   80 93 60 00     sts     0x0060, r24     ; 0x800060 <__data_end>
9a:   08 95           ret

and in C++ mode:

00000074 <_Z11__vector_21v>:
74:   80 91 60 00     lds     r24, 0x0060     ; 0x800060 <__data_end>
78:   80 93 61 00     sts     0x0061, r24     ; 0x800061 <v2>
7c:   08 95           ret

So, in C++ mode it is not recognized as ISR due to name mangling.

Furthermore there are no register push/pos and no reti.

Whats wrong?

Thanks.


Am 11.03.20 um 08:13 schrieb Dylan McKay:
> Here you go Wilhelm,
> 
> https://github.com/dylanmckay/clang-avr-libc-interrupt-example
> 
> 
> 
> On Thu, Mar 5, 2020 at 4:05 AM Wilhelm Meier <wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de>> wrote:
> 
>     Am 04.03.20 um 13:28 schrieb Dylan McKay:
> 
>     >
>     >   * *The C/C++ function needs to be declared with either the calling
>     >     convention avr-interrupt or avr-non-blocking-interrupt.* Skipping
>     >     this step will cause regular ret instructions to be emitted for
>     >     return-from-subroutine, instead of the required reti for interrupt
>     >     handlers. ISRs also have stricter requirements on which registers
>     >     must not be clobbered after execution, which the backend will
>     handle
>     >     properly by restoring all clobbered registers in the interrupt
>     >     handler epilogue
>     >   * *The symbol names of the ISR function handlers must match those
>     >     referred to in avr-libc/avr-libgcc/crt*. This is because the ISR
>     >     table is specified in assembly inside the GCC AVR CRT. The way it
>     >     works is that the external symbol references in the CRT object
>     files
>     >     are declared with an exotic linkage type that causes the linker to
>     >     skip linking of the symbols if they are undefined references.
>     If you
>     >     chose a custom ISR table in a custom CRT or runtime library, you
>     >     would be free to choose ISR names as you pleased.
>     >
>     Thank you for your explanation. But I suspect I didn't get it right. Can
>     you please provide an example?
> 
>     Thanks
> 


More information about the llvm-dev mailing list