/* 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
#include "tree.h"
#include "rtl.h"
#include <stdio.h>
-#include <string.h>
#include "obstack.h"
#define obstack_chunk_alloc xmalloc
extern void assemble_name ();
extern void output_addr_const ();
-int flag_half_pic; /* Global half-pic flag. */
+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;
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);
#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
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;
}
p->pointer_p = TRUE;
half_pic_names = p;
+ half_pic_number_ptrs++;
}
+ half_pic_number_refs++;
return gen_rtx (SYMBOL_REF, Pmode, p->ref_name);
}