Initial revision
authorMichael Meissner <meissner@gcc.gnu.org>
Fri, 21 Feb 1992 21:46:21 +0000 (21:46 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Fri, 21 Feb 1992 21:46:21 +0000 (21:46 +0000)
From-SVN: r354

gcc/halfpic.c [new file with mode: 0644]
gcc/halfpic.h [new file with mode: 0644]

diff --git a/gcc/halfpic.c b/gcc/halfpic.c
new file mode 100644 (file)
index 0000000..9b75ebb
--- /dev/null
@@ -0,0 +1,95 @@
+/* OSF/rose half-pic support functions.
+   Copyright (C) 1992 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+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 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
+   not need to be PIC-ized.
+
+   Another optimization is to have the compiler know what symbols are
+   in the shared libraries, and to only lay down the pointers to
+   things which in the library proper.  */
+
+#include "config.h"
+
+#ifdef HALF_PIC_INIT
+
+#include "tree.h"
+#include "rtl.h"
+#include <stdio.h>
+
+extern rtx eliminate_constant_term ();
+
+int flag_half_pic;             /* Global half-pic flag.  */
+
+\f
+/* Do any half-pic initializations.  */
+
+void
+half_pic_init ()
+{
+  flag_half_pic = TRUE;
+}
+
+\f
+/* Encode in a declaration whether or not it is half-pic.  */
+
+void
+half_pic_encode (decl)
+     tree decl;
+{
+#if 0
+  fprintf (stderr, "\n========== Half_pic_encode\n");
+  debug_tree (decl);
+#endif
+}
+
+\f
+/* Return whether an address is half-pic.  */
+
+int
+half_pic_address_p (addr)
+     rtx addr;
+{
+  int offset;
+  char *name;
+
+  switch (GET_CODE (addr))
+    {
+    case CONST:
+      offset = 0;
+      addr = eliminate_constant_term (addr, &offset);
+      if (GET_CODE (addr) != SYMBOL_REF)
+       return FALSE;
+       
+      /* fall through */
+
+    case SYMBOL_REF:
+      name = XSTR (addr, 0);
+
+      /* If this is a label, it will have a '*' in front of it.  */
+      if (name[0] == '*')
+       return FALSE;
+    }
+
+  return FALSE;
+}
+
+#endif /* HALF_PIC_INIT */
diff --git a/gcc/halfpic.h b/gcc/halfpic.h
new file mode 100644 (file)
index 0000000..3dd3091
--- /dev/null
@@ -0,0 +1,31 @@
+/* OSF/rose half-pic support definitions.
+   Copyright (C) 1992 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+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.  */
+
+extern int flag_half_pic;              /* Global half-pic flag.  */
+extern void half_pic_encode ();                /* encode whether half-pic */
+extern void half_pic_init ();          /* half_pic initialization */
+extern int half_pic_address_p ();      /* true if an address is half-pic */
+
+/* Macros to provide access to the half-pic stuff (so they can easily
+   be stubbed out.  */
+
+#define HALF_PIC_P()           (flag_half_pic)
+#define HALF_PIC_ENCODE(DECL)  half_pic_encode (DECL)
+#define HALF_PIC_INIT()                half_pic_init ()
+#define HALF_PIC_ADDRESS_P(X)  (flag_half_pic && half_pic_address_p (X))