[PATCH] D116551: [AVR] Mark call-clobbered registers as clobbered in interrupt handlers

Ben Shi via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 6 20:35:13 PST 2022


benshi001 added a comment.

That gets conformed with avr-gcc's behaviour on handling interrupt/signal service functions.

For the following C code

  #include <avr/interrupt.h>
  void foo(void);
  SIGNAL(_VECTOR(1)) { foo(); }

avr-gcc generates the following asm, which is conformed with your patch.

          .file   "a.c"
  __SP_H__ = 0x3e
  __SP_L__ = 0x3d
  __SREG__ = 0x3f
  __tmp_reg__ = 0
  __zero_reg__ = 1
          .text
  .global __vector_1
          .type   __vector_1, @function
  __vector_1:
          push r1
          push r0
          in r0,__SREG__
          push r0
          clr __zero_reg__
          push r18
          push r19
          push r20
          push r21
          push r22
          push r23
          push r24
          push r25
          push r26
          push r27
          push r30
          push r31
  /* prologue: Signal */
  /* frame size = 0 */
  /* stack size = 15 */
  .L__stack_usage = 15
          call foo
  /* epilogue start */
          pop r31
          pop r30
          pop r27
          pop r26
          pop r25
          pop r24
          pop r23
          pop r22
          pop r21
          pop r20
          pop r19
          pop r18
          pop r0
          out __SREG__,r0
          pop r0
          pop r1
          reti


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D116551/new/

https://reviews.llvm.org/D116551



More information about the llvm-commits mailing list