From b6182db813c6a6e0cc927888e18e59a82a07adab Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Tue, 6 Jun 2023 11:10:38 -0700 Subject: [PATCH] Simplify ftrace_hook() We now have a test to prove that its transitive closure doesn't perform floating point computations. --- libc/integral/c.inc | 1 + libc/runtime/ftrace-hook.S | 24 +---- test/libc/runtime/ftrace_test.c | 45 +++++++++ test/libc/runtime/prog/ftraceasm.c | 23 +++++ test/libc/runtime/test.mk | 109 ++++++++++++--------- third_party/python/Objects/unicodeobject.c | 4 +- third_party/python/Parser/acceler.c | 2 +- third_party/python/Parser/parsetok.c | 4 +- third_party/stb/stb_image.c | 8 +- third_party/stb/stb_image_resize.c | 5 +- third_party/unzip/fileio.c | 2 +- 11 files changed, 142 insertions(+), 85 deletions(-) create mode 100644 test/libc/runtime/ftrace_test.c create mode 100644 test/libc/runtime/prog/ftraceasm.c diff --git a/libc/integral/c.inc b/libc/integral/c.inc index a86663525..aab320791 100644 --- a/libc/integral/c.inc +++ b/libc/integral/c.inc @@ -446,6 +446,7 @@ typedef struct { #endif #ifndef optimizespeed +/* warning: corrupts frame pointer; only use on leaf functions */ #if !defined(__STRICT_ANSI__) && \ ((__GNUC__ + 0) * 100 + (__GNUC_MINOR__ + 0) >= 407 || \ __has_attribute(__optimize__)) diff --git a/libc/runtime/ftrace-hook.S b/libc/runtime/ftrace-hook.S index 2bae5295f..93d75a751 100644 --- a/libc/runtime/ftrace-hook.S +++ b/libc/runtime/ftrace-hook.S @@ -27,16 +27,6 @@ ftrace_hook: ret 1: push %rbp mov %rsp,%rbp - and $-16,%rsp - sub $0x80,%rsp - movaps %xmm0,0x00(%rsp) - movaps %xmm1,0x10(%rsp) - movaps %xmm2,0x20(%rsp) - movaps %xmm3,0x30(%rsp) - movaps %xmm4,0x40(%rsp) - movaps %xmm5,0x50(%rsp) - movaps %xmm6,0x60(%rsp) - movaps %xmm7,0x70(%rsp) push %rax push %rax push %rdi @@ -45,11 +35,7 @@ ftrace_hook: push %rcx push %r8 push %r9 - push %r10 - push %r11 call ftracer - pop %r11 - pop %r10 pop %r9 pop %r8 pop %rcx @@ -58,15 +44,7 @@ ftrace_hook: pop %rdi pop %rax pop %rax - movaps 0x00(%rsp),%xmm0 - movaps 0x10(%rsp),%xmm1 - movaps 0x20(%rsp),%xmm2 - movaps 0x30(%rsp),%xmm3 - movaps 0x40(%rsp),%xmm4 - movaps 0x50(%rsp),%xmm5 - movaps 0x60(%rsp),%xmm6 - movaps 0x70(%rsp),%xmm7 - leave + pop %rbp ret #elif defined(__aarch64__) diff --git a/test/libc/runtime/ftrace_test.c b/test/libc/runtime/ftrace_test.c new file mode 100644 index 000000000..ea32044e0 --- /dev/null +++ b/test/libc/runtime/ftrace_test.c @@ -0,0 +1,45 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2023 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/mem/gc.h" +#include "libc/runtime/runtime.h" +#include "libc/stdio/stdio.h" +#include "libc/str/str.h" +#include "libc/testlib/testlib.h" +#include "libc/x/x.h" + +char testlib_enable_tmp_setup_teardown; + +TEST(ftrace, test) { + const char *ftraceasm; + testlib_extract("/zip/ftraceasm.txt", "ftraceasm.txt", 0755); + ftraceasm = _gc(xslurp("ftraceasm.txt", 0)); +#ifdef __x86_64__ + if (strstr(ftraceasm, "%xmm") || strstr(ftraceasm, "%ymm")) { +#elif defined(__aarch64__) + if (strstr(ftraceasm, " d0,") || strstr(ftraceasm, " v0.")) { +#else + if (0) { +#endif + fprintf(stderr, + "error: ftrace_hook() depends on floating point code\n" + "you need to objdump o//test/libc/runtime/ftraceasm.elf\n" + "then compile the guilty module with -mgeneral-regs-only\n"); + exit(1); + } +} diff --git a/test/libc/runtime/prog/ftraceasm.c b/test/libc/runtime/prog/ftraceasm.c new file mode 100644 index 000000000..caa22ae09 --- /dev/null +++ b/test/libc/runtime/prog/ftraceasm.c @@ -0,0 +1,23 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2023 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ + +void ftrace_hook(void); +void _start(void) { + ftrace_hook(); +} diff --git a/test/libc/runtime/test.mk b/test/libc/runtime/test.mk index aea345878..92cdce597 100644 --- a/test/libc/runtime/test.mk +++ b/test/libc/runtime/test.mk @@ -6,82 +6,95 @@ PKGS += TEST_LIBC_RUNTIME TEST_LIBC_RUNTIME_SRCS := $(wildcard test/libc/runtime/*.c) TEST_LIBC_RUNTIME_SRCS_TEST = $(filter %_test.c,$(TEST_LIBC_RUNTIME_SRCS)) -TEST_LIBC_RUNTIME_OBJS = \ +TEST_LIBC_RUNTIME_OBJS = \ $(TEST_LIBC_RUNTIME_SRCS:%.c=o/$(MODE)/%.o) -TEST_LIBC_RUNTIME_COMS = \ +TEST_LIBC_RUNTIME_COMS = \ $(TEST_LIBC_RUNTIME_SRCS:%.c=o/$(MODE)/%.com) -TEST_LIBC_RUNTIME_BINS = \ - $(TEST_LIBC_RUNTIME_COMS) \ +TEST_LIBC_RUNTIME_BINS = \ + $(TEST_LIBC_RUNTIME_COMS) \ $(TEST_LIBC_RUNTIME_COMS:%=%.dbg) -TEST_LIBC_RUNTIME_TESTS = \ +TEST_LIBC_RUNTIME_TESTS = \ $(TEST_LIBC_RUNTIME_SRCS_TEST:%.c=o/$(MODE)/%.com.ok) -TEST_LIBC_RUNTIME_CHECKS = \ +TEST_LIBC_RUNTIME_CHECKS = \ $(TEST_LIBC_RUNTIME_SRCS_TEST:%.c=o/$(MODE)/%.com.runs) -TEST_LIBC_RUNTIME_DIRECTDEPS = \ - LIBC_CALLS \ - LIBC_FMT \ - LIBC_INTRIN \ - LIBC_LOG \ - LIBC_MEM \ - LIBC_NEXGEN32E \ - LIBC_RUNTIME \ - LIBC_STDIO \ - LIBC_STR \ - LIBC_STUBS \ - LIBC_SYSV \ - LIBC_THREAD \ - LIBC_TESTLIB \ - LIBC_TINYMATH \ - LIBC_X \ - LIBC_ZIPOS \ - TOOL_BUILD_LIB \ +TEST_LIBC_RUNTIME_DIRECTDEPS = \ + LIBC_CALLS \ + LIBC_FMT \ + LIBC_INTRIN \ + LIBC_LOG \ + LIBC_MEM \ + LIBC_NEXGEN32E \ + LIBC_RUNTIME \ + LIBC_STDIO \ + LIBC_STR \ + LIBC_STUBS \ + LIBC_SYSV \ + LIBC_THREAD \ + LIBC_TESTLIB \ + LIBC_TINYMATH \ + LIBC_X \ + LIBC_ZIPOS \ + TOOL_BUILD_LIB \ THIRD_PARTY_XED -TEST_LIBC_RUNTIME_DEPS := \ +TEST_LIBC_RUNTIME_DEPS := \ $(call uniq,$(foreach x,$(TEST_LIBC_RUNTIME_DIRECTDEPS),$($(x)))) -o/$(MODE)/test/libc/runtime/runtime.pkg: \ - $(TEST_LIBC_RUNTIME_OBJS) \ +o/$(MODE)/test/libc/runtime/runtime.pkg: \ + $(TEST_LIBC_RUNTIME_OBJS) \ $(foreach x,$(TEST_LIBC_RUNTIME_DIRECTDEPS),$($(x)_A).pkg) -o/$(MODE)/test/libc/runtime/%.com.dbg: \ - $(TEST_LIBC_RUNTIME_DEPS) \ - o/$(MODE)/test/libc/mem/prog/life.elf.zip.o \ - o/$(MODE)/test/libc/runtime/%.o \ - o/$(MODE)/test/libc/runtime/runtime.pkg \ - $(LIBC_TESTMAIN) \ - $(CRT) \ +o/$(MODE)/test/libc/runtime/%.com.dbg: \ + $(TEST_LIBC_RUNTIME_DEPS) \ + o/$(MODE)/test/libc/mem/prog/life.elf.zip.o \ + o/$(MODE)/test/libc/runtime/prog/ftraceasm.txt.zip.o \ + o/$(MODE)/test/libc/runtime/%.o \ + o/$(MODE)/test/libc/runtime/runtime.pkg \ + $(LIBC_TESTMAIN) \ + $(CRT) \ $(APE_NO_MODIFY_SELF) @$(APELINK) -o/$(MODE)/test/libc/runtime/ape_test.com.dbg: \ - $(TEST_LIBC_RUNTIME_DEPS) \ - o/$(MODE)/test/libc/runtime/ape_test.o \ - o/$(MODE)/test/libc/runtime/runtime.pkg \ - $(LIBC_TESTMAIN) \ - $(CRT) \ +o/$(MODE)/test/libc/runtime/ape_test.com.dbg: \ + $(TEST_LIBC_RUNTIME_DEPS) \ + o/$(MODE)/test/libc/runtime/ape_test.o \ + o/$(MODE)/test/libc/runtime/runtime.pkg \ + $(LIBC_TESTMAIN) \ + $(CRT) \ $(APE_NO_MODIFY_SELF) @$(APELINK) -$(TEST_LIBC_RUNTIME_OBJS): private \ - DEFAULT_CCFLAGS += \ +$(TEST_LIBC_RUNTIME_OBJS): private \ + DEFAULT_CCFLAGS += \ -fno-builtin -o/$(MODE)/test/libc/runtime/getenv_test.com.runs: \ +o/$(MODE)/test/libc/runtime/getenv_test.com.runs: \ o/$(MODE)/test/libc/runtime/getenv_test.com @HELLO=THERE build/runit $@ $< -o/$(MODE)/test/libc/runtime/itsatrap_test.o: private \ - CFLAGS += \ - -fno-sanitize=all \ +o/$(MODE)/test/libc/runtime/itsatrap_test.o: private \ + CFLAGS += \ + -fno-sanitize=all \ -ftrapv +o/$(MODE)/test/libc/runtime/prog/ftraceasm.elf: \ + $(TEST_LIBC_RUNTIME_DEPS) \ + o/$(MODE)/test/libc/runtime/prog/ftraceasm.o \ + o/$(MODE)/test/libc/runtime/runtime.pkg + @$(ELFLINK) +o/$(MODE)/test/libc/runtime/prog/ftraceasm.txt: \ + o/$(MODE)/test/libc/runtime/prog/ftraceasm.elf + @$(OBJDUMP) -d $< >$@ +o/$(MODE)/test/libc/runtime/prog/ftraceasm.txt.zip.o: private \ + ZIPOBJ_FLAGS += \ + -B + .PHONY: o/$(MODE)/test/libc/runtime -o/$(MODE)/test/libc/runtime: \ - $(TEST_LIBC_RUNTIME_BINS) \ +o/$(MODE)/test/libc/runtime: \ + $(TEST_LIBC_RUNTIME_BINS) \ $(TEST_LIBC_RUNTIME_CHECKS) diff --git a/third_party/python/Objects/unicodeobject.c b/third_party/python/Objects/unicodeobject.c index 30893b657..7731b97c7 100644 --- a/third_party/python/Objects/unicodeobject.c +++ b/third_party/python/Objects/unicodeobject.c @@ -5,6 +5,7 @@ │ https://docs.python.org/3/license.html │ ╚─────────────────────────────────────────────────────────────────────────────*/ #define PY_SSIZE_T_CLEAN +#include "third_party/python/Include/unicodeobject.h" #include "libc/assert.h" #include "libc/errno.h" #include "libc/fmt/fmt.h" @@ -39,7 +40,6 @@ #include "third_party/python/Include/sliceobject.h" #include "third_party/python/Include/tupleobject.h" #include "third_party/python/Include/ucnhash.h" -#include "third_party/python/Include/unicodeobject.h" #include "third_party/python/Include/warnings.h" #include "third_party/python/Include/yoink.h" #include "third_party/python/Modules/unicodedata.h" @@ -4902,7 +4902,7 @@ PyUnicode_DecodeUTF8(const char *s, # error C 'long' size should be either 4 or 8! #endif -static optimizespeed Py_ssize_t +static Py_ssize_t ascii_decode(const char *start, const char *end, Py_UCS1 *dest) { const char *p = start; diff --git a/third_party/python/Parser/acceler.c b/third_party/python/Parser/acceler.c index 94cc1d690..e90c49208 100644 --- a/third_party/python/Parser/acceler.c +++ b/third_party/python/Parser/acceler.c @@ -66,7 +66,7 @@ fixdfa(grammar *g, dfa *d) fixstate(g, s); } -static optimizespeed void +static void fixstate(grammar *g, state *s) { arc *a; diff --git a/third_party/python/Parser/parsetok.c b/third_party/python/Parser/parsetok.c index 402c2926d..258ae5c3f 100644 --- a/third_party/python/Parser/parsetok.c +++ b/third_party/python/Parser/parsetok.c @@ -4,12 +4,12 @@ │ Python 3 │ │ https://docs.python.org/3/license.html │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "third_party/python/Include/parsetok.h" #include "third_party/python/Include/errcode.h" #include "third_party/python/Include/graminit.h" #include "third_party/python/Include/grammar.h" #include "third_party/python/Include/node.h" #include "third_party/python/Include/objimpl.h" -#include "third_party/python/Include/parsetok.h" #include "third_party/python/Include/pgenheaders.h" #include "third_party/python/Include/pyerrors.h" #include "third_party/python/Parser/parser.h" @@ -184,7 +184,7 @@ warn(const char *msg, const char *filename, int lineno) /* Parse input coming from the given tokenizer structure. Return error code. */ -static optimizespeed node * +static node * parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, int *flags) { diff --git a/third_party/stb/stb_image.c b/third_party/stb/stb_image.c index 2901fccfb..3c1759d5e 100644 --- a/third_party/stb/stb_image.c +++ b/third_party/stb/stb_image.c @@ -1031,11 +1031,9 @@ static const unsigned char stbi__jpeg_dezigzag[64 + 15] = { 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}; // decode one 64-entry block -static optimizespeed int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], - stbi__huffman *hdc, - stbi__huffman *hac, - int16_t *fac, int b, - uint16_t *dequant) { +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], + stbi__huffman *hdc, stbi__huffman *hac, + int16_t *fac, int b, uint16_t *dequant) { unsigned int zig; int diff, dc, k, t, c, r, s, rs; if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); diff --git a/third_party/stb/stb_image_resize.c b/third_party/stb/stb_image_resize.c index 10b2580b7..22d6a3e76 100644 --- a/third_party/stb/stb_image_resize.c +++ b/third_party/stb/stb_image_resize.c @@ -16,12 +16,12 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "third_party/stb/stb_image_resize.h" #include "libc/assert.h" #include "libc/macros.internal.h" #include "libc/math.h" #include "libc/mem/mem.h" #include "libc/str/str.h" -#include "third_party/stb/stb_image_resize.h" asm(".ident\t\"\\n\\n\ stb_image_resize (Public Domain)\\n\ @@ -853,8 +853,7 @@ static float* stbir__get_decode_buffer(stbir__info* stbir_info) { #define STBIR__DECODE(type, colorspace) \ ((type) * (STBIR_MAX_COLORSPACES) + (colorspace)) -static optimizespeed void stbir__decode_scanline(stbir__info* stbir_info, - int n) { +static void stbir__decode_scanline(stbir__info* stbir_info, int n) { int c; int channels = stbir_info->channels; int alpha_channel = stbir_info->alpha_channel; diff --git a/third_party/unzip/fileio.c b/third_party/unzip/fileio.c index 148383004..bb70ed80c 100644 --- a/third_party/unzip/fileio.c +++ b/third_party/unzip/fileio.c @@ -2868,7 +2868,7 @@ char *str2oem(dst, src) /* Function memset() */ /*********************/ -zvoid *memset(buf, init, len) +zvoid *memset_(buf, init, len) register zvoid *buf; /* buffer location */ register int init; /* initializer character */ register unsigned int len; /* length of the buffer */