Hi! Honza's r208831 change apparently broke bootstrap-ubsan. The problem is that it now creates __builtin_unreachable with gimple_location where LOCATION_LOCUS is UNKNOWN_LOCATION (comes from fnsplit, any ideas what gimple_location to use for the calls if any?) and with -fsanitize=undefined we fold that into __ubsan_handle_builtin_unreachable call. But (already seen several times in the past) instead of emitting unknown file and 0/0 line/column as location we don't emit anything at all, which for unreachable data ICEs and in other cases just crashes in libubsan. The reason for trying to handle UNKNOWN_LOCATION specially is that some data structures in libubsan don't have sourceLocation (not the ones we emit right now though), and guess Marek wanted to be prepared to handle that.
This patch robustifies ubsan_create_data, by turning the location into a pointer to location_t, NULL means location should not be present, pointer to UNKNOWN_LOCATION means we should emit location as <unknown>:0:0, pointer to real locations something else. Bootstrapped/regtested with bootstrap-ubsan and normal, ok for trunk? 2014-03-26 Jakub Jelinek <ja...@redhat.com> * ubsan.h (ubsan_create_data): Change second argument's type to const location_t *. * ubsan.c (ubsan_source_location): If xloc.file is NULL, set it to _("<unknown>"). (ubsan_create_data): Change second argument to const location_t *PLOC. Create Loc field whenever PLOC is non-NULL. (ubsan_instrument_unreachable, ubsan_expand_null_ifn, ubsan_build_overflow_builtin, instrument_bool_enum_load): Adjust callers. c-family/ * c-ubsan.c (ubsan_instrument_division, ubsan_instrument_shift, ubsan_instrument_vla, ubsan_instrument_return): Adjust ubsan_create_data callers. --- gcc/ubsan.h.jj 2014-01-03 11:40:57.000000000 +0100 +++ gcc/ubsan.h 2014-03-26 11:14:32.492987318 +0100 @@ -38,7 +38,7 @@ struct ubsan_mismatch_data { extern void ubsan_expand_null_ifn (gimple_stmt_iterator); extern tree ubsan_instrument_unreachable (location_t); -extern tree ubsan_create_data (const char *, location_t, +extern tree ubsan_create_data (const char *, const location_t *, const struct ubsan_mismatch_data *, ...); extern tree ubsan_type_descriptor (tree, bool); extern tree ubsan_encode_value (tree, bool = false); --- gcc/ubsan.c.jj 2014-03-26 10:17:41.000000000 +0100 +++ gcc/ubsan.c 2014-03-26 11:32:57.053941843 +0100 @@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. #include "tree-ssanames.h" #include "asan.h" #include "gimplify-me.h" +#include "intl.h" /* Map from a tree to a VAR_DECL tree. */ @@ -238,6 +239,8 @@ ubsan_source_location (location_t loc) tree type = ubsan_source_location_type (); xloc = expand_location (loc); + if (xloc.file == NULL) + xloc.file = "<unknown>"; /* Fill in the values from LOC. */ size_t len = strlen (xloc.file); @@ -404,7 +407,7 @@ ubsan_type_descriptor (tree type, bool w pointer checking. */ tree -ubsan_create_data (const char *name, location_t loc, +ubsan_create_data (const char *name, const location_t *ploc, const struct ubsan_mismatch_data *mismatch, ...) { va_list args; @@ -412,17 +415,18 @@ ubsan_create_data (const char *name, loc tree fields[5]; vec<tree, va_gc> *saved_args = NULL; size_t i = 0; + location_t loc = UNKNOWN_LOCATION; /* Firstly, create a pointer to type descriptor type. */ tree td_type = ubsan_type_descriptor_type (); TYPE_READONLY (td_type) = 1; td_type = build_pointer_type (td_type); - loc = LOCATION_LOCUS (loc); /* Create the structure type. */ ret = make_node (RECORD_TYPE); - if (loc != UNKNOWN_LOCATION) + if (ploc != NULL) { + loc = LOCATION_LOCUS (*ploc); fields[i] = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, ubsan_source_location_type ()); DECL_CONTEXT (fields[i]) = ret; @@ -481,7 +485,7 @@ ubsan_create_data (const char *name, loc tree ctor = build_constructor (ret, v); /* If desirable, set the __ubsan_source_location element. */ - if (loc != UNKNOWN_LOCATION) + if (ploc != NULL) CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, ubsan_source_location (loc)); size_t nelts = vec_safe_length (saved_args); @@ -513,7 +517,7 @@ tree ubsan_instrument_unreachable (location_t loc) { initialize_sanitizer_builtins (); - tree data = ubsan_create_data ("__ubsan_unreachable_data", loc, NULL, + tree data = ubsan_create_data ("__ubsan_unreachable_data", &loc, NULL, NULL_TREE); tree t = builtin_decl_explicit (BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE); return build_call_expr_loc (loc, t, 1, build_fold_addr_expr_loc (loc, data)); @@ -583,7 +587,7 @@ ubsan_expand_null_ifn (gimple_stmt_itera const struct ubsan_mismatch_data m = { build_zero_cst (pointer_sized_int_node), ckind }; tree data = ubsan_create_data ("__ubsan_null_data", - loc, &m, + &loc, &m, ubsan_type_descriptor (TREE_TYPE (ptr), true), NULL_TREE); data = build_fold_addr_expr_loc (loc, data); @@ -658,7 +662,7 @@ tree ubsan_build_overflow_builtin (tree_code code, location_t loc, tree lhstype, tree op0, tree op1) { - tree data = ubsan_create_data ("__ubsan_overflow_data", loc, NULL, + tree data = ubsan_create_data ("__ubsan_overflow_data", &loc, NULL, ubsan_type_descriptor (lhstype, false), NULL_TREE); enum built_in_function fn_code; @@ -841,7 +845,7 @@ instrument_bool_enum_load (gimple_stmt_i update_stmt (stmt); tree data = ubsan_create_data ("__ubsan_invalid_value_data", - loc, NULL, + &loc, NULL, ubsan_type_descriptor (type, false), NULL_TREE); data = build_fold_addr_expr_loc (loc, data); --- gcc/c-family/c-ubsan.c.jj 2014-01-03 11:40:29.000000000 +0100 +++ gcc/c-family/c-ubsan.c 2014-03-26 11:22:12.105464655 +0100 @@ -73,7 +73,7 @@ ubsan_instrument_division (location_t lo make sure it gets evaluated before the condition. */ t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t); tree data = ubsan_create_data ("__ubsan_overflow_data", - loc, NULL, + &loc, NULL, ubsan_type_descriptor (type, false), NULL_TREE); data = build_fold_addr_expr_loc (loc, data); @@ -142,7 +142,7 @@ ubsan_instrument_shift (location_t loc, make sure it gets evaluated before the condition. */ t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t); tree data = ubsan_create_data ("__ubsan_shift_data", - loc, NULL, + &loc, NULL, ubsan_type_descriptor (type0, false), ubsan_type_descriptor (type1, false), NULL_TREE); @@ -169,7 +169,7 @@ ubsan_instrument_vla (location_t loc, tr t = fold_build2 (LE_EXPR, boolean_type_node, size, build_int_cst (type, 0)); tree data = ubsan_create_data ("__ubsan_vla_data", - loc, NULL, + &loc, NULL, ubsan_type_descriptor (type, false), NULL_TREE); data = build_fold_addr_expr_loc (loc, data); @@ -185,7 +185,7 @@ ubsan_instrument_vla (location_t loc, tr tree ubsan_instrument_return (location_t loc) { - tree data = ubsan_create_data ("__ubsan_missing_return_data", loc, + tree data = ubsan_create_data ("__ubsan_missing_return_data", &loc, NULL, NULL_TREE); tree t = builtin_decl_explicit (BUILT_IN_UBSAN_HANDLE_MISSING_RETURN); return build_call_expr_loc (loc, t, 1, build_fold_addr_expr_loc (loc, data)); Jakub