brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · 16a9176 Raw
93 lines · c
1/*2 * strlen test.3 *4 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5 * See https://llvm.org/LICENSE.txt for license information.6 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7 */8 9#include <stdint.h>10#include <stdio.h>11#include <stdlib.h>12#include <string.h>13#include <limits.h>14#include "stringlib.h"15 16static const struct fun17{18	const char *name;19	size_t (*fun)(const char *s);20} funtab[] = {21#define F(x) {#x, x},22F(strlen)23#if __aarch64__24F(__strlen_aarch64)25F(__strlen_aarch64_mte)26# if __ARM_FEATURE_SVE27F(__strlen_aarch64_sve)28# endif29#elif __arm__30# if __ARM_ARCH >= 6 && __ARM_ARCH_ISA_THUMB == 231F(__strlen_armv6t2)32# endif33#endif34#undef F35	{0, 0}36};37 38static int test_status;39#define ERR(...) (test_status=1, printf(__VA_ARGS__))40 41#define A 3242#define SP 51243#define LEN 25000044static char sbuf[LEN+2*A];45 46static void *alignup(void *p)47{48	return (void*)(((uintptr_t)p + A-1) & -A);49}50 51static void test(const struct fun *fun, int align, int len)52{53	char *src = alignup(sbuf);54	char *s = src + align;55	size_t r;56 57	if (len > LEN || align >= A)58		abort();59 60	for (int i = 0; i < len + A; i++)61		src[i] = '?';62	for (int i = 0; i < len - 2; i++)63		s[i] = 'a' + i%23;64	s[len - 1] = '\0';65 66	r = fun->fun(s);67	if (r != len-1) {68		ERR("%s(%p) returned %zu\n", fun->name, s, r);69		ERR("input:    %.*s\n", align+len+1, src);70		ERR("expected: %d\n", len);71		abort();72	}73}74 75int main()76{77	int r = 0;78	for (int i=0; funtab[i].name; i++) {79		test_status = 0;80		for (int a = 0; a < A; a++) {81			int n;82			for (n = 1; n < 100; n++)83				test(funtab+i, a, n);84			for (; n < LEN; n *= 2)85				test(funtab+i, a, n);86		}87		printf("%s %s\n", test_status ? "FAIL" : "PASS", funtab[i].name);88		if (test_status)89			r = -1;90	}91	return r;92}93