Hello All,

Fixed missing save of r18 in fast_interrupt.
Register 18 is used as a clobber register, and must be stored when entering a 
fast_interrupt. Before this fix, register 18 was only saved if it was used 
directly in the interrupt function.
    
However, if the fast_interrupt function called a function that used r18, the 
register would not be saved, and thus be mangled upon returning from the 
interrupt.
    
Changelog
        2020-04-04  Klaus Petersen <klauspeter...@gmail.com>
         * gcc/config/microblaze/microblaze.c: Check for fast_interrupt in
            microblaze_must_save_register.

        Signed-off-by: Klaus Petersen <klauspeter...@gmail.com>
        Signed-off-by :Nagaraju Mekala <nmek...@xilix.com>

diff --git a/gcc/config/microblaze/microblaze.c 
b/gcc/config/microblaze/microblaze.c
index b4754b1..67e393d 100644
--- a/gcc/config/microblaze/microblaze.c
+++ b/gcc/config/microblaze/microblaze.c
@@ -2035,7 +2035,7 @@ microblaze_must_save_register (int regno)
     {
       if (df_regs_ever_live_p (regno) 
          || regno == MB_ABI_MSR_SAVE_REG
-         || (interrupt_handler
+         || ((interrupt_handler || fast_interrupt)       
               && (regno == MB_ABI_ASM_TEMP_REGNUM
                  || regno == MB_ABI_EXCEPTION_RETURN_ADDR_REGNUM)))
        return 1;

Attached is the patch.

Thanks
Nagaraju

Attachment: 0001-Patch-microblaze-Fixed-missing-save-of-r18-in-fast_i.patch
Description: 0001-Patch-microblaze-Fixed-missing-save-of-r18-in-fast_i.patch

Reply via email to