public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/ARM/heads/morello)] A testsuite-only patch that will:
@ 2022-02-28 12:08 Matthew Malcomson
  0 siblings, 0 replies; only message in thread
From: Matthew Malcomson @ 2022-02-28 12:08 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:39294e2fe8abb2b2a06c2d196cd05107b26b37cd

commit 39294e2fe8abb2b2a06c2d196cd05107b26b37cd
Author: Stam Markianos-Wright <stam.markianos-wright@arm.com>
Date:   Wed Oct 20 09:53:48 2021 +0100

    A testsuite-only patch that will:
    
    - Skip a number of tests that, by their design, will
      do something illegal with capability pointers. This includes
      casting to/from integers, using executable-stack trampolines
      or under-aligning the capability in a packed struct (for tests
      that are in a generic part of the testsuite -- tests that
      under-align capabilities in the aarch64 testsuite are left as
      FAILs in order to be revisited at a later data)
    
    - In the builtins testsuite: Here all the affected tests would
      override the Newlib definition of memset/memcpy/memmove/etc.
      with one provided in
        a) the test itself (e.g. see memops-asm)
        b) the `lib/chk.c` file,
        c) the `lib/<operation>.c` file.
      These overrides causes a problem for memset, because memset also
      gets called at the very start of crt0.s, before `__init_global_caps`
      and `__processRelocs`, so an exception gets raised when this
      new memset tries to access global variables like `memset_disallowed`
      `inside_main` through the GOT.
      To avoid this clash I have renamed the new memset to test_memset,
      which no longer overrides Newlib's memset (the final binary includes
      both Newlib's `memset` and the new `test_memset`)
      Now most things from the tests will call `test_memset`,
      but crt0 will correctly call Newlib's `memset`.
      Some test coverage is lost when doing this (namely the check against
      `memset_disallowed && inside_main && n < 2`)
    
    - In global_constants.c: Simply skip an invalid section of
      the test (we may want to further expand the test for PureCap
      in the future).
    
    The remaining execution failures in the testsuite are:
    
    The following are in the aarch64 target testsuite and they under-align
    capabilities in packed structs. This will need to be further addressed
    and the tests modified in the future:
    - aapcs64/morello-test_7.c
    - aapcs64/morello-test_8.c
    - aapcs64/morello-func-ret-1.c
    
    Builtin apply has not been implemented for Purecap Morello:
    - stackalign/builtin-apply-2.c
    - gcc.dg/builtin-apply2.c

Diff:
---
 gcc/testsuite/gcc.c-torture/execute/960117-1.c                | 1 +
 gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-6.c      | 1 +
 gcc/testsuite/gcc.c-torture/execute/builtins/chk.h            | 4 ++++
 gcc/testsuite/gcc.c-torture/execute/builtins/lib/chk.c        | 8 ++++++++
 gcc/testsuite/gcc.c-torture/execute/builtins/lib/memset.c     | 4 ++++
 gcc/testsuite/gcc.c-torture/execute/builtins/memops-asm-lib.c | 4 ++++
 gcc/testsuite/gcc.c-torture/execute/comp-goto-1.c             | 1 +
 gcc/testsuite/gcc.c-torture/execute/pr36339.c                 | 1 +
 gcc/testsuite/gcc.c-torture/execute/pr60003.c                 | 6 ++++--
 gcc/testsuite/gcc.c-torture/execute/strct-pack-2.c            | 1 +
 gcc/testsuite/gcc.dg/compat/struct-layout-1.exp               | 6 ++++++
 gcc/testsuite/gcc.dg/pragma-align.c                           | 2 +-
 gcc/testsuite/gcc.dg/strlenopt-63.c                           | 4 +++-
 gcc/testsuite/gcc.dg/torture/pr45623.c                        | 1 +
 gcc/testsuite/gcc.dg/torture/pr45967-2.c                      | 1 +
 gcc/testsuite/gcc.dg/torture/pr45967-3.c                      | 1 +
 gcc/testsuite/gcc.dg/torture/pr45967.c                        | 1 +
 gcc/testsuite/gcc.dg/torture/pr65077.c                        | 1 +
 gcc/testsuite/gcc.target/aarch64/morello/global-constants.c   | 5 +++--
 gcc/testsuite/lib/target-supports.exp                         | 2 ++
 20 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/gcc/testsuite/gcc.c-torture/execute/960117-1.c b/gcc/testsuite/gcc.c-torture/execute/960117-1.c
