<div dir="ltr"><div>Hey Wilhelm,</div><div><br></div><div>Could you post the LLVM IR generated from your C++ file?</div><div><br></div><div>This can be achieved with 'clang -S -emit-llvm'</div><div><br></div><div>Cheers</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Mar 28, 2020 at 6:36 PM Wilhelm Meier <<a href="mailto:wilhelm.meier@hs-kl.de">wilhelm.meier@hs-kl.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Answering partly to myself there was a extern "C" missing.<br>
<br>
But the register pushes ans reti are still missing.<br>
<br>
Whats wrong?<br>
<br>
Am 28.03.20 um 06:26 schrieb Wilhelm Meier via llvm-dev:<br>
> Hi Dylan,<br>
> <br>
> the following code<br>
> <br>
> volatile uint8_t v1;<br>
> volatile uint8_t v2;<br>
> <br>
> __attribute__((interrupt)) void __vector_21(void)  {<br>
>     v2 = v1;<br>
> }<br>
> <br>
> produces in C mode:<br>
> <br>
> 00000092 <__vector_21>:<br>
> 92:   80 91 61 00     lds     r24, 0x0061     ; 0x800061 <v1><br>
> 96:   80 93 60 00     sts     0x0060, r24     ; 0x800060 <__data_end><br>
> 9a:   08 95           ret<br>
> <br>
> and in C++ mode:<br>
> <br>
> 00000074 <_Z11__vector_21v>:<br>
> 74:   80 91 60 00     lds     r24, 0x0060     ; 0x800060 <__data_end><br>
> 78:   80 93 61 00     sts     0x0061, r24     ; 0x800061 <v2><br>
> 7c:   08 95           ret<br>
> <br>
> So, in C++ mode it is not recognized as ISR due to name mangling.<br>
> <br>
> Furthermore there are no register push/pos and no reti.<br>
> <br>
> Whats wrong?<br>
> <br>
> Thanks.<br>
> <br>
> <br>
> Am 11.03.20 um 08:13 schrieb Dylan McKay:<br>
>> Here you go Wilhelm,<br>
>><br>
>> <a href="https://github.com/dylanmckay/clang-avr-libc-interrupt-example" rel="noreferrer" target="_blank">https://github.com/dylanmckay/clang-avr-libc-interrupt-example</a><br>
>><br>
>><br>
>><br>
>> On Thu, Mar 5, 2020 at 4:05 AM Wilhelm Meier <<a href="mailto:wilhelm.meier@hs-kl.de" target="_blank">wilhelm.meier@hs-kl.de</a><br>
>> <mailto:<a href="mailto:wilhelm.meier@hs-kl.de" target="_blank">wilhelm.meier@hs-kl.de</a>>> wrote:<br>
>><br>
>>     Am 04.03.20 um 13:28 schrieb Dylan McKay:<br>
>><br>
>>     ><br>
>>     >   * *The C/C++ function needs to be declared with either the calling<br>
>>     >     convention avr-interrupt or avr-non-blocking-interrupt.* Skipping<br>
>>     >     this step will cause regular ret instructions to be emitted for<br>
>>     >     return-from-subroutine, instead of the required reti for interrupt<br>
>>     >     handlers. ISRs also have stricter requirements on which registers<br>
>>     >     must not be clobbered after execution, which the backend will<br>
>>     handle<br>
>>     >     properly by restoring all clobbered registers in the interrupt<br>
>>     >     handler epilogue<br>
>>     >   * *The symbol names of the ISR function handlers must match those<br>
>>     >     referred to in avr-libc/avr-libgcc/crt*. This is because the ISR<br>
>>     >     table is specified in assembly inside the GCC AVR CRT. The way it<br>
>>     >     works is that the external symbol references in the CRT object<br>
>>     files<br>
>>     >     are declared with an exotic linkage type that causes the linker to<br>
>>     >     skip linking of the symbols if they are undefined references.<br>
>>     If you<br>
>>     >     chose a custom ISR table in a custom CRT or runtime library, you<br>
>>     >     would be free to choose ISR names as you pleased.<br>
>>     ><br>
>>     Thank you for your explanation. But I suspect I didn't get it right. Can<br>
>>     you please provide an example?<br>
>><br>
>>     Thanks<br>
>><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
> <br>
</blockquote></div>