[llvm-dev] How to add new AVR targets?
Wilhelm Meier via llvm-dev
llvm-dev at lists.llvm.org
Wed Apr 15 21:42:16 PDT 2020
Hi Dylan,
I can do testing, but working on the backend is not an option for me :-(
I am very happy to see that there is an alternative to avr-gcc, but it
looks like at the moment, that there is very few interest in the clang
community for this backend. I think there must be some more activity
here, if this backend leaves (hast left) the experimental status.
Thank you!
Wilhelm
Am 11.04.20 um 10:50 schrieb Dylan McKay:
> Hey Wilhelm,
>
> Raising a bug on bugs.llvm.org <http://bugs.llvm.org> sounds good to me.
>
> Is there anything I can do about it?
>
>
> If you look at the AVR backend and figure out why the unnecessary
> instructions are emitted, it shouldn't be too hard to skip them. I
> suspect the code that generates this lives in
> 'llvm/lib/Target/AVR/AVRFrameLowering.cpp'. Look specifically for the
> 'emitPrologue' and 'emitEpilogue' functions.
>
> If you can identify some subset of instructions which can be skipped for
> ISRs, add the appropriate conditionals and pop a review on
> reviews.llvm.org <http://reviews.llvm.org>.
>
> Most of the backend work thus far has been focused on correctness rather
> than efficiency, and so there is a lot of low hanging fruit laying there.
>
> BTW: gcc is loosing the AVR backend, so I would assume, there will be a
> greater interest to this in llvm compared to the past.
>
>
> The GCC backend died of bitrot so perhaps not, although there does seem
> to be a bit more activity here. Historically almost all users of the AVR
> backend were using frontends other than clang, so I suspect it Clang+AVR
> will get a good stress testing now.
>
> Regards,
> Dylan
>
> On Thu, Apr 9, 2020 at 7:46 AM Wilhelm Meier <wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de>> wrote:
>
> Is there anything I can do about it?
>
> BTW: gcc is loosing the AVR backend, so I would assume, there will be a
> greater interest to this in llvm compared to the past.
>
> Thanks,
> Wilhelm
>
> Am 03.04.20 um 15:09 schrieb Wilhelm Meier via llvm-dev:
> > Should I create an issue in bugzilla for this? Just to be reminded ...
> >
> > Am 31.03.20 um 09:34 schrieb Wilhelm Meier via llvm-dev:
> >> Hi Dylan,
> >>
> >> looks ok now.
> >>
> >> One thing:
> >>
> >> the ISR is now:
> >>
> >> __vector_21: ; @__vector_21
> >> __vector_21$local:
> >> sei
> >> push r0
> >> push r1
> >> in r0, 63
> >> push r0
> >> clr r0
> >> push r24
> >> lds r24, v1
> >> sts v2, r24
> >> pop r24
> >> pop r0
> >> out 63, r0
> >> pop r1
> >> pop r0
> >> reti
> >>
> >> There are unneccessary push/pops of r1 and r0 too, since the clr is
> >> useless ... GCC had the same problem but they made improvements.
> >>
> >> Thanks.
> >>
> >>
> >> Am 31.03.20 um 08:09 schrieb Wilhelm Meier via llvm-dev:
> >>> Hi Dylan,
> >>>
> >>> thank you. I'll be back with a test ...
> >>>
> >>> Wilhelm
> >>>
> >>> Am 31.03.20 um 08:06 schrieb Dylan McKay:
> >>>> Hey Wilhelm,
> >>>>
> >>>> That's a bug, the "interrupt" attribute is not being recognized
> by the
> >>>> backend.
> >>>>
> >>>> I have fixed it in
> >>>>
> https://github.com/llvm/llvm-project/commit/339b34266c1b54a9b5ff2f83cfb1da9cd8c9d90a
> >>>>
> >>>> Pull the latest LLVM and it should be fixed.
> >>>>
> >>>>
> >>>> On Tue, Mar 31, 2020 at 8:00 AM Wilhelm Meier
> <wilhelm.meier at hs-kl.de <mailto:wilhelm.meier at hs-kl.de>
> >>>> <mailto:wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de>>> wrote:
> >>>>
> >>>> Hi Dylan,
> >>>>
> >>>> I used the following commandline:
> >>>>
> >>>> clang++ -Os -DF_OSC=20000000 -DF_CPU=20000000 --target=avr -I.
> >>>> -I../include0 -I../../include0 -I../../../include0
> -I../../include0/std
> >>>> -I../include0/std -I../../../include0/std
> -I../../3rdparty/boost
> >>>> -I/usr/avr/include -mmcu=atmega328p
> >>>> /home/lmeier/Projekte/wmucpp/clang/bm00/bm00.cc -S
> -emit-llvm --output
> >>>> bm00.ir <http://bm00.ir> <http://bm00.ir>
> >>>>
> >>>> Please find the IR attached in the file bm00.ir
> <http://bm00.ir> <http://bm00.ir>
> >>>>
> >>>> Thanks,
> >>>> Wilhelm
> >>>>
> >>>>
> >>>> Am 30.03.20 um 13:44 schrieb Dylan McKay:
> >>>> > 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 <mailto:wilhelm.meier at hs-kl.de>
> <mailto:wilhelm.meier at hs-kl.de <mailto:wilhelm.meier at hs-kl.de>>
> >>>> > <mailto:wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de> <mailto:wilhelm.meier at hs-kl.de
> <mailto: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> <mailto:wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de>>
> >>>> <mailto:wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de> <mailto:wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de>>>
> >>>> > >> <mailto:wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de>
> >>>> <mailto:wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de>> <mailto:wilhelm.meier at hs-kl.de
> <mailto:wilhelm.meier at hs-kl.de>
> >>>> <mailto: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
> <mailto:llvm-dev at lists.llvm.org> <mailto:llvm-dev at lists.llvm.org
> <mailto:llvm-dev at lists.llvm.org>>
> >>>> <mailto:llvm-dev at lists.llvm.org
> <mailto:llvm-dev at lists.llvm.org> <mailto:llvm-dev at lists.llvm.org
> <mailto:llvm-dev at lists.llvm.org>>>
> >>>> > >
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >>>> > >
> >>>> >
> >>>>
> >>> _______________________________________________
> >>> LLVM Developers mailing list
> >>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> >>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >>>
> >> _______________________________________________
> >> LLVM Developers mailing list
> >> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >>
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >
>
More information about the llvm-dev
mailing list