> -----Original Message----- > From: Robert Suchanek [mailto:robert.sucha...@imgtec.com] > Sent: Wednesday, July 08, 2015 6:43 AM > To: Matthew Fortune; Moore, Catherine; gcc-patches@gcc.gnu.org > Subject: [PATCH, MIPS] Support new interrupt handler options > > Hi, > > This patch adds support for optional arguments for interrupt and > use_shadow_register_set attributes. The patch also fixes an ICE if both > interrupt and use_shadow_register_set are enabled and compiled with - > mips64r2 -mabi=64 discovered during testing of the attached test. > > The interrupt attribute accepts new arguments: "eic" and > "vector=[sw0|sw1|hw0|hw1|hw2|hw3|hw4|hw5]". The former is the > default if no argument is given and the latter changes the behaviour of GCC > and masks interrupts from sw0 up to and including the specified vector. As > part of this change, the EPC is now saved and restored unconditionally to > recover the state in nested interrupts. Only K1 register is clobbered for > masked interrupts but for non-masked interrupts K0 is still used. > > The use_shadow_register_set attribute has a new option, "intstack", to > indicate that the shadow register set has a valid stack pointer. With this > option "rdpgpr $sp, $sp" will not be generated for an ISR. > > Tested with mips-img-elf, mips-img-linux-gnu and mips64el-linux-gnu cross > compilers. Ok to apply? > > Regards, > Robert > > 2015-07-07 Matthew Fortune <matthew.fort...@imgtec.com> > Robert Suchanek <robert.sucha...@imgtec.com> > > gcc/ > * config/mips/mips.c (mips_int_mask): New enum. > (mips_shadow_set): Likewise. > (int_mask): New variable. > (use_shadow_register_set_p): Change type to enum > mips_shadow_set. > (machine_function): Add int_mask and use_shadow_register_set. > (mips_attribute_table): Add attribute handlers for interrupt and > use_shadow_register_set. > (mips_interrupt_mask): New static function. > (mips_handle_interrupt_attr): Likewise. > (mips_handle_use_shadow_register_set_attr): Likewise. > (mips_use_shadow_register_set): Change return type to enum > mips_shadow_set. Add argument handling for > use_shadow_register_set > attribute. > (mips_interrupt_extra_called_saved_reg_p): Update the conditional > to > compare with mips_shadow_set enum. > (mips_compute_frame_info): Add interrupt mask and > use_shadow_register_set to per-function information structure. > Add a stack slot for EPC unconditionally. > (mips_expand_prologue): Compare use_shadow_register_set value > with mips_shadow_set enum. Save EPC always in K1, clobber only K1 > for > masked interrupt register but in EIC mode use K0 and save Cause in > K0. > EPC saved and restored unconditionally. Use PMODE_INSN macro > when > copying the stack pointer from the shadow register set. > * config/mips/mips.h (SR_IM0): New define. > * config/mips/mips.md (mips_rdpgpr): Rename to... > (mips_rdpgpr_<mode>): ...this. Use the Pmode iterator. > * doc/extend.texi (Declaring Attributes of Functions): Document > optional arguments for interrupt and use_shadow_register_set > attributes. > > gcc/testsuite/ > * gcc.target/mips/interrupt_handler-4.c: New test.
Hi Robert, I'm getting build errors with the current TOT and your patch. The first errors that I encounter are: gcc/config/mips/mips.c:1355:1: warning: 'mips_int_mask mips_interrupt_mask(tree)' defined but not used [-Wunused-function] gcc/config/mips/mips.c:1392:1: warning: 'mips_shadow_set mips_use_shadow_register_set(tree)' defined but not used [-Wunused-function] Removing these two functions results in further errors that I have not investigated. Will you try applying and building your patch again? I have a couple of further comments on the existing patch, see below. Thanks, Catherine > diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index > ce21a0f..b6ad7db 100644 > --- a/gcc/config/mips/mips.c > +++ b/gcc/config/mips/mips.c > @@ -1325,13 +1359,62 @@ mips_interrupt_type_p (tree type) > return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL; } > > +static enum mips_int_mask > +mips_interrupt_mask (tree type) This function requires a comment. > +static enum mips_shadow_set > +mips_use_shadow_register_set (tree type) Likewise. > { > @@ -1537,6 +1620,87 @@ mips_can_inline_p (tree caller, tree callee) > return false; > return default_target_can_inline_p (caller, callee); } > + > +static tree > +mips_handle_interrupt_attr (tree *node, tree name, tree args, > + int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) > { Likewise. > + > +static tree > +mips_handle_use_shadow_register_set_attr (tree *node, tree name, tree > args, And here as well. >