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