9 * Basic helper routine descriptions for 'sparse'.
11 * Copyright (C) 2003 Transmeta Corp.
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:
22 * The above copyright notice and this permission notice shall be included in
23 * all copies or substantial portions of the Software.
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
39 #define DO_STRINGIFY(x) #x
40 #define STRINGIFY(x) DO_STRINGIFY(x)
43 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
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
;
51 extern int gcc_major
, gcc_minor
, gcc_patchlevel
;
53 extern const char *base_filename
;
55 extern unsigned int hexval(unsigned int c
);
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);
88 typedef struct pseudo
*pseudo_t
;
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
);
95 #define FORMAT_ATTR(pos) __attribute__ ((__format__ (__printf__, pos, pos+1)))
96 #define NORETURN_ATTR __attribute__ ((__noreturn__))
97 #define SENTINEL_ATTR __attribute__ ((__sentinel__))
99 #define FORMAT_ATTR(pos)
100 #define NORETURN_ATTR
101 #define SENTINEL_ATTR
104 FORMAT_ATTR(1) NORETURN_ATTR
105 extern void die(const char *, ...);
107 FORMAT_ATTR(2) NORETURN_ATTR
108 extern void error_die(struct position
, const char *, ...);
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);
115 #define ERROR_CURR_PHASE (1 << 0)
116 #define ERROR_PREV_PHASE (1 << 1)
117 extern int has_error
;
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)
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
);
139 extern int preprocess_only
;
142 extern int Waddress_space
;
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
;
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
;
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
;
184 extern int Wuninitialized
;
185 extern int Wunknown_attribute
;
188 extern int dump_macro_defs
;
189 extern int dump_macros_only
;
191 extern int dbg_compound
;
193 extern int dbg_domtree
;
194 extern int dbg_entry
;
196 extern int dbg_postorder
;
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
;
206 extern int arch_msize_long
;
207 extern int arch_big_endian
;
208 extern int arch_mach
;
214 STANDARD_GNU89
= STANDARD_C89
| STANDARD_GNU
,
216 STANDARD_GNU94
= STANDARD_C94
| STANDARD_GNU
,
218 STANDARD_GNU99
= STANDARD_C99
| STANDARD_GNU
,
220 STANDARD_GNU11
= STANDARD_C11
| STANDARD_GNU
,
222 extern enum standard standard
;
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);
231 static inline int symbol_list_size(struct symbol_list
*list
)
233 return ptr_list_size((struct ptr_list
*)(list
));
236 static inline int statement_list_size(struct statement_list
*list
)
238 return ptr_list_size((struct ptr_list
*)(list
));
241 static inline int expression_list_size(struct expression_list
*list
)
243 return ptr_list_size((struct ptr_list
*)(list
));
246 static inline int instruction_list_size(struct instruction_list
*list
)
248 return ptr_list_size((struct ptr_list
*)(list
));
251 static inline int pseudo_list_size(struct pseudo_list
*list
)
253 return ptr_list_size((struct ptr_list
*)(list
));
256 static inline int bb_list_size(struct basic_block_list
*list
)
258 return ptr_list_size((struct ptr_list
*)(list
));
261 static inline void free_instruction_list(struct instruction_list
**head
)
266 static inline struct instruction
* delete_last_instruction(struct instruction_list
**head
)
268 return undo_ptr_list_last((struct ptr_list
**)head
);
271 static inline struct basic_block
*first_basic_block(struct basic_block_list
*head
)
273 return first_ptr_list((struct ptr_list
*)head
);
275 static inline struct instruction
*last_instruction(struct instruction_list
*head
)
277 return last_ptr_list((struct ptr_list
*)head
);
280 static inline struct instruction
*first_instruction(struct instruction_list
*head
)
282 return first_ptr_list((struct ptr_list
*)head
);
285 static inline struct expression
*first_expression(struct expression_list
*head
)
287 return first_ptr_list((struct ptr_list
*)head
);
290 static inline pseudo_t
first_pseudo(struct pseudo_list
*head
)
292 return first_ptr_list((struct ptr_list
*)head
);
295 static inline void concat_symbol_list(struct symbol_list
*from
, struct symbol_list
**to
)
297 concat_ptr_list((struct ptr_list
*)from
, (struct ptr_list
**)to
);
300 static inline void concat_basic_block_list(struct basic_block_list
*from
, struct basic_block_list
**to
)
302 concat_ptr_list((struct ptr_list
*)from
, (struct ptr_list
**)to
);
305 static inline void concat_instruction_list(struct instruction_list
*from
, struct instruction_list
**to
)
307 concat_ptr_list((struct ptr_list
*)from
, (struct ptr_list
**)to
);
310 static inline void add_symbol(struct symbol_list
**list
, struct symbol
*sym
)
312 add_ptr_list(list
, sym
);
315 static inline void add_statement(struct statement_list
**list
, struct statement
*stmt
)
317 add_ptr_list(list
, stmt
);
320 static inline void add_expression(struct expression_list
**list
, struct expression
*expr
)
322 add_ptr_list(list
, expr
);
325 static inline void add_ident(struct ident_list
**list
, struct ident
*ident
)
327 add_ptr_list(list
, ident
);
330 #define hashval(x) ((unsigned long)(x))