1/* Internal to rs6000 type, variable, and function declarations and 2 definitons shared between the various rs6000 source files. 3 Copyright (C) 1991-2020 Free Software Foundation, Inc. 4 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu) 5 6 This file is part of GCC. 7 8 GCC is free software; you can redistribute it and/or modify it 9 under the terms of the GNU General Public License as published 10 by the Free Software Foundation; either version 3, or (at your 11 option) any later version. 12 13 GCC is distributed in the hope that it will be useful, but WITHOUT 14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 16 License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GCC; see the file COPYING3. If not see 20 <http://www.gnu.org/licenses/>. */ 21 22#ifndef GCC_RS6000_INTERNAL_H 23#define GCC_RS6000_INTERNAL_H 24 25/* Structure used to define the rs6000 stack */ 26typedef struct rs6000_stack { 27 int reload_completed; /* stack info won't change from here on */ 28 int first_gp_reg_save; /* first callee saved GP register used */ 29 int first_fp_reg_save; /* first callee saved FP register used */ 30 int first_altivec_reg_save; /* first callee saved AltiVec register used */ 31 int lr_save_p; /* true if the link reg needs to be saved */ 32 int cr_save_p; /* true if the CR reg needs to be saved */ 33 unsigned int vrsave_mask; /* mask of vec registers to save */ 34 int push_p; /* true if we need to allocate stack space */ 35 int calls_p; /* true if the function makes any calls */ 36 int world_save_p; /* true if we're saving *everything*: 37 r13-r31, cr, f14-f31, vrsave, v20-v31 */ 38 enum rs6000_abi abi; /* which ABI to use */ 39 int gp_save_offset; /* offset to save GP regs from initial SP */ 40 int fp_save_offset; /* offset to save FP regs from initial SP */ 41 int altivec_save_offset; /* offset to save AltiVec regs from initial SP */ 42 int lr_save_offset; /* offset to save LR from initial SP */ 43 int cr_save_offset; /* offset to save CR from initial SP */ 44 int vrsave_save_offset; /* offset to save VRSAVE from initial SP */ 45 int varargs_save_offset; /* offset to save the varargs registers */ 46 int ehrd_offset; /* offset to EH return data */ 47 int ehcr_offset; /* offset to EH CR field data */ 48 int reg_size; /* register size (4 or 8) */ 49 HOST_WIDE_INT vars_size; /* variable save area size */ 50 int parm_size; /* outgoing parameter size */ 51 int save_size; /* save area size */ 52 int fixed_size; /* fixed size of stack frame */ 53 int gp_size; /* size of saved GP registers */ 54 int fp_size; /* size of saved FP registers */ 55 int altivec_size; /* size of saved AltiVec registers */ 56 int cr_size; /* size to hold CR if not in fixed area */ 57 int vrsave_size; /* size to hold VRSAVE */ 58 int altivec_padding_size; /* size of altivec alignment padding */ 59 HOST_WIDE_INT total_size; /* total bytes allocated for stack */ 60 int savres_strategy; 61} rs6000_stack_t; 62 63 64extern int need_toc_init; 65extern char toc_label_name[10]; 66extern int rs6000_pic_labelno; 67 68#ifdef USING_ELFOS_H 69extern const char *rs6000_machine; 70#endif 71 72 73/* The VRSAVE bitmask puts bit %v0 as the most significant bit. */ 74#define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO)) 75 76 77/* Declare functions in rs6000-logue.c or called in rs6000.c 78 from rs6000-logue.c */ 79 80extern int uses_TOC (void); 81extern bool rs6000_global_entry_point_needed_p (void); 82extern void rs6000_output_function_prologue (FILE *file); 83extern void rs6000_output_function_epilogue (FILE *file); 84extern bool rs6000_function_ok_for_sibcall (tree decl, tree exp); 85extern sbitmap rs6000_get_separate_components (void); 86extern sbitmap rs6000_components_for_bb (basic_block bb); 87extern void rs6000_disqualify_components (sbitmap components, edge e, 88 sbitmap edge_components, 89 bool /*is_prologue*/); 90extern void rs6000_emit_prologue_components (sbitmap components); 91extern void rs6000_emit_epilogue_components (sbitmap components); 92extern void rs6000_set_handled_components (sbitmap components); 93extern rs6000_stack_t * rs6000_stack_info (void); 94extern rtx rs6000_got_sym (void); 95extern struct machine_function *rs6000_init_machine_status (void); 96extern bool save_reg_p (int reg); 97extern const char * rs6000_machine_from_flags (void); 98extern void emit_asm_machine (void); 99extern bool rs6000_global_entry_point_prologue_needed_p (void); 100extern bool rs6000_keep_leaf_when_profiled (void); 101extern void rs6000_live_on_entry (bitmap regs); 102 103/* Return true if the OFFSET is valid for the quad address instructions that 104 use d-form (register + offset) addressing. */ 105 106static inline bool 107quad_address_offset_p (HOST_WIDE_INT offset) 108{ 109 return (IN_RANGE (offset, -32768, 32767) && ((offset) & 0xf) == 0); 110} 111 112/* Mach-O (Darwin) support for longcalls, emitted from rs6000-logue.c. */ 113 114#if TARGET_MACHO 115 116typedef struct branch_island_d { 117 tree function_name; 118 tree label_name; 119 int line_number; 120 } branch_island; 121 122extern vec<branch_island, va_gc> *branch_islands; 123 124#endif 125 126/* Declare functions in rs6000-call.c or called in rs6000.c 127 from rs6000-call.c */ 128extern int rs6000_darwin64_struct_check_p (machine_mode mode, const_tree type); 129extern bool rs6000_discover_homogeneous_aggregate (machine_mode mode, 130 const_tree type, 131 machine_mode *elt_mode, 132 int *n_elts); 133extern void rs6000_output_mi_thunk (FILE *file, 134 tree thunk_fndecl ATTRIBUTE_UNUSED, 135 HOST_WIDE_INT delta, 136 HOST_WIDE_INT vcall_offset, 137 tree function); 138extern bool rs6000_output_addr_const_extra (FILE *file, rtx x); 139extern bool rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi); 140extern tree rs6000_build_builtin_va_list (void); 141extern void rs6000_va_start (tree valist, rtx nextarg); 142extern tree rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p, 143 gimple_seq *post_p); 144extern machine_mode rs6000_promote_function_mode (const_tree type ATTRIBUTE_UNUSED, 145 machine_mode mode, 146 int *punsignedp ATTRIBUTE_UNUSED, 147 const_tree, int); 148extern bool rs6000_return_in_memory (const_tree type, 149 const_tree fntype ATTRIBUTE_UNUSED); 150extern bool rs6000_return_in_msb (const_tree valtype); 151extern bool rs6000_pass_by_reference (cumulative_args_t, 152 const function_arg_info &); 153extern void setup_incoming_varargs (cumulative_args_t, 154 const function_arg_info &, int *, int); 155extern unsigned int rs6000_function_arg_boundary (machine_mode mode, 156 const_tree type); 157extern bool rs6000_must_pass_in_stack (const function_arg_info &); 158extern int rs6000_arg_partial_bytes (cumulative_args_t, 159 const function_arg_info &); 160extern void rs6000_function_arg_advance (cumulative_args_t, 161 const function_arg_info &); 162extern pad_direction rs6000_function_arg_padding (machine_mode mode, 163 const_tree type); 164extern rtx rs6000_function_arg (cumulative_args_t, const function_arg_info &); 165extern rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree, 166 bool, bool); 167extern rtx rs6000_internal_arg_pointer (void); 168 169extern void rs6000_init_builtins (void); 170extern tree rs6000_builtin_decl (unsigned code, 171 bool initialize_p ATTRIBUTE_UNUSED); 172extern rtx rs6000_expand_builtin (tree exp, rtx target, 173 rtx subtarget ATTRIBUTE_UNUSED, 174 machine_mode mode ATTRIBUTE_UNUSED, 175 int ignore ATTRIBUTE_UNUSED); 176extern tree rs6000_fold_builtin (tree fndecl ATTRIBUTE_UNUSED, 177 int n_args ATTRIBUTE_UNUSED, 178 tree *args ATTRIBUTE_UNUSED, 179 bool ignore ATTRIBUTE_UNUSED); 180 181#if TARGET_ELF 182extern bool rs6000_passes_ieee128; 183#endif 184extern bool rs6000_passes_float; 185extern bool rs6000_passes_long_double; 186extern bool rs6000_passes_vector; 187extern bool rs6000_returns_struct; 188extern bool cpu_builtin_p; 189 190#endif 191