1 #ifndef LIB_H 2 #define LIB_H 3 4 #include <stdlib.h> 5 #include <stddef.h> 6 7 /* 8 * Basic helper routine descriptions for 'sparse'. 9 * 10 * Copyright (C) 2003 Transmeta Corp. 11 * 2003 Linus Torvalds 12 * 2004 Christopher Li 13 * 14 * Permission is hereby granted, free of charge, to any person obtaining a copy 15 * of this software and associated documentation files (the "Software"), to deal 16 * in the Software without restriction, including without limitation the rights 17 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 18 * copies of the Software, and to permit persons to whom the Software is 19 * furnished to do so, subject to the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be included in 22 * all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 28 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 29 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 30 * THE SOFTWARE. 31 */ 32 33 #include "compat.h" 34 #include "ptrlist.h" 35 36 #define DO_STRINGIFY(x) #x 37 #define STRINGIFY(x) DO_STRINGIFY(x) 38 39 #ifndef ARRAY_SIZE 40 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) 41 #endif 42 43 extern int verbose, optimize, optimize_size, preprocessing; 44 extern int die_if_error; 45 extern int parse_error; 46 extern int repeat_phase, merge_phi_sources; 47 extern int gcc_major, gcc_minor, gcc_patchlevel; 48 49 extern unsigned int hexval(unsigned int c); 50 51 struct position { 52 unsigned int type:6, 53 stream:14, 54 newline:1, 55 whitespace:1, 56 pos:10; 57 unsigned int line:31, 58 noexpand:1; 59 }; 60 61 struct ident; 62 struct token; 63 struct symbol; 64 struct statement; 65 struct expression; 66 struct basic_block; 67 struct entrypoint; 68 struct instruction; 69 struct multijmp; 70 struct pseudo; 71 72 DECLARE_PTR_LIST(symbol_list, struct symbol); 73 DECLARE_PTR_LIST(statement_list, struct statement); 74 DECLARE_PTR_LIST(expression_list, struct expression); 75 DECLARE_PTR_LIST(basic_block_list, struct basic_block); 76 DECLARE_PTR_LIST(instruction_list, struct instruction); 77 DECLARE_PTR_LIST(multijmp_list, struct multijmp); 78 DECLARE_PTR_LIST(pseudo_list, struct pseudo); 79 DECLARE_PTR_LIST(ident_list, struct ident); 80 DECLARE_PTR_LIST(string_list, char); 81 82 typedef struct pseudo *pseudo_t; 83 84 struct token *skip_to(struct token *, int); 85 struct token *expect(struct token *, int, const char *); 86 #ifdef __GNUC__ 87 #define FORMAT_ATTR(pos) __attribute__ ((__format__ (__printf__, pos, pos+1))) 88 #define NORETURN_ATTR __attribute__ ((__noreturn__)) 89 #define SENTINEL_ATTR __attribute__ ((__sentinel__)) 90 #else 91 #define FORMAT_ATTR(pos) 92 #define NORETURN_ATTR 93 #define SENTINEL_ATTR 94 #endif 95 96 FORMAT_ATTR(1) NORETURN_ATTR 97 extern void die(const char *, ...); 98 99 FORMAT_ATTR(2) NORETURN_ATTR 100 extern void error_die(struct position, const char *, ...); 101 102 extern void info(struct position, const char *, ...) FORMAT_ATTR(2); 103 extern void warning(struct position, const char *, ...) FORMAT_ATTR(2); 104 extern void sparse_error(struct position, const char *, ...) FORMAT_ATTR(2); 105 extern void expression_error(struct expression *, const char *, ...) FORMAT_ATTR(2); 106 107 #define ERROR_CURR_PHASE (1 << 0) 108 #define ERROR_PREV_PHASE (1 << 1) 109 extern int has_error; 110 111 extern void add_pre_buffer(const char *fmt, ...) FORMAT_ATTR(1); 112 113 extern int preprocess_only; 114 115 extern int Waddress; 116 extern int Waddress_space; 117 extern int Wbitwise; 118 extern int Wcast_to_as; 119 extern int Wcast_truncate; 120 extern int Wconstant_suffix; 121 extern int Wconstexpr_not_const; 122 extern int Wcontext; 123 extern int Wdecl; 124 extern int Wdeclarationafterstatement; 125 extern int Wdefault_bitfield_sign; 126 extern int Wdesignated_init; 127 extern int Wdo_while; 128 extern int Wenum_mismatch; 129 extern int Wexternal_function_has_definition; 130 extern int Wsparse_error; 131 extern int Wimplicit_int; 132 extern int Winit_cstring; 133 extern int Wmemcpy_max_count; 134 extern int Wnon_pointer_null; 135 extern int Wold_initializer; 136 extern int Wold_style_definition; 137 extern int Wone_bit_signed_bitfield; 138 extern int Woverride_init; 139 extern int Woverride_init_all; 140 extern int Woverride_init_whole_range; 141 extern int Wparen_string; 142 extern int Wpointer_arith; 143 extern int Wptr_subtraction_blows; 144 extern int Wreturn_void; 145 extern int Wshadow; 146 extern int Wsizeof_bool; 147 extern int Wstrict_prototypes; 148 extern int Wtautological_compare; 149 extern int Wtransparent_union; 150 extern int Wtypesign; 151 extern int Wundef; 152 extern int Wuninitialized; 153 extern int Wunknown_attribute; 154 extern int Wvla; 155 156 extern int dump_macro_defs; 157 158 extern int dbg_entry; 159 extern int dbg_dead; 160 161 extern int fmem_report; 162 extern int fdump_linearize; 163 extern unsigned long long fmemcpy_max_count; 164 165 extern int arch_m64; 166 extern int arch_msize_long; 167 extern int arch_big_endian; 168 169 extern void declare_builtin_functions(void); 170 extern void create_builtin_stream(void); 171 extern void dump_macro_definitions(void); 172 extern struct symbol_list *sparse_initialize(int argc, char **argv, struct string_list **files); 173 extern struct symbol_list *__sparse(char *filename); 174 extern struct symbol_list *sparse_keep_tokens(char *filename); 175 extern struct symbol_list *sparse(char *filename); 176 extern void report_stats(void); 177 178 static inline int symbol_list_size(struct symbol_list *list) 179 { 180 return ptr_list_size((struct ptr_list *)(list)); 181 } 182 183 static inline int statement_list_size(struct statement_list *list) 184 { 185 return ptr_list_size((struct ptr_list *)(list)); 186 } 187 188 static inline int expression_list_size(struct expression_list *list) 189 { 190 return ptr_list_size((struct ptr_list *)(list)); 191 } 192 193 static inline int instruction_list_size(struct instruction_list *list) 194 { 195 return ptr_list_size((struct ptr_list *)(list)); 196 } 197 198 static inline int pseudo_list_size(struct pseudo_list *list) 199 { 200 return ptr_list_size((struct ptr_list *)(list)); 201 } 202 203 static inline int bb_list_size(struct basic_block_list *list) 204 { 205 return ptr_list_size((struct ptr_list *)(list)); 206 } 207 208 static inline void free_instruction_list(struct instruction_list **head) 209 { 210 free_ptr_list((struct ptr_list **)head); 211 } 212 213 static inline struct instruction * delete_last_instruction(struct instruction_list **head) 214 { 215 return undo_ptr_list_last((struct ptr_list **)head); 216 } 217 218 static inline struct basic_block * delete_last_basic_block(struct basic_block_list **head) 219 { 220 return delete_ptr_list_last((struct ptr_list **)head); 221 } 222 223 static inline struct basic_block *first_basic_block(struct basic_block_list *head) 224 { 225 return first_ptr_list((struct ptr_list *)head); 226 } 227 static inline struct instruction *last_instruction(struct instruction_list *head) 228 { 229 return last_ptr_list((struct ptr_list *)head); 230 } 231 232 static inline struct instruction *first_instruction(struct instruction_list *head) 233 { 234 return first_ptr_list((struct ptr_list *)head); 235 } 236 237 static inline struct expression *first_expression(struct expression_list *head) 238 { 239 return first_ptr_list((struct ptr_list *)head); 240 } 241 242 static inline pseudo_t first_pseudo(struct pseudo_list *head) 243 { 244 return first_ptr_list((struct ptr_list *)head); 245 } 246 247 static inline void concat_symbol_list(struct symbol_list *from, struct symbol_list **to) 248 { 249 concat_ptr_list((struct ptr_list *)from, (struct ptr_list **)to); 250 } 251 252 static inline void concat_basic_block_list(struct basic_block_list *from, struct basic_block_list **to) 253 { 254 concat_ptr_list((struct ptr_list *)from, (struct ptr_list **)to); 255 } 256 257 static inline void concat_instruction_list(struct instruction_list *from, struct instruction_list **to) 258 { 259 concat_ptr_list((struct ptr_list *)from, (struct ptr_list **)to); 260 } 261 262 static inline void add_symbol(struct symbol_list **list, struct symbol *sym) 263 { 264 add_ptr_list(list, sym); 265 } 266 267 static inline void add_statement(struct statement_list **list, struct statement *stmt) 268 { 269 add_ptr_list(list, stmt); 270 } 271 272 static inline void add_expression(struct expression_list **list, struct expression *expr) 273 { 274 add_ptr_list(list, expr); 275 } 276 277 static inline void add_ident(struct ident_list **list, struct ident *ident) 278 { 279 add_ptr_list(list, ident); 280 } 281 282 #define hashval(x) ((unsigned long)(x)) 283 284 #endif 285