Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 1 | /* |
| 2 | * strchr test. |
| 3 | * |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 4 | * Copyright (c) 2019-2020, Arm Limited. |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 5 | * SPDX-License-Identifier: MIT |
| 6 | */ |
| 7 | |
| 8 | #include <stdint.h> |
| 9 | #include <stdio.h> |
| 10 | #include <stdlib.h> |
| 11 | #include <string.h> |
| 12 | #include <limits.h> |
| 13 | #include "stringlib.h" |
Szabolcs Nagy | 22fd931 | 2020-04-16 11:46:02 +0100 | [diff] [blame] | 14 | #include "stringtest.h" |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 15 | |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 16 | #define F(x) {#x, x}, |
| 17 | |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 18 | static const struct fun |
| 19 | { |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 20 | const char *name; |
| 21 | char *(*fun) (const char *s, int c); |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 22 | } funtab[] = { |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 23 | // clang-format off |
| 24 | F(strchr) |
Adhemerval Zanella | b6b6ee0 | 2019-08-06 15:25:30 -0300 | [diff] [blame] | 25 | #if __aarch64__ |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 26 | F(__strchr_aarch64) |
| 27 | F(__strchr_aarch64_mte) |
Adhemerval Zanella | fbe165c | 2019-08-26 16:08:53 -0300 | [diff] [blame] | 28 | # if __ARM_FEATURE_SVE |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 29 | F(__strchr_aarch64_sve) |
Adhemerval Zanella | fbe165c | 2019-08-26 16:08:53 -0300 | [diff] [blame] | 30 | # endif |
Adhemerval Zanella | b6b6ee0 | 2019-08-06 15:25:30 -0300 | [diff] [blame] | 31 | #endif |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 32 | {0, 0} |
| 33 | // clang-format on |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 34 | }; |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 35 | #undef F |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 36 | |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 37 | #define ALIGN 32 |
Szabolcs Nagy | 9bd3b27 | 2020-04-29 17:04:10 +0100 | [diff] [blame] | 38 | #define LEN 512 |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 39 | static char sbuf[LEN + 3 * ALIGN]; |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 40 | |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 41 | static void * |
| 42 | alignup (void *p) |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 43 | { |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 44 | return (void *) (((uintptr_t) p + ALIGN - 1) & -ALIGN); |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 45 | } |
| 46 | |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 47 | static void |
| 48 | test (const struct fun *fun, int align, int seekpos, int len) |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 49 | { |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 50 | char *src = alignup (sbuf); |
| 51 | char *s = src + align; |
| 52 | char *f = seekpos != -1 ? s + seekpos : 0; |
| 53 | int seekchar = 0x1; |
| 54 | void *p; |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 55 | |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 56 | if (err_count >= ERR_LIMIT) |
| 57 | return; |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 58 | if (len > LEN || seekpos >= len || align >= ALIGN) |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 59 | abort (); |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 60 | |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 61 | for (int i = 0; src + i < s; i++) |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 62 | src[i] = (i + len) & 1 ? seekchar : 0; |
| 63 | for (int i = 1; i <= ALIGN; i++) |
| 64 | s[len + i] = (i + len) & 1 ? seekchar : 0; |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 65 | for (int i = 0; i < len; i++) |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 66 | s[i] = 'a' + (i & 31); |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 67 | if (seekpos != -1) |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 68 | s[seekpos] = seekchar; |
| 69 | if (seekpos != -1 && (len + align) & 1) |
| 70 | s[seekpos + 1] = seekchar; |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 71 | s[len] = '\0'; |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 72 | |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 73 | p = fun->fun (s, seekchar); |
| 74 | if (p != f) |
| 75 | { |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 76 | ERR ("%s (%p, 0x%02x) len %d returned %p, expected %p pos %d\n", |
| 77 | fun->name, s, seekchar, len, p, f, seekpos); |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 78 | quote ("input", s, len); |
| 79 | } |
Szabolcs Nagy | 9bd3b27 | 2020-04-29 17:04:10 +0100 | [diff] [blame] | 80 | |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 81 | p = fun->fun (s, 0); |
| 82 | if (p != s + len) |
| 83 | { |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 84 | ERR ("%s (%p, 0x%02x) len %d returned %p, expected %p pos %d\n", |
| 85 | fun->name, s, 0, len, p, f, len); |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 86 | quote ("input", s, len); |
| 87 | } |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 88 | } |
| 89 | |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 90 | int |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 91 | main (void) |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 92 | { |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 93 | int r = 0; |
| 94 | for (int i = 0; funtab[i].name; i++) |
| 95 | { |
| 96 | err_count = 0; |
Wilco Dijkstra | 620b09f | 2020-05-22 15:30:59 +0100 | [diff] [blame] | 97 | for (int a = 0; a < ALIGN; a++) |
| 98 | for (int n = 0; n < LEN; n++) |
| 99 | { |
| 100 | for (int sp = 0; sp < n; sp++) |
| 101 | test (funtab + i, a, sp, n); |
| 102 | test (funtab + i, a, -1, n); |
| 103 | } |
| 104 | |
Szabolcs Nagy | 0b7d1ae | 2020-05-12 16:40:08 +0100 | [diff] [blame] | 105 | printf ("%s %s\n", err_count ? "FAIL" : "PASS", funtab[i].name); |
| 106 | if (err_count) |
| 107 | r = -1; |
| 108 | } |
| 109 | return r; |
Adhemerval Zanella | ce6e5d6 | 2019-08-06 15:20:32 -0300 | [diff] [blame] | 110 | } |