/* Definitions for code generation pass of GNU compiler.
- Copyright (C) 2001, 2004, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2001-2015 Free Software Foundation, Inc.
This file is part of GCC.
#ifndef GCC_LIBFUNCS_H
#define GCC_LIBFUNCS_H
+
/* Enumeration of indexes into libfunc_table. */
enum libfunc_index
{
LTI_memset,
LTI_setbits,
- LTI_unwind_resume,
- LTI_eh_personality,
LTI_setjmp,
LTI_longjmp,
LTI_unwind_sjlj_register,
LTI_MAX
};
-/* SYMBOL_REF rtx's for the library functions that are called
- implicitly and not via optabs. */
-extern GTY(()) rtx libfunc_table[LTI_MAX];
+/* Information about an optab-related libfunc. The op field is logically
+ an enum optab_d, and the mode fields are logically machine_mode.
+ However, in the absence of forward-declared enums, there's no practical
+ benefit of pulling in the defining headers.
+
+ We use the same hashtable for normal optabs and conversion optabs. In
+ the first case mode2 is forced to VOIDmode. */
+
+struct GTY((for_user)) libfunc_entry {
+ int op, mode1, mode2;
+ rtx libfunc;
+};
+
+/* Descriptor for libfunc_entry. */
+
+struct libfunc_hasher : ggc_ptr_hash<libfunc_entry>
+{
+ static hashval_t hash (libfunc_entry *);
+ static bool equal (libfunc_entry *, libfunc_entry *);
+};
+
+/* Target-dependent globals. */
+struct GTY(()) target_libfuncs {
+ /* SYMBOL_REF rtx's for the library functions that are called
+ implicitly and not via optabs. */
+ rtx x_libfunc_table[LTI_MAX];
+
+ /* Hash table used to convert declarations into nodes. */
+ hash_table<libfunc_hasher> *GTY(()) x_libfunc_hash;
+};
+
+extern GTY(()) struct target_libfuncs default_target_libfuncs;
+#if SWITCHABLE_TARGET
+extern struct target_libfuncs *this_target_libfuncs;
+#else
+#define this_target_libfuncs (&default_target_libfuncs)
+#endif
+
+#define libfunc_table \
+ (this_target_libfuncs->x_libfunc_table)
/* Accessor macros for libfunc_table. */
#define memset_libfunc (libfunc_table[LTI_memset])
#define setbits_libfunc (libfunc_table[LTI_setbits])
-#define unwind_resume_libfunc (libfunc_table[LTI_unwind_resume])
-#define eh_personality_libfunc (libfunc_table[LTI_eh_personality])
#define setjmp_libfunc (libfunc_table[LTI_setjmp])
#define longjmp_libfunc (libfunc_table[LTI_longjmp])
#define unwind_sjlj_register_libfunc (libfunc_table[LTI_unwind_sjlj_register])
#define gcov_flush_libfunc (libfunc_table[LTI_gcov_flush])
+/* In explow.c */
+extern void set_stack_check_libfunc (const char *);
+
#endif /* GCC_LIBFUNCS_H */