diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/halfpic.c | 95 | ||||
-rw-r--r-- | gcc/halfpic.h | 31 |
2 files changed, 126 insertions, 0 deletions
diff --git a/gcc/halfpic.c b/gcc/halfpic.c new file mode 100644 index 0000000..9b75ebb --- /dev/null +++ b/gcc/halfpic.c @@ -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. */ + + +/* Do any half-pic initializations. */ + +void +half_pic_init () +{ + flag_half_pic = TRUE; +} + + +/* 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 +} + + +/* 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 index 0000000..3dd3091 --- /dev/null +++ b/gcc/halfpic.h @@ -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)) |