public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Andrew Burgess <andrew.burgess@embecosm.com>
To: Claudiu Zissulescu <Claudiu.Zissulescu@synopsys.com>
Cc: gcc-patches@gcc.gnu.org, Francois.Bedard@synopsys.com
Subject: Re: [PATCH 2/6] [ARC] Add SJLI support.
Date: Tue, 16 Jan 2018 10:37:00 -0000	[thread overview]
Message-ID: <20180116103652.GI2676@embecosm.com> (raw)
In-Reply-To: <1509625835-22344-3-git-send-email-claziss@synopsys.com>

* Claudiu Zissulescu <Claudiu.Zissulescu@synopsys.com> [2017-11-02 13:30:31 +0100]:

> gcc/
> 2017-02-20  Claudiu Zissulescu  <claziss@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
> 

  reply	other threads:[~2018-01-16 10:37 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-02 12:34 [PATCH 0/6] [ARC] New baremetal features and fixes Claudiu Zissulescu
2017-11-02 12:34 ` [PATCH 1/6] [ARC] Add JLI support Claudiu Zissulescu
2018-01-16 10:20   ` Andrew Burgess
2017-11-02 12:34 ` [PATCH 6/6] [ARC] Add 'aux' variable attribute Claudiu Zissulescu
2018-01-29 20:28   ` Andrew Burgess
2017-11-02 12:34 ` [PATCH 4/6] [ARC] Rework delegitimate_address hook Claudiu Zissulescu
2018-01-23 23:07   ` Andrew Burgess
2017-11-02 12:34 ` [PATCH 3/6] [ARC] Add support for "register file 16" reduced register set Claudiu Zissulescu
2018-01-16 10:52   ` Andrew Burgess
2017-11-02 12:34 ` [PATCH 2/6] [ARC] Add SJLI support Claudiu Zissulescu
2018-01-16 10:37   ` Andrew Burgess [this message]
2017-11-02 12:34 ` [PATCH 5/6] [ARC] Add 'uncached' attribute Claudiu Zissulescu
2017-11-03  2:26   ` Sandra Loosemore
2017-11-03 11:24     ` Claudiu Zissulescu
2017-11-03 18:55       ` Sandra Loosemore
2017-11-09  9:13         ` Claudiu Zissulescu
2018-01-29 20:23   ` Andrew Burgess
2018-02-01 10:10 ` [PATCH 0/6] [ARC] New baremetal features and fixes Claudiu Zissulescu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180116103652.GI2676@embecosm.com \
    --to=andrew.burgess@embecosm.com \
    --cc=Claudiu.Zissulescu@synopsys.com \
    --cc=Francois.Bedard@synopsys.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).