index 741455b08b9..ce97dc69485 100644
--- a/gcc/testsuite/gcc.c-torture/execute/960117-1.c
+++ b/gcc/testsuite/gcc.c-torture/execute/960117-1.c
@@ -1,3 +1,4 @@
+/* { dg-skip-if "Test performs capability-invalidating illegal memory accesses" { cheri_capability_pure } } */
 static char id_space[2] [32 +1];
 typedef short COUNT;
 
diff --git a/gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-6.c b/gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-6.c
index f643c5c7286..9a9f2ab6da0 100644
--- a/gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-6.c
+++ b/gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-6.c
@@ -1,6 +1,7 @@
 /* Test that __builtin_prefetch does no harm.
 
    Data prefetch should not fault if used with an invalid address.  */
+/* { dg-skip-if "Test performs illegal memory accesses with invalid capabilities" { cheri_capability_pure } } */
 
 #include <limits.h>
 
diff --git a/gcc/testsuite/gcc.c-torture/execute/builtins/chk.h b/gcc/testsuite/gcc.c-torture/execute/builtins/chk.h
index 9bf725560bf..9890af5c1e2 100644
--- a/gcc/testsuite/gcc.c-torture/execute/builtins/chk.h
+++ b/gcc/testsuite/gcc.c-torture/execute/builtins/chk.h
@@ -55,7 +55,11 @@
 #undef __builtin_memmove
 #define __builtin_memmove(dst, src, len) memmove (dst, src, len)
 #undef __builtin_memset
+#ifdef __CHERI_PURE_CAPABILITY__
+#define __builtin_memset(dst, val, len) test_memset (dst, val, len)
+#else
 #define __builtin_memset(dst, val, len) memset (dst, val, len)
+#endif
 #undef __builtin_strcpy
 #define __builtin_strcpy(dst, src) strcpy (dst, src)
 #undef __builtin_stpcpy
diff --git a/gcc/testsuite/gcc.c-torture/execute/builtins/lib/chk.c b/gcc/testsuite/gcc.c-torture/execute/builtins/lib/chk.c
index fd9e6015faa..2c82a9e3f8b 100644
--- a/gcc/testsuite/gcc.c-torture/execute/builtins/lib/chk.c
+++ b/gcc/testsuite/gcc.c-torture/execute/builtins/lib/chk.c
@@ -130,7 +130,11 @@ __memmove_chk (void *dst, const void *src, __SIZE_TYPE__ n, __SIZE_TYPE__ size)
 }
 
 void *
+#ifdef __CHERI_PURE_CAPABILITY__
+test_memset (void *dst, int c, __SIZE_TYPE__ n)
+#else
 memset (void *dst, int c, __SIZE_TYPE__ n)
+#endif
 {
   while (n-- != 0)
     n[(char *) dst] = c;
@@ -155,7 +159,11 @@ __memset_chk (void *dst, int c, __SIZE_TYPE__ n, __SIZE_TYPE__ size)
   ++chk_calls;
   if (n > size)
     __chk_fail ();
+#ifdef __CHERI_PURE_CAPABILITY__
+  return test_memset (dst, c, n);
+#else
   return memset (dst, c, n);
+#endif
 }
 
 char *
diff --git a/gcc/testsuite/gcc.c-torture/execute/builtins/lib/memset.c b/gcc/testsuite/gcc.c-torture/execute/builtins/lib/memset.c
index 90545abbf24..a39aabc89cb 100644
--- a/gcc/testsuite/gcc.c-torture/execute/builtins/lib/memset.c
+++ b/gcc/testsuite/gcc.c-torture/execute/builtins/lib/memset.c
@@ -3,7 +3,11 @@ extern int inside_main;
 
 __attribute__ ((__noinline__))
 void *
+#ifdef __CHERI_PURE_CAPABILITY__
+test_memset (void *dst, int c, __SIZE_TYPE__ n)
+#else
 memset (void *dst, int c, __SIZE_TYPE__ n)
+#endif
 {
   while (n-- != 0)
     n[(char *) dst] = c;
diff --git a/gcc/testsuite/gcc.c-torture/execute/builtins/memops-asm-lib.c b/gcc/testsuite/gcc.c-torture/execute/builtins/memops-asm-lib.c
index 3baf7a64622..d9970e208c9 100644
--- a/gcc/testsuite/gcc.c-torture/execute/builtins/memops-asm-lib.c
+++ b/gcc/testsuite/gcc.c-torture/execute/builtins/memops-asm-lib.c
@@ -96,7 +96,11 @@ bcopy (const void *s, void *d, size_t n)
 }
 
 void *
+#ifdef __CHERI_PURE_CAPABILITY__
+test_memset (void *d, int c, size_t n)
+#else
 memset (void *d, int c, size_t n)
