From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from olivedrab.birch.relay.mailchannels.net (olivedrab.birch.relay.mailchannels.net [23.83.209.135]) by sourceware.org (Postfix) with ESMTPS id 8807B3857C5F for ; Thu, 7 Oct 2021 22:15:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8807B3857C5F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gotplt.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gotplt.org X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id CD466341F8B; Thu, 7 Oct 2021 22:15:25 +0000 (UTC) Received: from pdx1-sub0-mail-a17.g.dreamhost.com (100-96-133-192.trex.outbound.svc.cluster.local [100.96.133.192]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 6872E3415D4; Thu, 7 Oct 2021 22:15:25 +0000 (UTC) X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from pdx1-sub0-mail-a17.g.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384) by 100.96.133.192 (trex/6.4.3); Thu, 07 Oct 2021 22:15:25 +0000 X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|siddhesh@gotplt.org X-MailChannels-Auth-Id: dreamhost X-Troubled-Minister: 37aa4e1a201f4163_1633644925693_2981958771 X-MC-Loop-Signature: 1633644925693:4149269451 X-MC-Ingress-Time: 1633644925693 Received: from pdx1-sub0-mail-a17.g.dreamhost.com (localhost [127.0.0.1]) by pdx1-sub0-mail-a17.g.dreamhost.com (Postfix) with ESMTP id 2A5397F2D7; Thu, 7 Oct 2021 15:15:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gotplt.org; h=from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; s=gotplt.org; bh=ME+PnYbKzg44tjrdKBg AuEpVpOo=; b=JvLS01NfWVhCkZGy4E4uUQTTbC/rcKW5HxFKCJcHPOOk1GgjQy2 jo5dFMUlSJfk01cTIxVqUvZ2RvxaL21trlVsKC0SE3io9qmQPJg5wQanWD/BeRoX X4i2DGXqqCjIr/LVpFkvIWpvsUuG3OnEYbOwcUtT+sywbzPo6kvPyw4w= Received: from rhbox.redhat.com (unknown [1.186.223.58]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: siddhesh@gotplt.org) by pdx1-sub0-mail-a17.g.dreamhost.com (Postfix) with ESMTPSA id 50DF083495; Thu, 7 Oct 2021 15:15:17 -0700 (PDT) X-DH-BACKEND: pdx1-sub0-mail-a17 From: Siddhesh Poyarekar To: gcc-patches@gcc.gnu.org Cc: jakub@redhat.com Subject: [PATCH 8/8] tree-dynamic-object-size: Add test wrappers to extend testing Date: Fri, 8 Oct 2021 03:44:32 +0530 Message-Id: <20211007221432.1029249-9-siddhesh@gotplt.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211007221432.1029249-1-siddhesh@gotplt.org> References: <20211007221432.1029249-1-siddhesh@gotplt.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-3039.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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-List-Received-Date: Thu, 07 Oct 2021 22:15:33 -0000 Wrap most tests for __builtin_object_size with __builtin_dynamic_object_size to get better coverage. At the moment only one test does not work correctly with __builtin_dynamic_object_size, viz. builtin-object-size-5.c. The test expects abort() calls to be optimized away, which does not happen with __builtin_dynamic_object_size since it cannot collapse loop iteration to a constant. gcc/testsuite/ChangeLog: * g++.dg/ext/builtin-dynamic-object-size1.C: New test. * g++.dg/ext/builtin-dynamic-object-size2.C: Likewise. * gcc.dg/builtin-dynamic-alloc-size.c: Likewise. * gcc.dg/builtin-dynamic-object-size-1.c: Likewise. * gcc.dg/builtin-dynamic-object-size-10.c: Likewise. * gcc.dg/builtin-dynamic-object-size-11.c: Likewise. * gcc.dg/builtin-dynamic-object-size-12.c: Likewise. * gcc.dg/builtin-dynamic-object-size-13.c: Likewise. * gcc.dg/builtin-dynamic-object-size-14.c: Likewise. * gcc.dg/builtin-dynamic-object-size-15.c: Likewise. * gcc.dg/builtin-dynamic-object-size-16.c: Likewise. * gcc.dg/builtin-dynamic-object-size-17.c: Likewise. * gcc.dg/builtin-dynamic-object-size-18.c: Likewise. * gcc.dg/builtin-dynamic-object-size-19.c: Likewise. * gcc.dg/builtin-dynamic-object-size-2.c: Likewise. * gcc.dg/builtin-dynamic-object-size-3.c: Likewise. * gcc.dg/builtin-dynamic-object-size-4.c: Likewise. * gcc.dg/builtin-dynamic-object-size-6.c: Likewise. * gcc.dg/builtin-dynamic-object-size-7.c: Likewise. * gcc.dg/builtin-dynamic-object-size-8.c: Likewise. * gcc.dg/builtin-dynamic-object-size-9.c: Likewise. * gcc.dg/builtin-object-size-1.c: Adjust to rebuild with __builtin_dynamic_object_size. * gcc.dg/builtin-object-size-16.c: Likewise. * gcc.dg/builtin-object-size-17.c: Likewise. * gcc.dg/builtin-object-size-2.c: Likewise. * gcc.dg/builtin-object-size-3.c: Likewise. * gcc.dg/builtin-object-size-4.c: Likewise. Signed-off-by: Siddhesh Poyarekar --- .../g++.dg/ext/builtin-dynamic-object-size1.C | 5 + .../g++.dg/ext/builtin-dynamic-object-size2.C | 5 + .../gcc.dg/builtin-dynamic-alloc-size.c | 7 + .../gcc.dg/builtin-dynamic-object-size-1.c | 7 + .../gcc.dg/builtin-dynamic-object-size-10.c | 9 ++ .../gcc.dg/builtin-dynamic-object-size-11.c | 7 + .../gcc.dg/builtin-dynamic-object-size-12.c | 5 + .../gcc.dg/builtin-dynamic-object-size-13.c | 5 + .../gcc.dg/builtin-dynamic-object-size-14.c | 5 + .../gcc.dg/builtin-dynamic-object-size-15.c | 6 + .../gcc.dg/builtin-dynamic-object-size-16.c | 7 + .../gcc.dg/builtin-dynamic-object-size-17.c | 8 + .../gcc.dg/builtin-dynamic-object-size-18.c | 8 + .../gcc.dg/builtin-dynamic-object-size-19.c | 104 ++++++++++++ .../gcc.dg/builtin-dynamic-object-size-2.c | 7 + .../gcc.dg/builtin-dynamic-object-size-3.c | 7 + .../gcc.dg/builtin-dynamic-object-size-4.c | 7 + .../gcc.dg/builtin-dynamic-object-size-6.c | 5 + .../gcc.dg/builtin-dynamic-object-size-7.c | 5 + .../gcc.dg/builtin-dynamic-object-size-8.c | 5 + .../gcc.dg/builtin-dynamic-object-size-9.c | 5 + gcc/testsuite/gcc.dg/builtin-object-size-1.c | 110 +++++++++++++ gcc/testsuite/gcc.dg/builtin-object-size-16.c | 10 ++ gcc/testsuite/gcc.dg/builtin-object-size-17.c | 2 + gcc/testsuite/gcc.dg/builtin-object-size-2.c | 126 +++++++++++++++ gcc/testsuite/gcc.dg/builtin-object-size-3.c | 148 ++++++++++++++++++ gcc/testsuite/gcc.dg/builtin-object-size-4.c | 117 ++++++++++++++ 27 files changed, 742 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/builtin-dynamic-object-size1= .C create mode 100644 gcc/testsuite/g++.dg/ext/builtin-dynamic-object-size2= .C create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-alloc-size.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-1.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-10.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-11.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-12.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-13.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-14.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-15.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-16.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-17.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-18.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-19.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-2.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-3.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-6.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-7.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-8.c create mode 100644 gcc/testsuite/gcc.dg/builtin-dynamic-object-size-9.c diff --git a/gcc/testsuite/g++.dg/ext/builtin-dynamic-object-size1.C b/gc= c/testsuite/g++.dg/ext/builtin-dynamic-object-size1.C new file mode 100644 index 00000000000..b11ac200751 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin-dynamic-object-size1.C @@ -0,0 +1,5 @@ +// { dg-do run } +// { dg-options "-O2" } + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size1.C" diff --git a/gcc/testsuite/g++.dg/ext/builtin-dynamic-object-size2.C b/gc= c/testsuite/g++.dg/ext/builtin-dynamic-object-size2.C new file mode 100644 index 00000000000..6e52cf38533 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin-dynamic-object-size2.C @@ -0,0 +1,5 @@ +// { dg-do run } +// { dg-options "-O2" } + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size2.C" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-alloc-size.c b/gcc/test= suite/gcc.dg/builtin-dynamic-alloc-size.c new file mode 100644 index 00000000000..9d0eadd6be4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-alloc-size.c @@ -0,0 +1,7 @@ +/* { dg-do compile } + { dg-require-effective-target alloca } + { dg-additional-options "-O2 -fdump-tree-optimized" } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-alloc-size.c" +/* { dg-final { scan-tree-dump-not "abort" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-1.c b/gcc/t= estsuite/gcc.dg/builtin-dynamic-object-size-1.c new file mode 100644 index 00000000000..2c7d2128913 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-1.c @@ -0,0 +1,7 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target alloca } */ + +#define DYNAMIC_OBJECT_SIZE +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-1.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-10.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-10.c new file mode 100644 index 00000000000..6db9ea8c667 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-10.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-early_dynobjsz-details -fdump-tree-dyno= bjsz1-details" } */ +// { dg-skip-if "packed attribute missing for drone_source_packet" { "ep= iphany-*-*" } } + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-10.c" + +/* { dg-final { scan-tree-dump "spkt.*: maximum dynamic object size _" "= early_dynobjsz" } } */ +/* { dg-final { scan-tree-dump ": maximum dynamic subobject size _" "ear= ly_dynobjsz" } } */ diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-11.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-11.c new file mode 100644 index 00000000000..65dcec9fcae --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-11.c @@ -0,0 +1,7 @@ +/* PR48985 */ +/* { dg-do run } */ +/* { dg-options "-std=3Dgnu89" } */ +/* { dg-skip-if "packed attribute missing for struct s" { "epiphany-*-*"= } } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-11.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-12.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-12.c new file mode 100644 index 00000000000..f0ce050a943 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-12.c @@ -0,0 +1,5 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-12.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-13.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-13.c new file mode 100644 index 00000000000..555e23522dc --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-13.c @@ -0,0 +1,5 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-13.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-14.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-14.c new file mode 100644 index 00000000000..26207200191 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-14.c @@ -0,0 +1,5 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-14.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-15.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-15.c new file mode 100644 index 00000000000..ad4d562f777 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-15.c @@ -0,0 +1,6 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#define DYNAMIC_OBJECT_SIZE +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-15.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-16.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-16.c new file mode 100644 index 00000000000..5aa256dec1a --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-16.c @@ -0,0 +1,7 @@ +/* { dg-do run } */ +/* { dg-options "-O0" } */ + +#define DYNAMIC_OBJECT_SIZE +#define __builtin_object_size __builtin_dynamic_object_size +char ax2[]; /* { dg-warning "assumed to have one element" = } */ +#include "builtin-object-size-16.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-17.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-17.c new file mode 100644 index 00000000000..d88317d111d --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-17.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O0 -fdump-tree-ssa" } */ + +char ax2[]; /* { dg-warning "assumed to have one element" = } */ +#define __builtin_object_size __builtin_dynamic_object_size +#define DYNAMIC_OBJECT_SIZE +#include "builtin-object-size-17.c" +/* { dg-final { scan-tree-dump-not "failure_on_line" "ssa" } } */ diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-18.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-18.c new file mode 100644 index 00000000000..70c1ebcff21 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-18.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* __stpncpy_chk could return buf up to buf + 64, so + the minimum object size might be far smaller than 64. */ +/* { dg-final { scan-tree-dump-not "return 64;" "optimized" } } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-18.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-19.c b/gcc/= testsuite/gcc.dg/builtin-dynamic-object-size-19.c new file mode 100644 index 00000000000..44141a38607 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-19.c @@ -0,0 +1,104 @@ +/* PR tree-optimization/88372 - alloc_size attribute is ignored + on function pointers { dg-do compile } + { dg-options "-O2 -fdump-tree-optimized" } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-18.c" + +typedef __SIZE_TYPE__ size_t; + +#define ATTR(...) __attribute__ ((__VA_ARGS__)) +#define CONCAT(x, y) x ## y +#define CAT(x, y) CONCAT (x, y) +#define FAILNAME(name) CAT (call_ ## name ##_on_line_, __LINE__) + +#define FAIL(name) do { \ + extern void FAILNAME (name) (void); \ + FAILNAME (name)(); \ + } while (0) + +/* Macro to emit a call to function named + call_in_true_branch_not_eliminated_on_line_NNN() + for each call that's expected to be eliminated. The dg-final + scan-tree-dump-time directive at the bottom of the test verifies + that no such call appears in output. */ +#define ELIM(expr) \ + if (!(expr)) FAIL (in_true_branch_not_eliminated); else (void)0 + +void sink (void*); + +#define T(alloc, n) do { \ + void *p =3D alloc; \ + sink (p); \ + ELIM (n =3D=3D __builtin_object_size (p, 0)); \ + ELIM (n =3D=3D __builtin_object_size (p, 1)); \ + ELIM (n =3D=3D __builtin_object_size (p, 2)); \ + ELIM (n =3D=3D __builtin_object_size (p, 3)); \ + } while (0) + + +ATTR (alloc_size (1)) void* (*alloc_1_x)(size_t, size_t); +ATTR (alloc_size (2)) void* (*alloc_x_2)(size_t, size_t); + +/* Verify that things work when attribute alloc_size is applied + to a typedef that is then used to declared a pointer. */ +typedef ATTR (alloc_size (1, 2)) void* (alloc_1_2_t)(size_t, size_t); + +void test_alloc_ptr (alloc_1_2_t *alloc_1_2) +{ + T (alloc_1_x (0, 0), 0); + T (alloc_1_x (1, 0), 1); + T (alloc_1_x (3, 0), 3); + T (alloc_1_x (9, 5), 9); + + T (alloc_x_2 (0, 0), 0); + T (alloc_x_2 (1, 0), 0); + T (alloc_x_2 (0, 1), 1); + T (alloc_x_2 (9, 5), 5); + + T (alloc_1_2 (0, 0), 0); + T (alloc_1_2 (1, 0), 0); + T (alloc_1_2 (0, 1), 0); + T (alloc_1_2 (9, 5), 45); +} + +/* Verify that object size is detected even in indirect calls via + function pointers to built-in allocation functions, even without + explicit use of attribute alloc_size on the pointers. */ + +typedef void *(allocfn_1) (size_t); +typedef void *(allocfn_1_2) (size_t, size_t); + +static inline void * +call_alloc (allocfn_1 *fn1, allocfn_1_2 *fn2, size_t n1, size_t n2) +{ + return fn1 ? fn1 (n1) : fn2 (n1, n2); +} + +static inline void * +call_malloc (size_t n) +{ + return call_alloc (__builtin_malloc, 0, n, 0); +} + +static inline void * +call_calloc (size_t n1, size_t n2) +{ + return call_alloc (0, __builtin_calloc, n1, n2); +} + +void test_builtin_ptr (void) +{ + T (call_malloc (0), 0); + T (call_malloc (1), 1); + T (call_malloc (9), 9); + + T (call_calloc (0, 0), 0); + T (call_calloc (0, 1), 0); + T (call_calloc (1, 0), 0); + T (call_calloc (1, 1), 1); + T (call_calloc (1, 3), 3); + T (call_calloc (2, 3), 6); +} + +/* { dg-final { scan-tree-dump-not "not_eliminated" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-2.c b/gcc/t= estsuite/gcc.dg/builtin-dynamic-object-size-2.c new file mode 100644 index 00000000000..2f07534c11b --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-2.c @@ -0,0 +1,7 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target alloca } */ + +#define DYNAMIC_OBJECT_SIZE +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-2.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-3.c b/gcc/t= estsuite/gcc.dg/builtin-dynamic-object-size-3.c new file mode 100644 index 00000000000..29b5b358845 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-3.c @@ -0,0 +1,7 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target alloca } */ + +#define DYNAMIC_OBJECT_SIZE +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-3.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c b/gcc/t= estsuite/gcc.dg/builtin-dynamic-object-size-4.c new file mode 100644 index 00000000000..5ff1f16c978 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c @@ -0,0 +1,7 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target alloca } */ + +#define DYNAMIC_OBJECT_SIZE +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-4.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-6.c b/gcc/t= estsuite/gcc.dg/builtin-dynamic-object-size-6.c new file mode 100644 index 00000000000..6a275ce5b37 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-6.c @@ -0,0 +1,5 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-6.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-7.c b/gcc/t= estsuite/gcc.dg/builtin-dynamic-object-size-7.c new file mode 100644 index 00000000000..e2a65994687 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-7.c @@ -0,0 +1,5 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-7.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-8.c b/gcc/t= estsuite/gcc.dg/builtin-dynamic-object-size-8.c new file mode 100644 index 00000000000..e7af383d9b6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-8.c @@ -0,0 +1,5 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-8.c" diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-9.c b/gcc/t= estsuite/gcc.dg/builtin-dynamic-object-size-9.c new file mode 100644 index 00000000000..19021bc2ce9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-9.c @@ -0,0 +1,5 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#define __builtin_object_size __builtin_dynamic_object_size +#include "builtin-object-size-9.c" diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-1.c b/gcc/testsuite= /gcc.dg/builtin-object-size-1.c index 8cdae49a6b1..33987dd279f 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-1.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-1.c @@ -42,9 +42,17 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (q, 0) !=3D (size_t) -1) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 0) + !=3D (x < 0 + ? sizeof (a) - __builtin_offsetof (struct A, a) - 9 + : sizeof (a) - __builtin_offsetof (struct A, c) - 1)) + abort (); +#else if (__builtin_object_size (r, 0) !=3D sizeof (a) - __builtin_offsetof (struct A, a) - 9) abort (); +#endif if (x < 6) r =3D &w[2].a[1]; else @@ -58,9 +66,17 @@ test1 (void *q, int x) if (__builtin_object_size (&y.b, 0) !=3D sizeof (a) - __builtin_offsetof (struct A, b)) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 0) + !=3D (x < 6 + ? 2 * sizeof (w[0]) - __builtin_offsetof (struct A, a) - 1 + : sizeof (a) - __builtin_offsetof (struct A, a) - 6)) + abort (); +#else if (__builtin_object_size (r, 0) !=3D 2 * sizeof (w[0]) - __builtin_offsetof (struct A, a) - 1) abort (); +#endif if (x < 20) r =3D malloc (30); else @@ -119,12 +135,21 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (&extb[5], 0) !=3D sizeof (extb) - 5) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (var, 0) !=3D x + 10) + abort (); + if (__builtin_object_size (var + 10, 0) !=3D x) + abort (); + if (__builtin_object_size (&var[5], 0) !=3D x + 5) + abort (); +#else if (__builtin_object_size (var, 0) !=3D (size_t) -1) abort (); if (__builtin_object_size (var + 10, 0) !=3D (size_t) -1) abort (); if (__builtin_object_size (&var[5], 0) !=3D (size_t) -1) abort (); +#endif if (__builtin_object_size (zerol, 0) !=3D 0) abort (); if (__builtin_object_size (&zerol, 0) !=3D 0) @@ -165,6 +190,9 @@ test2 (void) struct B { char buf1[10]; char buf2[10]; } a; char *r, buf3[20]; int i; +#ifdef DYNAMIC_OBJECT_SIZE + size_t dyn_res; +#endif =20 if (sizeof (a) !=3D 20) return; @@ -181,8 +209,26 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[9]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3); + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 1; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf2) - 7; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 9; + } + if (__builtin_object_size (r, 0) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 0) !=3D 20) abort (); +#endif r =3D &buf3[20]; for (i =3D 0; i < 4; ++i) { @@ -195,13 +241,44 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[9]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3) - 20; + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 7; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf2) - 7; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 9; + } + if (__builtin_object_size (r, 0) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 0) !=3D 15) abort (); +#endif r +=3D 8; +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res -=3D 8; + if (__builtin_object_size (r, 0) !=3D dyn_res) + abort (); + if (dyn_res >=3D 6) + { + if (__builtin_object_size (r + 6, 0) !=3D dyn_res - 6) + abort (); + } + else if (__builtin_object_size (r + 6, 0) !=3D 0) + abort (); +#else if (__builtin_object_size (r, 0) !=3D 7) abort (); if (__builtin_object_size (r + 6, 0) !=3D 1) abort (); +#endif r =3D &buf3[18]; for (i =3D 0; i < 4; ++i) { @@ -214,8 +291,31 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[4]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3) - 18; + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 9; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf2) - 9; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 4; + } + if (dyn_res >=3D 12) + { + if (__builtin_object_size (r + 12, 0) !=3D dyn_res - 12) + abort (); + } + else if (__builtin_object_size (r + 12, 0) !=3D 0) + abort (); +#else if (__builtin_object_size (r + 12, 0) !=3D 4) abort (); +#endif } =20 void @@ -358,6 +458,10 @@ test5 (size_t x) =20 for (i =3D 0; i < x; ++i) p =3D p + 4; +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (p, 0) !=3D sizeof (buf) - 8 - 4 * x) + abort (); +#else /* My understanding of ISO C99 6.5.6 is that a conforming program will not end up with p equal to &buf[0] through &buf[7], i.e. calling this function with say @@ -367,6 +471,7 @@ test5 (size_t x) it would be 64 (or conservative (size_t) -1 =3D=3D unknown). */ if (__builtin_object_size (p, 0) !=3D sizeof (buf) - 8) abort (); +#endif memset (p, ' ', sizeof (buf) - 8 - 4 * 4); } =20 @@ -380,8 +485,13 @@ test6 (size_t x) =20 for (i =3D 0; i < x; ++i) p =3D p + 4; +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (p, 0) !=3D sizeof (t) - 8 - 4 * x) + abort (); +#else if (__builtin_object_size (p, 0) !=3D sizeof (t) - 8) abort (); +#endif memset (p, ' ', sizeof (t) - 8 - 4 * 4); } =20 diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-16.c b/gcc/testsuit= e/gcc.dg/builtin-object-size-16.c index 48229390bfd..67680020337 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-16.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-16.c @@ -54,7 +54,9 @@ static int nfails; typedef __SIZE_TYPE__ size_t; =20 extern char ax[]; +#ifndef DYNAMIC_OBJECT_SIZE char ax2[]; /* { dg-warning "assumed to have one element" = } */ +#endif =20 extern char a0[0]; static char a1[1]; @@ -114,11 +116,19 @@ test_arrays () T ( 4, 2, 4, 2, &a2x2[0][0]); T ( 0, F1 (0), 0, 0, &a2x2 + 1); T ( 2, F1 ( 2), 2, F3 ( 2), &a2x2[0] + 1); +#ifdef DYNAMIC_OBJECT_SIZE + T ( 3, F1 ( 1), 3, F3 ( 1), &a2x2[0][0] + 1); +#else T ( 3, F1 ( 1), 3, F3 ( 3), &a2x2[0][0] + 1); +#endif =20 T ( 15, 15, 15, 15, a3x5); T ( 15, 5, 15, 5, &a3x5[0][0] + 0); +#ifdef DYNAMIC_OBJECT_SIZE + T ( 14, F1 ( 4), 14, F3 ( 4), &a3x5[0][0] + 1); +#else T ( 14, F1 ( 4), 14, F3 (14), &a3x5[0][0] + 1); +#endif =20 T ( 1, 1, 1, 1, a1 + 0); T ( 0, F1 (0), 0, 0, a1 + 1); diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-17.c b/gcc/testsuit= e/gcc.dg/builtin-object-size-17.c index 0497bbf4505..09552a8a963 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-17.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-17.c @@ -49,7 +49,9 @@ typedef __SIZE_TYPE__ size_t; =20 extern char ax[]; +#ifndef DYNAMIC_OBJECT_SIZE char ax2[]; /* { dg-warning "assumed to have one element" = } */ +#endif =20 extern char a0[0]; static char a1[1]; diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-2.c b/gcc/testsuite= /gcc.dg/builtin-object-size-2.c index ad2dd296a9a..c7ce5e988ca 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-2.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-2.c @@ -32,6 +32,9 @@ test1 (void *q, int x) void *p =3D &a.a[3], *r; char var[x + 10]; struct A vara[x + 10]; +#ifdef DYNAMIC_OBJECT_SIZE + size_t dyn_res; +#endif if (x < 0) r =3D &a.a[9]; else @@ -43,8 +46,15 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (q, 1) !=3D (size_t) -1) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (x < 0 + ? __builtin_object_size (r, 1) !=3D sizeof (a.a) - 9 + : __builtin_object_size (r, 1) !=3D sizeof (a.c) - 1) + abort (); +#else if (__builtin_object_size (r, 1) !=3D sizeof (a.c) - 1) abort (); +#endif if (x < 6) r =3D &w[2].a[1]; else @@ -55,36 +65,74 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (&y.b, 1) !=3D sizeof (a.b)) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (x < 6 + ? __builtin_object_size (r, 1) !=3D sizeof (a.a) - 1 + : __builtin_object_size (r, 1) !=3D sizeof (a.a) - 6) + abort (); +#else if (__builtin_object_size (r, 1) !=3D sizeof (a.a) - 1) abort (); +#endif if (x < 20) r =3D malloc (30); else r =3D calloc (2, 16); +#ifdef DYNAMIC_OBJECT_SIZE + if (x < 20 + ? __builtin_object_size (r, 1) !=3D 30 + : __builtin_object_size (r, 1) !=3D 2 * 16) + abort (); +#else /* We may duplicate this test onto the two exit paths. On one path the size will be 32, the other it will be 30. If we don't duplicat= e this test, then the size will be 32. */ if (__builtin_object_size (r, 1) !=3D 2 * 16 && __builtin_object_size (r, 1) !=3D 30) abort (); +#endif if (x < 20) r =3D malloc (30); else r =3D calloc (2, 14); +#ifdef DYNAMIC_OBJECT_SIZE + if (x < 20 + ? __builtin_object_size (r, 1) !=3D 30 + : __builtin_object_size (r, 1) !=3D 2 * 14) + abort (); +#else if (__builtin_object_size (r, 1) !=3D 30) abort (); +#endif if (x < 30) r =3D malloc (sizeof (a)); else r =3D &a.a[3]; +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D x < 30 ? sizeof (a) : sizeof (a.a) - 3; + if (__builtin_object_size (r, 1) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 1) !=3D sizeof (a)) abort (); +#endif r =3D memcpy (r, "a", 2); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 1) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 1) !=3D sizeof (a)) abort (); +#endif r =3D memcpy (r + 2, "b", 2) + 2; +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res -=3D 4; + if (__builtin_object_size (r, 1) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 1) !=3D sizeof (a) - 4) abort (); +#endif r =3D &a.a[4]; r =3D memset (r, 'a', 2); if (__builtin_object_size (r, 1) !=3D sizeof (a.a) - 4) @@ -123,6 +171,20 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (&extc[5].c[3], 1) !=3D (size_t) -1) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (var, 1) !=3D x + 10) + abort (); + if (__builtin_object_size (var + 10, 1) !=3D x) + abort (); + if (__builtin_object_size (&var[5], 1) !=3D x + 5) + abort (); + if (__builtin_object_size (vara, 1) !=3D (x + 10) * sizeof (struct A)) + abort (); + if (__builtin_object_size (vara + 10, 1) !=3D x * sizeof (struct A)) + abort (); =20 + if (__builtin_object_size (&vara[5], 1) !=3D (x + 5) * sizeof (struct = A)) + abort (); +#else if (__builtin_object_size (var, 1) !=3D (size_t) -1) abort (); if (__builtin_object_size (var + 10, 1) !=3D (size_t) -1) @@ -135,6 +197,7 @@ test1 (void *q, int x) abort (); =20 if (__builtin_object_size (&vara[5], 1) !=3D (size_t) -1) abort (); +#endif if (__builtin_object_size (&vara[0].a, 1) !=3D sizeof (vara[0].a)) abort (); if (__builtin_object_size (&vara[10].a[0], 1) !=3D sizeof (vara[0].a)) @@ -185,6 +248,9 @@ test2 (void) struct B { char buf1[10]; char buf2[10]; } a; char *r, buf3[20]; int i; +#ifdef DYNAMIC_OBJECT_SIZE + size_t dyn_res; +#endif =20 if (sizeof (a) !=3D 20) return; @@ -201,8 +267,26 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[9]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3); + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a.buf1) - 1; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a.buf2) - 7; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a.buf1) - 9; + } + if (__builtin_object_size (r, 1) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 1) !=3D sizeof (buf3)) abort (); +#endif r =3D &buf3[20]; for (i =3D 0; i < 4; ++i) { @@ -215,13 +299,50 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[9]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3) - 20; + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a.buf1) - 7; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a.buf2) - 7; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a.buf1) - 9; + } + if (__builtin_object_size (r, 1) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 1) !=3D sizeof (buf3) - 5) abort (); +#endif r +=3D 8; +#ifdef DYNAMIC_OBJECT_SIZE + if (dyn_res >=3D 8) + { + dyn_res -=3D 8; + if (__builtin_object_size (r, 1) !=3D dyn_res) + abort (); + + if (dyn_res >=3D 6) + { + if (__builtin_object_size (r + 6, 1) !=3D dyn_res - 6) + abort (); + } + else if (__builtin_object_size (r + 6, 1) !=3D 0) + abort (); + } + else if (__builtin_object_size (r, 1) !=3D 0) + abort (); +#else if (__builtin_object_size (r, 1) !=3D sizeof (buf3) - 13) abort (); if (__builtin_object_size (r + 6, 1) !=3D sizeof (buf3) - 19) abort (); +#endif } =20 void @@ -339,8 +460,13 @@ test5 (size_t x) =20 for (i =3D 0; i < x; ++i) p =3D p + 4; +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (p, 1) !=3D sizeof (t.buf) - 8 - 4 * x) + abort (); +#else if (__builtin_object_size (p, 1) !=3D sizeof (t.buf) - 8) abort (); +#endif memset (p, ' ', sizeof (t.buf) - 8 - 4 * 4); } =20 diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-3.c b/gcc/testsuite= /gcc.dg/builtin-object-size-3.c index d5ca5047ee9..9533af9f058 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-3.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-3.c @@ -42,9 +42,17 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (q, 2) !=3D 0) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 2) + !=3D (x < 0 + ? sizeof (a) - __builtin_offsetof (struct A, a) - 9 + : sizeof (a) - __builtin_offsetof (struct A, c) - 1)) + abort (); +#else if (__builtin_object_size (r, 2) !=3D sizeof (a) - __builtin_offsetof (struct A, c) - 1) abort (); +#endif if (x < 6) r =3D &w[2].a[1]; else @@ -58,9 +66,17 @@ test1 (void *q, int x) if (__builtin_object_size (&y.b, 2) !=3D sizeof (a) - __builtin_offsetof (struct A, b)) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 2) + !=3D (x < 6 + ? 2 * sizeof (w[0]) - __builtin_offsetof (struct A, a) - 1 + : sizeof (a) - __builtin_offsetof (struct A, a) - 6)) + abort (); +#else if (__builtin_object_size (r, 2) !=3D sizeof (a) - __builtin_offsetof (struct A, a) - 6) abort (); +#endif if (x < 20) r =3D malloc (30); else @@ -71,23 +87,45 @@ test1 (void *q, int x) r =3D malloc (30); else r =3D calloc (2, 14); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 2) !=3D (x < 20 ? 30 : 2 * 14)) + abort (); +#else if (__builtin_object_size (r, 2) !=3D 2 * 14) abort (); +#endif if (x < 30) r =3D malloc (sizeof (a)); else r =3D &a.a[3]; +#ifdef DYNAMIC_OBJECT_SIZE + size_t objsz =3D (x < 30 ? sizeof (a) + : sizeof (a) - __builtin_offsetof (struct A, a) - 3); + if (__builtin_object_size (r, 2) !=3D objsz) + abort (); +#else if (__builtin_object_size (r, 2) !=3D sizeof (a) - __builtin_offsetof (struct A, a) - 3) abort (); +#endif r =3D memcpy (r, "a", 2); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 2) !=3D objsz) + abort (); +#else if (__builtin_object_size (r, 2) !=3D sizeof (a) - __builtin_offsetof (struct A, a) - 3) abort (); +#endif r =3D memcpy (r + 2, "b", 2) + 2; +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 2) !=3D objsz - 4) + abort (); +#else if (__builtin_object_size (r, 2) !=3D sizeof (a) - __builtin_offsetof (struct A, a) - 3 - 4) abort (); +#endif r =3D &a.a[4]; r =3D memset (r, 'a', 2); if (__builtin_object_size (r, 2) @@ -118,12 +156,21 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (&extb[5], 2) !=3D sizeof (extb) - 5) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (var, 2) !=3D x + 10) + abort (); + if (__builtin_object_size (var + 10, 2) !=3D x) + abort (); + if (__builtin_object_size (&var[5], 2) !=3D x + 5) + abort (); +#else if (__builtin_object_size (var, 2) !=3D 0) abort (); if (__builtin_object_size (var + 10, 2) !=3D 0) abort (); if (__builtin_object_size (&var[5], 2) !=3D 0) abort (); +#endif if (__builtin_object_size (zerol, 2) !=3D 0) abort (); if (__builtin_object_size (&zerol, 2) !=3D 0) @@ -164,6 +211,9 @@ test2 (void) struct B { char buf1[10]; char buf2[10]; } a; char *r, buf3[20]; int i; +#ifdef DYNAMIC_OBJECT_SIZE + size_t dyn_res; +#endif =20 if (sizeof (a) !=3D 20) return; @@ -180,8 +230,26 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[9]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3); + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 1; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf2) - 7; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 9; + } + if (__builtin_object_size (r, 2) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 2) !=3D 3) abort (); +#endif r =3D &buf3[20]; for (i =3D 0; i < 4; ++i) { @@ -194,8 +262,26 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[9]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3) - 20; + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 7; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf2) - 7; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 9; + } + if (__builtin_object_size (r, 2) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 2) !=3D 0) abort (); +#endif r =3D &buf3[2]; for (i =3D 0; i < 4; ++i) { @@ -208,13 +294,44 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[4]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3) - 2; + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 1; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 2; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 4; + } + if (__builtin_object_size (r, 2) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 2) !=3D 15) abort (); +#endif r +=3D 8; +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res -=3D 8; + if (__builtin_object_size (r, 2) !=3D dyn_res) + abort (); + if (dyn_res >=3D 6) + { + if (__builtin_object_size (r + 6, 2) !=3D dyn_res - 6) + abort (); + } + else if (__builtin_object_size (r + 6, 2) !=3D 0) + abort (); +#else if (__builtin_object_size (r, 2) !=3D 7) abort (); if (__builtin_object_size (r + 6, 2) !=3D 1) abort (); +#endif r =3D &buf3[18]; for (i =3D 0; i < 4; ++i) { @@ -227,8 +344,31 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[4]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3) - 18; + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 9; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf2) - 9; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a) - __builtin_offsetof (struct B, buf1) - 4; + } + if (dyn_res >=3D 12) + { + if (__builtin_object_size (r + 12, 2) !=3D dyn_res - 12) + abort (); + } + else if (__builtin_object_size (r + 12, 2) !=3D 0) + abort (); +#else if (__builtin_object_size (r + 12, 2) !=3D 0) abort (); +#endif } =20 void @@ -371,7 +511,11 @@ test5 (size_t x) =20 for (i =3D 0; i < x; ++i) p =3D p + 4; +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (p, 2) !=3D sizeof (buf) - 8 - 4 * x) +#else if (__builtin_object_size (p, 2) !=3D 0) +#endif abort (); memset (p, ' ', sizeof (buf) - 8 - 4 * 4); } @@ -386,7 +530,11 @@ test6 (size_t x) =20 for (i =3D 0; i < x; ++i) p =3D p + 4; +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (p, 2) !=3D sizeof (t) - 8 - 4 * x) +#else if (__builtin_object_size (p, 2) !=3D 0) +#endif abort (); memset (p, ' ', sizeof (t) - 8 - 4 * 4); } diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-4.c b/gcc/testsuite= /gcc.dg/builtin-object-size-4.c index 9f159e36a0f..256cea0b3fb 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-4.c +++ b/gcc/testsuite/gcc.dg/builtin-object-size-4.c @@ -43,7 +43,12 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (q, 3) !=3D 0) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 3) + !=3D (x < 0 ? sizeof (a.a) - 9 : sizeof (a.c) - 1)) +#else if (__builtin_object_size (r, 3) !=3D sizeof (a.a) - 9) +#endif abort (); if (x < 6) r =3D &w[2].a[1]; @@ -55,31 +60,57 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (&y.b, 3) !=3D sizeof (a.b)) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 3) + !=3D (x < 6 ? sizeof (w[2].a) - 1 : sizeof (a.a) - 6)) +#else if (__builtin_object_size (r, 3) !=3D sizeof (a.a) - 6) +#endif abort (); if (x < 20) r =3D malloc (30); else r =3D calloc (2, 16); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 3) !=3D (x < 20 ? 30 : 2 * 16)) +#else if (__builtin_object_size (r, 3) !=3D 30) +#endif abort (); if (x < 20) r =3D malloc (30); else r =3D calloc (2, 14); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 3) !=3D (x < 20 ? 30 : 2 * 14)) +#else if (__builtin_object_size (r, 3) !=3D 2 * 14) +#endif abort (); if (x < 30) r =3D malloc (sizeof (a)); else r =3D &a.a[3]; +#ifdef DYNAMIC_OBJECT_SIZE + size_t objsz =3D x < 30 ? sizeof (a) : sizeof (a.a) - 3; + if (__builtin_object_size (r, 3) !=3D objsz) +#else if (__builtin_object_size (r, 3) !=3D sizeof (a.a) - 3) +#endif abort (); r =3D memcpy (r, "a", 2); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 3) !=3D objsz) +#else if (__builtin_object_size (r, 3) !=3D sizeof (a.a) - 3) +#endif abort (); r =3D memcpy (r + 2, "b", 2) + 2; +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 3) !=3D objsz - 4) +#else if (__builtin_object_size (r, 3) !=3D sizeof (a.a) - 3 - 4) +#endif abort (); r =3D &a.a[4]; r =3D memset (r, 'a', 2); @@ -119,6 +150,23 @@ test1 (void *q, int x) abort (); if (__builtin_object_size (&extc[5].c[3], 3) !=3D 0) abort (); +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (var, 3) !=3D x + 10) + abort (); + if (__builtin_object_size (var + 10, 3) !=3D x) + abort (); + if (__builtin_object_size (&var[5], 3) !=3D x + 5) + abort (); + size_t vara_sz =3D (x + 10) * sizeof (struct A); + if (__builtin_object_size (vara, 3) !=3D vara_sz) + abort (); + vara_sz =3D x * sizeof (struct A); + if (__builtin_object_size (vara + 10, 3) !=3D vara_sz) + abort (); =20 + vara_sz =3D (x + 5) * sizeof (struct A); + if (__builtin_object_size (&vara[5], 3) !=3D vara_sz) + abort (); +#else if (__builtin_object_size (var, 3) !=3D 0) abort (); if (__builtin_object_size (var + 10, 3) !=3D 0) @@ -131,6 +179,7 @@ test1 (void *q, int x) abort (); =20 if (__builtin_object_size (&vara[5], 3) !=3D 0) abort (); +#endif if (__builtin_object_size (&vara[0].a, 3) !=3D sizeof (vara[0].a)) abort (); if (__builtin_object_size (&vara[10].a[0], 3) !=3D sizeof (vara[0].a)) @@ -184,6 +233,9 @@ test2 (void) struct B { char buf1[10]; char buf2[10]; } a; char *r, buf3[20]; int i; +#ifdef DYNAMIC_OBJECT_SIZE + size_t dyn_res =3D 0; +#endif =20 if (sizeof (a) !=3D 20) return; @@ -200,8 +252,26 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[9]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3); + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a.buf1) - 1; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a.buf2) - 7; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a.buf1) - 9; + } + if (__builtin_object_size (r, 3) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 3) !=3D sizeof (a.buf1) - 9) abort (); +#endif r =3D &buf3[20]; for (i =3D 0; i < 4; ++i) { @@ -214,8 +284,26 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[9]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3) - 20; + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a.buf1) - 7; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a.buf2) - 7; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a.buf1) - 9; + } + if (__builtin_object_size (r, 3) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 3) !=3D 0) abort (); +#endif r =3D &buf3[1]; for (i =3D 0; i < 4; ++i) { @@ -228,13 +316,38 @@ test2 (void) else if (i =3D=3D l1 + 2) r =3D &a.buf1[2]; } +#ifdef DYNAMIC_OBJECT_SIZE + dyn_res =3D sizeof (buf3) - 1; + + for (i =3D 0; i < 4; ++i) + { + if (i =3D=3D l1 - 1) + dyn_res =3D sizeof (a.buf1) - 6; + else if (i =3D=3D l1) + dyn_res =3D sizeof (a.buf2) - 4; + else if (i =3D=3D l1 + 1) + dyn_res =3D sizeof (buf3) - 5; + else if (i =3D=3D l1 + 2) + dyn_res =3D sizeof (a.buf1) - 2; + } + if (__builtin_object_size (r, 3) !=3D dyn_res) + abort (); +#else if (__builtin_object_size (r, 3) !=3D sizeof (a.buf1) - 6) abort (); +#endif r +=3D 2; +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (r, 3) !=3D dyn_res - 2) + abort (); + if (__builtin_object_size (r + 1, 3) !=3D dyn_res - 3) + abort (); +#else if (__builtin_object_size (r, 3) !=3D sizeof (a.buf1) - 6 - 2) abort (); if (__builtin_object_size (r + 1, 3) !=3D sizeof (a.buf1) - 6 - 3) abort (); +#endif } =20 void @@ -352,7 +465,11 @@ test5 (size_t x) =20 for (i =3D 0; i < x; ++i) p =3D p + 4; +#ifdef DYNAMIC_OBJECT_SIZE + if (__builtin_object_size (p, 3) !=3D sizeof (t.buf) - 8 - 4 * x) +#else if (__builtin_object_size (p, 3) !=3D 0) +#endif abort (); memset (p, ' ', sizeof (t.buf) - 8 - 4 * 4); } --=20 2.31.1