static void set_type_package_list (tree type) { int i; const char *type_string = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))); const char *ptr; int qualifications; tree list = NULL_TREE, elt; for (ptr = type_string, qualifications = 0; *ptr; ptr++) if (*ptr == '.') qualifications += 1; for (ptr = type_string, i = 0; i < qualifications; ptr++) { if (ptr [0] == '.') { tree const identifier = get_identifier_with_length (type_string, ptr - type_string); elt = build_tree_list (identifier, identifier); TREE_CHAIN (elt) = list; list = elt; type_string = ptr+1; i += 1; } } elt = build_tree_list (type, get_identifier (type_string)); TREE_CHAIN (elt) = list; list = elt; TYPE_PACKAGE_LIST (type) = nreverse (list); }
static tree input_identifier (struct data_in *data_in, struct lto_input_block *ib) { unsigned int len; const char *ptr; ptr = streamer_read_indexed_string (data_in, ib, &len); if (!ptr) return NULL; return get_identifier_with_length (ptr, len); }
static tree gen_regparm_prefix (tree decl, unsigned nregs) { unsigned total = 0; /* ??? This probably should use XSTR (XEXP (DECL_RTL (decl), 0), 0) instead of DECL_ASSEMBLER_NAME. */ const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); char *newsym; tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl)); if (formal_type != NULL_TREE) { /* This attribute is ignored for variadic functions. */ if (TREE_VALUE (tree_last (formal_type)) != void_type_node) return NULL_TREE; /* Quit if we hit an incomplete type. Error is reported by convert_arguments in c-typeck.c or cp/typeck.c. */ while (TREE_VALUE (formal_type) != void_type_node && COMPLETE_TYPE_P (TREE_VALUE (formal_type))) { unsigned parm_size = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type))); /* Must round up to include padding. This is done the same way as in store_one_arg. */ parm_size = ((parm_size + PARM_BOUNDARY - 1) / PARM_BOUNDARY * PARM_BOUNDARY); total += parm_size; formal_type = TREE_CHAIN (formal_type); } } if (nregs > total / BITS_PER_WORD) nregs = total / BITS_PER_WORD; gcc_assert (nregs <= 9); newsym = alloca (3 + strlen (asmname) + 1); return get_identifier_with_length (newsym, sprintf (newsym, "_%u@%s", nregs, asmname)); }
static tree gen_stdcall_or_fastcall_decoration (tree decl, char prefix) { unsigned total = 0; /* ??? This probably should use XSTR (XEXP (DECL_RTL (decl), 0), 0) instead of DECL_ASSEMBLER_NAME. */ const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); char *newsym; tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl)); if (formal_type != NULL_TREE) { /* These attributes are ignored for variadic functions in i386.c:ix86_return_pops_args. For compatibility with MS compiler do not add @0 suffix here. */ if (TREE_VALUE (tree_last (formal_type)) != void_type_node) return NULL_TREE; /* Quit if we hit an incomplete type. Error is reported by convert_arguments in c-typeck.c or cp/typeck.c. */ while (TREE_VALUE (formal_type) != void_type_node && COMPLETE_TYPE_P (TREE_VALUE (formal_type))) { unsigned parm_size = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type))); /* Must round up to include padding. This is done the same way as in store_one_arg. */ parm_size = ((parm_size + PARM_BOUNDARY - 1) / PARM_BOUNDARY * PARM_BOUNDARY); total += parm_size; formal_type = TREE_CHAIN (formal_type); } } newsym = alloca (1 + strlen (asmname) + 1 + 10 + 1); return get_identifier_with_length (newsym, sprintf (newsym, "%c%s@%u", prefix, asmname, total / BITS_PER_UNIT)); }
vfy_string vfy_get_string (const char *s, int len) { return get_identifier_with_length (s, len); }