From patchwork Fri Feb 24 11:32:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 61277 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp852356wrd; Fri, 24 Feb 2023 03:33:33 -0800 (PST) X-Google-Smtp-Source: AK7set8i6B9bjryR4d/4S8nkEwRhPHiYOHh5qFKoWZHs9+UnX6f146x+VEiZ65N1Kv6qhxbQNmSy X-Received: by 2002:a17:906:d925:b0:8b1:78b6:4b3c with SMTP id rn5-20020a170906d92500b008b178b64b3cmr27113603ejb.73.1677238412959; Fri, 24 Feb 2023 03:33:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677238412; cv=none; d=google.com; s=arc-20160816; b=Pd1ZaDh9xtX7KlhwvkzmNoal92aRsoeRUiY/btxsG1D+UwryZv5CD/YxAV/hf/cjw0 oQJNMfrAwGZMTo4XeQgf5G4OwHV1xo9uVfPm7Ol0tQqD9cYXKD1uIVcwsWnRtP3Wbwa4 nWf0nZ2yZROQCHyZlzMpssxmcITq1c7njkeiWqFiJmKFZ3VQSb7CEiUk/XM/Lmwo3YdG sB4JZSaYf80kw1DpNmCtot/jsWsvJ/TeC+/RRpL7P47SDcte1EfxDsmQb6lbXzzQa7Re pAmXgljsofb7TtFnO75VsYDXifj0ys0DQzgLQiTokseAKzodHnipxpTromrIDQkNjIes J7kQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:message-id :mime-version:subject:to:date:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=iYJcp4jg/0+j/qDu2O+muhNQzkBMqZZ8HijVhk3Jr24=; b=bWOugSlL2K1G8Ld1PoL5vxcJhtJ0QzvDZlkd5ytUFOJxB/nzxr3xlN53aDi15fr4Qk joexUHfcXHhoz2yF+hMyrNS/kHYMVqDA6nPG/zG+kdijCuwrtX+kzG7GrkCGmpKjRvOT ZBYOMskECKfXdV+Y2ie4T2hjFwJI+eEBJnGO7QZecc+f3zr56qK951cvNfp4Ge8U/Inn 20E54LhRnfY6CICZrx6QI3qIGfp2ksKZiYv+X3n+d//qSe57c4cnbKqPxh8wMFrxVa4v GvBE69PKaqx26G0h8e8e+MOo57RoLOADJQJuyhFVn69MCEkpKllXO6JfO0YM+0BZhoIX RLqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b="POc/k1lW"; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id 25-20020a170906025900b008b17fe95459si29682880ejl.47.2023.02.24.03.33.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 03:33:32 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b="POc/k1lW"; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0BD91385B53E for ; Fri, 24 Feb 2023 11:33:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0BD91385B53E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677238412; bh=iYJcp4jg/0+j/qDu2O+muhNQzkBMqZZ8HijVhk3Jr24=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=POc/k1lWnUYRKFYmpZfBhGiUYeclrp27zqhXEzLY5laoD/R1X4B0VLhMgpHNX2lNN n+5gq5HVvtC3qLIh88ek5T/uJkO47ZqbKsm3J5DyXwZXajpWWMwUvIcvg7fqsGyJdD rKBnDWgSDHc8vx/XUUtf10bNLYm+XI5skpnQEf0I= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id B66783853567 for ; Fri, 24 Feb 2023 11:32:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B66783853567 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id B5EB9605D2 for ; Fri, 24 Feb 2023 11:32:45 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 9645013246 for ; Fri, 24 Feb 2023 11:32:45 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id pHWPI12g+GMWAwAAMHmgww (envelope-from ) for ; Fri, 24 Feb 2023 11:32:45 +0000 Date: Fri, 24 Feb 2023 12:32:45 +0100 (CET) To: gcc-patches@gcc.gnu.org Subject: [PATCH 1/2] Change vec<, , vl_embed>::m_vecdata refrences into address () MIME-Version: 1.0 Message-Id: <20230224113245.9645013246@imap2.suse-dmz.suse.de> X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Richard Biener via Gcc-patches From: Richard Biener Reply-To: Richard Biener Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1758711946312301710?= X-GMAIL-MSGID: =?utf-8?q?1758711946312301710?= As preparation to remove m_vecdata in the vl_embed vector this changes references to it into calls to address (). As I was here it also fixes ::contains to avoid repeated bounds checking and the same issue in ::lower_bound which also suffers from unnecessary copying around values. * vec.h: Change m_vecdata references to address (). * vec.h (vec::lower_bound): Adjust to take a const reference to the object, use address to access data. (vec::contains): Use address to access data. (vec::operator[]): Use address instead of m_vecdata to access data. (vec::iterate): Likewise. (vec::copy): Likewise. (vec::quick_push): Likewise. (vec::pop): Likewise. (vec::quick_insert): Likewise. (vec::ordered_remove): Likewise. (vec::unordered_remove): Likewise. (vec::block_remove): Likewise. (vec::address): Likewise. --- gcc/vec.h | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/gcc/vec.h b/gcc/vec.h index a536b68732d..5a2ee9c0294 100644 --- a/gcc/vec.h +++ b/gcc/vec.h @@ -614,7 +614,7 @@ public: T *bsearch (const void *key, int (*compar)(const void *, const void *)); T *bsearch (const void *key, int (*compar)(const void *, const void *, void *), void *); - unsigned lower_bound (T, bool (*)(const T &, const T &)) const; + unsigned lower_bound (const T &, bool (*)(const T &, const T &)) const; bool contains (const T &search) const; static size_t embedded_size (unsigned); void embedded_init (unsigned, unsigned = 0, unsigned = 0); @@ -879,7 +879,7 @@ inline const T & vec::operator[] (unsigned ix) const { gcc_checking_assert (ix < m_vecpfx.m_num); - return m_vecdata[ix]; + return address ()[ix]; } template @@ -887,7 +887,7 @@ inline T & vec::operator[] (unsigned ix) { gcc_checking_assert (ix < m_vecpfx.m_num); - return m_vecdata[ix]; + return address ()[ix]; } @@ -929,7 +929,7 @@ vec::iterate (unsigned ix, T *ptr) const { if (ix < m_vecpfx.m_num) { - *ptr = m_vecdata[ix]; + *ptr = address()[ix]; return true; } else @@ -955,7 +955,7 @@ vec::iterate (unsigned ix, T **ptr) const { if (ix < m_vecpfx.m_num) { - *ptr = CONST_CAST (T *, &m_vecdata[ix]); + *ptr = CONST_CAST (T *, &address ()[ix]); return true; } else @@ -978,7 +978,7 @@ vec::copy (ALONE_MEM_STAT_DECL) const { vec_alloc (new_vec, len PASS_MEM_STAT); new_vec->embedded_init (len, len); - vec_copy_construct (new_vec->address (), m_vecdata, len); + vec_copy_construct (new_vec->address (), address (), len); } return new_vec; } @@ -1018,7 +1018,7 @@ inline T * vec::quick_push (const T &obj) { gcc_checking_assert (space (1)); - T *slot = &m_vecdata[m_vecpfx.m_num++]; + T *slot = &address ()[m_vecpfx.m_num++]; *slot = obj; return slot; } @@ -1031,7 +1031,7 @@ inline T & vec::pop (void) { gcc_checking_assert (length () > 0); - return m_vecdata[--m_vecpfx.m_num]; + return address ()[--m_vecpfx.m_num]; } @@ -1056,7 +1056,7 @@ vec::quick_insert (unsigned ix, const T &obj) { gcc_checking_assert (length () < allocated ()); gcc_checking_assert (ix <= length ()); - T *slot = &m_vecdata[ix]; + T *slot = &address ()[ix]; memmove (slot + 1, slot, (m_vecpfx.m_num++ - ix) * sizeof (T)); *slot = obj; } @@ -1071,7 +1071,7 @@ inline void vec::ordered_remove (unsigned ix) { gcc_checking_assert (ix < length ()); - T *slot = &m_vecdata[ix]; + T *slot = &address ()[ix]; memmove (slot, slot + 1, (--m_vecpfx.m_num - ix) * sizeof (T)); } @@ -1118,7 +1118,7 @@ inline void vec::unordered_remove (unsigned ix) { gcc_checking_assert (ix < length ()); - m_vecdata[ix] = m_vecdata[--m_vecpfx.m_num]; + address ()[ix] = address ()[--m_vecpfx.m_num]; } @@ -1130,7 +1130,7 @@ inline void vec::block_remove (unsigned ix, unsigned len) { gcc_checking_assert (ix + len <= length ()); - T *slot = &m_vecdata[ix]; + T *slot = &address ()[ix]; m_vecpfx.m_num -= len; memmove (slot, slot + len, (m_vecpfx.m_num - ix) * sizeof (T)); } @@ -1249,8 +1249,11 @@ vec::contains (const T &search) const { unsigned int len = length (); for (unsigned int i = 0; i < len; i++) - if ((*this)[i] == search) - return true; + { + const T *slot = &address ()[i]; + if (*slot == search) + return true; + } return false; } @@ -1262,7 +1265,8 @@ vec::contains (const T &search) const template unsigned -vec::lower_bound (T obj, bool (*lessthan)(const T &, const T &)) +vec::lower_bound (const T &obj, + bool (*lessthan)(const T &, const T &)) const { unsigned int len = length (); @@ -1273,7 +1277,7 @@ vec::lower_bound (T obj, bool (*lessthan)(const T &, const T &)) half = len / 2; middle = first; middle += half; - T middle_elem = (*this)[middle]; + const T &middle_elem = address ()[middle]; if (lessthan (middle_elem, obj)) { first = middle; @@ -1476,10 +1480,10 @@ public: { return m_vec ? m_vec->length () : 0; } T *address (void) - { return m_vec ? m_vec->m_vecdata : NULL; } + { return m_vec ? m_vec->address () : NULL; } const T *address (void) const - { return m_vec ? m_vec->m_vecdata : NULL; } + { return m_vec ? m_vec->address () : NULL; } T *begin () { return address (); } const T *begin () const { return address (); } From patchwork Fri Feb 24 11:44:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 61279 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp857424wrd; Fri, 24 Feb 2023 03:45:31 -0800 (PST) X-Google-Smtp-Source: AK7set9wK7WH1WXAQLswsJGEbjxalpSW5pCHpxpx3CplbT8eWXIgbXo6a+l+cGGtwX0NTUrHhFeI X-Received: by 2002:a17:906:64a:b0:8b1:2c2d:4658 with SMTP id t10-20020a170906064a00b008b12c2d4658mr21420348ejb.33.1677239131563; Fri, 24 Feb 2023 03:45:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677239131; cv=none; d=google.com; s=arc-20160816; b=LUI50/I9uMQ9yPeGrQXGtAf9plHMweGH5iGNcet1JSiO8m0c+sqAMSWBeKeG0r0PFR Wgl78pqUrNyqaTC1TYjofCbXpWlDEnLVT9OtOPYnieetUsHfhiro6nnc5+RMgAMtapIR ctJDbysWmmNaKhIXzHjvP3rpnDS/cLR/dU/eFz5RXzCySD7G/fMhrK0ZfWXfiGQ/WIna fZT0cmuQ1YSbkSIA5uuIW6fRPU+yqN8lgJFZZbNrqiPw2UGD+pG++j+dvWUlORRz/vtC iz9p75L6OHIYuMeGQ3tN4Ognp247ff1OmUcZvTsWX6N9+PybFsX6RTor5be9G5bztZjr Lh2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:message-id :mime-version:subject:cc:to:date:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=g0S2cgYqg/N8p7mzV+4PSFKyk4h6qaQoI9EGGcd0ZYo=; b=mnOLQpzBJsb+ncGu2kAcXCO7bfRbcGNQLB8rjlik2eJUYIxSkijHL/vx5jj10RGAjw JMyLYvlR7dKxWMt82tNWM0JanBKBSOmOBzYGTbHysLIKLZFeOE4nINx7lS74jGbQc3sD ugjobL0QcdhmgcamhrS04a9f7BB972+xqVuYbOqDZEU+uEwzkWQkE2l39TSj1JBFTdAD M7tQDleQRZePviZwpeVwtwdhMGbhHD0KFc3kQhcIkl0Phnd8LseDw02gc4qAhpWV56NG vltL44sToWFRehKB+vIq0Do2B9TvCRuF70prY+WNGaMckXGBN84dECyoAxFDQ3jSJusp Nadw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=BUCrcI+x; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id wj20-20020a170907051400b008bbcd4d9a0csi21988298ejb.858.2023.02.24.03.45.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 03:45:31 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=BUCrcI+x; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5EF8E385B513 for ; Fri, 24 Feb 2023 11:45:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5EF8E385B513 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677239130; bh=g0S2cgYqg/N8p7mzV+4PSFKyk4h6qaQoI9EGGcd0ZYo=; h=Date:To:cc:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=BUCrcI+xMPmNakVx/bhOmpU4wR+j7VWijGIx2vZdoTv6iNgXTnrIq6/uEhr4sB8uN xf6QkJ7Mnd1qcFyau9dspRuBtMQGSQB3DB3Lo6AhdW4ii5Oedzw4FuAszwzhBdoVh5 hk9OdKjh1K8Wy6YhfeYgrAuV+H1TtABOXisUBVFg= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by sourceware.org (Postfix) with ESMTPS id 933B9385840F for ; Fri, 24 Feb 2023 11:44:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 933B9385840F Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 9BB2938B81; Fri, 24 Feb 2023 11:44:44 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 7E2CE13246; Fri, 24 Feb 2023 11:44:44 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id Y73EHSyj+GMoCgAAMHmgww (envelope-from ); Fri, 24 Feb 2023 11:44:44 +0000 Date: Fri, 24 Feb 2023 12:44:44 +0100 (CET) To: gcc-patches@gcc.gnu.org cc: jwakely@redhat.com, Jakub Jelinek Subject: [PATCH 2/2] Avoid default-initializing auto_vec storage, fix vec MIME-Version: 1.0 Message-Id: <20230224114444.7E2CE13246@imap2.suse-dmz.suse.de> X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Richard Biener via Gcc-patches From: Richard Biener Reply-To: Richard Biener Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1758712699515545084?= X-GMAIL-MSGID: =?utf-8?q?1758712699515545084?= The following avoids default-initializing auto_vec storage for non-POD T since that's not what the allocated storage fallback will do and it's also not expected for existing cases like auto_vec, 64> elts; which exist to optimize the allocation. It also fixes the array accesses done by vec to not use its own m_vecdata member but instead access the container provided storage via pointer arithmetic. This seems to work but it also somehow breaks genrecog which now goes OOM with this change. I'm going to see if the testsuite shows anything, but maybe it's obvious from a second eye what I did wrong ... Comments welcome of course. Thanks, Richard. * vec.h (vec::m_vecdata): Remove. (vec::m_vecpfx): Align as T to avoid changing alignment of vec and simplifying address. (vec::address): Compute as this + 1. (vec::embedded_size): Use sizeof the vector instead of the offset of the m_vecdata member. (auto_vec): Turn m_data storage into uninitialized unsigned char aligned as T. * vec.cc (test_auto_alias): New. (vec_cc_tests): Call it. --- gcc/vec.cc | 17 +++++++++++++++++ gcc/vec.h | 11 +++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/gcc/vec.cc b/gcc/vec.cc index 511e6dff50d..2128f6666b1 100644 --- a/gcc/vec.cc +++ b/gcc/vec.cc @@ -568,6 +568,22 @@ test_auto_delete_vec () ASSERT_EQ (dtor_count, 2); } +/* Verify accesses to m_vecdata are done indirectly. */ + +static void +test_auto_alias () +{ + volatile int i = 1; + auto_vec v; + v.quick_grow (2); + v[0] = 1; + v[1] = 2; + int val; + for (int ix = i; v.iterate (ix, &val); ix++) + ASSERT_EQ (val, 2); + ASSERT_EQ (val, 0); +} + /* Run all of the selftests within this file. */ void @@ -587,6 +603,7 @@ vec_cc_tests () test_qsort (); test_reverse (); test_auto_delete_vec (); + test_auto_alias (); } } // namespace selftest diff --git a/gcc/vec.h b/gcc/vec.h index 5a2ee9c0294..b680efebe7a 100644 --- a/gcc/vec.h +++ b/gcc/vec.h @@ -586,8 +586,8 @@ public: unsigned allocated (void) const { return m_vecpfx.m_alloc; } unsigned length (void) const { return m_vecpfx.m_num; } bool is_empty (void) const { return m_vecpfx.m_num == 0; } - T *address (void) { return m_vecdata; } - const T *address (void) const { return m_vecdata; } + T *address (void) { return reinterpret_cast (this + 1); } + const T *address (void) const { return reinterpret_cast (this + 1); } T *begin () { return address (); } const T *begin () const { return address (); } T *end () { return address () + length (); } @@ -631,8 +631,7 @@ public: /* FIXME - These fields should be private, but we need to cater to compilers that have stricter notions of PODness for types. */ - vec_prefix m_vecpfx; - T m_vecdata[1]; + alignas (T) vec_prefix m_vecpfx; }; @@ -1313,7 +1312,7 @@ vec::embedded_size (unsigned alloc) vec, vec_embedded>::type vec_stdlayout; static_assert (sizeof (vec_stdlayout) == sizeof (vec), ""); static_assert (alignof (vec_stdlayout) == alignof (vec), ""); - return offsetof (vec_stdlayout, m_vecdata) + alloc * sizeof (T); + return sizeof (vec_stdlayout) + alloc * sizeof (T); } @@ -1588,7 +1587,7 @@ public: private: vec m_auto; - T m_data[MAX (N - 1, 1)]; + alignas(T) unsigned char m_data[sizeof (T) * N]; }; /* auto_vec is a sub class of vec whose storage is released when it is