OSDN Git Service

(AIX4): More robust release numbering discovery.
[pf3gnuchains/gcc-fork.git] / gcc / halfpic.c
index 817dc21..d4ae36e 100644 (file)
@@ -15,12 +15,13 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 /* The OSF/rose half-pic model assumes that the non-library code does
    not need to have full PIC (position independent code), but rather,
    that pointers to external references are put into the data section
-   and derefenced as normal pointers.  References to static data does
+   and dereferenced as normal pointers.  References to static data does
    not need to be PIC-ized.
 
    Another optimization is to have the compiler know what symbols are
@@ -34,7 +35,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "tree.h"
 #include "rtl.h"
 #include <stdio.h>
-#include <string.h>
 #include "obstack.h"
 
 #define obstack_chunk_alloc xmalloc
@@ -46,9 +46,10 @@ extern rtx eliminate_constant_term ();
 extern void assemble_name ();
 extern void output_addr_const ();
 
-int flag_half_pic;             /* Global half-pic flag.  */
-int half_pic_number_ptrs;      /* # distinct pointers found */
-int half_pic_number_refs;      /* # half-pic references */
+int flag_half_pic              = 0;    /* Global half-pic flag.  */
+int half_pic_number_ptrs       = 0;    /* # distinct pointers found */
+int half_pic_number_refs       = 0;    /* # half-pic references */
+int (*ptr_half_pic_address_p)() = half_pic_address_p;
 
 /* Obstack to hold generated pic names.  */
 static struct obstack half_pic_obstack;
@@ -209,14 +210,26 @@ half_pic_encode (decl)
   if (code != VAR_DECL && code != FUNCTION_DECL)
     return;
 
-  /* If this is not an external reference, it can't be half-pic.  */
-  if (!TREE_EXTERNAL (decl))
-    return;
-
   asm_name = DECL_ASSEMBLER_NAME (decl);
+
   if (!asm_name)
     return;
 
+#ifdef HALF_PIC_DEBUG
+  if (HALF_PIC_DEBUG)
+    {
+      if (HALF_PIC_DEBUG)
+       fprintf (stderr, "\n========== Half_pic_encode %.*s\n",
+                IDENTIFIER_LENGTH (asm_name),
+                IDENTIFIER_POINTER (asm_name));
+      debug_tree (decl);
+    }
+#endif
+
+  /* If this is not an external reference, it can't be half-pic.  */
+  if (!DECL_EXTERNAL (decl) && (code != VAR_DECL || !TREE_PUBLIC (decl)))
+    return;
+
   ptr = half_pic_hash (IDENTIFIER_POINTER (asm_name),
                       IDENTIFIER_LENGTH (asm_name),
                       TRUE);
@@ -225,7 +238,7 @@ half_pic_encode (decl)
 
 #ifdef HALF_PIC_DEBUG
   if (HALF_PIC_DEBUG)
-    fprintf (stderr, "\n========== Half_pic_encode %.*s\n",
+    fprintf (stderr, "\n%.*s is half-pic\n",
             IDENTIFIER_LENGTH (asm_name),
             IDENTIFIER_POINTER (asm_name));
 #endif
@@ -256,6 +269,30 @@ half_pic_declare (name)
 }
 
 \f
+/* Mark that an object is explicitly external.  */
+
+void
+half_pic_external (name)
+     char *name;
+{
+  struct all_refs *ptr;
+
+  if (!flag_half_pic)
+    return;
+
+  ptr = half_pic_hash (name, 0, TRUE);
+  if (!ptr)
+    return;
+
+  ptr->external_p = TRUE;
+
+#ifdef HALF_PIC_DEBUG
+  if (HALF_PIC_DEBUG)
+    fprintf (stderr, "\n========== Half_pic_external %s\n", name);
+#endif
+}
+
+\f
 /* Return whether an address is half-pic.  */
 
 int
@@ -277,7 +314,7 @@ half_pic_address_p (addr)
     case CONST:
       {
        rtx offset = const0_rtx;
-       addr = eliminate_constant_term (addr, &offset);
+       addr = eliminate_constant_term (XEXP (addr, 0), &offset);
        if (GET_CODE (addr) != SYMBOL_REF)
          return FALSE;
       }