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

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


Answering partly to myself there was a extern "C" missing.

But the register pushes ans reti are still missing.

Whats wrong?

Am 28.03.20 um 06:26 schrieb Wilhelm Meier via llvm-dev:
> 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
>>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> 


More information about the llvm-dev mailing list