On Mon, Aug 26, 2013 at 12:15 PM, Marek Polacek <pola...@redhat.com> wrote: > I noticed I forgot to apply this old patch, already acked by Jason. > It introduces new pointer_sized_int_node, thus we can get rid of > uptr_type function in ubsan, and it allows us to do some clean-up > in asan.c, too. > > Tested x86_64-linux, applying to ubsan branch. > > 2013-08-26 Marek Polacek <pola...@redhat.com> > > * tree.h (enum tree_index): Add TI_POINTER_SIZED_TYPE. > (pointer_sized_int_node): Define. > * tree.c (build_common_tree_nodes): Initialize > pointer_sized_int_node. > * ubsan.c (ubsan_encode_value): Use pointer_sized_int_node instead > calling uptr_type. > (uptr_type): Remove function. > * asan.c (asan_global_struct): Use pointer_sized_int_node instead > calling build_nonstandard_integer_type. > (initialize_sanitizer_builtins): Likewise. > (asan_finish_file): Likewise. > > --- gcc/tree.c.mp 2013-07-21 19:54:35.416986756 +0200 > +++ gcc/tree.c 2013-07-21 19:56:58.347562787 +0200 > @@ -9638,6 +9638,8 @@ build_common_tree_nodes (bool signed_cha > = build_pointer_type (build_type_variant (void_type_node, 1, 0)); > fileptr_type_node = ptr_type_node; > > + pointer_sized_int_node = build_nonstandard_integer_type (POINTER_SIZE, 1); > + > float_type_node = make_node (REAL_TYPE); > TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE; > layout_type (float_type_node); > --- gcc/ubsan.c.mp 2013-07-21 20:04:59.469653493 +0200 > +++ gcc/ubsan.c 2013-07-21 20:07:00.227178083 +0200 > @@ -123,14 +123,6 @@ ubsan_typedesc_new (tree type, tree decl > return desc; > } > > -/* Build the ubsan uptr type. */ > - > -static tree > -uptr_type (void) > -{ > - return build_nonstandard_integer_type (POINTER_SIZE, 1); > -} > - > /* Helper routine, which encodes a value in the uptr type. > Arguments with precision <= POINTER_SIZE are passed directly, > the rest is passed by reference. T is a value we are to encode. */ > @@ -143,7 +135,7 @@ ubsan_encode_value (tree t) > { > case INTEGER_TYPE: > if (TYPE_PRECISION (type) <= POINTER_SIZE) > - return fold_build1 (NOP_EXPR, uptr_type (), t); > + return fold_build1 (NOP_EXPR, pointer_sized_int_node, t); > else > return build_fold_addr_expr (t); > case REAL_TYPE: > @@ -153,7 +145,7 @@ ubsan_encode_value (tree t) > { > tree itype = build_nonstandard_integer_type (bitsize, true); > t = fold_build1 (VIEW_CONVERT_EXPR, itype, t); > - return fold_convert (uptr_type (), t); > + return fold_convert (pointer_sized_int_node, t); > } > else > { > --- gcc/tree.h.mp 2013-07-21 19:54:35.441986868 +0200 > +++ gcc/tree.h 2013-07-21 19:56:05.128353854 +0200 > @@ -4227,6 +4227,7 @@ enum tree_index > TI_VA_LIST_FPR_COUNTER_FIELD, > TI_BOOLEAN_TYPE, > TI_FILEPTR_TYPE, > + TI_POINTER_SIZED_TYPE,
I'd rather see TI_UINTPTR_TYPE and TI_INTPTR_TYPE (note they might not be exactly of POINTER_SIZE but larger). TI_POINTER_SIZED_TYPE is ambiguous, too - what's its signedness? All around the compiler we use sizetype and ssizetype to munge pointers (well, not strictly correct as targets may define sizetype to be larger/smaller than actual pointers). Richard. > > TI_DFLOAT32_TYPE, > TI_DFLOAT64_TYPE, > @@ -4383,6 +4384,7 @@ extern GTY(()) tree global_trees[TI_MAX] > #define va_list_fpr_counter_field > global_trees[TI_VA_LIST_FPR_COUNTER_FIELD] > /* The C type `FILE *'. */ > #define fileptr_type_node global_trees[TI_FILEPTR_TYPE] > +#define pointer_sized_int_node global_trees[TI_POINTER_SIZED_TYPE] > > #define boolean_type_node global_trees[TI_BOOLEAN_TYPE] > #define boolean_false_node global_trees[TI_BOOLEAN_FALSE] > --- gcc/asan.c.mp 2013-07-21 20:07:15.013237456 +0200 > +++ gcc/asan.c 2013-07-21 20:16:10.929376734 +0200 > @@ -1954,7 +1954,7 @@ asan_global_struct (void) > = build_decl (UNKNOWN_LOCATION, FIELD_DECL, > get_identifier (field_names[i]), > (i == 0 || i == 3) ? const_ptr_type_node > - : build_nonstandard_integer_type (POINTER_SIZE, 1)); > + : pointer_sized_int_node); > DECL_CONTEXT (fields[i]) = ret; > if (i) > DECL_CHAIN (fields[i - 1]) = fields[i]; > @@ -2039,8 +2039,7 @@ initialize_sanitizer_builtins (void) > ptr_type_node, ptr_type_node, NULL_TREE); > tree BT_FN_VOID_PTR_PTRMODE > = build_function_type_list (void_type_node, ptr_type_node, > - build_nonstandard_integer_type (POINTER_SIZE, > - 1), > NULL_TREE); > + pointer_sized_int_node, NULL_TREE); > tree BT_FN_VOID_INT > = build_function_type_list (void_type_node, integer_type_node, > NULL_TREE); > tree BT_FN_BOOL_VPTR_PTR_IX_INT_INT[5]; > @@ -2197,7 +2196,6 @@ asan_finish_file (void) > if (gcount) > { > tree type = asan_global_struct (), var, ctor; > - tree uptr = build_nonstandard_integer_type (POINTER_SIZE, 1); > tree dtor_statements = NULL_TREE; > vec<constructor_elt, va_gc> *v; > char buf[20]; > @@ -2226,15 +2224,16 @@ asan_finish_file (void) > varpool_assemble_decl (varpool_node_for_decl (var)); > > fn = builtin_decl_implicit (BUILT_IN_ASAN_REGISTER_GLOBALS); > + tree gcount_tree = build_int_cst (pointer_sized_int_node, gcount); > append_to_statement_list (build_call_expr (fn, 2, > build_fold_addr_expr (var), > - build_int_cst (uptr, > gcount)), > + gcount_tree), > &asan_ctor_statements); > > fn = builtin_decl_implicit (BUILT_IN_ASAN_UNREGISTER_GLOBALS); > append_to_statement_list (build_call_expr (fn, 2, > build_fold_addr_expr (var), > - build_int_cst (uptr, > gcount)), > + gcount_tree), > &dtor_statements); > cgraph_build_static_cdtor ('D', dtor_statements, > MAX_RESERVED_INIT_PRIORITY - 1); > > Marek