static void pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr) { bp_pack_value (bp, DECL_COMMON (expr), 1); bp_pack_value (bp, DECL_DLLIMPORT_P (expr), 1); bp_pack_value (bp, DECL_WEAK (expr), 1); bp_pack_value (bp, DECL_SEEN_IN_BIND_EXPR_P (expr), 1); bp_pack_value (bp, DECL_COMDAT (expr), 1); bp_pack_value (bp, DECL_VISIBILITY (expr), 2); bp_pack_value (bp, DECL_VISIBILITY_SPECIFIED (expr), 1); if (TREE_CODE (expr) == VAR_DECL) { bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1); /* DECL_IN_TEXT_SECTION is set during final asm output only. */ bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1); bp_pack_value (bp, DECL_TLS_MODEL (expr), 3); } if (TREE_CODE (expr) == FUNCTION_DECL) { bp_pack_value (bp, DECL_FINAL_P (expr), 1); bp_pack_value (bp, DECL_CXX_CONSTRUCTOR_P (expr), 1); bp_pack_value (bp, DECL_CXX_DESTRUCTOR_P (expr), 1); } if (VAR_OR_FUNCTION_DECL_P (expr)) bp_pack_var_len_unsigned (bp, DECL_INIT_PRIORITY (expr)); }
static int compare_ctor (const void *p1, const void *p2) { tree f1; tree f2; int priority1; int priority2; f1 = *(const tree *)p1; f2 = *(const tree *)p2; priority1 = DECL_INIT_PRIORITY (f1); priority2 = DECL_INIT_PRIORITY (f2); if (priority1 < priority2) return -1; else if (priority1 > priority2) return 1; else /* Ensure a stable sort. */ return (const tree *)p1 - (const tree *)p2; }
static void build_cdtor (bool ctor_p, tree *cdtors, size_t len) { size_t i; i = 0; while (i < len) { tree body; tree fn; priority_type priority; priority = 0; body = NULL_TREE; /* Find the next batch of constructors/destructors with the same initialization priority. */ do { priority_type p; fn = cdtors[i]; p = ctor_p ? DECL_INIT_PRIORITY (fn) : DECL_FINI_PRIORITY (fn); if (!body) priority = p; else if (p != priority) break; append_to_statement_list (build_function_call_expr (fn, 0), &body); ++i; } while (i < len); gcc_assert (body != NULL_TREE); /* Generate a function to call all the function of like priority. */ cgraph_build_static_cdtor (ctor_p ? 'I' : 'D', body, priority); } }