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

Dylan McKay via llvm-dev llvm-dev at lists.llvm.org
Mon Mar 30 04:44:06 PDT 2020


Hey Wilhelm,

Could you post the LLVM IR generated from your C++ file?

This can be achieved with 'clang -S -emit-llvm'

Cheers

On Sat, Mar 28, 2020 at 6:36 PM Wilhelm Meier <wilhelm.meier at hs-kl.de>
wrote:

> 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
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200331/919d9b1c/attachment-0001.html>


More information about the llvm-dev mailing list