From patchwork Sun Jul 14 17:51:42 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 258904 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 033E92C0175 for ; Mon, 15 Jul 2013 03:52:03 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; q=dns; s=default; b=wlSMv6sqYqmWI8HHS Q0IeLj6waT5VWBd0ZDuyj4PFWp5U1PDU5X3AwUsbkH2rGZBmxKXU4JwupmCCI86I DFS8f/1s0tbNfeZX9WPvY/ILV80sTR9gthRHrQav2At0DuUz0pDrNjtYfMBm2rQd wxWY9ZJ7g0QBlcHcQg1G9A6ygw= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=default; bh=aLM9pclVmvJWgRJVYf2Ek6S u57g=; b=scJq82guIM1Je4D+Zdcr0XUYGh/HKUK57qA4UctYQmgirLkRUseOs9R ZJJ7QWFbWVCEQsb5mGXKx1bLf948lSQ2UACTWHCb4Xl5VXg8KHDzVN/VKo/PBu3k qxt2YoxBC6FUZBCzDxHYhTLdKEiqbWUFHI1pNorbsZOeXhbDDnr0= Received: (qmail 23124 invoked by alias); 14 Jul 2013 17:51:57 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 23110 invoked by uid 89); 14 Jul 2013 17:51:57 -0000 X-Spam-SWARE-Status: No, score=-3.0 required=5.0 tests=AWL, BAYES_99, RCVD_IN_HOSTKARMA_W, RCVD_IN_HOSTKARMA_WL, RDNS_NONE, SPF_HELO_PASS, SPF_PASS, TW_FN autolearn=no version=3.3.1 Received: from Unknown (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sun, 14 Jul 2013 17:51:56 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r6EHpnN6030774 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 14 Jul 2013 13:51:49 -0400 Received: from redhat.com (ovpn-116-16.ams2.redhat.com [10.36.116.16]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r6EHphKo028718 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Sun, 14 Jul 2013 13:51:47 -0400 Date: Sun, 14 Jul 2013 19:51:42 +0200 From: Marek Polacek To: Jakub Jelinek Cc: GCC Patches Subject: Re: [ubsan] Instrument __builtin_unreachable Message-ID: <20130714175142.GI3697@redhat.com> References: <20130714053938.GG3697@redhat.com> <20130714134440.GK2475@laptop.redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20130714134440.GK2475@laptop.redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Sun, Jul 14, 2013 at 03:44:40PM +0200, Jakub Jelinek wrote: > On Sun, Jul 14, 2013 at 07:39:38AM +0200, Marek Polacek wrote: > > This patch implements sanitizing of the __builtin_unreachable call. > > A call to __builtin_unreachable only emits BARRIER, if we actually get to it, > > the behavior is undefined. So, we just replace the call with a call to > > the ubsan library, it then issues an error and dies. > > > > The patch is long because I had to pluck some code out of c-family/c-ubsan.c > > (otherwise we couldn't call ubsan_* routines from builtins.c), I've put > > the code into ubsan.c. > > > > Commited to ubsan branch. Comments? > > > --- gcc/builtins.c.mp 2013-07-13 20:01:33.862643705 +0200 > > +++ gcc/builtins.c 2013-07-14 03:11:23.471284429 +0200 > > @@ -48,6 +48,7 @@ along with GCC; see the file COPYING3. > > #include "value-prof.h" > > #include "diagnostic-core.h" > > #include "builtins.h" > > +#include "ubsan.h" > > You haven't added builtins.o : ubsan.h dependency to the Makefile.in. > Please double check that for the C/C++ files you've added #include > in the past you have it recorded in Makefile.in too. Yeah, fixed with: 2013-07-14 Marek Polacek * Makefile.in (c-family/c-ubsan.o): Add alloc-pool.h, CGRAPH_H, GIMPLE_H, HASH_TABLE_H, output.h, toplev.h and ubsan.h dependencies. (builtins.o): Add ubsan.h dependency. Marek > Otherwise it looks good to me. Thanks, will put both patches on the ubsan branch. Marek --- gcc/Makefile.in.mp 2013-07-14 18:09:19.770341832 +0200 +++ gcc/Makefile.in 2013-07-14 18:15:04.330055011 +0200 @@ -2023,8 +2023,9 @@ c-family/stub-objc.o : c-family/stub-obj coretypes.h $(TREE_H) $(C_COMMON_H) c-family/c-objc.h c-family/c-ubsan.o : c-family/c-ubsan.c $(CONFIG_H) $(SYSTEM_H) \ - coretypes.h $(TREE_H) $(C_COMMON_H) c-family/c-ubsan.h - + coretypes.h $(TREE_H) $(C_COMMON_H) c-family/c-ubsan.h \ + alloc-pool.h $(CGRAPH_H) $(GIMPLE_H) $(HASH_TABLE_H) output.h \ + toplev.h ubsan.h default-c.o: config/default-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ $(C_TARGET_H) $(C_TARGET_DEF_H) $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \ @@ -2261,11 +2262,11 @@ tsan.o : $(CONFIG_H) $(SYSTEM_H) $(TREE_ $(TM_H) coretypes.h $(TREE_DUMP_H) $(TREE_PASS_H) $(CGRAPH_H) $(GGC_H) \ $(BASIC_BLOCK_H) $(FLAGS_H) $(FUNCTION_H) \ $(TM_P_H) $(TREE_FLOW_H) $(DIAGNOSTIC_CORE_H) $(GIMPLE_H) tree-iterator.h \ - intl.h cfghooks.h output.h options.h c-family/c-common.h tsan.h asan.h \ + intl.h cfghooks.h output.h options.h $(C_COMMON_H) tsan.h asan.h \ tree-ssa-propagate.h ubsan.o : ubsan.c ubsan.h $(CONFIG_H) $(SYSTEM_H) $(GIMPLE_H) \ output.h coretypes.h $(TREE_H) alloc-pool.h $(CGRAPH_H) $(HASH_TABLE_H) \ - toplev.h c-family/c-common.h c-family/c-ubsan.h + toplev.h $(C_COMMON_H) tree-ssa-tail-merge.o: tree-ssa-tail-merge.c \ $(SYSTEM_H) $(CONFIG_H) coretypes.h $(TM_H) $(BITMAP_H) \ $(FLAGS_H) $(TM_P_H) $(BASIC_BLOCK_H) $(CFGLOOP_H) \ @@ -2823,7 +2824,7 @@ builtins.o : builtins.c builtins.h $(CON hard-reg-set.h $(DIAGNOSTIC_CORE_H) hard-reg-set.h $(EXCEPT_H) \ $(TM_P_H) $(PREDICT_H) $(LIBFUNCS_H) langhooks.h $(BASIC_BLOCK_H) \ tree-mudflap.h realmpfr.h $(BUILTINS_DEF) $(MACHMODE_H) \ - $(DIAGNOSTIC_CORE_H) $(TREE_FLOW_H) value-prof.h + $(DIAGNOSTIC_CORE_H) $(TREE_FLOW_H) value-prof.h ubsan.h calls.o : calls.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ $(TREE_H) $(FLAGS_H) $(EXPR_H) $(OPTABS_H) langhooks.h $(TARGET_H) \ $(LIBFUNCS_H) $(REGS_H) $(DIAGNOSTIC_CORE_H) output.h \ > > #ifndef PAD_VARARGS_DOWN > > @@ -10281,6 +10282,11 @@ fold_builtin_0 (location_t loc, tree fnd > > case BUILT_IN_CLASSIFY_TYPE: > > return fold_builtin_classify_type (NULL_TREE); > > > > + case BUILT_IN_UNREACHABLE: > > + if (flag_sanitize & SANITIZE_UNDEFINED) > > + return ubsan_instrument_unreachable (loc); > > + break; > > If you have committed your fsanitize= option handling patch, > I'd expect the above to be actually SANITIZE_UNREACHABLE or > whatever the option is plus changes to add SANITIZE_UNREACHABLE > to SANITIZE_UNDEFINED, and parsing unrechable string in *opts.c. Right, done with following patch. Sorry for that. 2013-07-14 Marek Polacek * opts.c (common_handle_option): Add -fsanitize=unreachable option. * builtins.c (fold_builtin_0): Use SANITIZE_UNREACHABLE instead of SANITIZE_UNDEFINED. * flag-types.h (enum sanitize_code): Add SANITIZE_UNREACHABLE. --- gcc/opts.c.mp 2013-07-14 18:30:44.548918471 +0200 +++ gcc/opts.c 2013-07-14 18:31:39.483143160 +0200 @@ -1423,6 +1423,8 @@ common_handle_option (struct gcc_options { "integer-divide-by-zero", SANITIZE_DIVIDE, sizeof "integer-divide-by-zero" - 1 }, { "undefined", SANITIZE_UNDEFINED, sizeof "undefined" - 1 }, + { "unreachable", SANITIZE_UNREACHABLE, + sizeof "unreachable" - 1 }, { NULL, 0, 0 } }; const char *comma; --- gcc/builtins.c.mp 2013-07-14 18:28:11.995229992 +0200 +++ gcc/builtins.c 2013-07-14 18:28:37.246416948 +0200 @@ -10283,7 +10283,7 @@ fold_builtin_0 (location_t loc, tree fnd return fold_builtin_classify_type (NULL_TREE); case BUILT_IN_UNREACHABLE: - if (flag_sanitize & SANITIZE_UNDEFINED) + if (flag_sanitize & SANITIZE_UNREACHABLE) return ubsan_instrument_unreachable (loc); break; --- gcc/flag-types.h.mp 2013-07-14 18:28:41.481434976 +0200 +++ gcc/flag-types.h 2013-07-14 18:29:41.123680421 +0200 @@ -200,7 +200,8 @@ enum sanitize_code { /* UndefinedBehaviorSanitizer. */ SANITIZE_SHIFT = 1 << 2, SANITIZE_DIVIDE = 1 << 3, - SANITIZE_UNDEFINED = SANITIZE_SHIFT | SANITIZE_DIVIDE + SANITIZE_UNREACHABLE = 1 << 4, + SANITIZE_UNDEFINED = SANITIZE_SHIFT | SANITIZE_DIVIDE | SANITIZE_UNREACHABLE }; #endif /* ! GCC_FLAG_TYPES_H */