diff mbox

PR rtl-optimization/32219: optimizer causees wrong code in pic/hidden/weak symbol checking

Message ID CAMe9rOrzZdRx31rXyBKBDvcWvoDuC2ZKib6o=EW984prxq8=CQ@mail.gmail.com
State New
Headers show

Commit Message

H.J. Lu Feb. 12, 2015, 11:04 p.m. UTC
On Thu, Feb 12, 2015 at 11:25 AM, Richard Henderson <rth@redhat.com> wrote:
> On 02/12/2015 10:58 AM, H.J. Lu wrote:
>>    if (DECL_VISIBILITY_SPECIFIED (exp)
>> +      && (resolved_locally
>> +       || !flag_pic
>
> Yes, this essentially goes back to your original patch, which I claim still
> conflates issues.
>
> In particular, I believe mentioning flag_pic here is a serious error.
>
> There are two problems that I see so far,
>
>  (1) node->definition isn't set for this symbol.  This is because you
>      only fixed varpool_node::finalize_decl, and not
>      cgraph_node::finalize_function.
>
>  (2) The weak test should probably be split into two pieces, like the
>      visibility test: exclude undefined weak, include specified visibility,
>      exclude non-dominant weak, exclude external, include implied visibility.
>

How about this patch?
diff mbox

Patch

From 3b516badec25151acd4a96fa4ef07b3f88e3f053 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 12 Feb 2015 10:55:55 -0800
Subject: [PATCH] A variable is local if specified by user

And it is resolved or defined locally, not compiling for PIC or not weak.
---
 gcc/varasm.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/gcc/varasm.c b/gcc/varasm.c
index 9f79416..b14f2d3 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -6838,15 +6838,21 @@  default_binds_local_p_2 (const_tree exp, bool shlib, bool weak_dominate)
 	resolved_locally = true;
     }
 
-  /* Undefined (or non-dominant) weak symbols are not defined locally.  */
-  if (DECL_WEAK (exp) && !resolved_locally)
-    return false;
-
-  /* A variable is local if the user has said explicitly that it will be.  */
+  /* A variable is local if the user has said explicitly that it will
+     be and it is resolved or defined locally, not compiling for PIC or
+     not weak.  */
   if (DECL_VISIBILITY_SPECIFIED (exp)
+      && (resolved_locally
+	  || !flag_pic
+	  || !DECL_EXTERNAL (exp)
+	  || !DECL_WEAK (exp))
       && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
     return true;
 
+  /* Undefined (or non-dominant) weak symbols are not defined locally.  */
+  if (DECL_WEAK (exp) && !resolved_locally)
+    return false;
+
   /* Variables defined outside this object might not be local.  */
   if (DECL_EXTERNAL (exp) && !resolved_locally)
     return false;
-- 
1.9.3