[{"id":1839889,"web_url":"http://patchwork.ozlabs.org/comment/1839889/","msgid":"<20180116103652.GI2676@embecosm.com>","list_archive_url":null,"date":"2018-01-16T10:36:52","subject":"Re: [PATCH 2/6] [ARC] Add SJLI support.","submitter":{"id":65155,"url":"http://patchwork.ozlabs.org/api/people/65155/","name":"Andrew Burgess","email":"andrew.burgess@embecosm.com"},"content":"* Claudiu Zissulescu <Claudiu.Zissulescu@synopsys.com> [2017-11-02 13:30:31 +0100]:\n\n> gcc/\n> 2017-02-20  Claudiu Zissulescu  <claziss@synopsys.com>\n> \n> \t* config/arc/arc-protos.h: Add arc_is_secure_call_p proto.\n> \t* config/arc/arc.c (arc_handle_secure_attribute): New function.\n> \t(arc_attribute_table): Add 'secure_call' attribute.\n> \t(arc_print_operand): Print secure call operand.\n> \t(arc_function_ok_for_sibcall): Don't optimize tail calls when\n> \tsecure.\n> \t(arc_is_secure_call_p): New function.\n> \t* config/arc/arc.md (call_i): Add support for sjli instruction.\n> \t(call_value_i): Likewise.\n> \t* config/arc/constraints.md (Csc): New constraint.\n> ---\n>  gcc/config/arc/arc-protos.h   |   1 +\n>  gcc/config/arc/arc.c          | 164 +++++++++++++++++++++++++++++++-----------\n>  gcc/config/arc/arc.md         |  32 +++++----\n>  gcc/config/arc/constraints.md |   7 ++\n>  gcc/doc/extend.texi           |   6 ++\n>  5 files changed, 155 insertions(+), 55 deletions(-)\n\nLooks fine, few comments inline below.\n\nThanks\nAndrew\n\n> \n> @@ -3939,6 +3985,9 @@ arc_print_operand (FILE *file, rtx x, int code)\n>  \t\t\t    : NULL_TREE);\n>  \t      if (lookup_attribute (\"jli_fixed\", attrs))\n>  \t\t{\n> +\t\t  /* No special treatment for jli_fixed functions.  */\n> +\t\t  if (code == 'j' )\n\nExtra space before ')'.\n\n> +\t\t    break;\n>  \t\t  fprintf (file, \"%ld\\t; @\",\n>  \t\t\t   TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attrs))));\n>  \t\t  assemble_name (file, XSTR (x, 0));\n> @@ -3947,6 +3996,22 @@ arc_print_operand (FILE *file, rtx x, int code)\n>  \t    }\n>  \t  fprintf (file, \"@__jli.\");\n>  \t  assemble_name (file, XSTR (x, 0));\n> +\t  if (code == 'j')\n> +\t    arc_add_jli_section (x);\n> +\t  return;\n> +\t}\n> +      if (GET_CODE (x) == SYMBOL_REF\n> +\t  && arc_is_secure_call_p (x))\n> +\t{\n> +\t  /* No special treatment for secure functions.  */\n> +\t  if (code == 'j' )\n> +\t    break;\n> +\t  tree attrs = (TREE_TYPE (SYMBOL_REF_DECL (x)) != error_mark_node\n> +\t\t\t? TYPE_ATTRIBUTES (TREE_TYPE (SYMBOL_REF_DECL (x)))\n> +\t\t\t: NULL_TREE);\n> +\t  fprintf (file, \"%ld\\t; @\",\n> +\t\t   TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attrs))));\n> +\t  assemble_name (file, XSTR (x, 0));\n>  \t  return;\n>  \t}\n>        break;\n> @@ -6897,6 +6962,8 @@ arc_function_ok_for_sibcall (tree decl,\n>  \treturn false;\n>        if (lookup_attribute (\"jli_fixed\", attrs))\n>  \treturn false;\n> +      if (lookup_attribute (\"secure_call\", attrs))\n> +\treturn false;\n>      }\n>  \n>    /* Everything else is ok.  */\n> @@ -7594,46 +7661,6 @@ arc_reorg_loops (void)\n>    reorg_loops (true, &arc_doloop_hooks);\n>  }\n>  \n> -/* Add the given function declaration to emit code in JLI section.  */\n> -\n> -static void\n> -arc_add_jli_section (rtx pat)\n> -{\n> -  const char *name;\n> -  tree attrs;\n> -  arc_jli_section *sec = arc_jli_sections, *new_section;\n> -  tree decl = SYMBOL_REF_DECL (pat);\n> -\n> -  if (!pat)\n> -    return;\n> -\n> -  if (decl)\n> -    {\n> -      /* For fixed locations do not generate the jli table entry.  It\n> -\t should be provided by the user as an asm file.  */\n> -      attrs = TYPE_ATTRIBUTES (TREE_TYPE (decl));\n> -      if (lookup_attribute (\"jli_fixed\", attrs))\n> -\treturn;\n> -    }\n> -\n> -  name = XSTR (pat, 0);\n> -\n> -  /* Don't insert the same symbol twice.  */\n> -  while (sec != NULL)\n> -    {\n> -      if(strcmp (name, sec->name) == 0)\n> -\treturn;\n> -      sec = sec->next;\n> -    }\n> -\n> -  /* New name, insert it.  */\n> -  new_section = (arc_jli_section *) xmalloc (sizeof (arc_jli_section));\n> -  gcc_assert (new_section != NULL);\n> -  new_section->name = name;\n> -  new_section->next = arc_jli_sections;\n> -  arc_jli_sections = new_section;\n> -}\n> -\n>  /* Scan all calls and add symbols to be emitted in the jli section if\n>     needed.  */\n>  \n> @@ -10968,6 +10995,63 @@ arc_handle_jli_attribute (tree *node ATTRIBUTE_UNUSED,\n>     return NULL_TREE;\n>  }\n>  \n> +/* Handle and \"scure\" attribute; arguments as in struct\n> +   attribute_spec.handler.  */\n> +\n> +static tree\n> +arc_handle_secure_attribute (tree *node ATTRIBUTE_UNUSED,\n> +\t\t\t  tree name, tree args, int,\n> +\t\t\t  bool *no_add_attrs)\n> +{\n> +  if (!TARGET_EM)\n> +    {\n> +      warning (OPT_Wattributes,\n> +\t       \"%qE attribute only valid for ARC EM architecture\",\n> +\t       name);\n> +      *no_add_attrs = true;\n> +    }\n> +\n> +  if (args == NULL_TREE)\n> +    {\n> +      warning (OPT_Wattributes,\n> +\t       \"argument of %qE attribute is missing\",\n> +\t       name);\n> +      *no_add_attrs = true;\n> +    }\n> +  else\n> +    {\n> +      if (TREE_CODE (TREE_VALUE (args)) == NON_LVALUE_EXPR)\n> +\tTREE_VALUE (args) = TREE_OPERAND (TREE_VALUE (args), 0);\n> +      tree arg = TREE_VALUE (args);\n> +      if (TREE_CODE (arg) != INTEGER_CST)\n> +\t{\n> +\t  warning (0, \"%qE attribute allows only an integer constant argument\",\n> +\t\t   name);\n> +\t  *no_add_attrs = true;\n> +\t}\n> +      /* FIXME! add range check.  TREE_INT_CST_LOW (arg) */\n\nShould this be fixed in this commit?\n\n> +    }\n> +   return NULL_TREE;\n> +}\n> +\n> +/* Return nonzero if the symbol is a secure function.  */\n> +\n> +bool\n> +arc_is_secure_call_p (rtx pat)\n> +{\n> +  tree attrs;\n> +  tree decl = SYMBOL_REF_DECL (pat);\n> +\n> +  if (!decl)\n> +    return false;\n> +\n> +  attrs = TYPE_ATTRIBUTES (TREE_TYPE (decl));\n> +  if (lookup_attribute (\"secure_call\", attrs))\n> +    return true;\n> +\n> +  return false;\n> +}\n> +\n>  /* Implement TARGET_USE_ANCHORS_FOR_SYMBOL_P.  We don't want to use\n>     anchors for small data: the GP register acts as an anchor in that\n>     case.  We also don't want to use them for PC-relative accesses,\n> diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md\n> index c72420c..48625d3 100644\n> --- a/gcc/config/arc/arc.md\n> +++ b/gcc/config/arc/arc.md\n> @@ -736,10 +736,10 @@\n>     mov%? %0,%1\t\t;11\n>     add %0,%1\t\t;12\n>     add %0,pcl,%1@pcl    ;13\n> -   mov%? %0,%1  \t;14\n> -   mov%? %0,%1\t\t;15\n> -   mov%? %0,%1\t\t;16\n> -   ld%?%U1 %0,%1\t;17\n> +   mov%? %0,%j1 \t;14\n> +   mov%? %0,%j1\t\t;15\n> +   mov%? %0,%j1\t\t;16\n> +   ld%? %0,%1\t\t;17\n>     st%? %1,%0%&\t\t;18\n>     * return arc_short_long (insn, \\\"push%? %1%&\\\", \\\"st%U0 %1,%0%&\\\");\n>     * return arc_short_long (insn, \\\"pop%? %0%&\\\",  \\\"ld%U1 %0,%1%&\\\");\n> @@ -4229,7 +4229,7 @@\n>  ; alternative 1 (\"q\"), that means that we can't use the short form.\n>  (define_insn \"*call_i\"\n>    [(call (mem:SI (match_operand:SI 0\n> -\t\t  \"call_address_operand\" \"Rcq,q,c,Cji,Cbp,Cbr,L,I,Cal\"))\n> +\t\t  \"call_address_operand\" \"Rcq,q,c,Cji,Csc,Cbp,Cbr,L,I,Cal\"))\n>  \t (match_operand 1 \"\" \"\"))\n>     (clobber (reg:SI 31))]\n>    \"\"\n> @@ -4238,15 +4238,16 @@\n>     jl%!%* [%0]%&\n>     jl%!%* [%0]\n>     jli_s %S0\n> +   sjli  %S0\n>     bl%!%* %P0\n>     bl%!%* %P0\n>     jl%!%* %0\n>     jl%* %0\n>     jl%! %0\"\n> -  [(set_attr \"type\" \"call,call,call,call_no_delay_slot,call,call,call,call,call_no_delay_slot\")\n> -   (set_attr \"iscompact\" \"maybe,false,*,true,*,*,*,*,*\")\n> -   (set_attr \"predicable\" \"no,no,yes,no,yes,no,yes,no,yes\")\n> -   (set_attr \"length\" \"*,*,4,2,4,4,4,4,8\")])\n> +  [(set_attr \"type\" \"call,call,call,call_no_delay_slot,call_no_delay_slot,call,call,call,call,call_no_delay_slot\")\n> +   (set_attr \"iscompact\" \"maybe,false,*,true,*,*,*,*,*,*\")\n> +   (set_attr \"predicable\" \"no,no,yes,no,no,yes,no,yes,no,yes\")\n> +   (set_attr \"length\" \"*,*,4,2,4,4,4,4,4,8\")])\n>  \n>  (define_expand \"call_value\"\n>    ;; operand 2 is stack_size_rtx\n> @@ -4272,9 +4273,9 @@\n>  ; At instruction output time, if it doesn't match and we end up with\n>  ; alternative 1 (\"q\"), that means that we can't use the short form.\n>  (define_insn \"*call_value_i\"\n> -  [(set (match_operand 0 \"dest_reg_operand\"  \"=Rcq,q,w,  w,  w,  w,w,w,  w\")\n> +  [(set (match_operand 0 \"dest_reg_operand\"  \"=Rcq,q,w,  w,  w,  w,  w,w,w,  w\")\n>  \t(call (mem:SI (match_operand:SI 1\n> -\t\t       \"call_address_operand\" \"Rcq,q,c,Cji,Cbp,Cbr,L,I,Cal\"))\n> +\t\t       \"call_address_operand\" \"Rcq,q,c,Cji,Csc,Cbp,Cbr,L,I,Cal\"))\n>  \t      (match_operand 2 \"\" \"\")))\n>     (clobber (reg:SI 31))]\n>    \"\"\n> @@ -4283,15 +4284,16 @@\n>     jl%!%* [%1]%&\n>     jl%!%* [%1]\n>     jli_s %S1\n> +   sjli  %S1\n>     bl%!%* %P1;1\n>     bl%!%* %P1;1\n>     jl%!%* %1\n>     jl%* %1\n>     jl%! %1\"\n> -  [(set_attr \"type\" \"call,call,call,call_no_delay_slot,call,call,call,call,call_no_delay_slot\")\n> -   (set_attr \"iscompact\" \"maybe,false,*,true,*,*,*,*,*\")\n> -   (set_attr \"predicable\" \"no,no,yes,no,yes,no,yes,no,yes\")\n> -   (set_attr \"length\" \"*,*,4,2,4,4,4,4,8\")])\n> +  [(set_attr \"type\" \"call,call,call,call_no_delay_slot,call_no_delay_slot,call,call,call,call,call_no_delay_slot\")\n> +   (set_attr \"iscompact\" \"maybe,false,*,true,false,*,*,*,*,*\")\n> +   (set_attr \"predicable\" \"no,no,yes,no,no,yes,no,yes,no,yes\")\n> +   (set_attr \"length\" \"*,*,4,2,4,4,4,4,4,8\")])\n>  \n>  ; There is a bl_s instruction (16 bit opcode branch-and-link), but we can't\n>  ; use it for lack of inter-procedural branch shortening.\n> diff --git a/gcc/config/arc/constraints.md b/gcc/config/arc/constraints.md\n> index 7114e6e..3fed018 100644\n> --- a/gcc/config/arc/constraints.md\n> +++ b/gcc/config/arc/constraints.md\n> @@ -407,6 +407,13 @@\n>         (match_test \"TARGET_CODE_DENSITY\")\n>         (match_test \"arc_is_jli_call_p (op)\")))\n>  \n> +(define_constraint \"Csc\"\n> +  \"Secure call\"\n> +  (and (match_code \"symbol_ref\")\n> +       (match_test \"TARGET_CODE_DENSITY\")\n> +       (match_test \"TARGET_EM\")\n> +       (match_test \"arc_is_secure_call_p (op)\")))\n> +\n>  (define_constraint \"Cpc\"\n>    \"pc-relative constant\"\n>    (match_test \"arc_legitimate_pic_addr_p (op)\"))\n> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi\n> index 1e16d06..0f8ba05 100644\n> --- a/gcc/doc/extend.texi\n> +++ b/gcc/doc/extend.texi\n> @@ -3761,6 +3761,12 @@ Forces the particular function to be called using jli instruction.\n>  Identical like the above one, but the location of the function in the\n>  JLI table is known and given as an attribute parameter.\n>  \n> +@item secure_call\n> +@cindex @code{secure_call} function attribute, ARC\n> +This attribute allows one to mark secure-code functions that are\n> +callable from normal mode.  The location of the secure call function\n> +into the SJLI table needs to be passed as argument.\n> +\n>  @end table\n>  \n>  @node ARM Function Attributes\n> -- \n> 1.9.1\n>","headers":{"Return-Path":"<gcc-patches-return-471351-incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":["patchwork-incoming@bilbo.ozlabs.org","mailing list gcc-patches@gcc.gnu.org"],"Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org\n\t(client-ip=209.132.180.131; helo=sourceware.org;\n\tenvelope-from=gcc-patches-return-471351-incoming=patchwork.ozlabs.org@gcc.gnu.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org\n\theader.b=\"PqVQQSnF\"; dkim-atps=neutral","sourceware.org; auth=none"],"Received":["from sourceware.org (server1.sourceware.org [209.132.180.131])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3zLRVj0Wkbz9s7M\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 16 Jan 2018 21:37:16 +1100 (AEDT)","(qmail 126778 invoked by alias); 16 Jan 2018 10:37:08 -0000","(qmail 126752 invoked by uid 89); 16 Jan 2018 10:37:06 -0000","from mail-wm0-f44.google.com (HELO mail-wm0-f44.google.com)\n\t(74.125.82.44) by sourceware.org\n\t(qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP;\n\tTue, 16 Jan 2018 10:36:56 +0000","by mail-wm0-f44.google.com with SMTP id g1so7305616wmg.2 for\n\t<gcc-patches@gcc.gnu.org>; Tue, 16 Jan 2018 02:36:56 -0800 (PST)","from localhost ([194.153.2.136]) by smtp.gmail.com with ESMTPSA id\n\t187sm2401833wmu.19.2018.01.16.02.36.53 (version=TLS1_2\n\tcipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tTue, 16 Jan 2018 02:36:53 -0800 (PST)"],"DomainKey-Signature":"a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender:date\n\t:from:to:cc:subject:message-id:references:mime-version\n\t:content-type:in-reply-to; q=dns; s=default; b=kZd31wu2ev+W5lY/N\n\tUIGkiHb/4ygZcSFWVxj4VmMWyK8snaiMyKlZV/p2AZw+0mn5w/cUbDZQ/77R8MdN\n\tct9EG0Hpdi3CK0RMcN7K4Y8TbOe+T+B9EH3BbzBDH6pw7ZjUfcyPCbNHkAmpKiN8\n\tC/fCaATE6OBgF+nD5syDF23pHQ=","DKIM-Signature":"v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender:date\n\t:from:to:cc:subject:message-id:references:mime-version\n\t:content-type:in-reply-to; s=default; bh=jrUg1SZZQzaiEdKj4h7Bxfg\n\tChME=; b=PqVQQSnFVyHUjvTrrxfb0llThUToG3e6t6deId3HjXuta0+fNoGdND9\n\tTc/qxi22kLODhG5XIQ72uv0IwbHH3qdh2WfKEJxvPEf4xH9aMo/zX+3xFyy4n9vh\n\teCa9h+NKSkh83+ksLJ8jqciYDeB1HHDohESuj21rec8WFLBeqDNM=","Mailing-List":"contact gcc-patches-help@gcc.gnu.org; run by ezmlm","Precedence":"bulk","List-Id":"<gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<mailto:gcc-patches-unsubscribe-incoming=patchwork.ozlabs.org@gcc.gnu.org>","List-Archive":"<http://gcc.gnu.org/ml/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-help@gcc.gnu.org>","Sender":"gcc-patches-owner@gcc.gnu.org","X-Virus-Found":"No","X-Spam-SWARE-Status":"No, score=-23.1 required=5.0 tests=AWL, BAYES_00,\n\tGIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3,\n\tKAM_STOCKGEN, RCVD_IN_DNSWL_NONE,\n\tSPF_PASS autolearn=ham version=3.3.2 spammy=xstr, cpc","X-HELO":"mail-wm0-f44.google.com","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net;\n\ts=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:in-reply-to:user-agent;\n\tbh=Vm1wTD8F2+X4KM6Sa4zCkRbvoqU8OWxHjaF73qgUYxk=;\n\tb=Am7CyFuixlg9cMGwPxwrW9IID4tIsV5H1coL0lXh25JEZkO36z/KpAv1L0YCpfvWo3\n\tAv6TGE4s8PDZYJ1TJmE9v/7hDCdzeaXgrfZn2oEGL2yniGXAHf8ephK7793HSMpglaaS\n\tn425AwKfbX3QkJvijXTslNnRw51+ol4/NFqAzv+9mH8EKG58+fRmGiJWTZ0CjXQEQu+h\n\t/SEP9hQBo7JiRd4wBseAc34Tp+Mn6nzOEB+MCj9LQwY/dG8T80ocZgWzjd/oSgjckzom\n\tVbhAxSLQRugqfmXZBJAT0P60lBWTUwYE2EWEv2r01pvOBtfE/EMX2Ga0rudNzHiv/TxO\n\tEeaQ==","X-Gm-Message-State":"AKwxyte0dw175/owZW3uSJpnjv0SrNA2yQSargi83oUU5KDeMGbK0ABd\txTJ3S3rbZvRKZF3oI2brYFKF2A==","X-Google-Smtp-Source":"ACJfBosPdLQRD160efUEHWUlUNHqcov+JOYrQpL6h/U3N8g85+VsNs1tcQ5nqd6e8vU8cj5WjrVH/w==","X-Received":"by 10.28.107.65 with SMTP id g62mr12050668wmc.80.1516099014386;\n\tTue, 16 Jan 2018 02:36:54 -0800 (PST)","Date":"Tue, 16 Jan 2018 10:36:52 +0000","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.","Message-ID":"<20180116103652.GI2676@embecosm.com>","References":"<1509625835-22344-1-git-send-email-claziss@synopsys.com>\n\t<1509625835-22344-3-git-send-email-claziss@synopsys.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<1509625835-22344-3-git-send-email-claziss@synopsys.com>","X-Editor":"GNU Emacs [ http://www.gnu.org/software/emacs ]","User-Agent":"Mutt/1.9.1 (2017-09-22)","X-IsSubscribed":"yes"}}]