this is only a placeholder for an omitted FDE. */
void (* unwind_label) (FILE *, tree, int, int);
+ /* Emit any directives required to unwind this instruction. */
+ void (* unwind_emit) (FILE *, rtx);
+
/* Output an internal label. */
void (* internal_label) (FILE *, const char *, unsigned long);
rtx (* dfa_post_cycle_insn) (void);
/* The following member value is a pointer to a function returning value
which defines how many insns in queue `ready' will we try for
- multi-pass scheduling. if the member value is nonzero and the
+ multi-pass scheduling. If the member value is nonzero and the
function returns positive value, the DFA based scheduler will make
multi-pass scheduling for the first cycle. In other words, we will
try to choose ready insn which permits to start maximum number of
the previous insn has been issued and the current processor
cycle. */
int (* dfa_new_cycle) (FILE *, int, rtx, int, int, int *);
- /* The values of the following members are pointers to functions
- used to improve the first cycle multipass scheduling by
- inserting nop insns. dfa_scheduler_bubble gives a function
- returning a nop insn with given index. The indexes start with
- zero. The function should return NULL if there are no more nop
- insns with indexes greater than given index. To initialize the
- nop insn the function given by member
- init_dfa_scheduler_bubbles is used. The default values of the
- members result in not inserting nop insns during the multipass
- scheduling. */
- void (* init_dfa_bubbles) (void);
- rtx (* dfa_bubble) (int);
/* The following member value is a pointer to a function called
by the insn scheduler. It should return true if there exists a
dependence which is considered costly by the target, between
/* Create the __builtin_va_list type. */
tree (* build_builtin_va_list) (void);
+ /* Gimplifies a VA_ARG_EXPR. */
+ tree (* gimplify_va_arg_expr) (tree valist, tree type, tree *pre_p,
+ tree *post_p);
+
/* Validity-checking routines for PCH files, target-specific.
get_pch_validity returns a pointer to the data to be stored,
and stores the size in its argument. pch_valid_p gets the same
rtx (*struct_value_rtx) (tree fndecl, int incoming);
bool (*return_in_memory) (tree type, tree fndecl);
bool (*return_in_msb) (tree type);
+
+ /* Return true if a parameter must be passed by reference. TYPE may
+ be null if this is a libcall. CA may be null if this query is
+ from __builtin_va_arg. */
+ bool (*pass_by_reference) (CUMULATIVE_ARGS *ca, enum machine_mode mode,
+ tree type, bool named_arg);
+
rtx (*expand_builtin_saveregs) (void);
/* Returns pretend_argument_size. */
void (*setup_incoming_varargs) (CUMULATIVE_ARGS *ca, enum machine_mode mode,
should be passed as two scalars. */
bool (* split_complex_arg) (tree type);
- /* Gimplifies a VA_ARG_EXPR. */
- void (* gimplify_va_arg_expr) (tree *expr_p, tree *pre_p,
- tree *post_p);
+ /* Return true if type T, mode MODE, may not be passed in registers,
+ but must be passed on the stack. */
+ /* ??? This predicate should be applied strictly after pass-by-reference.
+ Need audit to verify that this is the case. */
+ bool (* must_pass_in_stack) (enum machine_mode mode, tree t);
} calls;
+ /* Functions specific to the C++ frontend. */
+ struct cxx {
+ /* Return the integer type used for guard variables. */
+ tree (*guard_type) (void);
+ /* Return true if only the low bit of the guard should be tested. */
+ bool (*guard_mask_bit) (void);
+ /* Returns the size of the array cookie for an array of type. */
+ tree (*get_cookie_size) (tree);
+ /* Returns true if the element size should be stored in the
+ array cookie. */
+ bool (*cookie_has_size) (void);
+ /* Allows backends to perform additional processing when
+ deciding if a class should be exported or imported. */
+ int (*import_export_class) (tree, int);
+ } cxx;
+
/* Leave the boolean fields at the end. */
/* True if arbitrary sections are supported. */
at the beginning of assembly output. */
bool file_start_file_directive;
+ /* True if #pragma redefine_extname is to be supported. */
+ bool handle_pragma_redefine_extname;
+
+ /* True if #pragma extern_prefix is to be supported. */
+ bool handle_pragma_extern_prefix;
+
+ /* True if the RTL prologue and epilogue should be expanded after all
+ passes that modify the instructions (and not merely reorder them)
+ have been run. */
+ bool late_rtl_prologue_epilogue;
+
/* Leave the boolean fields at the end. */
};