static tree record_reference (tree *tp, int *walk_subtrees, void *data) { tree t = *tp; tree decl; struct record_reference_ctx *ctx = (struct record_reference_ctx *)data; t = canonicalize_constructor_val (t, NULL); if (!t) t = *tp; else if (t != *tp) *tp = t; switch (TREE_CODE (t)) { case VAR_DECL: case FUNCTION_DECL: gcc_unreachable (); break; case FDESC_EXPR: case ADDR_EXPR: /* Record dereferences to the functions. This makes the functions reachable unconditionally. */ decl = get_base_var (*tp); if (TREE_CODE (decl) == FUNCTION_DECL) { struct cgraph_node *node = cgraph_get_create_node (decl); if (!ctx->only_vars) cgraph_mark_address_taken_node (node); ipa_record_reference (ctx->varpool_node, node, IPA_REF_ADDR, NULL); } if (TREE_CODE (decl) == VAR_DECL) { varpool_node *vnode = varpool_node_for_decl (decl); ipa_record_reference (ctx->varpool_node, vnode, IPA_REF_ADDR, NULL); } *walk_subtrees = 0; break; default: /* Save some cycles by not walking types and declaration as we won't find anything useful there anyway. */ if (IS_TYPE_OR_DECL_P (*tp)) { *walk_subtrees = 0; break; } break; } return NULL_TREE; }
static int perf_parse_file(config_fn_t fn, void *data) { int comment = 0; int baselen = 0; static char var[MAXNAME]; /* U+FEFF Byte Order Mark in UTF8 */ static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf"; const unsigned char *bomptr = utf8_bom; for (;;) { int c = get_next_char(); if (bomptr && *bomptr) { /* We are at the file beginning; skip UTF8-encoded BOM * if present. Sane editors won't put this in on their * own, but e.g. Windows Notepad will do it happily. */ if ((unsigned char) c == *bomptr) { bomptr++; continue; } else { /* Do not tolerate partial BOM. */ if (bomptr != utf8_bom) break; /* No BOM at file beginning. Cool. */ bomptr = NULL; } } if (c == '\n') { if (config_file_eof) return 0; comment = 0; continue; } if (comment || isspace(c)) continue; if (c == '#' || c == ';') { comment = 1; continue; } if (c == '[') { baselen = get_base_var(var); if (baselen <= 0) break; var[baselen++] = '.'; var[baselen] = 0; continue; } if (!isalpha(c)) break; var[baselen] = tolower(c); if (get_value(fn, data, var, baselen+1) < 0) break; } die("bad config file line %d in %s", config_linenr, config_file_name); }
static void look_for_address_of (tree t) { if (TREE_CODE (t) == ADDR_EXPR) { tree x = get_base_var (t); if (TREE_CODE (x) == VAR_DECL || TREE_CODE (x) == FUNCTION_DECL) if (has_proper_scope_for_analysis (x)) bitmap_set_bit (module_statics_escape, DECL_UID (x)); } }
static void look_for_address_of (funct_state local, tree t) { if (TREE_CODE (t) == ADDR_EXPR) { tree x = get_base_var (t); if (TREE_CODE (x) == VAR_DECL) { check_decl (local, x, false); /* Taking the address of something appears to be reasonable in PURE code. Not allowed in const. */ if (local->pure_const_state == IPA_CONST) local->pure_const_state = IPA_PURE; } } }
ipa_ref * symtab_node::maybe_create_reference (tree val, enum ipa_ref_use use_type, gimple stmt) { STRIP_NOPS (val); if (TREE_CODE (val) != ADDR_EXPR) return NULL; val = get_base_var (val); if (val && (TREE_CODE (val) == FUNCTION_DECL || TREE_CODE (val) == VAR_DECL)) { symtab_node *referred = symtab_node::get (val); gcc_checking_assert (referred); return create_reference (referred, use_type, stmt); } return NULL; }
struct ipa_ref * ipa_maybe_record_reference (symtab_node *referring_node, tree val, enum ipa_ref_use use_type, gimple stmt) { STRIP_NOPS (val); if (TREE_CODE (val) != ADDR_EXPR) return NULL; val = get_base_var (val); if (val && (TREE_CODE (val) == FUNCTION_DECL || TREE_CODE (val) == VAR_DECL)) { symtab_node *referred = symtab_get_node (val); gcc_checking_assert (referred); return ipa_record_reference (referring_node, referred, use_type, stmt); } return NULL; }
static int git_parse_file(config_fn_t fn) { int comment = 0; int baselen = 0; static char var[MAXNAME]; for (;;) { int c = get_next_char(); if (c == '\n') { /* EOF? */ if (!config_file) return 0; comment = 0; continue; } if (comment || isspace(c)) continue; if (c == '#' || c == ';') { comment = 1; continue; } if (c == '[') { baselen = get_base_var(var); if (baselen <= 0) break; var[baselen++] = '.'; var[baselen] = 0; continue; } if (!isalpha(c)) break; var[baselen] = tolower(c); if (get_value(fn, var, baselen+1) < 0) break; } die("bad config file line %d in %s", config_linenr, config_file_name); }