From patchwork Sat Nov 3 11:28:52 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 196824 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]) by ozlabs.org (Postfix) with SMTP id E650E2C00B2 for ; Sat, 3 Nov 2012 22:29:00 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1352546941; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:From:To:Mail-Followup-To:Subject:References:Date: In-Reply-To:Message-ID:User-Agent:MIME-Version:Content-Type: Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:Sender:Delivered-To; bh=DT/sC7fUNyId6uAVLJRD RpqrCrA=; b=W8fHwPV8Fiz2mqhcoypIWeywvemLpbOqS8bTwv++PkDHDElmyLv7 yJPoQBgttO+xojPh1nsAvlChoFsXocpSTE8A0oyBfGMY9GQ0kInv+PXxwXW6osjh rrLAe0KsHnZ+0vwTxdknHEYk//OgwKlUDk/+b778yQSS/LELiDjl8Cw= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Received:From:To:Mail-Followup-To:Subject:References:Date:In-Reply-To:Message-ID:User-Agent:MIME-Version:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=v7CBF21m1MCLFTdyTzxi8d90xQSXVK4NuAgMItYJPp+8N27ycCTAewRW6TfokV vkgUZjvQsqeiZoLHYtlIBlgTLkIMmUrGo4C280UMTkCvBUnIjAzWb+/yYIO6apXb 82vJ/9hyQo+HP80bJ2VZxtEKbsp1PehY38ZYsLG+wTh+I=; Received: (qmail 8021 invoked by alias); 3 Nov 2012 11:28:56 -0000 Received: (qmail 8013 invoked by uid 22791); 3 Nov 2012 11:28:56 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL, BAYES_50, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, KHOP_RCVD_TRUST, KHOP_SPAMHAUS_DROP, NML_ADSP_CUSTOM_MED, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-wg0-f51.google.com (HELO mail-wg0-f51.google.com) (74.125.82.51) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 03 Nov 2012 11:28:49 +0000 Received: by mail-wg0-f51.google.com with SMTP id ed3so2269508wgb.8 for ; Sat, 03 Nov 2012 04:28:48 -0700 (PDT) Received: by 10.180.78.170 with SMTP id c10mr6108143wix.5.1351942128293; Sat, 03 Nov 2012 04:28:48 -0700 (PDT) Received: from localhost ([2.26.192.222]) by mx.google.com with ESMTPS id dm3sm2348160wib.3.2012.11.03.04.28.46 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 03 Nov 2012 04:28:47 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, rdsandiford@googlemail.com Subject: [6/8] Add strict volatile handling to bit_field_mode_iterator References: <87k3u3eybu.fsf@talisman.home> Date: Sat, 03 Nov 2012 11:28:52 +0000 In-Reply-To: <87k3u3eybu.fsf@talisman.home> (Richard Sandiford's message of "Sat, 03 Nov 2012 11:10:45 +0000") Message-ID: <87txt7dix7.fsf@talisman.home> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) MIME-Version: 1.0 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 This patch makes bit_field_mode_iterator take -fstrict-volatile-bitfields into account, in cases where the size of the underlying object is known. This is used in the next patch. Tested as described in the covering note. OK to install? Richard gcc/ * machmode.h (bit_field_mode_iterator::bit_field_mode_iterator): Add an object_bitsize parameter. (bit_field_mode_iterator): Add object_bitsize_. * stor-layout.c (bit_field_mode_iterator::bit_field_mode_iterator): Add an object_bitsize parameter. Initialize object_bitsize_. (bit_field_mode_iterator::next_mode): For strict volatile fields, reject modes that aren't the same width as the underlying object. (get_best_mode): Update bit_field_mode_iterator constructor. Index: gcc/machmode.h =================================================================== --- gcc/machmode.h 2012-11-02 22:47:03.291372600 +0000 +++ gcc/machmode.h 2012-11-02 23:14:00.225368645 +0000 @@ -265,7 +265,7 @@ extern enum machine_mode mode_for_vector public: bit_field_mode_iterator (HOST_WIDE_INT, HOST_WIDE_INT, HOST_WIDE_INT, HOST_WIDE_INT, - unsigned int, bool); + unsigned HOST_WIDE_INT, unsigned int, bool); bool next_mode (enum machine_mode *); bool prefer_smaller_modes (); @@ -277,6 +277,7 @@ extern enum machine_mode mode_for_vector HOST_WIDE_INT bitpos_; HOST_WIDE_INT bitregion_start_; HOST_WIDE_INT bitregion_end_; + unsigned HOST_WIDE_INT object_bitsize_; unsigned int align_; bool volatilep_; int count_; Index: gcc/stor-layout.c =================================================================== --- gcc/stor-layout.c 2012-11-02 23:10:07.316369215 +0000 +++ gcc/stor-layout.c 2012-11-02 23:14:00.224368645 +0000 @@ -2634,6 +2634,8 @@ fixup_unsigned_type (tree type) BITREGION_END - BITREGION_START + 1. Otherwise, we are allowed to touch any adjacent non bit-fields. + OBJECT_BITSIZE is the number of bits that should be used to access + a strict volatile bitfield, or 0 if not known. ALIGN is the alignment of the underlying object in bits. VOLATILEP says whether the bitfield is volatile. */ @@ -2641,11 +2643,12 @@ fixup_unsigned_type (tree type) ::bit_field_mode_iterator (HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, HOST_WIDE_INT bitregion_start, HOST_WIDE_INT bitregion_end, + unsigned HOST_WIDE_INT object_bitsize, unsigned int align, bool volatilep) : mode_ (GET_CLASS_NARROWEST_MODE (MODE_INT)), bitsize_ (bitsize), bitpos_ (bitpos), bitregion_start_ (bitregion_start), - bitregion_end_ (bitregion_end), align_ (MIN (align, BIGGEST_ALIGNMENT)), - volatilep_ (volatilep), count_ (0) + bitregion_end_ (bitregion_end), object_bitsize_ (object_bitsize), + align_ (MIN (align, BIGGEST_ALIGNMENT)), volatilep_ (volatilep), count_ (0) { if (bitregion_end_) bitregion_end_ += 1; @@ -2676,6 +2679,14 @@ bool bit_field_mode_iterator::next_mode if ((bitpos_ % unit) + bitsize_ > unit) continue; + /* If the field is strict volatile, skip modes that are not the same + as the object size. */ + if (object_bitsize_ + && unit != object_bitsize_ + && volatilep_ + && flag_strict_volatile_bitfields > 0) + continue; + /* Stop if the mode is too wide to handle efficiently. */ if (unit > MAX_FIXED_MODE_SIZE) break; @@ -2749,7 +2760,7 @@ get_best_mode (int bitsize, int bitpos, enum machine_mode largest_mode, bool volatilep) { bit_field_mode_iterator iter (bitsize, bitpos, bitregion_start, - bitregion_end, align, volatilep); + bitregion_end, 0, align, volatilep); enum machine_mode widest_mode = VOIDmode; enum machine_mode mode; while (iter.next_mode (&mode)