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,
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;
/* name not in hash table. */
if (!create_p)
- return (struct all_refs *)0;
+ return (struct all_refs *) 0;
ptr = (struct all_refs *) obstack_alloc (&half_pic_obstack, sizeof (struct all_refs));
*ptr = zero_all_refs;
ptr->real_len = len;
/* Update circular links. */
- if (first == (struct all_refs *)0)
+ if (first == (struct all_refs *) 0)
ptr->hash_next = ptr;
else
}
\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
return FALSE;
ptr = half_pic_hash (name, len, FALSE);
- if (ptr == (struct all_refs *)0)
+ if (ptr == (struct all_refs *) 0)
return FALSE;
if (ptr->external_p)
name = XSTR (operand, 0);
len = strlen (name);
p = half_pic_hash (name, len, FALSE);
- if (p == (struct all_refs *)0 || !p->external_p)
+ if (p == (struct all_refs *) 0 || !p->external_p)
return operand;
if (!p->pointer_p)