+#endif
 {
   void *result = my_memset (d, c, n);
   TEST_ABORT;
diff --git a/gcc/testsuite/gcc.c-torture/execute/comp-goto-1.c b/gcc/testsuite/gcc.c-torture/execute/comp-goto-1.c
index 4379fe70e9c..5b6b4674c58 100644
--- a/gcc/testsuite/gcc.c-torture/execute/comp-goto-1.c
+++ b/gcc/testsuite/gcc.c-torture/execute/comp-goto-1.c
@@ -1,5 +1,6 @@
 /* { dg-require-effective-target label_values } */
 /* { dg-require-stack-size "4000" } */
+/* { dg-skip-if "Test performs capability-invalidating illegal memory accesses" { cheri_capability_pure } } */
 
 #include <stdlib.h>
 
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr36339.c b/gcc/testsuite/gcc.c-torture/execute/pr36339.c
index c4f36ddcace..2cfcc172871 100644
--- a/gcc/testsuite/gcc.c-torture/execute/pr36339.c
+++ b/gcc/testsuite/gcc.c-torture/execute/pr36339.c
@@ -1,3 +1,4 @@
+/* { dg-skip-if "Test performs capability-invalidating illegal memory accesses" { cheri_capability_pure } } */
 extern void abort (void);
 
 typedef unsigned long my_uintptr_t;
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr60003.c b/gcc/testsuite/gcc.c-torture/execute/pr60003.c
index 92bcc565980..cd33485cc72 100644
--- a/gcc/testsuite/gcc.c-torture/execute/pr60003.c
+++ b/gcc/testsuite/gcc.c-torture/execute/pr60003.c
@@ -2,9 +2,11 @@
 /* { dg-require-effective-target indirect_jumps } */
 
 extern void abort (void);
-
+#ifdef __GCC_ARM_CAPABILITY_ANY
+__uintcap_t jmp_buf[5];
+#else
 unsigned long long jmp_buf[5];
-
+#endif
 __attribute__((noinline, noclone)) void
 baz (void)
 {
diff --git a/gcc/testsuite/gcc.c-torture/execute/strct-pack-2.c b/gcc/testsuite/gcc.c-torture/execute/strct-pack-2.c
index be76c764521..60f343a9693 100644
--- a/gcc/testsuite/gcc.c-torture/execute/strct-pack-2.c
+++ b/gcc/testsuite/gcc.c-torture/execute/strct-pack-2.c
@@ -1,3 +1,4 @@
+/* { dg-skip-if "Test performs capability-invalidating illegal memory accesses" { cheri_capability_pure } } */
 typedef struct
 {
   short a __attribute__ ((aligned (2),packed));
diff --git a/gcc/testsuite/gcc.dg/compat/struct-layout-1.exp b/gcc/testsuite/gcc.dg/compat/struct-layout-1.exp
index 66ee483e491..8578a69b4c5 100644
--- a/gcc/testsuite/gcc.dg/compat/struct-layout-1.exp
+++ b/gcc/testsuite/gcc.dg/compat/struct-layout-1.exp
@@ -34,6 +34,12 @@ if $tracelevel then {
     strace $tracelevel
 }
 
+# The random generator in this testsuite may deliberately underalign
+# capabilities in a packed struct. This is currently not supported.
+if { [check_effective_target_cheri_capability_pure] } then {
+  return
+}
+
 global GCC_UNDER_TEST
 global compat_save_gcc_under_test
 global compat_use_alt
diff --git a/gcc/testsuite/gcc.dg/pragma-align.c b/gcc/testsuite/gcc.dg/pragma-align.c
index 4c0138b5f89..0ecf993234b 100644
--- a/gcc/testsuite/gcc.dg/pragma-align.c
+++ b/gcc/testsuite/gcc.dg/pragma-align.c
@@ -9,7 +9,7 @@ struct {
         long two;
 } defaultalign;
 
-#if defined(__LP64__)
+#if __SIZEOF_LONG__ == 8
 #pragma pack(8)
 #else
 #pragma pack(4)
diff --git a/gcc/testsuite/gcc.dg/strlenopt-63.c b/gcc/testsuite/gcc.dg/strlenopt-63.c
index f77db6bbe7a..f09bbc002cf 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-63.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-63.c
@@ -3,7 +3,9 @@
    Verify that strlen of pointers to char arrays are computed correctly
    (whether folded or not).
    { dg-do run }
-   { dg-options "-O2 -Wall" } */
+   { dg-options "-O2 -Wall" }
+   { dg-skip-if "Test performs illegal out-of-bounds capability memory accesses" { cheri_capability_pure } }
+   */
 
 #include "strlenopt.h"
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr45623.c b/gcc/testsuite/gcc.dg/torture/pr45623.c
index 693a8c4c7be..ce3914e93ec 100644
--- a/gcc/testsuite/gcc.dg/torture/pr45623.c
+++ b/gcc/testsuite/gcc.dg/torture/pr45623.c
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-std=c99" } */
+/* { dg-skip-if "Test performs capability-invalidating illegal memory accesses" { cheri_capability_pure } } */
 
 #include <stdint.h>
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr45967-2.c b/gcc/testsuite/gcc.dg/torture/pr45967-2.c
index 6959fd5e15c..8c0a7c420ba 100644
--- a/gcc/testsuite/gcc.dg/torture/pr45967-2.c
+++ b/gcc/testsuite/gcc.dg/torture/pr45967-2.c
@@ -1,4 +1,5 @@
 /* { dg-do run } */
+/* { dg-skip-if "Test performs capability-invalidating illegal memory accesses" { cheri_capability_pure } } */
 
 extern void abort (void);
 int b;
diff --git a/gcc/testsuite/gcc.dg/torture/pr45967-3.c b/gcc/testsuite/gcc.dg/torture/pr45967-3.c
index 1a23a773b17..66bf2a229cc 100644
--- a/gcc/testsuite/gcc.dg/torture/pr45967-3.c
+++ b/gcc/testsuite/gcc.dg/torture/pr45967-3.c
@@ -1,4 +1,5 @@
 /* { dg-do run } */
+/* { dg-skip-if "Test performs capability-invalidating illegal memory accesses" { cheri_capability_pure } } */
 
 extern void abort (void);
 void
diff --git a/gcc/testsuite/gcc.dg/torture/pr45967.c b/gcc/testsuite/gcc.dg/torture/pr45967.c
index 0a5b206e5e1..02515f3b79b 100644
--- a/gcc/testsuite/gcc.dg/torture/pr45967.c
+++ b/gcc/testsuite/gcc.dg/torture/pr45967.c
@@ -1,4 +1,5 @@
 /* { dg-do run } */
+/* { dg-skip-if "Test performs capability-invalidating illegal memory accesses" { cheri_capability_pure } } */
 
 extern void abort (void);
 void __attribute__((noinline,noclone))
diff --git a/gcc/testsuite/gcc.dg/torture/pr65077.c b/gcc/testsuite/gcc.dg/torture/pr65077.c
index f57356c60bb..5c191fd911e 100644
--- a/gcc/testsuite/gcc.dg/torture/pr65077.c
+++ b/gcc/testsuite/gcc.dg/torture/pr65077.c
@@ -1,4 +1,5 @@
 /* { dg-do run } */
+/* { dg-skip-if "Test performs capability-invalidating illegal memory accesses" { cheri_capability_pure } } */
 
 extern void abort (void);
 extern void *memcpy(void *, const void *, __SIZE_TYPE__);
diff --git a/gcc/testsuite/gcc.target/aarch64/morello/global-constants.c b/gcc/testsuite/gcc.target/aarch64/morello/global-constants.c
index 8e413aace32..624e6742095 100644
--- a/gcc/testsuite/gcc.target/aarch64/morello/global-constants.c
+++ b/gcc/testsuite/gcc.target/aarch64/morello/global-constants.c
@@ -33,13 +33,14 @@ int main()
   assert (ucap2 == 100);
   assert (((char*)ucap)[0] == 'a' && ((char*)ucap)[7] == 'h'
 	  && ((char*)ucap)[8] == '\0'); */
-  /* TODO put an `if !pure-cap` clause here, and assert that accesses fail if
-   * on purecap.  */
+#ifndef __CHERI_PURE_CAPABILITY__
   assert (((char*)x)[0] == 'a' && ((char*)x)[4] == 'e'
 	  && ((char*)x)[5] == '\0');
   assert (basicstring[0] == 'a' && basicstring[6] == 'g'
 	  && basicstring[7] == '\0');
   assert (stringval[0] == 'a' && stringval[5] == 'f' && stringval[6] == '\0');
+#endif
+  return 0;
 }
 
 /* TODO Execution test to check everything works properly (i.e. all the
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index be4f0e6db73..544d597710b 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -537,6 +537,8 @@ proc check_effective_target_trampolines { } {
       return 0
     }
     if { [istarget avr-*-*]
+	 || [istarget aarch64-none-elf]
+	     && [check_effective_target_aarch64_capability_any]
 	 || [istarget msp430-*-*]
 	 || [istarget nvptx-*-*]
 	 || [istarget hppa2.0w-hp-hpux11.23]


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-02-28 12:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-28 12:08 [gcc(refs/vendors/ARM/heads/morello)] A testsuite-only patch that will: Matthew Malcomson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).