From 839b37219e2833c5dae39522356918a1991d9add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sat, 10 May 2025 23:51:22 +0300 Subject: [PATCH] pgo-training: Add a script for doing PGO training of a toolchain Use a makefile for running a set of commands in parallel. --- pgo-training.make | 57 ++++++++++++++++++++++++++++++++++++++++++ pgo-training.sh | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100755 pgo-training.make create mode 100755 pgo-training.sh diff --git a/pgo-training.make b/pgo-training.make new file mode 100755 index 0000000..b26bc02 --- /dev/null +++ b/pgo-training.make @@ -0,0 +1,57 @@ +#!/bin/sh +# +# Copyright (c) 2025 Martin Storsjo +# +# 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. + +CFLAGS = --sysroot=$(STAGE1) -resource-dir=$(shell $(STAGE1)/bin/clang --print-resource-dir) --config-user-dir=$(STAGE1)/bin +CC = $(PREFIX)/bin/clang +CXX = $(PREFIX)/bin/clang++ + +hello-exception-opt-%.exe: test/hello-exception.cpp + $(CXX) -target $*-w64-mingw32 $(CFLAGS) $+ -o $@ -O3 + +hello-exception-%.exe: test/hello-exception.cpp + $(CXX) -target $*-w64-mingw32 $(CFLAGS) $+ -o $@ + +sqlite-opt-%.exe: $(SQLITE)/sqlite3.c $(SQLITE)/shell.c + $(CC) -target $*-w64-mingw32 $(CFLAGS) $+ -o $@ -O3 + +sqlite-%.exe: $(SQLITE)/sqlite3.c $(SQLITE)/shell.c + $(CC) -target $*-w64-mingw32 $(CFLAGS) $+ -o $@ + +LIBCXXTEST = llvm-project/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort.pass.cpp + +libcxxtest-opt-%.exe: $(LIBCXXTEST) + $(CXX) -target $*-w64-mingw32 $(CFLAGS) $+ -o $@ -Illvm-project/libcxx/test/support -O3 + +libcxxtest-%.exe: $(LIBCXXTEST) + $(CXX) -target $*-w64-mingw32 $(CFLAGS) $+ -o $@ -Illvm-project/libcxx/test/support + +ARCHS ?= i686 x86_64 armv7 aarch64 + +TARGETS = hello-exception hello-exception-opt + +ifneq ($(SQLITE),) +TARGETS += sqlite sqlite-opt +endif +ifneq ($(wildcard $(LIBCXXTEST)),) +TARGETS += libcxxtest libcxxtest-opt +endif + +ALLTARGETS = $(foreach arch, $(ARCHS), $(foreach target, $(TARGETS), $(target)-$(arch).exe)) + +all: $(ALLTARGETS) + +clean: + rm -f $(ALLTARGETS) diff --git a/pgo-training.sh b/pgo-training.sh new file mode 100755 index 0000000..918e0e5 --- /dev/null +++ b/pgo-training.sh @@ -0,0 +1,63 @@ +#!/bin/sh +# +# Copyright (c) 2025 Martin Storsjo +# +# 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. + +set -e + +: ${SQLITE_VERSION:=3490200} +: ${SQLITE_YEAR:=2025} + +: ${LLVM_PROFILE_DATA_DIR:=/tmp/llvm-profile} +: ${LLVM_PROFDATA_FILE:=profile.profdata} + +if [ $# -lt 2 ]; then + echo $0 build stage1 + exit 1 +fi +PREFIX="$1" +STAGE1="$2" +PREFIX="$(cd "$PREFIX" && pwd)" + +MAKE=make +if command -v gmake >/dev/null; then + MAKE=gmake +fi + +: ${CORES:=$(nproc 2>/dev/null)} +: ${CORES:=$(sysctl -n hw.ncpu 2>/dev/null)} +: ${CORES:=4} +: ${ARCHS:=${TOOLCHAIN_ARCHS-i686 x86_64 armv7 aarch64}} + +download() { + if command -v curl >/dev/null; then + curl -LO "$1" + else + wget "$1" + fi +} + +SQLITE=sqlite-amalgamation-$SQLITE_VERSION +if [ ! -d $SQLITE ]; then + download https://sqlite.org/$SQLITE_YEAR/sqlite-amalgamation-$SQLITE_VERSION.zip + unzip sqlite-amalgamation-$SQLITE_VERSION.zip +fi + +rm -rf "$LLVM_PROFILE_DATA_DIR" +$MAKE -f pgo-training.make PREFIX=$PREFIX STAGE1=$STAGE1 SQLITE=$SQLITE clean +$MAKE -f pgo-training.make PREFIX=$PREFIX STAGE1=$STAGE1 SQLITE=$SQLITE -j$CORES + +rm -f "$LLVM_PROFDATA_FILE" +$STAGE1/bin/llvm-profdata merge -output "$LLVM_PROFDATA_FILE" $LLVM_PROFILE_DATA_DIR/*.profraw +rm -rf "$LLVM_PROFILE_DATA_DIR"