Patchwork Mark static const strings as read-only.

login
register
mail settings
Submitter Tom de Vries
Date Oct. 13, 2011, 9:56 a.m.
Message ID <4E96B5DA.4010004@mentor.com>
Download mbox | patch
Permalink /patch/119399/
State New
Headers show

Comments

Tom de Vries - Oct. 13, 2011, 9:56 a.m.
On 10/12/2011 10:13 AM, Tom de Vries wrote:
> On 10/10/2011 05:50 PM, Eric Botcazou wrote:
>>> So, the patch for build_constant_desc does not have the desired effect.
>>
>> OK, too bad that we need to play this back-and-forth game with MEMs.  So the 
>> original patch is OK (with TREE_READONLY (base) on the next line to mimic what 
>> is done just above and without the gcc/ prefix in the ChangeLog).  If you have 
>> some available cycles, you can test and install the build_constant_desc change 
>> in the same commit, otherwise I'll do it myself.
>>
> 
> I'll include the build_constant_desc change in a bootstrap/reg-test on x86_64.
> 
> Thanks,
> - Tom

No problems found in bootstrap/reg-test on x86_64. Committed.

Thanks,
- Tom

2011-10-13  Tom de Vries  <tom@codesourcery.com>

	* emit-rtl.c (set_mem_attributes_minus_bitpos): Set MEM_READONLY_P
	for static const strings.
	* varasm.c (build_constant_desc): Generate the memory location of the
	constant using gen_const_mem.

	* gcc.dg/memcpy-4.c: New test.

Patch

Index: gcc/emit-rtl.c
===================================================================
--- gcc/emit-rtl.c (revision 179773)
+++ gcc/emit-rtl.c (working copy)
@@ -1696,6 +1696,12 @@  set_mem_attributes_minus_bitpos (rtx ref
 	  && !TREE_THIS_VOLATILE (base))
 	MEM_READONLY_P (ref) = 1;
 
+      /* Mark static const strings readonly as well.  */
+      if (base && TREE_CODE (base) == STRING_CST
+	  && TREE_READONLY (base)
+	  && TREE_STATIC (base))
+	MEM_READONLY_P (ref) = 1;
+
       /* If this expression uses it's parent's alias set, mark it such
 	 that we won't change it.  */
       if (component_uses_parent_alias_set (t))
Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c (revision 179773)
+++ gcc/varasm.c (working copy)
@@ -3119,7 +3119,7 @@  build_constant_desc (tree exp)
   SET_SYMBOL_REF_DECL (symbol, decl);
   TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
 
-  rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
+  rtl = gen_const_mem (TYPE_MODE (TREE_TYPE (exp)), symbol);
   set_mem_attributes (rtl, exp, 1);
   set_mem_alias_set (rtl, 0);
   set_mem_alias_set (rtl, const_alias_set);
Index: gcc/testsuite/gcc.dg/memcpy-4.c
===================================================================
--- /dev/null (new file)
+++ gcc/testsuite/gcc.dg/memcpy-4.c (revision 0)
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-rtl-expand" } */
+
+void
+f1 (char *p)
+{
+  __builtin_memcpy (p, "123", 3);
+}
+
+/* { dg-final { scan-rtl-dump-times "mem/s/u" 3 "expand" { target mips*-*-* } } } */
+/* { dg-final { cleanup-rtl-dump "expand" } } */