* Claudiu Zissulescu <claudiu.zissule...@synopsys.com> [2017-11-02 13:30:31 +0100]:
> gcc/ > 2017-02-20 Claudiu Zissulescu <claz...@synopsys.com> > > * config/arc/arc-protos.h: Add arc_is_secure_call_p proto. > * config/arc/arc.c (arc_handle_secure_attribute): New function. > (arc_attribute_table): Add 'secure_call' attribute. > (arc_print_operand): Print secure call operand. > (arc_function_ok_for_sibcall): Don't optimize tail calls when > secure. > (arc_is_secure_call_p): New function. > * config/arc/arc.md (call_i): Add support for sjli instruction. > (call_value_i): Likewise. > * config/arc/constraints.md (Csc): New constraint. > --- > gcc/config/arc/arc-protos.h | 1 + > gcc/config/arc/arc.c | 164 > +++++++++++++++++++++++++++++++----------- > gcc/config/arc/arc.md | 32 +++++---- > gcc/config/arc/constraints.md | 7 ++ > gcc/doc/extend.texi | 6 ++ > 5 files changed, 155 insertions(+), 55 deletions(-) Looks fine, few comments inline below. Thanks Andrew > > @@ -3939,6 +3985,9 @@ arc_print_operand (FILE *file, rtx x, int code) > : NULL_TREE); > if (lookup_attribute ("jli_fixed", attrs)) > { > + /* No special treatment for jli_fixed functions. */ > + if (code == 'j' ) Extra space before ')'. > + break; > fprintf (file, "%ld\t; @", > TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attrs)))); > assemble_name (file, XSTR (x, 0)); > @@ -3947,6 +3996,22 @@ arc_print_operand (FILE *file, rtx x, int code) > } > fprintf (file, "@__jli."); > assemble_name (file, XSTR (x, 0)); > + if (code == 'j') > + arc_add_jli_section (x); > + return; > + } > + if (GET_CODE (x) == SYMBOL_REF > + && arc_is_secure_call_p (x)) > + { > + /* No special treatment for secure functions. */ > + if (code == 'j' ) > + break; > + tree attrs = (TREE_TYPE (SYMBOL_REF_DECL (x)) != error_mark_node > + ? TYPE_ATTRIBUTES (TREE_TYPE (SYMBOL_REF_DECL (x))) > + : NULL_TREE); > + fprintf (file, "%ld\t; @", > + TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attrs)))); > + assemble_name (file, XSTR (x, 0)); > return; > } > break; > @@ -6897,6 +6962,8 @@ arc_function_ok_for_sibcall (tree decl, > return false; > if (lookup_attribute ("jli_fixed", attrs)) > return false; > + if (lookup_attribute ("secure_call", attrs)) > + return false; > } > > /* Everything else is ok. */ > @@ -7594,46 +7661,6 @@ arc_reorg_loops (void) > reorg_loops (true, &arc_doloop_hooks); > } > > -/* Add the given function declaration to emit code in JLI section. */ > - > -static void > -arc_add_jli_section (rtx pat) > -{ > - const char *name; > - tree attrs; > - arc_jli_section *sec = arc_jli_sections, *new_section; > - tree decl = SYMBOL_REF_DECL (pat); > - > - if (!pat) > - return; > - > - if (decl) > - { > - /* For fixed locations do not generate the jli table entry. It > - should be provided by the user as an asm file. */ > - attrs = TYPE_ATTRIBUTES (TREE_TYPE (decl)); > - if (lookup_attribute ("jli_fixed", attrs)) > - return; > - } > - > - name = XSTR (pat, 0); > - > - /* Don't insert the same symbol twice. */ > - while (sec != NULL) > - { > - if(strcmp (name, sec->name) == 0) > - return; > - sec = sec->next; > - } > - > - /* New name, insert it. */ > - new_section = (arc_jli_section *) xmalloc (sizeof (arc_jli_section)); > - gcc_assert (new_section != NULL); > - new_section->name = name; > - new_section->next = arc_jli_sections; > - arc_jli_sections = new_section; > -} > - > /* Scan all calls and add symbols to be emitted in the jli section if > needed. */ > > @@ -10968,6 +10995,63 @@ arc_handle_jli_attribute (tree *node > ATTRIBUTE_UNUSED, > return NULL_TREE; > } > > +/* Handle and "scure" attribute; arguments as in struct > + attribute_spec.handler. */ > + > +static tree > +arc_handle_secure_attribute (tree *node ATTRIBUTE_UNUSED, > + tree name, tree args, int, > + bool *no_add_attrs) > +{ > + if (!TARGET_EM) > + { > + warning (OPT_Wattributes, > + "%qE attribute only valid for ARC EM architecture", > + name); > + *no_add_attrs = true; > + } > + > + if (args == NULL_TREE) > + { > + warning (OPT_Wattributes, > + "argument of %qE attribute is missing", > + name); > + *no_add_attrs = true; > + } > + else > + { > + if (TREE_CODE (TREE_VALUE (args)) == NON_LVALUE_EXPR) > + TREE_VALUE (args) = TREE_OPERAND (TREE_VALUE (args), 0); > + tree arg = TREE_VALUE (args); > + if (TREE_CODE (arg) != INTEGER_CST) > + { > + warning (0, "%qE attribute allows only an integer constant argument", > + name); > + *no_add_attrs = true; > + } > + /* FIXME! add range check. TREE_INT_CST_LOW (arg) */ Should this be fixed in this commit? > + } > + return NULL_TREE; > +} > + > +/* Return nonzero if the symbol is a secure function. */ > + > +bool > +arc_is_secure_call_p (rtx pat) > +{ > + tree attrs; > + tree decl = SYMBOL_REF_DECL (pat); > + > + if (!decl) > + return false; > + > + attrs = TYPE_ATTRIBUTES (TREE_TYPE (decl)); > + if (lookup_attribute ("secure_call", attrs)) > + return true; > + > + return false; > +} > + > /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P. We don't want to use > anchors for small data: the GP register acts as an anchor in that > case. We also don't want to use them for PC-relative accesses, > diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md > index c72420c..48625d3 100644 > --- a/gcc/config/arc/arc.md > +++ b/gcc/config/arc/arc.md > @@ -736,10 +736,10 @@ > mov%? %0,%1 ;11 > add %0,%1 ;12 > add %0,pcl,%1@pcl ;13 > - mov%? %0,%1 ;14 > - mov%? %0,%1 ;15 > - mov%? %0,%1 ;16 > - ld%?%U1 %0,%1 ;17 > + mov%? %0,%j1 ;14 > + mov%? %0,%j1 ;15 > + mov%? %0,%j1 ;16 > + ld%? %0,%1 ;17 > st%? %1,%0%& ;18 > * return arc_short_long (insn, \"push%? %1%&\", \"st%U0 %1,%0%&\"); > * return arc_short_long (insn, \"pop%? %0%&\", \"ld%U1 %0,%1%&\"); > @@ -4229,7 +4229,7 @@ > ; alternative 1 ("q"), that means that we can't use the short form. > (define_insn "*call_i" > [(call (mem:SI (match_operand:SI 0 > - "call_address_operand" "Rcq,q,c,Cji,Cbp,Cbr,L,I,Cal")) > + "call_address_operand" "Rcq,q,c,Cji,Csc,Cbp,Cbr,L,I,Cal")) > (match_operand 1 "" "")) > (clobber (reg:SI 31))] > "" > @@ -4238,15 +4238,16 @@ > jl%!%* [%0]%& > jl%!%* [%0] > jli_s %S0 > + sjli %S0 > bl%!%* %P0 > bl%!%* %P0 > jl%!%* %0 > jl%* %0 > jl%! %0" > - [(set_attr "type" > "call,call,call,call_no_delay_slot,call,call,call,call,call_no_delay_slot") > - (set_attr "iscompact" "maybe,false,*,true,*,*,*,*,*") > - (set_attr "predicable" "no,no,yes,no,yes,no,yes,no,yes") > - (set_attr "length" "*,*,4,2,4,4,4,4,8")]) > + [(set_attr "type" > "call,call,call,call_no_delay_slot,call_no_delay_slot,call,call,call,call,call_no_delay_slot") > + (set_attr "iscompact" "maybe,false,*,true,*,*,*,*,*,*") > + (set_attr "predicable" "no,no,yes,no,no,yes,no,yes,no,yes") > + (set_attr "length" "*,*,4,2,4,4,4,4,4,8")]) > > (define_expand "call_value" > ;; operand 2 is stack_size_rtx > @@ -4272,9 +4273,9 @@ > ; At instruction output time, if it doesn't match and we end up with > ; alternative 1 ("q"), that means that we can't use the short form. > (define_insn "*call_value_i" > - [(set (match_operand 0 "dest_reg_operand" "=Rcq,q,w, w, w, w,w,w, w") > + [(set (match_operand 0 "dest_reg_operand" "=Rcq,q,w, w, w, w, w,w,w, > w") > (call (mem:SI (match_operand:SI 1 > - "call_address_operand" "Rcq,q,c,Cji,Cbp,Cbr,L,I,Cal")) > + "call_address_operand" > "Rcq,q,c,Cji,Csc,Cbp,Cbr,L,I,Cal")) > (match_operand 2 "" ""))) > (clobber (reg:SI 31))] > "" > @@ -4283,15 +4284,16 @@ > jl%!%* [%1]%& > jl%!%* [%1] > jli_s %S1 > + sjli %S1 > bl%!%* %P1;1 > bl%!%* %P1;1 > jl%!%* %1 > jl%* %1 > jl%! %1" > - [(set_attr "type" > "call,call,call,call_no_delay_slot,call,call,call,call,call_no_delay_slot") > - (set_attr "iscompact" "maybe,false,*,true,*,*,*,*,*") > - (set_attr "predicable" "no,no,yes,no,yes,no,yes,no,yes") > - (set_attr "length" "*,*,4,2,4,4,4,4,8")]) > + [(set_attr "type" > "call,call,call,call_no_delay_slot,call_no_delay_slot,call,call,call,call,call_no_delay_slot") > + (set_attr "iscompact" "maybe,false,*,true,false,*,*,*,*,*") > + (set_attr "predicable" "no,no,yes,no,no,yes,no,yes,no,yes") > + (set_attr "length" "*,*,4,2,4,4,4,4,4,8")]) > > ; There is a bl_s instruction (16 bit opcode branch-and-link), but we can't > ; use it for lack of inter-procedural branch shortening. > diff --git a/gcc/config/arc/constraints.md b/gcc/config/arc/constraints.md > index 7114e6e..3fed018 100644 > --- a/gcc/config/arc/constraints.md > +++ b/gcc/config/arc/constraints.md > @@ -407,6 +407,13 @@ > (match_test "TARGET_CODE_DENSITY") > (match_test "arc_is_jli_call_p (op)"))) > > +(define_constraint "Csc" > + "Secure call" > + (and (match_code "symbol_ref") > + (match_test "TARGET_CODE_DENSITY") > + (match_test "TARGET_EM") > + (match_test "arc_is_secure_call_p (op)"))) > + > (define_constraint "Cpc" > "pc-relative constant" > (match_test "arc_legitimate_pic_addr_p (op)")) > diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi > index 1e16d06..0f8ba05 100644 > --- a/gcc/doc/extend.texi > +++ b/gcc/doc/extend.texi > @@ -3761,6 +3761,12 @@ Forces the particular function to be called using jli > instruction. > Identical like the above one, but the location of the function in the > JLI table is known and given as an attribute parameter. > > +@item secure_call > +@cindex @code{secure_call} function attribute, ARC > +This attribute allows one to mark secure-code functions that are > +callable from normal mode. The location of the secure call function > +into the SJLI table needs to be passed as argument. > + > @end table > > @node ARM Function Attributes > -- > 1.9.1 >