150397Sobrien/* toplev.h - Various declarations for functions found in toplev.c 2169689Skan Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005 3132718Skan Free Software Foundation, Inc. 450397Sobrien 590075SobrienThis file is part of GCC. 652284Sobrien 790075SobrienGCC is free software; you can redistribute it and/or modify it under 890075Sobrienthe terms of the GNU General Public License as published by the Free 990075SobrienSoftware Foundation; either version 2, or (at your option) any later 1090075Sobrienversion. 1152284Sobrien 1290075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY 1390075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or 1490075SobrienFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1590075Sobrienfor more details. 1652284Sobrien 1752284SobrienYou should have received a copy of the GNU General Public License 1890075Sobrienalong with GCC; see the file COPYING. If not, write to the Free 19169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 20169689Skan02110-1301, USA. */ 2152284Sobrien 2290075Sobrien#ifndef GCC_TOPLEV_H 2390075Sobrien#define GCC_TOPLEV_H 2450397Sobrien 2590075Sobrien/* If non-NULL, return one past-the-end of the matching SUBPART of 2690075Sobrien the WHOLE string. */ 2790075Sobrien#define skip_leading_substring(whole, part) \ 2890075Sobrien (strncmp (whole, part, strlen (part)) ? NULL : whole + strlen (part)) 2950397Sobrien 30132718Skanextern int toplev_main (unsigned int, const char **); 31132718Skanextern int read_integral_parameter (const char *, const char *, const int); 32132718Skanextern void strip_off_ending (char *, int); 33132718Skanextern const char *trim_filename (const char *); 34132718Skanextern void _fatal_insn_not_found (rtx, const char *, int, const char *) 35132718Skan ATTRIBUTE_NORETURN; 36132718Skanextern void _fatal_insn (const char *, rtx, const char *, int, const char *) 37132718Skan ATTRIBUTE_NORETURN; 3850397Sobrien 3990075Sobrien#define fatal_insn(msgid, insn) \ 4090075Sobrien _fatal_insn (msgid, insn, __FILE__, __LINE__, __FUNCTION__) 4190075Sobrien#define fatal_insn_not_found(insn) \ 4290075Sobrien _fatal_insn_not_found (insn, __FILE__, __LINE__, __FUNCTION__) 4390075Sobrien 44132718Skan/* If we haven't already defined a frontend specific diagnostics 45132718Skan style, use the generic one. */ 46132718Skan#ifndef GCC_DIAG_STYLE 47169689Skan#define GCC_DIAG_STYLE __gcc_tdiag__ 48132718Skan#endif 4990075Sobrien/* None of these functions are suitable for ATTRIBUTE_PRINTF, because 5090075Sobrien each language front end can extend them with its own set of format 51132718Skan specifiers. We must use custom format checks. */ 52169689Skan#if GCC_VERSION >= 4001 53132718Skan#define ATTRIBUTE_GCC_DIAG(m, n) __attribute__ ((__format__ (GCC_DIAG_STYLE, m, n))) ATTRIBUTE_NONNULL(m) 54132718Skan#else 55132718Skan#define ATTRIBUTE_GCC_DIAG(m, n) ATTRIBUTE_NONNULL(m) 56132718Skan#endif 57132718Skanextern void internal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2) 58132718Skan ATTRIBUTE_NORETURN; 59169689Skanextern void warning0 (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2); 60169689Skan/* Pass one of the OPT_W* from options.h as the first parameter. */ 61169689Skanextern void warning (int, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3); 62169689Skanextern void error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2); 63132718Skanextern void fatal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2) 64132718Skan ATTRIBUTE_NORETURN; 65169689Skanextern void pedwarn (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2); 66169689Skanextern void sorry (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2); 67132718Skanextern void inform (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2); 68169689Skanextern void verbatim (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2); 6990075Sobrien 70169689Skanextern void rest_of_decl_compilation (tree, int, int); 71132718Skanextern void rest_of_type_compilation (tree, int); 72169689Skanextern void tree_rest_of_compilation (tree); 73169689Skanextern void init_optimization_passes (void); 74169689Skanextern void finish_optimization_passes (void); 75169689Skanextern bool enable_rtl_dump_file (int); 7652284Sobrien 77132718Skanextern void announce_function (tree); 7852284Sobrien 79132718Skanextern void error_for_asm (rtx, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3); 80132718Skanextern void warning_for_asm (rtx, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3); 81132718Skanextern void warn_deprecated_use (tree); 82260918Spfg/* APPLE LOCAL "unavailable" attribute (radar 2809697) */ 83260918Spfgextern void error_unavailable_use (tree); 8450397Sobrien 8550397Sobrien#ifdef BUFSIZ 86132718Skanextern void output_quoted_string (FILE *, const char *); 87132718Skanextern void output_file_directive (FILE *, const char *); 8850397Sobrien#endif 8950397Sobrien 9052284Sobrien#ifdef BUFSIZ 9190075Sobrien /* N.B. Unlike all the others, fnotice is just gettext+fprintf, and 9290075Sobrien therefore it can have ATTRIBUTE_PRINTF. */ 93132718Skanextern void fnotice (FILE *, const char *, ...) 94132718Skan ATTRIBUTE_PRINTF_2; 9552284Sobrien#endif 9652284Sobrien 97169689Skanextern void wrapup_global_declaration_1 (tree); 98169689Skanextern bool wrapup_global_declaration_2 (tree); 99169689Skanextern bool wrapup_global_declarations (tree *, int); 100169689Skanextern void check_global_declaration_1 (tree); 101132718Skanextern void check_global_declarations (tree *, int); 102169689Skanextern void emit_debug_global_declarations (tree *, int); 103132718Skanextern void write_global_declarations (void); 10490075Sobrien 105132718Skan/* A unique local time stamp, might be zero if none is available. */ 106132718Skanextern unsigned local_tick; 107132718Skan 10890075Sobrienextern const char *progname; 10990075Sobrienextern const char *dump_base_name; 110117395Skanextern const char *aux_base_name; 111132718Skanextern const char *aux_info_file_name; 112132718Skanextern const char *asm_file_name; 113132718Skanextern bool exit_after_options; 11490075Sobrien 115117395Skanextern int target_flags_explicit; 116117395Skan 117169689Skan/* True if the user has tagged the function with the 'section' 118169689Skan attribute. */ 119169689Skan 120169689Skanextern bool user_defined_section_attribute; 121169689Skan 122132718Skan/* See toplev.c. */ 123132718Skanextern int flag_crossjumping; 124132718Skanextern int flag_if_conversion; 125132718Skanextern int flag_if_conversion2; 126132718Skanextern int flag_keep_static_consts; 127132718Skanextern int flag_peel_loops; 128132718Skanextern int flag_rerun_cse_after_loop; 129132718Skanextern int flag_thread_jumps; 130132718Skanextern int flag_tracer; 131132718Skanextern int flag_unroll_loops; 132132718Skanextern int flag_unroll_all_loops; 133132718Skanextern int flag_unswitch_loops; 134132718Skanextern int flag_cprop_registers; 135132718Skanextern int time_report; 136132718Skan 137132718Skan/* Things to do with target switches. */ 138132718Skanextern void print_version (FILE *, const char *); 139132718Skanextern void * default_get_pch_validity (size_t *); 140132718Skanextern const char * default_pch_valid_p (const void *, size_t); 141132718Skan 14290075Sobrien/* The hashtable, so that the C front ends can pass it to cpplib. */ 14390075Sobrienextern struct ht *ident_hash; 14490075Sobrien 145117395Skan/* This function can be used by targets to set the flags originally 146117395Skan implied by -ffast-math and -fno-fast-math. */ 14790075Sobrien 148132718Skanextern void set_fast_math_flags (int); 14990075Sobrien 150132718Skan/* Handle -d switch. */ 151132718Skanextern void decode_d_option (const char *); 152132718Skan 153117395Skan/* Return true iff flags are set as if -ffast-math. */ 154132718Skanextern bool fast_math_flags_set_p (void); 155117395Skan 156169689Skan/* Return log2, or -1 if not exact. */ 157169689Skanextern int exact_log2 (unsigned HOST_WIDE_INT); 15890075Sobrien 159169689Skan/* Return floor of log2, with -1 for zero. */ 160169689Skanextern int floor_log2 (unsigned HOST_WIDE_INT); 16190075Sobrien 162169689Skan/* Inline versions of the above for speed. */ 163169689Skan#if GCC_VERSION >= 3004 164169689Skan# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG 165169689Skan# define CLZ_HWI __builtin_clzl 166169689Skan# define CTZ_HWI __builtin_ctzl 167169689Skan# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG 168169689Skan# define CLZ_HWI __builtin_clzll 169169689Skan# define CTZ_HWI __builtin_ctzll 170169689Skan# else 171169689Skan# define CLZ_HWI __builtin_clz 172169689Skan# define CTZ_HWI __builtin_ctz 173169689Skan# endif 174169689Skan 175169689Skanextern inline int 176169689Skanfloor_log2 (unsigned HOST_WIDE_INT x) 177169689Skan{ 178169689Skan return x ? HOST_BITS_PER_WIDE_INT - 1 - (int) CLZ_HWI (x) : -1; 179169689Skan} 180169689Skan 181169689Skanextern inline int 182169689Skanexact_log2 (unsigned HOST_WIDE_INT x) 183169689Skan{ 184169689Skan return x == (x & -x) && x ? (int) CTZ_HWI (x) : -1; 185169689Skan} 186169689Skan#endif /* GCC_VERSION >= 3004 */ 187169689Skan 188132718Skan/* Functions used to get and set GCC's notion of in what directory 189132718Skan compilation was started. */ 190132718Skan 191132718Skanextern const char *get_src_pwd (void); 192132718Skanextern bool set_src_pwd (const char *); 193132718Skan 19490075Sobrien#endif /* ! GCC_TOPLEV_H */ 195