toplev.c: Remove half-pic.
2002-06-05 Eric Christopher <echristo@redhat.com> * toplev.c: Remove half-pic. * config/mips/mips.c: Ditto. * config/mips/mips.h: Ditto. Remove unused defines. * config/mips/openbsd.h: Update comment to reflect above. * config/mips/mips.md: Remove half-pic constraints. * halfpic.h: Delete. * halfpic.c: Ditto. From-SVN: r54296
This commit is contained in:
parent
5d3dfc3ac1
commit
3300516226
|
@ -1,8 +1,18 @@
|
|||
2002-06-05 Eric Christopher <echristo@redhat.com>
|
||||
|
||||
* toplev.c: Remove half-pic.
|
||||
* config/mips/mips.c: Ditto.
|
||||
* config/mips/mips.h: Ditto. Remove unused defines.
|
||||
* config/mips/openbsd.h: Update comment to reflect above.
|
||||
* config/mips/mips.md: Remove half-pic constraints.
|
||||
* halfpic.h: Delete.
|
||||
* halfpic.c: Ditto.
|
||||
|
||||
2002-06-05 Jeffrey Law <law@redhat.com>
|
||||
|
||||
* pa.h (EXTRA_CONSTRAINT, T case): Further refine so that it
|
||||
rejects (mem (lo_sum (reg) (unspec))), but will allow
|
||||
(mem (lo_sum (reg) (symbol_ref)) for PA2.0.
|
||||
(mem (lo_sum (reg) (symbol_ref)) for PA2.0.
|
||||
|
||||
2002-06-05 Neil Booth <neil@daikokuya.demon.co.uk>
|
||||
|
||||
|
@ -52,7 +62,7 @@ Wed Jun 5 20:42:31 2002 J"orn Rennecke <joern.rennecke@superh.com>
|
|||
(diagnostic_set_info): Declare.
|
||||
|
||||
* diagnostic.c (report_problematic_module): Rename to
|
||||
diagnostic_repor_current_module.
|
||||
diagnostic_repor_current_module.
|
||||
(set_diagnostic_context): Remove.
|
||||
(count_error): Rename to diagnostic_error_count.
|
||||
(error_function_changed): Remove.
|
||||
|
@ -215,7 +225,7 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
2002-06-03 Geoffrey Keating <geoffk@redhat.com>
|
||||
|
||||
Merge from pch-branch:
|
||||
|
||||
|
||||
* gengtype.h (UNION_OR_STRUCT_P): New macro.
|
||||
* gengtype.c (write_gc_structure_fields): Use it.
|
||||
(write_gc_root): Use it here too.
|
||||
|
@ -362,7 +372,7 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
outside ifdefs.
|
||||
(incomplete_types): Likewise.
|
||||
(decl_scope_table): Likewise.
|
||||
(dwarf2out_init): Don't call ggc_add_tree_varray_root.
|
||||
(dwarf2out_init): Don't call ggc_add_tree_varray_root.
|
||||
* cfglayout.c (scope_to_insns_finalize): Don't use VARRAY_FREE.
|
||||
* c-tree.h (struct lang_type): Update for change to length specifier.
|
||||
* c-parse.in (yylexstring): Don't use VARRAY_FREE.
|
||||
|
@ -436,7 +446,7 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
to list of includes.
|
||||
|
||||
* gengtype.c (write_gc_marker_routine_for_structure): Name
|
||||
the routines 'gt_ggc_mx_*' instead of 'gt_ggc_m_*'.
|
||||
the routines 'gt_ggc_mx_*' instead of 'gt_ggc_m_*'.
|
||||
(write_gc_types): Arrange for the tests with NULL to be inlined.
|
||||
(write_gc_roots): Update uses of procedure pointers.
|
||||
* ggc-common.c (gt_ggc_mx_rtx_def): Rename from gt_ggc_m_rtx_def.
|
||||
|
@ -579,7 +589,7 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
* c-tree.h (struct lang_identifier): Use gengtype.
|
||||
(union lang_tree_node): New.
|
||||
(c_mark_tree): Delete prototype.
|
||||
* dwarf2out.c [!DWARF2_DEBUGGING_INFO]: Define dummy
|
||||
* dwarf2out.c [!DWARF2_DEBUGGING_INFO]: Define dummy
|
||||
dwarf2_debug_hooks.
|
||||
* gengtype-lex.l (IWORD): Allow 'bool'.
|
||||
(ptr_alias): Match.
|
||||
|
@ -664,7 +674,7 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
* config/d30v/d30v.c (d30v_init_expanders): Likewise.
|
||||
* config/arm/arm.c (arm_init_expanders): Likewise.
|
||||
* config/alpha/alpha.c (override_options): Likewise.
|
||||
* gengtype.h (enum gc_used_enum): Add GC_MAYBE_POINTED_TO.
|
||||
* gengtype.h (enum gc_used_enum): Add GC_MAYBE_POINTED_TO.
|
||||
* gengtype.c (set_gc_used_type): Handle 'maybe_null' option.
|
||||
(write_gc_structure_fields): Don't handle 'really' option.
|
||||
Handle 'maybe_null' option.
|
||||
|
@ -985,7 +995,7 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
* tree.c: Use gengtype for roots.
|
||||
* tree.h: Use gengtype for roots.
|
||||
* varasm.c: Use gengtype for roots.
|
||||
|
||||
|
||||
* Makefile.in (GTFILES): Add @all_gtfiles@.
|
||||
* configure: Regenerate.
|
||||
* configure.in: Construct all_gtfiles from the gtfiles definitions
|
||||
|
@ -1031,10 +1041,10 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
* config/arm/arm.c (arm_mark_machine_status): Delete.
|
||||
(arm_init_machine_status): Update calling sequence.
|
||||
(arm_init_expanders): Use canonical name for arm_mark_machine_status.
|
||||
* config/cris/cris.c (cris_init_machine_status): Update
|
||||
* config/cris/cris.c (cris_init_machine_status): Update
|
||||
calling sequence.
|
||||
* config/d30v/d30v.h (struct machine_function): Use gengtype.
|
||||
* config/d30v/d30v.c (d30v_init_machine_status): Update
|
||||
* config/d30v/d30v.c (d30v_init_machine_status): Update
|
||||
calling sequence.
|
||||
(d30v_mark_machine_status): Delete.
|
||||
* config/i386/i386.c: Include gt-i386.h.
|
||||
|
@ -1043,12 +1053,12 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
(ix86_mark_machine_status): Delete.
|
||||
(override_options): Use canonical namke for ix86_mark_machine_status.
|
||||
* config/ia64/ia64.h (struct machine_function): Use gengtype.
|
||||
* config/ia64/ia64.c (ia64_init_machine_status): Update calling
|
||||
* config/ia64/ia64.c (ia64_init_machine_status): Update calling
|
||||
sequence.
|
||||
(ia64_mark_machine_status): Delete.
|
||||
(ia64_override_options): Use canonical name for
|
||||
(ia64_override_options): Use canonical name for
|
||||
ia64_mark_machine_status.
|
||||
* config/mmix/mmix.c (mmix_init_machine_status): Update calling
|
||||
* config/mmix/mmix.c (mmix_init_machine_status): Update calling
|
||||
sequence.
|
||||
* config/rs6000/rs6000.c (rs6000_init_machine_status): Likewise.
|
||||
* config/xtensa/xtensa.c (xtensa_init_machine_status): Likewise.
|
||||
|
@ -1191,7 +1201,7 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
Document that the machine_function structures must be allocated
|
||||
using GC. Update mark_machine_status documentation.
|
||||
* function.h: Don't declare free_machine_status.
|
||||
* function.c (free_machine_status): Don't define.
|
||||
* function.c (free_machine_status): Don't define.
|
||||
(free_after_compilation): Don't call free_machine_status.
|
||||
(ggc_mark_struct_function): Mark f->machine. Call
|
||||
mark_machine_status only on non-NULL pointers.
|
||||
|
@ -1388,7 +1398,7 @@ Tue Jun 4 19:29:42 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
|
||||
2002-06-03 Gabriel Dos Reis <gdr@codesourcery.com>
|
||||
|
||||
* diagnostic.h (diagnostic_count): Move from output_buffer to
|
||||
* diagnostic.h (diagnostic_count): Move from output_buffer to
|
||||
diagnostic_context.
|
||||
(diagnostic_kind_count): Adjust definition.
|
||||
|
||||
|
@ -1555,7 +1565,7 @@ config/h8300:
|
|||
2002-06-02 Gabriel Dos Reis <gdr@codesourcery.com>
|
||||
|
||||
* diagnostic.h (struct diagnostic_context): Add new member
|
||||
internal_error.
|
||||
internal_error.
|
||||
(internal_error_function): Remove declaration.
|
||||
* diagnostic.c (internal_error_function): Remove definition..
|
||||
(internal_error): Adjust use.
|
||||
|
@ -1641,7 +1651,7 @@ Sat Jun 1 23:29:51 CEST 2002 Jan Hubicka <jh@suse.cz>
|
|||
2002-06-01 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
* tree-inline.c (expand_call_inline): Make the statement
|
||||
expression we generate have a COMPOUND_STMT.
|
||||
expression we generate have a COMPOUND_STMT.
|
||||
|
||||
2002-06-01 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
|
|
|
@ -54,10 +54,6 @@ Boston, MA 02111-1307, USA. */
|
|||
#include "target.h"
|
||||
#include "target-def.h"
|
||||
|
||||
#ifdef HALF_PIC_DEBUG
|
||||
#include "halfpic.h"
|
||||
#endif
|
||||
|
||||
#ifdef __GNU_STAB__
|
||||
#define STAB_CODE_TYPE enum __stab_debug_code
|
||||
#else
|
||||
|
@ -272,10 +268,6 @@ rtx branch_cmp[2];
|
|||
/* what type of branch to use */
|
||||
enum cmp_type branch_type;
|
||||
|
||||
/* Number of previously seen half-pic pointers and references. */
|
||||
static int prev_half_pic_ptrs = 0;
|
||||
static int prev_half_pic_refs = 0;
|
||||
|
||||
/* The target cpu for code generation. */
|
||||
enum processor_type mips_arch;
|
||||
|
||||
|
@ -2277,46 +2269,10 @@ mips_move_1word (operands, insn, unsignedp)
|
|||
|
||||
else if (code1 == SYMBOL_REF || code1 == CONST)
|
||||
{
|
||||
if (HALF_PIC_P () && CONSTANT_P (op1) && HALF_PIC_ADDRESS_P (op1))
|
||||
{
|
||||
rtx offset = const0_rtx;
|
||||
|
||||
if (GET_CODE (op1) == CONST)
|
||||
op1 = eliminate_constant_term (XEXP (op1, 0), &offset);
|
||||
|
||||
if (GET_CODE (op1) == SYMBOL_REF)
|
||||
{
|
||||
operands[2] = HALF_PIC_PTR (op1);
|
||||
|
||||
if (TARGET_STATS)
|
||||
mips_count_memory_refs (operands[2], 1);
|
||||
|
||||
if (INTVAL (offset) == 0)
|
||||
{
|
||||
delay = DELAY_LOAD;
|
||||
ret = (unsignedp && TARGET_64BIT
|
||||
? "lwu\t%0,%2"
|
||||
: "lw\t%0,%2");
|
||||
}
|
||||
else
|
||||
{
|
||||
dslots_load_total++;
|
||||
operands[3] = offset;
|
||||
if (unsignedp && TARGET_64BIT)
|
||||
ret = (SMALL_INT (offset)
|
||||
? "lwu\t%0,%2%#\n\tadd\t%0,%0,%3"
|
||||
: "lwu\t%0,%2%#\n\t%[li\t%@,%3\n\tadd\t%0,%0,%@%]");
|
||||
else
|
||||
ret = (SMALL_INT (offset)
|
||||
? "lw\t%0,%2%#\n\tadd\t%0,%0,%3"
|
||||
: "lw\t%0,%2%#\n\t%[li\t%@,%3\n\tadd\t%0,%0,%@%]");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (TARGET_MIPS16
|
||||
&& code1 == CONST
|
||||
&& GET_CODE (XEXP (op1, 0)) == REG
|
||||
&& REGNO (XEXP (op1, 0)) == GP_REG_FIRST + 28)
|
||||
if (TARGET_MIPS16
|
||||
&& code1 == CONST
|
||||
&& GET_CODE (XEXP (op1, 0)) == REG
|
||||
&& REGNO (XEXP (op1, 0)) == GP_REG_FIRST + 28)
|
||||
{
|
||||
/* This case arises on the mips16; see
|
||||
mips16_gp_pseudo_reg. */
|
||||
|
@ -5203,10 +5159,6 @@ override_options ()
|
|||
if (mips_abi != ABI_32 && mips_abi != ABI_O64)
|
||||
flag_pcc_struct_return = 0;
|
||||
|
||||
/* Tell halfpic.c that we have half-pic code if we do. */
|
||||
if (TARGET_HALF_PIC)
|
||||
HALF_PIC_INIT ();
|
||||
|
||||
/* -fpic (-KPIC) is the default when TARGET_ABICALLS is defined. We need
|
||||
to set flag_pic so that the LEGITIMATE_PIC_OPERAND_P macro will work. */
|
||||
/* ??? -non_shared turns off pic code generation, but this is not
|
||||
|
@ -6369,11 +6321,6 @@ mips_asm_file_end (file)
|
|||
tree name_tree;
|
||||
struct extern_list *p;
|
||||
|
||||
if (HALF_PIC_P ())
|
||||
{
|
||||
HALF_PIC_FINISH (file);
|
||||
}
|
||||
|
||||
if (extern_head)
|
||||
{
|
||||
fputs ("\n", file);
|
||||
|
@ -7614,20 +7561,6 @@ mips_output_function_epilogue (file, size)
|
|||
dslots_jump_total, dslots_jump_filled,
|
||||
num_refs[0], num_refs[1], num_refs[2]);
|
||||
|
||||
if (HALF_PIC_NUMBER_PTRS > prev_half_pic_ptrs)
|
||||
{
|
||||
fprintf (stderr,
|
||||
" half-pic=%3d", HALF_PIC_NUMBER_PTRS - prev_half_pic_ptrs);
|
||||
prev_half_pic_ptrs = HALF_PIC_NUMBER_PTRS;
|
||||
}
|
||||
|
||||
if (HALF_PIC_NUMBER_REFS > prev_half_pic_refs)
|
||||
{
|
||||
fprintf (stderr,
|
||||
" pic-ref=%3d", HALF_PIC_NUMBER_REFS - prev_half_pic_refs);
|
||||
prev_half_pic_refs = HALF_PIC_NUMBER_REFS;
|
||||
}
|
||||
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
|
||||
|
@ -8085,11 +8018,6 @@ mips_encode_section_info (decl, first)
|
|||
SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
|
||||
}
|
||||
|
||||
else if (HALF_PIC_P ())
|
||||
{
|
||||
if (first)
|
||||
HALF_PIC_ENCODE (decl);
|
||||
}
|
||||
}
|
||||
|
||||
/* Return register to use for a function return value with VALTYPE for
|
||||
|
|
|
@ -172,20 +172,6 @@ extern int mips_string_length; /* length of strings for mips16 */
|
|||
extern void sdata_section PARAMS ((void));
|
||||
extern void sbss_section PARAMS ((void));
|
||||
|
||||
/* Stubs for half-pic support if not OSF/1 reference platform. */
|
||||
|
||||
#ifndef HALF_PIC_P
|
||||
#define HALF_PIC_P() 0
|
||||
#define HALF_PIC_NUMBER_PTRS 0
|
||||
#define HALF_PIC_NUMBER_REFS 0
|
||||
#define HALF_PIC_ENCODE(DECL)
|
||||
#define HALF_PIC_DECLARE(NAME)
|
||||
#define HALF_PIC_INIT() error ("half-pic init called on systems that don't support it")
|
||||
#define HALF_PIC_ADDRESS_P(X) 0
|
||||
#define HALF_PIC_PTR(X) X
|
||||
#define HALF_PIC_FINISH(STREAM)
|
||||
#endif
|
||||
|
||||
/* Macros to silence warnings about numbers being signed in traditional
|
||||
C and unsigned in ISO C when compiled on 32-bit hosts. */
|
||||
|
||||
|
@ -210,7 +196,7 @@ extern void sbss_section PARAMS ((void));
|
|||
#define MASK_SOFT_FLOAT 0x00000100 /* software floating point */
|
||||
#define MASK_FLOAT64 0x00000200 /* fp registers are 64 bits */
|
||||
#define MASK_ABICALLS 0x00000400 /* emit .abicalls/.cprestore/.cpload */
|
||||
#define MASK_HALF_PIC 0x00000800 /* Emit OSF-style pic refs to externs*/
|
||||
#define MASK_UNUSED1 0x00000800 /* Unused Mask. */
|
||||
#define MASK_LONG_CALLS 0x00001000 /* Always call through a register */
|
||||
#define MASK_64BIT 0x00002000 /* Use 64 bit GP registers and insns */
|
||||
#define MASK_EMBEDDED_PIC 0x00004000 /* Generate embedded PIC code */
|
||||
|
@ -285,9 +271,6 @@ extern void sbss_section PARAMS ((void));
|
|||
/* .abicalls, etc from Pyramid V.4 */
|
||||
#define TARGET_ABICALLS (target_flags & MASK_ABICALLS)
|
||||
|
||||
/* OSF pic references to externs */
|
||||
#define TARGET_HALF_PIC (target_flags & MASK_HALF_PIC)
|
||||
|
||||
/* software floating point */
|
||||
#define TARGET_SOFT_FLOAT (target_flags & MASK_SOFT_FLOAT)
|
||||
#define TARGET_HARD_FLOAT (! TARGET_SOFT_FLOAT)
|
||||
|
@ -417,10 +400,6 @@ extern void sbss_section PARAMS ((void));
|
|||
N_("Use Irix PIC")}, \
|
||||
{"no-abicalls", -MASK_ABICALLS, \
|
||||
N_("Don't use Irix PIC")}, \
|
||||
{"half-pic", MASK_HALF_PIC, \
|
||||
N_("Use OSF PIC")}, \
|
||||
{"no-half-pic", -MASK_HALF_PIC, \
|
||||
N_("Don't use OSF PIC")}, \
|
||||
{"long-calls", MASK_LONG_CALLS, \
|
||||
N_("Use indirect calls")}, \
|
||||
{"no-long-calls", -MASK_LONG_CALLS, \
|
||||
|
@ -506,11 +485,7 @@ extern void sbss_section PARAMS ((void));
|
|||
#endif
|
||||
|
||||
#ifndef TARGET_ENDIAN_DEFAULT
|
||||
#ifndef DECSTATION
|
||||
#define TARGET_ENDIAN_DEFAULT MASK_BIG_ENDIAN
|
||||
#else
|
||||
#define TARGET_ENDIAN_DEFAULT 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef MIPS_ISA_DEFAULT
|
||||
|
@ -780,35 +755,6 @@ while (0)
|
|||
/* Show we can debug even without a frame pointer. */
|
||||
#define CAN_DEBUG_WITHOUT_FP
|
||||
|
||||
/* Complain about missing specs and predefines that should be defined in each
|
||||
of the target tm files to override the defaults. This is mostly a place-
|
||||
holder until I can get each of the files updated [mm]. */
|
||||
|
||||
#if defined(OSF_OS) \
|
||||
|| defined(DECSTATION) \
|
||||
|| defined(SGI_TARGET) \
|
||||
|| defined(MIPS_NEWS) \
|
||||
|| defined(MIPS_SYSV) \
|
||||
|| defined(MIPS_SVR4) \
|
||||
|| defined(MIPS_BSD43)
|
||||
|
||||
#ifndef CPP_PREDEFINES
|
||||
#error "Define CPP_PREDEFINES in the appropriate tm.h file"
|
||||
#endif
|
||||
|
||||
#ifndef LIB_SPEC
|
||||
#error "Define LIB_SPEC in the appropriate tm.h file"
|
||||
#endif
|
||||
|
||||
#ifndef STARTFILE_SPEC
|
||||
#error "Define STARTFILE_SPEC in the appropriate tm.h file"
|
||||
#endif
|
||||
|
||||
#ifndef MACHINE_TYPE
|
||||
#error "Define MACHINE_TYPE in the appropriate tm.h file"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Tell collect what flags to pass to nm. */
|
||||
#ifndef NM_FLAGS
|
||||
#define NM_FLAGS "-Bn"
|
||||
|
@ -1001,10 +947,6 @@ extern int mips_abi;
|
|||
%{mint64|mlong64|mlong32:-mexplicit-type-size }\
|
||||
%{mgp32: %{mfp64:%emay not use both -mgp32 and -mfp64} %{!mfp32: -mfp32}} \
|
||||
%{G*} %{EB:-meb} %{EL:-mel} %{EB:%{EL:%emay not use both -EB and -EL}} \
|
||||
%{pic-none: -mno-half-pic} \
|
||||
%{pic-lib: -mhalf-pic} \
|
||||
%{pic-extern: -mhalf-pic} \
|
||||
%{pic-calls: -mhalf-pic} \
|
||||
%{save-temps: } \
|
||||
%(subtarget_cc1_spec) \
|
||||
%(cc1_cpu_spec)"
|
||||
|
@ -2234,7 +2176,6 @@ extern enum reg_class mips_char_to_class[256];
|
|||
|
||||
`Q' is for mips16 GP relative constants
|
||||
`R' is for memory references which take 1 word for the instruction.
|
||||
`S' is for references to extern items which are PIC for OSF/rose.
|
||||
`T' is for memory addresses that can be used to load two words. */
|
||||
|
||||
#define EXTRA_CONSTRAINT(OP,CODE) \
|
||||
|
@ -2243,8 +2184,6 @@ extern enum reg_class mips_char_to_class[256];
|
|||
&& mips16_gp_offset_p (OP)) \
|
||||
: (GET_CODE (OP) != MEM) ? FALSE \
|
||||
: ((CODE) == 'R') ? simple_memory_operand (OP, GET_MODE (OP)) \
|
||||
: ((CODE) == 'S') ? (HALF_PIC_P () && CONSTANT_P (OP) \
|
||||
&& HALF_PIC_ADDRESS_P (OP)) \
|
||||
: FALSE)
|
||||
|
||||
/* Given an rtx X being reloaded into a reg required to be
|
||||
|
@ -3092,14 +3031,13 @@ typedef struct mips_args {
|
|||
`la $5,s;sw $4,70000($5)' via LEGITIMIZE_ADDRESS. */
|
||||
/* ??? SGI Irix 6 assembler fails for CONST address, so reject them. */
|
||||
#define CONSTANT_ADDRESS_P(X) \
|
||||
((GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
|
||||
(GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
|
||||
|| GET_CODE (X) == CONST_INT || GET_CODE (X) == HIGH \
|
||||
|| (GET_CODE (X) == CONST \
|
||||
&& ! (flag_pic && pic_address_needs_scratch (X)) \
|
||||
&& (mips_abi == ABI_32 \
|
||||
|| mips_abi == ABI_O64 \
|
||||
|| mips_abi == ABI_EABI))) \
|
||||
&& (!HALF_PIC_P () || !HALF_PIC_ADDRESS_P (X)))
|
||||
|| mips_abi == ABI_EABI)))
|
||||
|
||||
/* Define this, so that when PIC, reload won't try to reload invalid
|
||||
addresses which require two reload registers. */
|
||||
|
@ -3354,13 +3292,6 @@ typedef struct mips_args {
|
|||
|
||||
#define FUNCTION_MODE (Pmode == DImode ? DImode : SImode)
|
||||
|
||||
/* Define TARGET_MEM_FUNCTIONS if we want to use calls to memcpy and
|
||||
memset, instead of the BSD functions bcopy and bzero. */
|
||||
|
||||
#if defined(MIPS_SYSV) || defined(OSF_OS)
|
||||
#define TARGET_MEM_FUNCTIONS
|
||||
#endif
|
||||
|
||||
|
||||
/* A part of a C `switch' statement that describes the relative
|
||||
costs of constant RTL expressions. It must contain `case'
|
||||
|
@ -4161,7 +4092,7 @@ typedef struct mips_args {
|
|||
ALL_COP_ADDITIONAL_REGISTER_NAMES \
|
||||
}
|
||||
|
||||
/* This is meant to be redefined in the host dependent files. It is a
|
||||
/* This is meant to be redefined in the host dependent files. It is a
|
||||
set of alternative names and regnums for mips coprocessors. */
|
||||
|
||||
#define ALL_COP_ADDITIONAL_REGISTER_NAMES
|
||||
|
@ -4282,8 +4213,7 @@ while (0)
|
|||
LM[0-9]+ Silicon Graphics/ECOFF stabs label before each stmt.
|
||||
$Lb[0-9]+ Begin blocks for MIPS debug support
|
||||
$Lc[0-9]+ Label for use in s<xx> operation.
|
||||
$Le[0-9]+ End blocks for MIPS debug support
|
||||
$Lp\..+ Half-pic labels. */
|
||||
$Le[0-9]+ End blocks for MIPS debug support */
|
||||
|
||||
/* This is how to output the definition of a user-level label named NAME,
|
||||
such as the label on a static function or variable NAME.
|
||||
|
@ -4316,7 +4246,6 @@ do { \
|
|||
do \
|
||||
{ \
|
||||
mips_declare_object (STREAM, NAME, "", ":\n", 0); \
|
||||
HALF_PIC_DECLARE (NAME); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
|
@ -4393,10 +4322,10 @@ do { \
|
|||
emitting the label is moved to function_prologue, so that we can
|
||||
get the line number correctly emitted before the .ent directive,
|
||||
and after any .file directives. */
|
||||
|
||||
/*
|
||||
#undef ASM_DECLARE_FUNCTION_NAME
|
||||
#define ASM_DECLARE_FUNCTION_NAME(STREAM,NAME,DECL) \
|
||||
HALF_PIC_DECLARE (NAME)
|
||||
#define ASM_DECLARE_FUNCTION_NAME(STREAM,NAME,DECL)
|
||||
*/
|
||||
|
||||
/* This is how to output an internal numbered label where
|
||||
PREFIX is the class of label and NUM is the number within the class. */
|
||||
|
|
|
@ -4938,7 +4938,7 @@ move\\t%0,%z4\\n\\
|
|||
|
||||
if ((INTVAL (offset) & 7) == 0
|
||||
&& (mem_addr == stack_pointer_rtx || mem_addr == frame_pointer_rtx))
|
||||
return \"sd\\t%1,%0\";
|
||||
return \"sd\\t%z1,%0\";
|
||||
|
||||
return \"usd\\t%z1,%0\";
|
||||
}"
|
||||
|
@ -5131,17 +5131,17 @@ move\\t%0,%z4\\n\\
|
|||
"")
|
||||
|
||||
(define_insn "movdi_internal2"
|
||||
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*x,*d,*x,*a,*B*C*D,*B*C*D,*B*C*D,*d,*m,*R")
|
||||
(match_operand:DI 1 "movdi_operand" "d,S,IKL,Mnis,R,m,dJ,dJ,J,*x,*d,*J,*d,*m,*R,*B*C*D,*B*C*D,*B*C*D"))]
|
||||
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,R,m,*x,*d,*x,*a,*B*C*D,*B*C*D,*B*C*D,*d,*m,*R")
|
||||
(match_operand:DI 1 "movdi_operand" "d,IKL,Mnis,R,m,dJ,dJ,J,*x,*d,*J,*d,*m,*R,*B*C*D,*B*C*D,*B*C*D"))]
|
||||
"TARGET_64BIT && !TARGET_MIPS16
|
||||
&& (register_operand (operands[0], DImode)
|
||||
|| se_register_operand (operands[1], DImode)
|
||||
|| (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)
|
||||
|| operands[1] == CONST0_RTX (DImode))"
|
||||
"* return mips_move_2words (operands, insn); "
|
||||
[(set_attr "type" "move,load,arith,arith,load,load,store,store,hilo,hilo,hilo,hilo,xfer,load,load,xfer,store,store")
|
||||
[(set_attr "type" "move,arith,arith,load,load,store,store,hilo,hilo,hilo,hilo,xfer,load,load,xfer,store,store")
|
||||
(set_attr "mode" "DI")
|
||||
(set_attr "length" "4,8,4,8,4,8,4,8,4,4,4,8,8,8,8,8,8,8")])
|
||||
(set_attr "length" "4,4,8,4,8,4,8,4,4,4,8,8,8,8,8,8,8")])
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,y,d,d,d,d,d,d,R,m,*d")
|
||||
|
@ -5517,7 +5517,7 @@ move\\t%0,%z4\\n\\
|
|||
(set_attr "mode" "SI")
|
||||
(set_attr_alternative
|
||||
"length"
|
||||
[(if_then_else
|
||||
[(if_then_else
|
||||
(lt (symbol_ref "(unsigned HOST_WIDE_INT) INTVAL (operands[0])")
|
||||
(const_int 1024))
|
||||
(const_int 4)
|
||||
|
@ -5527,28 +5527,28 @@ move\\t%0,%z4\\n\\
|
|||
;; in FP registers (off by default, use -mdebugh to enable).
|
||||
|
||||
(define_insn "movsi_internal1"
|
||||
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*d,*f*z,*f,*f,*f,*R,*m,*x,*x,*d,*d,*B*C*D,*B*C*D,*B*C*D,*d,*m,*R")
|
||||
(match_operand:SI 1 "move_operand" "d,S,IKL,Mnis,R,m,dJ,dJ,*f*z,*d,*f,*R,*m,*f,*f,J,*d,*x,*a,*d,*m,*R,*B*C*D,*B*C*D,*B*C*D"))]
|
||||
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,R,m,*d,*f*z,*f,*f,*f,*R,*m,*x,*x,*d,*d,*B*C*D,*B*C*D,*B*C*D,*d,*m,*R")
|
||||
(match_operand:SI 1 "move_operand" "d,IKL,Mnis,R,m,dJ,dJ,*f*z,*d,*f,*R,*m,*f,*f,J,*d,*x,*a,*d,*m,*R,*B*C*D,*B*C*D,*B*C*D"))]
|
||||
"TARGET_DEBUG_H_MODE && !TARGET_MIPS16
|
||||
&& (register_operand (operands[0], SImode)
|
||||
|| register_operand (operands[1], SImode)
|
||||
|| (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
|
||||
"* return mips_move_1word (operands, insn, FALSE);"
|
||||
[(set_attr "type" "move,load,arith,arith,load,load,store,store,xfer,xfer,move,load,load,store,store,hilo,hilo,hilo,hilo,xfer,load,load,xfer,store,store")
|
||||
[(set_attr "type" "move,arith,arith,load,load,store,store,xfer,xfer,move,load,load,store,store,hilo,hilo,hilo,hilo,xfer,load,load,xfer,store,store")
|
||||
(set_attr "mode" "SI")
|
||||
(set_attr "length" "4,8,4,8,4,8,4,8,4,4,4,4,8,4,8,4,4,4,4,4,4,8,4,4,8")])
|
||||
(set_attr "length" "4,4,8,4,8,4,8,4,4,4,4,8,4,8,4,4,4,4,4,4,8,4,4,8")])
|
||||
|
||||
(define_insn "movsi_internal2"
|
||||
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*d,*z,*x,*d,*x,*d,*B*C*D,*B*C*D,*B*C*D,*d,*m,*R")
|
||||
(match_operand:SI 1 "move_operand" "d,S,IKL,Mnis,R,m,dJ,dJ,*z,*d,J,*x,*d,*a,*d,*m,*R,*B*C*D,*B*C*D,*B*C*D"))]
|
||||
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,R,m,*d,*z,*x,*d,*x,*d,*B*C*D,*B*C*D,*B*C*D,*d,*m,*R")
|
||||
(match_operand:SI 1 "move_operand" "d,IKL,Mnis,R,m,dJ,dJ,*z,*d,J,*x,*d,*a,*d,*m,*R,*B*C*D,*B*C*D,*B*C*D"))]
|
||||
"!TARGET_DEBUG_H_MODE && !TARGET_MIPS16
|
||||
&& (register_operand (operands[0], SImode)
|
||||
|| register_operand (operands[1], SImode)
|
||||
|| (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
|
||||
"* return mips_move_1word (operands, insn, FALSE);"
|
||||
[(set_attr "type" "move,load,arith,arith,load,load,store,store,xfer,xfer,hilo,hilo,hilo,hilo,xfer,load,load,xfer,store,store")
|
||||
[(set_attr "type" "move,arith,arith,load,load,store,store,xfer,xfer,hilo,hilo,hilo,hilo,xfer,load,load,xfer,store,store")
|
||||
(set_attr "mode" "SI")
|
||||
(set_attr "length" "4,8,4,8,4,8,4,8,4,4,4,4,4,4,4,4,8,4,4,8")])
|
||||
(set_attr "length" "4,4,8,4,8,4,8,4,4,4,4,4,4,4,4,8,4,4,8")])
|
||||
|
||||
;; This is the mips16 movsi instruction. We accept a small integer as
|
||||
;; the source if the destination is a GP memory reference. This is
|
||||
|
@ -5559,8 +5559,8 @@ move\\t%0,%z4\\n\\
|
|||
;; into a register.
|
||||
|
||||
(define_insn ""
|
||||
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,y,d,d,d,d,d,d,d,R,m,*d,*d")
|
||||
(match_operand:SI 1 "move_operand" "d,d,y,S,K,N,s,R,m,d,d,*x,*a"))]
|
||||
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,y,d,d,d,d,d,d,R,m,*d,*d")
|
||||
(match_operand:SI 1 "move_operand" "d,d,y,K,N,s,R,m,d,d,*x,*a"))]
|
||||
"TARGET_MIPS16
|
||||
&& (register_operand (operands[0], SImode)
|
||||
|| register_operand (operands[1], SImode)
|
||||
|
@ -5572,13 +5572,12 @@ move\\t%0,%z4\\n\\
|
|||
&& (SMALL_INT (operands[1])
|
||||
|| SMALL_INT_UNSIGNED (operands[1]))))"
|
||||
"* return mips_move_1word (operands, insn, FALSE);"
|
||||
[(set_attr "type" "move,move,move,load,arith,arith,arith,load,load,store,store,hilo,hilo")
|
||||
[(set_attr "type" "move,move,move,arith,arith,arith,load,load,store,store,hilo,hilo")
|
||||
(set_attr "mode" "SI")
|
||||
(set_attr_alternative "length"
|
||||
[(const_int 4)
|
||||
(const_int 4)
|
||||
(const_int 4)
|
||||
(const_int 8)
|
||||
(if_then_else (match_operand:VOID 1 "m16_uimm8_1" "")
|
||||
(const_int 4)
|
||||
(const_int 8))
|
||||
|
|
|
@ -35,7 +35,7 @@ Boston, MA 02111-1307, USA. */
|
|||
#define LIB_SPEC OBSD_LIB_SPEC
|
||||
|
||||
/* By default, OpenBSD mips is little endian. This is important to set
|
||||
here as mips/mips.h defaults to big endian unless DECSTATION. */
|
||||
here as mips/mips.h defaults to big endian. */
|
||||
#ifndef TARGET_ENDIAN_DEFAULT
|
||||
#define TARGET_ENDIAN_DEFAULT 0
|
||||
#endif
|
||||
|
@ -81,7 +81,7 @@ Boston, MA 02111-1307, USA. */
|
|||
|
||||
/* Controlling the compilation driver. */
|
||||
|
||||
/* LINK_SPEC appropriate for OpenBSD: support for GCC options
|
||||
/* LINK_SPEC appropriate for OpenBSD: support for GCC options
|
||||
-static, -assert, and -nostdlib. Dynamic loader control. */
|
||||
#undef LINK_SPEC
|
||||
#define LINK_SPEC \
|
||||
|
|
399
gcc/halfpic.c
399
gcc/halfpic.c
|
@ -1,399 +0,0 @@
|
|||
/* OSF/rose half-pic support functions.
|
||||
Copyright (C) 1992, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC 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.
|
||||
|
||||
GCC 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 GCC; see the file COPYING. If not, write to 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 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
|
||||
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 "system.h"
|
||||
#include "tree.h"
|
||||
#include "rtl.h"
|
||||
#include "expr.h"
|
||||
#include "output.h"
|
||||
#include "obstack.h"
|
||||
#include "halfpic.h"
|
||||
|
||||
#define obstack_chunk_alloc xmalloc
|
||||
#define obstack_chunk_free free
|
||||
|
||||
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) PARAMS ((rtx)) = half_pic_address_p;
|
||||
|
||||
/* Obstack to hold generated pic names. */
|
||||
static struct obstack half_pic_obstack;
|
||||
|
||||
/* List of pointers created to pic references. */
|
||||
|
||||
struct all_refs {
|
||||
struct all_refs *hash_next; /* next name in hash chain */
|
||||
struct all_refs *next; /* next name created */
|
||||
int external_p; /* name is an external reference */
|
||||
int pointer_p; /* pointer created. */
|
||||
const char *ref_name; /* reference name to ptr to real_name */
|
||||
int ref_len; /* reference name length */
|
||||
const char *real_name; /* real function/data name */
|
||||
int real_len; /* strlen (real_name) */
|
||||
};
|
||||
|
||||
static struct all_refs *half_pic_names;
|
||||
|
||||
static const char *half_pic_prefix;
|
||||
static int half_pic_prefix_len;
|
||||
|
||||
|
||||
/* Return the hash bucket of a name or NULL. The hash chain is
|
||||
organized as a self reorganizing circularly linked chain. It is
|
||||
assumed that any name passed to use will never be reallocated. For
|
||||
names in SYMBOL_REF's this is true, because the names are allocated
|
||||
on the permanent obstack. */
|
||||
|
||||
#ifndef MAX_HASH_TABLE
|
||||
#define MAX_HASH_TABLE 1009
|
||||
#endif
|
||||
|
||||
#define HASHBITS 30
|
||||
|
||||
static struct all_refs *half_pic_hash PARAMS ((const char *, int, int));
|
||||
|
||||
static struct all_refs *
|
||||
half_pic_hash (name, len, create_p)
|
||||
const char *name; /* name to hash */
|
||||
int len; /* length of the name (or 0 to call strlen) */
|
||||
int create_p; /* != 0 to create new hash bucket if new */
|
||||
{
|
||||
static struct all_refs *hash_table[MAX_HASH_TABLE];
|
||||
static struct all_refs zero_all_refs;
|
||||
|
||||
const unsigned char *uname;
|
||||
int hash;
|
||||
int i;
|
||||
int ch;
|
||||
struct all_refs *first;
|
||||
struct all_refs *ptr;
|
||||
|
||||
if (len == 0)
|
||||
len = strlen (name);
|
||||
|
||||
/* Compute hash code */
|
||||
uname = (const unsigned char *)name;
|
||||
ch = uname[0];
|
||||
hash = len * 613 + ch;
|
||||
for (i = 1; i < len; i += 2)
|
||||
hash = (hash * 613) + uname[i];
|
||||
|
||||
hash &= (1 << HASHBITS) - 1;
|
||||
hash %= MAX_HASH_TABLE;
|
||||
|
||||
/* See if the name is in the hash table. */
|
||||
ptr = first = hash_table[hash];
|
||||
if (ptr)
|
||||
{
|
||||
do
|
||||
{
|
||||
if (len == ptr->real_len
|
||||
&& ch == *(ptr->real_name)
|
||||
&& !strcmp (name, ptr->real_name))
|
||||
{
|
||||
hash_table[hash] = ptr;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
ptr = ptr->hash_next;
|
||||
}
|
||||
while (ptr != first);
|
||||
}
|
||||
|
||||
/* name not in hash table. */
|
||||
if (!create_p)
|
||||
return (struct all_refs *) 0;
|
||||
|
||||
ptr = (struct all_refs *) obstack_alloc (&half_pic_obstack, sizeof (struct all_refs));
|
||||
*ptr = zero_all_refs;
|
||||
|
||||
ptr->real_name = name;
|
||||
ptr->real_len = len;
|
||||
|
||||
/* Update circular links. */
|
||||
if (first == (struct all_refs *) 0)
|
||||
ptr->hash_next = ptr;
|
||||
|
||||
else
|
||||
{
|
||||
ptr->hash_next = first->hash_next;
|
||||
first->hash_next = ptr;
|
||||
}
|
||||
|
||||
hash_table[hash] = ptr;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
/* Do any half-pic initializations. */
|
||||
|
||||
void
|
||||
half_pic_init ()
|
||||
{
|
||||
flag_half_pic = TRUE;
|
||||
half_pic_prefix = HALF_PIC_PREFIX;
|
||||
half_pic_prefix_len = strlen (half_pic_prefix);
|
||||
obstack_init (&half_pic_obstack);
|
||||
}
|
||||
|
||||
|
||||
/* Write out all pointers to pic references. */
|
||||
|
||||
void
|
||||
half_pic_finish (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
struct all_refs *p = half_pic_names;
|
||||
|
||||
if (!p)
|
||||
return;
|
||||
|
||||
data_section ();
|
||||
for (; p != 0; p = p->next)
|
||||
{
|
||||
/* Emit the pointer if used. */
|
||||
if (p->pointer_p)
|
||||
{
|
||||
ASM_OUTPUT_LABEL (stream, p->ref_name);
|
||||
assemble_aligned_integer (POINTER_SIZE / BITS_PER_UNIT,
|
||||
gen_rtx_SYMBOL_REF (Pmode, p->real_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Encode in a declaration whether or not it is half-pic. */
|
||||
|
||||
void
|
||||
half_pic_encode (decl)
|
||||
tree decl;
|
||||
{
|
||||
enum tree_code code = TREE_CODE (decl);
|
||||
tree asm_name;
|
||||
struct all_refs *ptr;
|
||||
|
||||
if (!flag_half_pic)
|
||||
return;
|
||||
|
||||
if (code != VAR_DECL && code != FUNCTION_DECL)
|
||||
return;
|
||||
|
||||
asm_name = DECL_ASSEMBLER_NAME (decl);
|
||||
|
||||
if (!asm_name)
|
||||
return;
|
||||
|
||||
#ifdef 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);
|
||||
|
||||
ptr->external_p = TRUE;
|
||||
|
||||
#ifdef HALF_PIC_DEBUG
|
||||
if (HALF_PIC_DEBUG)
|
||||
fprintf (stderr, "\n%.*s is half-pic\n",
|
||||
IDENTIFIER_LENGTH (asm_name),
|
||||
IDENTIFIER_POINTER (asm_name));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* Mark that an object is now local, and no longer needs half-pic. */
|
||||
|
||||
void
|
||||
half_pic_declare (name)
|
||||
const char *name;
|
||||
{
|
||||
struct all_refs *ptr;
|
||||
|
||||
if (!flag_half_pic)
|
||||
return;
|
||||
|
||||
ptr = half_pic_hash (name, 0, FALSE);
|
||||
if (!ptr)
|
||||
return;
|
||||
|
||||
ptr->external_p = FALSE;
|
||||
|
||||
#ifdef HALF_PIC_DEBUG
|
||||
if (HALF_PIC_DEBUG)
|
||||
fprintf (stderr, "\n========== Half_pic_declare %s\n", name);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* Mark that an object is explicitly external. */
|
||||
|
||||
void
|
||||
half_pic_external (name)
|
||||
const 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
|
||||
}
|
||||
|
||||
|
||||
/* Return whether an address is half-pic. */
|
||||
|
||||
int
|
||||
half_pic_address_p (addr)
|
||||
rtx addr;
|
||||
{
|
||||
const char *name;
|
||||
int len;
|
||||
struct all_refs *ptr;
|
||||
|
||||
if (!flag_half_pic)
|
||||
return FALSE;
|
||||
|
||||
switch (GET_CODE (addr))
|
||||
{
|
||||
default:
|
||||
break;
|
||||
|
||||
case CONST:
|
||||
{
|
||||
rtx offset = const0_rtx;
|
||||
addr = eliminate_constant_term (XEXP (addr, 0), &offset);
|
||||
if (GET_CODE (addr) != SYMBOL_REF)
|
||||
return FALSE;
|
||||
}
|
||||
/* fall through */
|
||||
|
||||
case SYMBOL_REF:
|
||||
name = XSTR (addr, 0);
|
||||
|
||||
#ifdef HALF_PIC_DEBUG
|
||||
if (HALF_PIC_DEBUG)
|
||||
fprintf (stderr, "\n========== Half_pic_address_p %s\n", name);
|
||||
#endif
|
||||
|
||||
/* If this is a label, it will have a '*' in front of it. */
|
||||
if (name[0] == '*')
|
||||
return FALSE;
|
||||
|
||||
/* If this is a reference to the actual half-pic pointer, it
|
||||
is obviously not half-pic. */
|
||||
|
||||
len = strlen (name);
|
||||
if (len > half_pic_prefix_len
|
||||
&& half_pic_prefix[0] == name[0]
|
||||
&& !strncmp (name, half_pic_prefix, half_pic_prefix_len))
|
||||
return FALSE;
|
||||
|
||||
ptr = half_pic_hash (name, len, FALSE);
|
||||
if (ptr == (struct all_refs *) 0)
|
||||
return FALSE;
|
||||
|
||||
if (ptr->external_p)
|
||||
{
|
||||
#ifdef HALF_PIC_DEBUG
|
||||
if (HALF_PIC_DEBUG)
|
||||
fprintf (stderr, "%s is half-pic\n", name);
|
||||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/* Return the name of the pointer to the PIC function, allocating
|
||||
it if need be. */
|
||||
|
||||
struct rtx_def *
|
||||
half_pic_ptr (operand)
|
||||
rtx operand;
|
||||
{
|
||||
const char *name;
|
||||
struct all_refs *p;
|
||||
int len;
|
||||
|
||||
if (GET_CODE (operand) != SYMBOL_REF)
|
||||
return operand;
|
||||
|
||||
name = XSTR (operand, 0);
|
||||
len = strlen (name);
|
||||
p = half_pic_hash (name, len, FALSE);
|
||||
if (p == (struct all_refs *) 0 || !p->external_p)
|
||||
return operand;
|
||||
|
||||
if (!p->pointer_p)
|
||||
{ /* first time, create pointer */
|
||||
obstack_grow (&half_pic_obstack, half_pic_prefix, half_pic_prefix_len);
|
||||
obstack_grow (&half_pic_obstack, name, len+1);
|
||||
|
||||
p->next = half_pic_names;
|
||||
p->ref_name = (char *) obstack_finish (&half_pic_obstack);
|
||||
p->ref_len = len + half_pic_prefix_len;
|
||||
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);
|
||||
}
|
||||
|
||||
#endif /* HALF_PIC_INIT */
|
|
@ -1,67 +0,0 @@
|
|||
/* OSF/rose half-pic support definitions.
|
||||
Copyright (C) 1992, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC 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.
|
||||
|
||||
GCC 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 GCC; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA. */
|
||||
|
||||
#ifndef NO_HALF_PIC
|
||||
|
||||
/* Declare the variable flag_half_pic as 'int' instead of 'extern
|
||||
int', so that BSS variables are created (even though this is not
|
||||
strict ANSI). This is because rtl.c now refers to the
|
||||
CONSTANT_ADDRESS_P macro, which in turn refers to flag_half_pic,
|
||||
and wants to call half_pic_address_p, whose address we also store
|
||||
in a BSS variable. This way, the gen* programs won't get
|
||||
unknown symbol errors when being linked (flag_half_pic will never
|
||||
be true in the gen* programs). */
|
||||
|
||||
int flag_half_pic; /* Global half-pic flag. */
|
||||
int (*ptr_half_pic_address_p) PARAMS ((struct rtx_def *)); /* ptr to half_pic_address_p () */
|
||||
|
||||
extern int half_pic_number_ptrs; /* # distinct pointers found */
|
||||
extern int half_pic_number_refs; /* # half-pic references */
|
||||
extern void half_pic_encode PARAMS ((union tree_node *)); /* encode whether half-pic */
|
||||
extern void half_pic_declare PARAMS ((const char *)); /* declare object local */
|
||||
extern void half_pic_external PARAMS ((const char *)); /* declare object external */
|
||||
extern void half_pic_init PARAMS ((void)); /* half_pic initialization */
|
||||
extern int half_pic_address_p PARAMS ((struct rtx_def *)); /* true if an address is half-pic */
|
||||
extern struct rtx_def *half_pic_ptr PARAMS ((struct rtx_def *)); /* return RTX for half-pic pointer */
|
||||
#ifdef BUFSIZ
|
||||
extern void half_pic_finish PARAMS ((FILE *)); /* half_pic termination */
|
||||
#endif
|
||||
|
||||
/* 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_NUMBER_PTRS (half_pic_number_ptrs)
|
||||
#define HALF_PIC_NUMBER_REFS (half_pic_number_refs)
|
||||
|
||||
#define HALF_PIC_ENCODE(DECL) half_pic_encode (DECL)
|
||||
#define HALF_PIC_DECLARE(NAME) half_pic_declare (NAME)
|
||||
#define HALF_PIC_EXTERNAL(NAME) half_pic_external (NAME)
|
||||
#define HALF_PIC_INIT() half_pic_init ()
|
||||
#define HALF_PIC_FINISH(STREAM) half_pic_finish (STREAM)
|
||||
#define HALF_PIC_ADDRESS_P(X) ((*ptr_half_pic_address_p) (X))
|
||||
#define HALF_PIC_PTR(X) half_pic_ptr (X)
|
||||
|
||||
/* Prefix for half-pic names */
|
||||
#ifndef HALF_PIC_PREFIX
|
||||
#define HALF_PIC_PREFIX "__pic_"
|
||||
#endif
|
||||
|
||||
#endif /* NO_HALF_PIC */
|
|
@ -88,10 +88,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#include "xcoffout.h" /* Needed for external data
|
||||
declarations for e.g. AIX 4.x. */
|
||||
#endif
|
||||
|
||||
#ifdef HALF_PIC_DEBUG
|
||||
#include "halfpic.h"
|
||||
#endif
|
||||
|
||||
/* Carry information from ASM_DECLARE_OBJECT_NAME
|
||||
to ASM_FINISH_DECLARE_OBJECT. */
|
||||
|
|
Loading…
Reference in New Issue