[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