From 5c2a257768c3b09f609de5b44fd9d5eaa6744c76 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 27 Feb 2018 09:03:51 +0100 Subject: [PATCH 1/2] Add README doc into the repo --- debian/README | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 debian/README diff --git a/debian/README b/debian/README new file mode 100644 index 00000000..0a78f210 --- /dev/null +++ b/debian/README @@ -0,0 +1,95 @@ +Organization of the repository +============================== + +The debian package for each LLVM point release is maintained as a git branch. +For example, the 4.0 release lives at in the "4.0" branch. + +The current snapshot release is maintained in the "snapshot" branch. + +The easiest way to get all branches is probably to have one +clone per version: + +for f in 4.0 5.0 6.0 snapshot; do + git clone git@salsa.debian.org:pkg-llvm-team/llvm-toolchain.git -b $f $f +done + +Steps for manually building a snapshot release +============================================== + +1) Retrieve the latest snapshot and create original tarballs. + + Run the orig-tar.sh script, + + $ sh snapshot/debian/orig-tar.sh + + which will retrieve the latest version for each LLVM subproject (llvm, + clang, lldb, etc.) from the main development (upstream SVN). and repack it + as a set of tarballs. + +2) Unpack the original tarballs and apply quilt debian patches. + + From the branches/ directory run the unpack.sh script, + + $ sh unpack.sh + + which will unpack the source tree inside a new directory such as + branches/llvm-toolchain-snapshot_3.9~svn268942. Depending on the current + snapshot version number and svn release, the directory name will be + different. + + Quilt patches will then be applied. + +3) Build the binary packages using, + + $ fakeroot debian/rules binary + +When debugging, successive builds can be recompiled faster by using tools such +as ccache (PATH=/usr/lib/ccache:$PATH fakeroot debian/rules binary). + +Retrieving a specific branch or release candidate with orig-tar.sh +================================================================== + +When using orig-tar.sh, if you need to retrieve a specific branch, you can pass +the branch name as the first argument. For example, to get the 4.0 release +branch at + http://llvm.org/svn/llvm-project/{llvm,...}/branches/release_40 +you should use, + + $ sh 4.0/debian/orig-tar.sh release_40 + +To retrieve a specific release candidate, you can pass the branch name as the +first argument, and the tag rc number as the second argument. For example, to +get the 4.0.1 release candidate rc3 at + http://llvm.org/svn/llvm-project/{llvm,...}/tags/RELEASE_401/rc3 +you should use, + + $ sh 4.0/debian/orig-tar.sh RELEASE_401 rc3 4.0.1 + +Additional maintainer scripts +============================= + +The script qualify-clang.sh that is found at the git debian/ directory +should be used to quickly test a newly built package. It runs a short +set of sanity-check tests and regression tests. + +The script releases/snapshot/debian/prepare-new-release.sh is used when +preparing a new point release. It automatically replaces version numbers +in various files of the package. + + +Change in major upstream version +================================ +TODO update with the git commands + +$ svn copy snapshot VERSION +$ svn commit -m "VERSION branched" VERSION +$ cd VERSION +$ sed -i -e '0,/llvm-toolchain-snapshot/s/llvm-toolchain-snapshot/llvm-toolchain-VERSION/' debian/changelog debian/control +$ svn commit -m "snapshot => VERSION" +$ cd ../snapshot +$ emacs debian/prepare-new-release.sh +# Change the version +$ bash debian/prepare-new-release.sh +$ svn commit -m "new snapshot release" + +Now, try build build it. From 4f47c2ac959dd05399da8fd2c40084ee86c25267 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 27 Feb 2018 09:04:04 +0100 Subject: [PATCH 2/2] add a script to test the usual non regressions --- debian/qualify-clang.sh | 250 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 debian/qualify-clang.sh diff --git a/debian/qualify-clang.sh b/debian/qualify-clang.sh new file mode 100644 index 00000000..f88af00b --- /dev/null +++ b/debian/qualify-clang.sh @@ -0,0 +1,250 @@ +#!/bin/sh +# Stop at the first error +set -e + +VERSION=4.0 + +if test ! -f /usr/bin/llvm-config-$VERSION; then + echo "Install llvm-$VERSION & llvm-$VERSION-dev" + exit 1 +fi +llvm-config-$VERSION --link-shared --libs &> /dev/null + +echo '#include +int main() { + char *x = (char*)malloc(10 * sizeof(char*)); + free(x); + return x[5]; +} +' > foo.c +clang-$VERSION -o foo -fsanitize=address -O1 -fno-omit-frame-pointer -g foo.c +if ! ./foo 2>&1 | grep -q heap-use-after-free ; then + echo "sanitize=address is failing" + exit 42 +fi + +echo 'int main() {return 0;}' > foo.c +clang-$VERSION foo.c + +echo '#include ' > x.c +clang-$VERSION -c x.c + +echo "#include " > x.cc +NBLINES=$(clang++-$VERSION -P -E x.cc|wc -l) +if test $NBLINES -lt 100; then + echo "Error: more than 100 lines should be returned" + exit 42 +fi + +echo '#include ' > x.cc +clang++-$VERSION -c x.cc + +echo ' +#include +int +main () +{ + (void) strcat; + return 0; +}' > x.c +clang-$VERSION -c x.c + +echo '#include +int main() {} ' > x.c +clang-$VERSION x.c + +echo '#include +int main() { }' > x.cpp +clang++-$VERSION -std=c++11 x.cpp + +echo '#include +int main() { +if (1==1) { + printf("true"); +}else{ + printf("false"); + return 42; +} +return 0;}' > foo.c +clang-$VERSION --coverage foo.c -o foo +./foo > /dev/null +if test ! -f foo.gcno; then + echo "Coverage failed"; +fi + +echo "#include " > foo.cpp +clang++-$VERSION -c foo.cpp + + +echo '#include +int main() { +if (1==1) { + printf("true"); +}else{ + printf("false"); + return 42; +} +return 0;}' > foo.c +rm foo + +if test ! -f /usr/lib/llvm-$VERSION/bin/../lib/LLVMgold.so; then + echo "Install llvm-$VERSION-dev" + exit 1 +fi + +clang-$VERSION -flto foo.c -o foo +./foo > /dev/null + +clang-$VERSION -fuse-ld=gold foo.c -o foo +./foo > /dev/null + +# test thinlto +echo "int foo(void) { return 0; }"> foo.c +echo "int foo(void); int main() {foo(); return 0;}">main.c +clang-$VERSION -flto=thin -O2 foo.c main.c -o foo +./foo > /dev/null + +if test ! -f /usr/bin/lld-$VERSION; then + echo "Install lld-$VERSION" + exit 1 +fi +clang-$VERSION -fuse-ld=lld -O2 foo.c main.c -o foo +./foo > /dev/null + +cat << EOF > test_fuzzer.cc +#include +#include +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size > 0 && data[0] == 'H') + if (size > 1 && data[1] == 'I') + if (size > 2 && data[2] == '!') + __builtin_trap(); + return 0; +} +EOF + +if test ! -f /usr/lib/llvm-$VERSION/lib/libFuzzer.a; then + echo "Install libfuzzer-$VERSION-dev"; + exit -1; +fi + +clang++-$VERSION -fsanitize=address -fsanitize-coverage=edge test_fuzzer.cc /usr/lib/llvm-$VERSION/lib/libFuzzer.a +if ! ./a.out 2>&1 | grep -q -E "(Test unit written|PreferSmall)"; then + echo "fuzzer" + exit 42 +fi +clang-$VERSION -fsanitize=fuzzer test_fuzzer.cc +if ! ./a.out 2>&1 | grep -q -E "(Test unit written|PreferSmall)"; then + echo "fuzzer" + exit 42 +fi + +echo 'int main() { + int a=0; + return a; +} +' > foo.c +clang++-$VERSION -g -o bar foo.c +echo "b main +run +bt +quit" > lldb-cmd.txt + +if test ! -f /usr/bin/lldb-$VERSION; then + echo "Install lldb-$VERSION"; + exit -1; +fi + + +lldb-$VERSION -s lldb-cmd.txt bar +echo ' +#include +int main (void) +{ std::vector a; + a.push_back (0); +} +' > o.cpp +clang++-$VERSION -g -o o o.cpp +echo 'target create "./o" +b main +r +n +p a +quit' > lldb-cmd.txt +lldb-$VERSION -s lldb-cmd.txt ./o + +echo "int main() { return 1; }" > foo.c +clang-$VERSION -fsanitize=efficiency-working-set -o foo foo.c +./foo > /dev/null || true + +CLANG=clang-$VERSION +#command -v "$CLANG" 1>/dev/null 2>/dev/null || { printf "Usage:\n%s CLANGEXE [ARGS]\n" "$0" 1>&2; exit 1; } +#shift + +TEMPDIR=$(mktemp -d); trap "rm -rf \"$TEMPDIR\"" 0 + +cat > "$TEMPDIR/test.c" < +#include +int main () +{ +#if __has_feature(address_sanitizer) + puts("address_sanitizer"); +#endif +#if __has_feature(thread_sanitizer) + puts("thread_sanitizer"); +#endif +#if __has_feature(memory_sanitizer) + puts("memory_sanitizer"); +#endif +#if __has_feature(undefined_sanitizer) + puts("undefined_sanitizer"); +#endif +#if __has_feature(dataflow_sanitizer) + puts("dataflow_sanitizer"); +#endif +#if __has_feature(efficiency_sanitizer) + puts("efficiency_sanitizer"); +#endif + printf("Ok\n"); + return EXIT_SUCCESS; +} +EOF + +# only for AMD64 for now +# many sanitizers only work on AMD64 +# x32 programs need to be enabled in the kernel bootparams for debian +# (https://wiki.debian.org/X32Port) +# +# SYSTEM should iterate multiple targets (eg. x86_64-unknown-none-gnu for embedded) +# MARCH should iterate the library architectures via flags +# LIB should iterate the different libraries +for SYSTEM in ""; do + for MARCH in -m64 -m32 -mx32 "-m32 -march=i686"; do + for LIB in --rtlib=compiler-rt -fsanitize=address -fsanitize=thread -fsanitize=memory -fsanitize=undefined -fsanitize=dataflow; do # -fsanitize=efficiency-working-set; do + if test "$MARCH" == "-m32" -o "$MARCH" == "-mx32"; then + if test $LIB == "-fsanitize=thread" -o $LIB == "-fsanitize=memory" -o $LIB == "-fsanitize=dataflow" -o $LIB == "-fsanitize=address" -o $LIB == "-fsanitize=undefined"; then + echo "Skip $MARCH / $LIB"; + continue + fi + fi + if test "$MARCH" == "-m32 -march=i686"; then + if test $LIB == "-fsanitize=memory" -o $LIB == "-fsanitize=thread" -o $LIB == "-fsanitize=dataflow"; then + echo "Skip $MARCH / $LIB"; + continue + fi + fi + XARGS="$SYSTEM $MARCH $LIB" + printf "\nTest: clang %s\n" "$XARGS" + rm -f "$TEMPDIR/test" + "$CLANG" $XARGS -o "$TEMPDIR/test" "$@" "$TEMPDIR/test.c" + [ ! -e "$TEMPDIR/test" ] || { "$TEMPDIR/test" || printf 'Error\n'; } + done + done +done + +echo "#include " > foo.m +clang-$VERSION -c foo.m + +echo "Completed" +