/* Tree based points-to analysis Copyright (C) 2005-2025 Free Software Foundation, Inc. Contributed by Daniel Berlin This file is part of GCC. GCC is free software; you can redistribute it and/or modify under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ /* NOTE: This file declares the internal interface of the points-to analyzer. Outward-facing function declarations can be found in tree-ssa-alias.h. */ #ifndef TREE_SSA_STRUCTALIAS_H #define TREE_SSA_STRUCTALIAS_H namespace pointer_analysis { enum constraint_expr_type {SCALAR, DEREF, ADDRESSOF}; /* Static IDs for the special variables. Variable ID zero is unused and used as terminator for the sub-variable chain. */ enum { nothing_id = 1, anything_id = 2, string_id = 3, escaped_id = 4, nonlocal_id = 5, escaped_return_id = 6, storedanything_id = 7, integer_id = 8 }; /* Use 0x8000... as special unknown offset. */ #define UNKNOWN_OFFSET HOST_WIDE_INT_MIN /* An expression that appears in a constraint. */ struct constraint_expr { /* Constraint type. */ constraint_expr_type type; /* Variable we are referring to in the constraint. */ unsigned int var; /* Offset, in bits, of this constraint from the beginning of variables it ends up referring to. IOW, in a deref constraint, we would deref, get the result set, then add OFFSET to each member. */ HOST_WIDE_INT offset; }; typedef struct constraint_expr ce_s; /* Our set constraints are made up of two constraint expressions, one LHS, and one RHS. As described in the introduction in tree-ssa-structalias.cc, our set constraints each represent an operation between set valued variables. */ struct constraint { struct constraint_expr lhs; struct constraint_expr rhs; }; typedef struct constraint *constraint_t; struct variable_info { /* ID of this variable. */ unsigned int id; /* True if this is a variable created by the constraint analysis, such as heap variables and constraints we had to break up. */ unsigned int is_artificial_var : 1; /* True if this is a special variable whose solution set should not be changed. */ unsigned int is_special_var : 1; /* True for variables whose size is not known or variable. */ unsigned int is_unknown_size_var : 1; /* True for (sub-)fields that represent a whole variable. */ unsigned int is_full_var : 1; /* True if this is a heap variable. */ unsigned int is_heap_var : 1; /* True if this is a register variable. */ unsigned int is_reg_var : 1; /* True if this field may contain pointers. */ unsigned int may_have_pointers : 1; /* True if this field has only restrict qualified pointers. */ unsigned int only_restrict_pointers : 1; /* True if this represents a heap var created for a restrict qualified pointer. */ unsigned int is_restrict_var : 1; /* True if this represents a global variable. */ unsigned int is_global_var : 1; /* True if this represents a module escape point for IPA analysis. */ unsigned int is_ipa_escape_point : 1; /* True if this represents a IPA function info. */ unsigned int is_fn_info : 1; /* True if this appears as RHS in a ADDRESSOF constraint. */ unsigned int address_taken : 1; /* ??? Store somewhere better. */ unsigned short ruid; /* The ID of the variable for the next field in this structure or zero for the last field in this structure. */ unsigned next; /* The ID of the variable for the first field in this structure. */ unsigned head; /* Offset of this variable, in bits, from the base variable. */ unsigned HOST_WIDE_INT offset; /* Size of the variable, in bits. */ unsigned HOST_WIDE_INT size; /* Full size of the base variable, in bits. */ unsigned HOST_WIDE_INT fullsize; /* In IPA mode the shadow UID in case the variable needs to be duplicated in the final points-to solution because it reaches its containing function recursively. Zero if none is needed. */ unsigned int shadow_var_uid; /* Name of this variable. */ const char *name; /* Tree that this variable is associated with. */ tree decl; /* Points-to set for this variable. */ bitmap solution; /* Old points-to set for this variable. */ bitmap oldsolution; }; typedef struct variable_info *varinfo_t; struct constraint_stats { unsigned int total_vars; unsigned int nonpointer_vars; unsigned int unified_vars_static; unsigned int unified_vars_dynamic; unsigned int iterations; unsigned int num_edges; unsigned int num_implicit_edges; unsigned int num_avoided_edges; unsigned int points_to_sets_created; }; extern struct constraint_stats stats; extern bitmap_obstack pta_obstack; extern bitmap_obstack oldpta_obstack; extern vec varmap; extern vec constraints; extern unsigned int *var_rep; /* Return the varmap element N. */ inline varinfo_t get_varinfo (unsigned int n) { return varmap[n]; } /* Return the next variable in the list of sub-variables of VI or NULL if VI is the last sub-variable. */ inline varinfo_t vi_next (varinfo_t vi) { return get_varinfo (vi->next); } varinfo_t first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset); varinfo_t first_or_preceding_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset); void dump_constraint (FILE *file, constraint_t c); void dump_constraints (FILE *file, int from); void dump_solution_for_var (FILE *file, unsigned int var); void dump_sa_stats (FILE *outfile); void dump_sa_points_to_info (FILE *outfile); void dump_varinfo (FILE *file, varinfo_t vi); void dump_varmap (FILE *file); void debug_constraint (constraint_t); void debug_constraints (void); void debug_solution_for_var (unsigned int); void debug_sa_points_to_info (void); void debug_varinfo (varinfo_t); void debug_varmap (void); } // namespace pointer_analysis #endif /* TREE_SSA_STRUCTALIAS_H */