From 0da830875cb6b59d90f28720efc201d7e8fc8c63 Mon Sep 17 00:00:00 2001 From: Mo Zhou Date: Sat, 9 Mar 2019 06:10:15 +0000 Subject: [PATCH] Import llvm-toolchain-6.0_6.0.1-11.debian.tar.xz [dgit import tarball llvm-toolchain-6.0 1:6.0.1-11 llvm-toolchain-6.0_6.0.1-11.debian.tar.xz] --- NEWS | 5 + README | 99 + README.source | 5 + TODO | 6 + changelog | 2051 ++++++ clang-X.Y-doc.docs.in | 2 + clang-X.Y-examples.examples.in | 1 + clang-X.Y.install.in | 12 + clang-X.Y.links.in | 2 + clang-X.Y.lintian-overrides.in | 2 + clang-X.Y.manpages.in | 1 + clang-format-X.Y.install.in | 10 + clang-format-X.Y.lintian-overrides.in | 4 + clang-format-X.Y.manpages.in | 3 + clang-tidy-X.Y.install.in | 5 + clang-tidy-X.Y.links.in | 4 + clang-tidy-X.Y.lintian-overrides.in | 3 + clang-tidy-X.Y.manpages.in | 1 + clang-tools-X.Y.install.in | 54 + clang-tools-X.Y.links.in | 3 + clang-tools-X.Y.lintian-overrides.in | 6 + clang-tools-X.Y.manpages.in | 11 + compat | 1 + control | 474 ++ copyright | 443 ++ debian_path.h | 16 + libclang-X.Y-dev.install.in | 10 + libclang-X.Y-dev.links.in | 3 + libclang-common-X.Y-dev.install.in | 13 + libclang-common-X.Y-dev.links.in | 7 + libclang1-X.Y.install.in | 2 + libclang1-X.Y.links.in | 3 + libclang1-X.Y.lintian-overrides.in | 5 + libclang1-X.Y.symbols.in | 362 + liblld-X.Y-dev.install.in | 2 + liblld-X.Y.install.in | 11 + liblld-X.Y.links.in | 4 + liblldb-X.Y-dev.install.in | 3 + liblldb-X.Y-dev.links.in | 3 + liblldb-X.Y.install.in | 4 + liblldb-X.Y.links.in | 2 + liblldb-X.Y.lintian-overrides.in | 5 + libllvm-X.Y-ocaml-dev.META.in | 63 + libllvm-X.Y-ocaml-dev.dirs.in | 2 + libllvm-X.Y-ocaml-dev.install.in | 2 + libllvm-X.Y-ocaml-dev.lintian-overrides.in | 2 + libllvmX.Y.install.in | 1 + libllvmX.Y.links.in | 4 + libllvmX.Y.lintian-overrides.in | 2 + lld-X.Y.install.in | 11 + lld-X.Y.manpages.in | 1 + lldb-X.Y.install.in | 11 + lldb-X.Y.links.in | 2 + lldb-X.Y.lintian-overrides.in | 3 + lldb-X.Y.manpages.in | 2 + lldb-X.Y.postinst.in | 8 + llvm-X.Y-dev.dirs.in | 5 + llvm-X.Y-dev.install.in | 31 + llvm-X.Y-dev.links.in | 19 + llvm-X.Y-doc.dirs.in | 1 + llvm-X.Y-doc.install.in | 6 + llvm-X.Y-examples.dirs.in | 1 + llvm-X.Y-examples.examples.in | 1 + llvm-X.Y-examples.links.in | 3 + llvm-X.Y-runtime.binfmt.in | 3 + llvm-X.Y-runtime.install.in | 8 + llvm-X.Y-runtime.lintian-overrides.in | 1 + llvm-X.Y-runtime.manpages.in | 1 + llvm-X.Y-runtime.postinst.in | 11 + llvm-X.Y-runtime.prerm.in | 18 + llvm-X.Y-tools.dirs.in | 2 + llvm-X.Y-tools.install.in | 17 + llvm-X.Y.dirs.in | 3 + llvm-X.Y.install.in | 16 + llvm-X.Y.lintian-overrides.in | 12 + llvm-X.Y.manpages.in | 8 + llvm-priv-dev.dirs | 1 + orig-tar.sh | 201 + ...resolve-symlinks-in-LLVMConfig.cmake.patch | 34 + ...esolve-symlinks-in-ClangConfig.cmake.patch | 34 + ...03-Debian-version-info-and-bugreport.patch | 19 + patches/0044-soname.diff | 30 + ...-html_static_path-_static-everywhere.patch | 63 + ...e-Debian-provided-MathJax-everywhere.patch | 122 + patches/19-clang_debian_version.patch | 21 + .../23-strlcpy_strlcat_warning_removed.diff | 195 + patches/26-set-correct-float-abi.diff | 33 + patches/27-fix_clang_stdint.diff | 29 + patches/D40146-JumpThreading-backport-1.diff | 2148 ++++++ patches/D42717-JumpThreading-backport-2.diff | 267 + patches/D51108-rust-powerpc.diff | 65 + patches/D51335-alignment-issue.diff | 107 + patches/D51639-optim-issue.diff | 46 + patches/D53557-hurd-self-exe-realpath.diff | 72 + patches/PowerPC-Make-AddrSpaceCast-noop.diff | 43 + patches/atomic_library_1.diff | 25 + patches/clang-analyzer-force-version.diff | 25 + .../clang-arm-default-vfp3-on-armv7a.patch | 23 + ...clang-fix-cmpxchg8-detection-on-i386.patch | 46 + patches/clang-format-version.diff | 39 + patches/clang-tidy-run-bin.diff | 17 + patches/declare_clear_cache.diff | 15 + ...isable-display-PASS-UNSUPPORTED-XFAIL.diff | 17 + patches/disable-error-xray.diff | 13 + patches/disable-llvm-symbolizer-test.diff | 25 + patches/disable-path-test-failing.diff | 29 + patches/disable-source-interleave.diff | 12 + patches/disable-sse2-old-x86.diff | 12 + patches/do-not-fail-on-unexpected-pass.diff | 13 + patches/fix-clang-path-and-build.diff | 24 + patches/fix-llvm-config-obj-src-root.patch | 20 + patches/fix-scan-view-path.diff | 21 + patches/force-gcc-header-obj.diff | 16 + patches/hurd-EIEIO-undef.diff | 14 + patches/hurd-lib_Support_Unix_Path.inc.diff | 52 + patches/hurd-pathmax.diff | 93 + .../hurd-tools_llvm-shlib_CMakeLists.txt.diff | 12 + patches/install-scan-build-py.diff | 16 + patches/julia/llvm-6.0-NVPTX-addrspaces.patch | 32 + ...lvm-D27629-AArch64-large_model_6.0.1.patch | 24 + .../julia/llvm-D34078-vectorize-fdiv.patch | 53 + .../llvm-D42262-jumpthreading-not-i1.patch | 82 + .../julia/llvm-D44892-Perf-integration.patch | 677 ++ patches/julia/llvm-D50010-VNCoercion-ni.patch | 89 + patches/julia/llvm-D50167-scev-umin.patch | 1143 +++ .../julia/llvm-rL326967-aligned-load.patch | 301 + patches/julia/llvm-rL327898.patch | 6131 +++++++++++++++++ ...ddversion-suffix-to-llvm-server-exec.patch | 35 + patches/lldb-disable-swig-error.diff | 13 + patches/lldb-libname.diff | 15 + patches/lldb-link-atomic-cmake.patch | 27 + patches/lldb-missing-install.diff | 24 + patches/lldb-soname.diff | 43 + patches/llvm-D49832-SCEVPred.patch | 187 + patches/llvm-rL323946-LSRTy.patch | 45 + patches/mips-fpxx-enable.diff | 17 + .../powerpcspe-add-missing-include-path.diff | 18 + patches/pr38663-pgo-lto-crash.patch | 1573 +++++ patches/python-clangpath.diff | 15 + ...-cherry-pick-really-subtle-miscompile.diff | 153 + patches/remove-test-freezing.diff | 32 + patches/scan-build-clang-path.diff | 15 + patches/scan-view-fix-path.diff | 13 + patches/series | 96 + patches/silent-MCJIIT-tests.diff | 178 + patches/silent-amd-tet.diff | 11 + patches/silent-gold-test.diff | 38 + patches/silent-gold-utils.diff | 190 + patches/silent-llvm-isel-fuzzer.diff | 24 + patches/silent-more-tests.diff | 52 + patches/silent-test-failing-codeverage.diff | 13 + patches/silent-test-macho.diff | 14 + patches/sparc64-add-missing-tls-get-addr.diff | 43 + patches/test-keep-alive.diff | 21 + patches/ubuntu-cosmic-support.patch | 33 + patches/unwind-chain-inclusion.diff | 41 + patches/x32-fix-driver-search-paths.diff | 80 + pollycc.in | 3 + prepare-new-release.sh | 16 + python-clang-X.Y.install.in | 1 + python-lldb-X.Y.install.in | 1 + python-lldb-X.Y.links.in | 6 + qualify-clang.sh | 308 + rules | 631 ++ source.lintian-overrides | 9 + source/format | 1 + tests.disabled/control | 4 + tests.disabled/llvm | 9 + watch | 4 + 169 files changed, 20637 insertions(+) create mode 100644 NEWS create mode 100644 README create mode 100644 README.source create mode 100644 TODO create mode 100644 changelog create mode 100644 clang-X.Y-doc.docs.in create mode 100644 clang-X.Y-examples.examples.in create mode 100644 clang-X.Y.install.in create mode 100644 clang-X.Y.links.in create mode 100644 clang-X.Y.lintian-overrides.in create mode 100644 clang-X.Y.manpages.in create mode 100644 clang-format-X.Y.install.in create mode 100644 clang-format-X.Y.lintian-overrides.in create mode 100644 clang-format-X.Y.manpages.in create mode 100644 clang-tidy-X.Y.install.in create mode 100644 clang-tidy-X.Y.links.in create mode 100644 clang-tidy-X.Y.lintian-overrides.in create mode 100644 clang-tidy-X.Y.manpages.in create mode 100644 clang-tools-X.Y.install.in create mode 100644 clang-tools-X.Y.links.in create mode 100644 clang-tools-X.Y.lintian-overrides.in create mode 100644 clang-tools-X.Y.manpages.in create mode 100644 compat create mode 100644 control create mode 100644 copyright create mode 100644 debian_path.h create mode 100644 libclang-X.Y-dev.install.in create mode 100644 libclang-X.Y-dev.links.in create mode 100644 libclang-common-X.Y-dev.install.in create mode 100644 libclang-common-X.Y-dev.links.in create mode 100644 libclang1-X.Y.install.in create mode 100644 libclang1-X.Y.links.in create mode 100644 libclang1-X.Y.lintian-overrides.in create mode 100644 libclang1-X.Y.symbols.in create mode 100644 liblld-X.Y-dev.install.in create mode 100644 liblld-X.Y.install.in create mode 100644 liblld-X.Y.links.in create mode 100644 liblldb-X.Y-dev.install.in create mode 100644 liblldb-X.Y-dev.links.in create mode 100644 liblldb-X.Y.install.in create mode 100644 liblldb-X.Y.links.in create mode 100644 liblldb-X.Y.lintian-overrides.in create mode 100644 libllvm-X.Y-ocaml-dev.META.in create mode 100644 libllvm-X.Y-ocaml-dev.dirs.in create mode 100644 libllvm-X.Y-ocaml-dev.install.in create mode 100644 libllvm-X.Y-ocaml-dev.lintian-overrides.in create mode 100644 libllvmX.Y.install.in create mode 100644 libllvmX.Y.links.in create mode 100644 libllvmX.Y.lintian-overrides.in create mode 100644 lld-X.Y.install.in create mode 100644 lld-X.Y.manpages.in create mode 100644 lldb-X.Y.install.in create mode 100644 lldb-X.Y.links.in create mode 100644 lldb-X.Y.lintian-overrides.in create mode 100644 lldb-X.Y.manpages.in create mode 100644 lldb-X.Y.postinst.in create mode 100644 llvm-X.Y-dev.dirs.in create mode 100644 llvm-X.Y-dev.install.in create mode 100644 llvm-X.Y-dev.links.in create mode 100644 llvm-X.Y-doc.dirs.in create mode 100644 llvm-X.Y-doc.install.in create mode 100644 llvm-X.Y-examples.dirs.in create mode 100644 llvm-X.Y-examples.examples.in create mode 100644 llvm-X.Y-examples.links.in create mode 100644 llvm-X.Y-runtime.binfmt.in create mode 100644 llvm-X.Y-runtime.install.in create mode 100644 llvm-X.Y-runtime.lintian-overrides.in create mode 100644 llvm-X.Y-runtime.manpages.in create mode 100644 llvm-X.Y-runtime.postinst.in create mode 100644 llvm-X.Y-runtime.prerm.in create mode 100644 llvm-X.Y-tools.dirs.in create mode 100644 llvm-X.Y-tools.install.in create mode 100644 llvm-X.Y.dirs.in create mode 100644 llvm-X.Y.install.in create mode 100644 llvm-X.Y.lintian-overrides.in create mode 100644 llvm-X.Y.manpages.in create mode 100644 llvm-priv-dev.dirs create mode 100755 orig-tar.sh create mode 100644 patches/0001-llvm-cmake-resolve-symlinks-in-LLVMConfig.cmake.patch create mode 100644 patches/0001-tools-clang-cmake-resolve-symlinks-in-ClangConfig.cmake.patch create mode 100644 patches/0003-Debian-version-info-and-bugreport.patch create mode 100644 patches/0044-soname.diff create mode 100644 patches/0048-Set-html_static_path-_static-everywhere.patch create mode 100644 patches/0049-Use-Debian-provided-MathJax-everywhere.patch create mode 100644 patches/19-clang_debian_version.patch create mode 100644 patches/23-strlcpy_strlcat_warning_removed.diff create mode 100644 patches/26-set-correct-float-abi.diff create mode 100644 patches/27-fix_clang_stdint.diff create mode 100644 patches/D40146-JumpThreading-backport-1.diff create mode 100644 patches/D42717-JumpThreading-backport-2.diff create mode 100644 patches/D51108-rust-powerpc.diff create mode 100644 patches/D51335-alignment-issue.diff create mode 100644 patches/D51639-optim-issue.diff create mode 100644 patches/D53557-hurd-self-exe-realpath.diff create mode 100644 patches/PowerPC-Make-AddrSpaceCast-noop.diff create mode 100644 patches/atomic_library_1.diff create mode 100644 patches/clang-analyzer-force-version.diff create mode 100644 patches/clang-arm-default-vfp3-on-armv7a.patch create mode 100644 patches/clang-fix-cmpxchg8-detection-on-i386.patch create mode 100644 patches/clang-format-version.diff create mode 100644 patches/clang-tidy-run-bin.diff create mode 100644 patches/declare_clear_cache.diff create mode 100644 patches/disable-display-PASS-UNSUPPORTED-XFAIL.diff create mode 100644 patches/disable-error-xray.diff create mode 100644 patches/disable-llvm-symbolizer-test.diff create mode 100644 patches/disable-path-test-failing.diff create mode 100644 patches/disable-source-interleave.diff create mode 100644 patches/disable-sse2-old-x86.diff create mode 100644 patches/do-not-fail-on-unexpected-pass.diff create mode 100644 patches/fix-clang-path-and-build.diff create mode 100644 patches/fix-llvm-config-obj-src-root.patch create mode 100644 patches/fix-scan-view-path.diff create mode 100644 patches/force-gcc-header-obj.diff create mode 100644 patches/hurd-EIEIO-undef.diff create mode 100644 patches/hurd-lib_Support_Unix_Path.inc.diff create mode 100644 patches/hurd-pathmax.diff create mode 100644 patches/hurd-tools_llvm-shlib_CMakeLists.txt.diff create mode 100644 patches/install-scan-build-py.diff create mode 100644 patches/julia/llvm-6.0-NVPTX-addrspaces.patch create mode 100644 patches/julia/llvm-D27629-AArch64-large_model_6.0.1.patch create mode 100644 patches/julia/llvm-D34078-vectorize-fdiv.patch create mode 100644 patches/julia/llvm-D42262-jumpthreading-not-i1.patch create mode 100644 patches/julia/llvm-D44892-Perf-integration.patch create mode 100644 patches/julia/llvm-D50010-VNCoercion-ni.patch create mode 100644 patches/julia/llvm-D50167-scev-umin.patch create mode 100644 patches/julia/llvm-rL326967-aligned-load.patch create mode 100644 patches/julia/llvm-rL327898.patch create mode 100644 patches/lldb-addversion-suffix-to-llvm-server-exec.patch create mode 100644 patches/lldb-disable-swig-error.diff create mode 100644 patches/lldb-libname.diff create mode 100644 patches/lldb-link-atomic-cmake.patch create mode 100644 patches/lldb-missing-install.diff create mode 100644 patches/lldb-soname.diff create mode 100644 patches/llvm-D49832-SCEVPred.patch create mode 100644 patches/llvm-rL323946-LSRTy.patch create mode 100644 patches/mips-fpxx-enable.diff create mode 100644 patches/powerpcspe-add-missing-include-path.diff create mode 100644 patches/pr38663-pgo-lto-crash.patch create mode 100644 patches/python-clangpath.diff create mode 100644 patches/rL338481-cherry-pick-really-subtle-miscompile.diff create mode 100644 patches/remove-test-freezing.diff create mode 100644 patches/scan-build-clang-path.diff create mode 100644 patches/scan-view-fix-path.diff create mode 100644 patches/series create mode 100644 patches/silent-MCJIIT-tests.diff create mode 100644 patches/silent-amd-tet.diff create mode 100644 patches/silent-gold-test.diff create mode 100644 patches/silent-gold-utils.diff create mode 100644 patches/silent-llvm-isel-fuzzer.diff create mode 100644 patches/silent-more-tests.diff create mode 100644 patches/silent-test-failing-codeverage.diff create mode 100644 patches/silent-test-macho.diff create mode 100644 patches/sparc64-add-missing-tls-get-addr.diff create mode 100644 patches/test-keep-alive.diff create mode 100644 patches/ubuntu-cosmic-support.patch create mode 100644 patches/unwind-chain-inclusion.diff create mode 100644 patches/x32-fix-driver-search-paths.diff create mode 100755 pollycc.in create mode 100644 prepare-new-release.sh create mode 100644 python-clang-X.Y.install.in create mode 100644 python-lldb-X.Y.install.in create mode 100644 python-lldb-X.Y.links.in create mode 100644 qualify-clang.sh create mode 100755 rules create mode 100644 source.lintian-overrides create mode 100644 source/format create mode 100644 tests.disabled/control create mode 100644 tests.disabled/llvm create mode 100644 watch diff --git a/NEWS b/NEWS new file mode 100644 index 00000000..91160e68 --- /dev/null +++ b/NEWS @@ -0,0 +1,5 @@ +llvm-toolchain-snapshot (1:3.6~svn214630-1~exp1) experimental; urgency=medium + + * clang is now co-instalable. Available on version 3.4, 3.5 and 3.6 + + -- Sylvestre Ledru Sat, 02 Aug 2014 12:57:41 +0200 diff --git a/README b/README new file mode 100644 index 00000000..3707a057 --- /dev/null +++ b/README @@ -0,0 +1,99 @@ +Organization of the repository +============================== + +The debian package for each LLVM point release is maintained as a git branch. +For example, the 6.0 release lives at in the "6.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 6.0 release +branch at + http://llvm.org/svn/llvm-project/{llvm,...}/branches/release_60 +you should use, + + $ sh 6.0/debian/orig-tar.sh release_60 + +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 6.0.1 release candidate rc3 at + http://llvm.org/svn/llvm-project/{llvm,...}/tags/RELEASE_601/rc3 +you should use, + + $ sh 6.0/debian/orig-tar.sh RELEASE_601 rc3 6.0.1 + +For a stable release, the syntax is: + + $ sh 6.0/debian/orig-tar.sh RELEASE_600 final 6.0 + +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. diff --git a/README.source b/README.source new file mode 100644 index 00000000..deeb3f28 --- /dev/null +++ b/README.source @@ -0,0 +1,5 @@ + +Repack of the snapshot release are done with orig-tar.sh which will checkout the sources. + + -- Sylvestre Ledru , Tue, 26 Feb 2013 14:57:56 +0100 + diff --git a/TODO b/TODO new file mode 100644 index 00000000..0ce53dbd --- /dev/null +++ b/TODO @@ -0,0 +1,6 @@ +* add the support of libclang in llvm default (for now, it is +called libclang1-3.3.so) + +* move the header at the right place in libclang-dev + +* bootstrap of clang with itself diff --git a/changelog b/changelog new file mode 100644 index 00000000..8f90c1dd --- /dev/null +++ b/changelog @@ -0,0 +1,2051 @@ +llvm-toolchain-6.0 (1:6.0.1-11) unstable; urgency=medium + + [ Sylvestre Ledru ] + * Remove 'Multi-Arch: same' in libclang (Closes: #874248) + * Cherry-pick various llvm fixes for Julia (Closes: #919628) + + [ Mo Zhou ] + * Rebase and enable D51639-optim-issue.diff . + * Remove install-lldb-sb-headers.patch, merged upstream. + * Remove empty file: bug-30342.diff + * Remove deprecated patch: fix-lldb-server-build. (See 602ceb9ec) + + -- Mo Zhou Sat, 09 Mar 2019 06:10:15 +0000 + +llvm-toolchain-6.0 (1:6.0.1-10) unstable; urgency=medium + + * Fix a baseline violation on armhf (Closes: #914268) + Thanks to Adrian Bunk + doing that for the Julia package. + + [ John Paul Adrian Glaubitz ] + * Add patch to fix missing include and library paths on x32 + + -- Sylvestre Ledru Wed, 23 Jan 2019 23:25:50 +0100 + +llvm-toolchain-6.0 (1:6.0.1-9.2) unstable; urgency=medium + + * Non-maintainer upload. + * debian/patches/D53557-hurd-self-exe-realpath.diff: Fix paths returned by + llvm-config (Closes: Bug#911817). + + -- Samuel Thibault Wed, 24 Oct 2018 22:44:54 +0000 + +llvm-toolchain-6.0 (1:6.0.1-9.1) unstable; urgency=medium + + * Non-maintainer upload. + * Apply hurd fixes (Closes: #908847). + - hurd-lib_Support_Unix_Path.inc.diff + - hurd-pathmax.diff + - hurd-tools_llvm-shlib_CMakeLists.txt.diff + + -- Samuel Thibault Tue, 16 Oct 2018 20:18:39 +0000 + +llvm-toolchain-6.0 (1:6.0.1-9) unstable; urgency=medium + + [ John Paul Adrian Glaubitz ] + * Add patch to fix missing MultiArch include dir + on powerpcspe (Closes: #908791) + + [ Gianfranco Costamagna ] + * Force polly cmake removal on arch:all because of --fail-missing + + -- John Paul Adrian Glaubitz Fri, 14 Sep 2018 09:24:02 +0200 + +llvm-toolchain-6.0 (1:6.0.1-8) unstable; urgency=medium + + [ John Paul Adrian Glaubitz ] + * Fix inverted logic in ifeq statement for POLLY_ENABLE (Closes: #908646) + + [ Gianfranco Costamagna ] + * Fixup the polly installation failure where polly is not built + * Add s390x to polly architectures + * Fix typo in rules file + + [ Sylvestre Ledru ] + * Disable sse2 on pentium4 arch (Closes: #632472) + + -- Sylvestre Ledru Thu, 13 Sep 2018 10:04:42 +0200 + +llvm-toolchain-6.0 (1:6.0.1-7) unstable; urgency=medium + + * Cherry pick a patch from upstream to fix a crash + when doing PGO + LTO + See upstream bug 38663 + * Fix an alignment issue + See upstream bug 38707 (Closes: #907622) + * Cherry pick an upstream issue with x86 mentionned here: + https://lists.llvm.org/pipermail/llvm-dev/2018-August/125111.html + "A very subtle miscompile due to a bug in EFLAGS copy lowering + for X86 was fixed. Chandler suggests maintainers of out-of-tree + branches using the X86 backend may want to cherry-pick this fix." + https://reviews.llvm.org/rL338481 + + -- Sylvestre Ledru Thu, 06 Sep 2018 20:51:24 +0200 + +llvm-toolchain-6.0 (1:6.0.1-6) unstable; urgency=medium + + * Remove libtool flex, bison, dejagnu, tcl, expect, + and perl from the build deps (testing) + + [ John Paul Adrian Glaubitz ] + * Don't build with ld.gold on powerpcspe + * Disable polly on powerpcspe + * Cherry-pick upstream patch to make rustc build on ppc + + [ Gianfranco Costamagna ] + * Team upload + * Upload to unstable + * Enable lld on ppc64el + * Add liblldb-6.0-dev to python-lldb runtime dependencies, needed to import it + + -- Sylvestre Ledru Sun, 26 Aug 2018 14:00:14 +0200 + +llvm-toolchain-6.0 (1:6.0.1-5exp1) experimental; urgency=medium + + * Enable lld on arm64, mips64el + * Enable lldb on mips64el + + -- Gianfranco Costamagna Fri, 17 Aug 2018 17:36:03 +0200 + +llvm-toolchain-6.0 (1:6.0.1-5) unstable; urgency=medium + + * Cherry-pick a patch from 7 to fix an issue with Julia + on powerpc - PowerPC-Make-AddrSpaceCast-noop.diff + (Closes: #906314) + + -- Sylvestre Ledru Fri, 17 Aug 2018 08:49:22 +0200 + +llvm-toolchain-6.0 (1:6.0.1-4) unstable; urgency=medium + + * Disable force-gcc-header-obj.diff as it is introducing + some regressions in the search headers + (Closes: #903709) + * Standards-Version: 4.2.0 + + -- Sylvestre Ledru Wed, 15 Aug 2018 15:25:42 +0200 + +llvm-toolchain-6.0 (1:6.0.1-3) unstable; urgency=medium + + * Backport to fix a miscompilation issue with rust. + See https://github.com/rust-lang/rust/issues/52694 + and https://github.com/rust-lang/llvm/pull/106 + + [ Dimitri John Ledkov ] + * Enable lldb on ppc64el LP: #1777136 + + [ Lumin ] + * backport two upstream patches to fix julia miscompiling (Closes: #905397) + llvm-D49832-SCEVPred.patch, llvm-rL323946-LSRTy.patch + + [ Gianfranco Costamagna ] + * Team Upload to unstable + + -- Gianfranco Costamagna Thu, 09 Aug 2018 10:06:11 +0200 + +llvm-toolchain-6.0 (1:6.0.1-2) unstable; urgency=medium + + * Bump std-version to 4.1.4, no changes required. + + -- Gianfranco Costamagna Wed, 27 Jun 2018 16:24:20 +0200 + +llvm-toolchain-6.0 (1:6.0.1-1) unstable; urgency=medium + + * New stable release + + -- Sylvestre Ledru Wed, 27 Jun 2018 08:52:37 +0200 + +llvm-toolchain-6.0 (1:6.0.1~+rc3-1~exp1) experimental; urgency=medium + + * New testing release + + -- Sylvestre Ledru Fri, 15 Jun 2018 18:28:35 +0200 + +llvm-toolchain-6.0 (1:6.0.1~+rc2-1~exp1) experimental; urgency=medium + + * New testing release + * Enable WebAssembly & AVR as experimental archs (Closes: #899202) + * d/p/force-gcc-header-obj.diff Fix the detection of the objc path + + [ Gianfranco Costamagna ] + * Add ubuntu cosmic to Ubuntu supported releases + + -- Sylvestre Ledru Wed, 09 May 2018 14:23:49 +0200 + +llvm-toolchain-6.0 (1:6.0.1~+rc1-1~exp2) experimental; urgency=medium + + * Add python-yaml as dep for clang-tidy (Closes: #890514) + + [ Peter Wu ] + * Make CMake find_package(Clang) work. Fixes upstream bug + https://bugs.llvm.org/show_bug.cgi?id=37128 + - Move Clang*.cmake back to /usr/lib/llvm-X.Y/lib/cmake/clang and install a + symlink in /usr/lib/cmake/clang-X.Y. + - Ensure that the LLVM installation prefix is correctly discovered despire + symlinks (replaces fix-cmake-config-prefix.diff). + - Create /usr/lib/llvm-X.Y/bin/clang-X.Y symlink as required by + ClangTargets-relwithdebinfo.cmake. + - Remove useless LLVM_CMAKE_DIR sed command that did not match anything. + - Ignore missing binaries in ClangTargets-relwithdebinfo.cmake. + + -- Sylvestre Ledru Mon, 07 May 2018 23:27:26 +0200 + +llvm-toolchain-6.0 (1:6.0.1~+rc1-1~exp1) experimental; urgency=medium + + * New snapshot release + * Fix a typo in the debci + + -- Sylvestre Ledru Thu, 26 Apr 2018 08:02:09 +0200 + +llvm-toolchain-6.0 (1:6.0-3) unstable; urgency=medium + + * Remove sysconf_interceptor_bypass_test.cc because it makes + Debian unstable and Ubuntu bionic freeze + * Remove the info text from the manpages (Closes: #894734) + + [ Reshabh Sharma ] + * Enable autopkgtest for amd64 & i386 on the llvm test suite + (Closes: #774294) + + [ Nicholas D Steeves ] + * Fix the lintian error 'privacy-breach-uses-embedded-file' + (Closes: #829361) + + [ Athos Ribeiro ] + * Create symlink to run-clang-tidy-X.Y.py to remove its .py extension + (Closes: #892089) + + [ David Tenty ] + * Migrate to automatic debug packages (Closes: #893267) + + [ Nishanth Aravamudan ] + * debian/patches/install-lldb-sb-headers.patch: Install lldb's + SB headers (pr36630). Thanks to Pavel Labath . + (LP: #1761009) (Closes: #895051) + + -- Sylvestre Ledru Tue, 24 Apr 2018 23:24:44 +0200 + +llvm-toolchain-6.0 (1:6.0.1-1~exp1) experimental; urgency=medium + + * preparation of the new release + * Remove sysconf_interceptor_bypass_test.cc because it makes + Debian unstable and Ubuntu bionic freeze + + [ David Tenty ] + * Migrate to automatic debug packages (Closes: #893267) + + [ Nishanth Aravamudan ] + * debian/patches/install-lldb-sb-headers.patch: Install lldb's + SB headers (pr36630). Thanks to Pavel Labath . + (LP: #1761009) (Closes: #895051) + + -- David Tenty Sat, 31 Mar 2018 21:11:28 +0000 + +llvm-toolchain-6.0 (1:6.0-2) unstable; urgency=medium + + * clang-tidy-6.0: depends on libclang-common-6.0-dev + (Closes: #891999) + * clang-tidy-6.0 also depends on clang-tools-6.0 for, at least + clang-apply-replacements + * Remove a bunch of old unused patches + * Fix debian-watch-uses-insecure-uri as upstream has now https + * Standards-Version updated to 4.1.3 + + -- Sylvestre Ledru Mon, 05 Mar 2018 09:58:10 +0100 + +llvm-toolchain-6.0 (1:6.0-1) unstable; urgency=medium + + * New upstream release + + -- Sylvestre Ledru Fri, 02 Mar 2018 13:28:19 +0100 + +llvm-toolchain-6.0 (1:6.0~+rc3-1) unstable; urgency=medium + + [ Sylvestre Ledru ] + * New snapshot release + * Move the VCS to git. + Many thanks to James Clarke for doing the conversion + * Create the directory before having the manpages generated + + [ John Paul Adrian Glaubitz ] + * Add proposed upstream patch by James Clarke to add the + missing __tls_get_addr symbol to the symbol table for + TLS calls on SPARC (Closes: #890401) + + [ James Clarke ] + * Disable LLDB on powerpcspe + + -- James Clarke Mon, 26 Feb 2018 16:07:18 +0000 + +llvm-toolchain-6.0 (1:6.0~+rc2-1) unstable; urgency=medium + + * New snapshot release + - should fix the FTBFS on arm64 (Closes: #888877) + * Also ignore comdat.ll test failure in silent-gold-test.diff. see + https://bugs.llvm.org/show_bug.cgi?id=36166 + * Remove the python-lldb-6.0 dep to liblldb-6.0-dev to remove the + circular dependency (Closes: #876015) + * Mark liblldb-6.0-dbg conflict with liblldb-7-dbg + (Closes: #888057) + + -- Sylvestre Ledru Wed, 07 Feb 2018 23:13:54 +0100 + +llvm-toolchain-6.0 (1:6.0~+rc1-1) unstable; urgency=medium + + * New snapshot release + * Update of the clang-tools-X.Y description + + -- Sylvestre Ledru Thu, 18 Jan 2018 09:26:04 +0100 + +llvm-toolchain-6.0 (1:6.0~svn321745-1~exp1) experimental; urgency=medium + + * Upload the new package (upstream just branched) + + -- Sylvestre Ledru Wed, 03 Jan 2018 20:03:12 +0100 + +llvm-toolchain-snapshot (1:6.0~svn321385-1) unstable; urgency=medium + + * Snapshot upload before rc1 (January) + * Create clang-tools-6.0 and move the various clang tools into it + clang-tools-6.0 depends on clang-6.0. This might affect some packages. + (Closes: #836397) + * Bring back the libedit support in lldb + Fix upstream bug https://bugs.llvm.org/show_bug.cgi?id=35291 + * Also ship ld64.lld and wasm-ld in the lld-X.Y package + * Update d/rules to reflect the move of libfuzzer into compiler-rt + * Update of the copyright file (Closes: #878502) + Thanks to Nicholas D Steeves for the work + * Try to fix the mipsel FTBFS (Closes: #877567) + I am trying the first option from the bug: + - gsplit-dward on 32 bits archs + - -g everywhere + Many thanks to Adrian Bunk for that + * Use ?= for some variables declarations + * Remove the hardcoded declarations of llvm version in debian/rules + * add /usr/lib/cuda to the CUDA toolkit search paths + Thanks to Andreas Beckmann for the patch (Closes: #882505) (LP: #1706326) + * Fix the fix-scan-view-path.diff path + * Move libomp-dev from Suggests to Recommends (Closes: #882781) + * Add a symlink to fix lldb-X.Y (Closes: #881993) + * Remove update-cuda-search-path.patch (applied upstream) + * Also install usr/bin/lldb-test-6.0 + * liblld-6.0-dev depends on liblld-6.0 (Closes: #856545) + * Add new symbols for libclang1: + - clang_CXIndex_setInvocationEmissionPathOption + - clang_CXXRecord_isAbstract + - clang_Cursor_getObjCManglings + - clang_getCursorTLSKind + * add test-keep-alive.diff to improve the keep alive for some + archs like mips* + * Standards-Version: 4.1.1 + * remove liblld-6.0-dbg for now + + -- Sylvestre Ledru Fri, 22 Dec 2017 21:41:17 +0100 + +llvm-toolchain-snapshot (1:6.0~svn315736-1) unstable; urgency=medium + + * New snapshot + * Ship liblldMinGW lld lib + * Ship clang-refactor & clang-func-mapping in clang-X.Y + * Remove the -Wl option to call gold instead of the normal linker + (Closes: #876787) + * Force the deactivation of ocaml until the transition is done + * Standards Version 4.1.0 + + [ Gianfranco Costamagna ] + * Enable ocaml on release architectures. + * Add NDEBUG flag, lost in the -g -> -g1 switch + + [ Matthias Klose ] + * Link with --no-keep-files-mapped --no-map-whole-files when using gold. + * build using gold on arm64 and s390x. For backports, arm64 might still + need the BFD linker, and building with only one or two processes in + parallel. + * On amd64, s390x, arm64 and ppc64el, build with -g1 instead of -g. + * Set CMAKE_CXX_FLAGS_RELWITHDEBINFO and pass opt_flags. + + -- Sylvestre Ledru Mon, 11 Sep 2017 22:27:20 +0200 + +llvm-toolchain-snapshot (1:6.0~svn311834-2) unstable; urgency=medium + + * Fix the FTBFS because of -gsplit-dwarf: + - Only enable it on archs which needs it + - Only enable it when gcc supports it correctly + * Fail the build if the arch + gcc has a broken gsplit-dwarf support + + -- Sylvestre Ledru Thu, 31 Aug 2017 19:14:53 +0200 + +llvm-toolchain-snapshot (1:6.0~svn311834-1) unstable; urgency=medium + + * Link LLDB with -latomic on powerpcspe (Closes: #872267) + * Fix the C++ include path order (Closes: #859083) + * Disable -gsplit-dwarf when using gcc 7 for causing a linking issue + See https://bugs.llvm.org/show_bug.cgi?id=34140 + (Closes: #853525) + * clang was producing unusable binaries on armv5tel (Closes: #873307) + Thanks to Adrian Bunk for the patch + * With Ubuntu Trusty (for apt.llvm.org), the build fails + on internal compiler error: in output_index_string, at dwarf2out.c:218 + force the usage of gcc 4.9 + + -- Sylvestre Ledru Sat, 26 Aug 2017 22:35:00 +0200 + +llvm-toolchain-snapshot (1:6.0~svn310776-1) unstable; urgency=medium + + * We moved from 5.0 to 6.0 + * Ship the opt-viewer new program as part of llvm-6.0 tools + * ld.lld manpage wasn't installed + * Disable the clang-fix-cmpxchg8-detection-on-i386.patch patch + because breaks the build with + 'error: 'isCmpXChg8Supported' was not declared in this scope' + * Remove usr/bin/liblldb-intel-mpxtable.so-6.0 as it seems to be removed + from usptream + * Force the usage of gcc 6 until the link issues with gcc 7 are fixed + https://bugs.llvm.org/show_bug.cgi?id=34140 + + [ Katsuhiko Nishimra ] + * Ensure /usr/bin/g++-$(GCC_VERSION) exists (Closes: #871591) + + -- Sylvestre Ledru Thu, 27 Jul 2017 23:16:06 +0200 + +llvm-toolchain-snapshot (1:5.0~svn305653-1) unstable; urgency=medium + + [ Gianfranco Costamagna ] + * Re-add clang-doc documentation + + [ Sylvestre Ledru ] + * New snapshot release + * Fix a hurd PATH_MAX issue + * Transform the lldb swig check from a error to a warning + * Add libomp-dev to the suggests of clang + * Add Provides on python-lldb-x.y & python-clang-x.y & libllvm-x.y-ocaml-dev + to avoid the recurring problem about conflicts + (Closes: #835546, #863739, #863742) + * Standards-Version => 4.0.0 + * Generate the llvm-tblgen, clang-change-namespace, clang-offload-bundler + lld, clang++, clang-check, clang-cpp & clang-import-test manpages + * Remove the --no-discard-stderr option from help2man calls + * use -DPOLLY_BUNDLED_JSONCPP=OFF & add pkg-config as a dep (to help find + the files) + + -- Sylvestre Ledru Fri, 09 Jun 2017 12:04:56 +0200 + +llvm-toolchain-snapshot (1:5.0~svn302368-1~exp1) experimental; urgency=medium + + * Only enable libfuzzer for Linux kernel. + Thanks to Pino Toscano for the patch + * Add option -DPOLLY_BUNDLED_JSONCPP=ON + to use the system lib instead of the patch d/p/use-deb-json.diff + * New symbols added in libclang + - clang_EvalResult_getAsLongLong + - clang_EvalResult_getAsUnsigned + - clang_EvalResult_isUnsignedInt + - clang_TargetInfo_dispose + - clang_TargetInfo_getPointerWidth + - clang_TargetInfo_getTriple + - clang_Type_isTransparentTagTypedef + - clang_getAllSkippedRanges + - clang_getTranslationUnitTargetInfo + + -- Sylvestre Ledru Sun, 07 May 2017 12:13:43 +0200 + +llvm-toolchain-snapshot (1:5.0~svn298899-1) unstable; urgency=medium + + * Limit the archs where the ocaml binding is built + Should fix the FTBFS + Currently amd64 arm64 armel armhf i386 + * d/p/add_symbols_versioning.patch removed (applied upstream) + * Really fix "use versioned symbols" for llvm + Thanks to Julien Cristau for the patch (Closes: #849098) + * Explicit the dep of clang-tidy on same version of llvm to avoid + undefined symbols + * Add override_dh_makeshlibs for the libllvm or liblldb versions + Thanks to Julien Cristau for the patch + * change the min version of the libclang1 symbols to 1:4.0-3~ + * Fix the symlink on scan-build-py + * add libncurses in the list of build deps (Closes: #861170) + + [ Rebecca N. Palmer ] + * Use versioned symbols (Closes: #848368) + + -- Sylvestre Ledru Sun, 09 Apr 2017 10:11:56 +0200 + +llvm-toolchain-snapshot (1:5.0~svn294583-1~exp1) experimental; urgency=medium + + * New snapshot release + * New library liblldb-intel-mpxtable.so + * Fix the incorrect symlink to scan-build-py (Closes: #856869) + * Explicit the dep of clang-format on same version of llvm to avoid + undefined symbols + + -- Sylvestre Ledru Mon, 16 Jan 2017 09:03:48 +0100 + +llvm-toolchain-snapshot (1:5.0~svn292017-1~exp1) experimental; urgency=medium + + * New snapshot release + snapshot is now 5.0 + * d/p/silent-amdgpu-test-failing.diff silent amdgpu tests failing + (see upstream bug 31610) + * d/p/lldb-server-link-issue.patch removed, merged upstream + * Also install python-lldb-5.0 when installing lldb-5.0 (Closes: #851171) + * Bring back the content of llvm-5.0-doc (Closes: #844616) + * Bring back the content of llvm-4.0-doc (Closes: #844616) + * d/p/pthread-link.diff Hardcode like to pthread which was missing for + libclang + + -- Sylvestre Ledru Sat, 14 Jan 2017 16:36:51 +0100 + +llvm-toolchain-snapshot (1:4.0~svn291344-1) unstable; urgency=medium + + * New snapshot release + * Disable libedit usage in lldb because of garbage (Closes: #846616, #850111) + * Build lld + - d/p/lld-arg-cmake-issue.diff fixes upstream bug #27685 + * ship clang-tblgen + * Run clang extra test suite + * Fix the detection of lldb-server + * Fix the run of the check-lldb target + + -- Sylvestre Ledru Sat, 07 Jan 2017 12:24:32 +0100 + +llvm-toolchain-snapshot (1:4.0~svn290810-1) unstable; urgency=medium + + * New snapshot release + * d/p/kfreebsd-support.diff removed (applied upstream) + * debian/orig-tar.sh: less verbose + * d/p/lldb-missing-install.diff: For the install + of lldb-server and lldb-argdumper as they are not always installed + * Ship new binary in clang-X.Y: clang-import-test + * New symbols in libclang1: + - clang_EvalResult_getAsLongLong + - clang_EvalResult_getAsLongLong + - clang_EvalResult_isUnsignedInt + * Fix a regression in the test run for the code coverage + * Silent ThinLTO/X86/autoupgrade.ll, fails with code coverage (and maybe others) + + -- Sylvestre Ledru Mon, 02 Jan 2017 13:51:06 +0100 + +llvm-toolchain-snapshot (1:4.0~svn286225-1) unstable; urgency=medium + + * New snapshot release + * Remove the info section from the generated manpages (Closes: #846269) + + [ Kai Wasserbäch ] + * debian/patches/{0003-Debian-version-info-and-bugreport.patch, + 0044-soname.diff,23-strlcpy_strlcat_warning_removed.diff, + 26-set-correct-float-abi.diff,atomic_library_[12].diff, + fix-clang-path-and-build.diff,fix-lldb-server-build,lldb-libname.diff, + lldb-soname.diff,mips-fpxx-enable.diff,removeduplicatedeclaration.diff}: + Refreshed. + * debian/patches/{silent-gold-utils,kfreebsd-support}.diff: Updated. + + -- Sylvestre Ledru Tue, 08 Nov 2016 12:19:55 +0100 + +llvm-toolchain-snapshot (1:4.0~svn282142-1~exp1) experimental; urgency=medium + + * The libstdc++-6-dev & libobjc-6-dev are only install with clang-X.Y + and libclang-X.Y-dev and no longer with libclang1-X.Y + (Closes: #841309) + * Fix the VCS-* fields + + [ Kai Wasserbäch ] + * debian/patches/{23-strlcpy_strlcat_warning_removed.diff, + 0003-Debian-version-info-and-bugreport.patch, atomic_library_[12].diff, + python-clangpath.diff,removeduplicatedeclaration.diff, + fix-clang-path-and-build.diff,mips-fpxx-enable.diff}: Refreshed. + * debian/patches/{silent-more-tests.diff,silent-MCJIIT-tests.diff}: Updated. + + -- Sylvestre Ledru Mon, 24 Oct 2016 10:45:07 +0200 + +llvm-toolchain-3.9 (1:3.9-6) unstable; urgency=medium + + * Fix segfaults in the memory sanitizers (Closes: #842642) + Caused by the newer glibc. Many thanks for Nobert Lange for everything + * Enable the sanitizers testsuite + + -- Sylvestre Ledru Fri, 11 Nov 2016 17:01:38 +0100 + +llvm-toolchain-3.9 (1:3.9-5) unstable; urgency=medium + + * d/p/0011-SimplifyCFG-Hoisting-invalidates-metadata.patch: Also apply bug 29163 + to fix some issues in rust (Closes: #842956) + Many thanks to Ximin Luo for the investigation + + * libclang-common-4.0-dev: missing multilib binaries for the sanitizer + libraries (Closes: #841923) + Many thanks to Norbert Lange for the changes + + [ Pauli ] + * d/p/clang-fix-cmpxchg8-detection-on-i386.patch: + libcxx atomic tests for old i386 fail with wrong Atomic inline width. + Needed for libc++ + (See https://llvm.org/bugs/show_bug.cgi?id=19355) + * d/p lldb-addversion-suffix-to-llvm-server-exec.patch: + Fix the lldb-server call in some cases + + -- Sylvestre Ledru Fri, 04 Nov 2016 17:18:07 +0100 + +llvm-toolchain-3.9 (1:3.9-4) unstable; urgency=medium + + * LLVMConfig.cmake was installed into wrong location + Install a symlink from lib/cmake/llvm to share/llvm/cmake + (Closes: #839234) + * Fix a path issue in scan-view. Thanks Riccardo Magliocchetti + (Closes: #838572) + + -- Sylvestre Ledru Mon, 31 Oct 2016 10:47:52 +0100 + +llvm-toolchain-3.9 (1:3.9-3) unstable; urgency=medium + + [ Sylvestre Ledru ] + * The libstdc++-6-dev & libobjc-6-dev are only install with clang-X.Y + and libclang-X.Y-dev and no longer with libclang1-X.Y + (Closes: #841309) + + [ Gianfranco Costamagna ] + * Team upload + * d/p/drop-wrong-hack-arm64.patch: + - drop hack that was preventing the package from building on + non-amd64 64bit architectures: + + -- Gianfranco Costamagna Thu, 27 Oct 2016 11:45:28 +0200 + +llvm-toolchain-snapshot (1:4.0~svn280796-1~exp1) experimental; urgency=medium + + * Merge clang-include-fixer-4.0 into clang-4.0. Don't think + it deserves it own package + * python-lldb-4.0 archs "any" to a list like others pkg + * Fix a version issue with run-clang-tidy-4.0.py + * Also install clang-change-namespace-4.0 + + [ Kai Wasserbäch ] + * debian/clang-X.Y.install.in: Added clang-cpp. + * debian/patches: Refreshed. + + -- Sylvestre Ledru Fri, 02 Sep 2016 13:11:56 +0200 + +llvm-toolchain-3.9 (1:3.9-1) unstable; urgency=medium + + * New stable release + * Port to kfreebsd. Many thanks to Pino Toscano + (Closes: #835665) + * clang_getAllSkippedRanges in the list of libclang1 symbols + * Try to disable the execution of the testsuite for scan-build & coverity + for real + * Also ship clang-reorder-fields as part of the clang-4.0 package + * Build lldb on arm64. Hopefully, works. + * New snapshot release + * Tentative fix for lldb-server build + + -- Sylvestre Ledru Wed, 07 Sep 2016 12:02:12 +0200 + +llvm-toolchain-snapshot (1:4.0~svn279916-1) unstable; urgency=medium + + * Snapshot is now 4.0 + * Introduce clang-include-fixer-4.0 + * Fix the usage of jsoncpp in polly. Thanks to James Clarke for the patch + (Closes: #835607) + * Fix the renaming of the manpages (Closes: #834077) + * Use the manpage from clang.rst instead of help2man + * Disable the build of lldb on mips64el, ppc64 and s390x for real + * Add symlink from ./build to ../share and ../lib etc + Thanks to Ximin Luo for the patch (Closes: #834144) + * Sync the 3.9 changes into 4.0 + * Fix the cmake paths in llvm-4.0-dev deb package. Thanks to Brad King + for the patch (Closes: #819072) + * Bring back the lto (gone with the cmake migration) + (Closes: #819333) (upstream: #27223) + * LLVMConfig.cmake is now installed to /lib/cmake/llvm instead of + /share/llvm/cmake + Thanks to Brad King of the fix + * Disable lldb on sparc64 (Closes: #832371) + * Also install clang-rename.el & clang-rename.py in clang-4.0 + * scan-build llvm results are built using --show-description + * Generate manpages for lli, lldb-mi & git-clang-format + * Fix some lintian overrides + * Generate more manpages + * Remove some garbage from the manpages (Closes: #815991, #804347) + * Disable -gsplit-dwarf on Ubuntu precise + * Update the coverity configuration (Debian has moved to gcc 6) + * remove compiler-rt-path.diff (file removed upstream, probably because + we moved to cmake) + * Ship clang-offload-bundler in clang 4.0 + * Set the correct Conflicts for python-clang-4.0, python-lldb-4.0 + (Closes: #832410) + + -- Sylvestre Ledru Sat, 27 Aug 2016 14:19:41 +0200 + +llvm-toolchain-snapshot (1:4.0~svn275970-1~exp1) experimental; urgency=medium + + * New snapshot release + * Bring back llvm-4.0-tools to life + * ship clang-tblgen & yaml-bench as part of the libclang-common-X.Y-dev + package + + * amd64 llvm testsuite is green, bring back the failure in case of error + * Fix the cmake paths in llvm-3.9-dev deb package. Thanks to Brad King + for the patch (Closes: #819072) + + -- Sylvestre Ledru Mon, 25 Jul 2016 12:18:52 +0200 + +llvm-toolchain-3.9 (1:3.9~svn275918-1~exp1) experimental; urgency=medium + + * New snapshot release + * Silent test CodeGen/SPARC/LeonInsertNOPsDoublePrecision.ll + * ship lli-child-target as part of the llvm-X.Y-runtime package + * Bring back llvm-3.9-tools to life + * ship clang-tblgen & yaml-bench as part of the libclang-common-X.Y-dev + package + * ship lli-child-target as part of the llvm-X.Y-runtime package + + -- Sylvestre Ledru Tue, 19 Jul 2016 15:34:08 +0200 + +llvm-toolchain-snapshot (1:3.9~svn274438-1) unstable; urgency=medium + + * Remove the autoconf section + * Bring back the removal of the build dir + * Fix the coverage builds (didn't allow several cflags) + * Set the correct conflicts on python-lldb-3.8 (Closes: #817873) + * Set the correct conflicts on python-clang-3.8 (Closes: #817872) + * remove llvm26003-sanitizer-check-env.diff (merged upstream) + * Do not fail the build if the manpages cannot be built (failing on + Ubuntu precise) + * Install libfindAllSymbols.a as part of libclang-X.Y-dev + * Ship scan-build-py + * Use the libjsoncpp library embedded (fails to link otherwise) + * Standards-Version 3.9.8 + * cmake files moved from usr/lib/llvm-3.9/share/llvm/cmake/ + to usr/lib/llvm-3.9/lib/cmake/llvm/ + (upstream change) + * Add a symlink from usr/lib/llvm-3.9/share/llvm/cmake + pointing to usr/share/llvm-3.9/cmake + * Disable the run of lldb testsuite because of LLVM_LINK_LLVM_DYLIB=ON: + https://llvm.org/bugs/show_bug.cgi?id=28127 + * Add -gsplit-dwarf to CXXFLAGS to workaround the memory allocation + issue on i386 + * Ignore the lintian override about embedded-library for json. + Doesn't link otherwise + * Fix the soname of libclang and libLLVM. Might cause some breakage with + existing app but no choice... + + [ Pablo Oliveira ] + * Add python-six as a dependency of python-lldb (Closes: #825371) + (thanks to Askar Safin) + * Fix lldb symlinks + * Fix missing _lldb.so import during lldb testsuite + + [ Ed Schouten ] + * Preparation of the support of lld (not ready yet) + + [ Kai Wasserbäch ] + * debian/rules: + - Ensure ld-gold is used. CMake invokes the linker through g++ most of the + time, therefore we need to set -Wl,-fuse-ld=gold. + - Remove unused variable "confargs". + + [ Brad King ] + * Install cmake files in usr/share/llvm-@LLVM_VERSION@/cmake/ instead of + usr/share/llvm-@LLVM_VERSION@/cmake/ + * Also install libLLVM-3.8.so.1 as a symlink + * debian/patches/fix-cmake-config-prefix.diff: + cover the CMake build system too + (Closes: #819072) + + [ Alexis La Goutte ] + * Fix an issue with scan-view (Closes: #825101) + + [ YunQiang Su ] + * Enable FPXX by default on mips/mipsel (Closes: #826749) + + -- Sylvestre Ledru Sat, 02 Jul 2016 20:46:05 +0200 + +llvm-toolchain-snapshot (1:3.9~svn260851-1) unstable; urgency=medium + + * New snapshot + * Switch to 3.9 (remove lldb-3.9-dev as it was a transitionnal pkg) + * Update the clang description for something more accurate (C++-11, 14, etc) + * Cmake migration. Done by Andrew Wilkins. Many thanks to him + - Update patches to set SONAME in CMake build + - Create symlinks with ".links", don't install from build tree + - Remove LLVM-internal tools (lit, FileCheck, not, tblgen, etc.) + - Remove llvm-X.Y-tools package, because it contained only + internal tools that are not intended for distribution. + - Remove autotools-specific artifacts from packages. + - Remove "dummy" documentation artifacts from llvm-X.Y-docs + package. Not built/installed by CMake, not useful. + - Update control/rules to support CMake + - Patch LLDB SWIG interfaces to workaround a bug in SWIG + See https://llvm.org/bugs/show_bug.cgi?id=25468 + - add missing files to clang-format + - Add patch to fix sanitizer lit invocation + - removed LLVM-internal tools (lit, FileCheck, not, *-tblgen, etc.); + not installed by CMake, not intended for distribution + - removed llvm-X.Y-tools (contained only internal tools) + - removed autotools-specific artifacts (configure, Makefile, etc.) + - removed dummy documentation files + * Sync against 3.8 + * Disable "Sphinx warnings treated as errors" + + -- Sylvestre Ledru Tue, 08 Mar 2016 09:50:29 +0100 + +llvm-toolchain-3.8 (1:3.8-1) unstable; urgency=medium + + * New upstream release + * Install a missing library to unbreak lldb (Closes: #815809) + + -- Sylvestre Ledru Thu, 03 Mar 2016 21:16:21 +0100 + +llvm-toolchain-3.8 (1:3.8~+rc3-1~exp1) experimental; urgency=medium + + * New snapshot release + * Update the clang description for something more accurate (C++-11, 14, etc) + * Update debian/orig-tar.sh to remove autoconf/config.sub autoconf/config.guess + in polly + + [ Matthias Klose ] + * clang-tidy-3.8: Remove Breaks/Replaces on clang-modernize-3.8. + * Disable lldb on s390x. + + -- Sylvestre Ledru Thu, 25 Feb 2016 14:26:14 +0100 + +llvm-toolchain-3.8 (1:3.8~+rc2-1~exp1) experimental; urgency=medium + + * New snapshot release + * Remove build-llvm/ after the install step to save space. + Most of the rc1 builds failed because of hd space. + + -- Sylvestre Ledru Wed, 03 Feb 2016 08:59:32 +0100 + +llvm-toolchain-3.8 (1:3.8~+rc1-1~exp1) experimental; urgency=medium + + * New snapshot release + * Cmake migration. Done by Andrew Wilkins. Many thanks to him + - Update patches to set SONAME in CMake build + - Create symlinks with ".links", don't install from build tree + - Remove LLVM-internal tools (lit, FileCheck, not, tblgen, etc.) + - Remove llvm-X.Y-tools package, because it contained only + internal tools that are not intended for distribution. + - Remove autotools-specific artifacts from packages. + - Remove "dummy" documentation artifacts from llvm-X.Y-docs + package. Not built/installed by CMake, not useful. + - Update control/rules to support CMake + - Patch LLDB SWIG interfaces to workaround a bug in SWIG + See https://llvm.org/bugs/show_bug.cgi?id=25468 + - add missing files to clang-format + - Add patch to fix sanitizer lit invocation + - removed LLVM-internal tools (lit, FileCheck, not, *-tblgen, etc.); + not installed by CMake, not intended for distribution + - removed llvm-X.Y-tools (contained only internal tools) + - removed autotools-specific artifacts (configure, Makefile, etc.) + - removed dummy documentation files + + -- Sylvestre Ledru Wed, 20 Jan 2016 16:09:01 +0100 + +llvm-toolchain-3.8 (1:3.8.1-8) unstable; urgency=medium + + * Disable the usage of ld gold on powerpc (Closes: #833583) + * Revert drop-avx512-from-skylake.diff, it is causing some regressions in the + testsuite + * Disable lldb on ppc64 + * libfuzzer depends on the same version of clang (Closes: #833564) + * Use filter into of findstring in the gold usage. Thanks Doko for the + suggestion + + -- Sylvestre Ledru Sun, 07 Aug 2016 14:10:09 +0200 + +llvm-toolchain-3.8 (1:3.8.1-7) unstable; urgency=medium + + * Fix the detection of gcc. This broke the build on the latest unstable + + -- Sylvestre Ledru Fri, 05 Aug 2016 09:55:15 +0200 + +llvm-toolchain-3.8 (1:3.8.1-6) unstable; urgency=medium + + * Ship libFuzzer in its own package (libfuzzer-X.Y-dev) (Closes: #820159) + * Sync from Ubuntu. Many thanks to Matthias Klose + - drop-avx512-from-skylake.diff: Don't enable AVX512 on Skylake, as it's + a server cpu feature and breaks llvmpipe on workstations. + - Remove the build tree before calling dh_strip; at least the amd64 buildd + runs out of diskspace at this step. + - Add support for gcc's attribute abi_tag (needed for compatibility with + GCC 5's libstdc++); taken from the trunk (Closes: #797038) + (LP: #1510042, #1488254) + D17567-PR23529-Sema-part-of-attrbute-abi_tag-support.diff + D18035-PR23529-Mangler-part-of-attrbute-abi_tag-support.diff + + -- Sylvestre Ledru Thu, 28 Jul 2016 11:15:04 +0200 + +llvm-toolchain-3.8 (1:3.8.1-5) unstable; urgency=medium + + [ Gianfranco Costamagna ] + * Try to fix mips64el build, by enabling the same + packages as the mips and mipsel versions + * Link mips* with latomic. + + [ Sylvestre Ledru ] + * Disable lldb on sparc64 (Closes: #832371) + * Hopefully fix the FTBFS on armel + + -- Sylvestre Ledru Wed, 27 Jul 2016 22:49:09 +0200 + +llvm-toolchain-3.8 (1:3.8.1-4) unstable; urgency=medium + + * Fix the FTBFS under mips/mipsel? (enable the link against atomic) + (Closes: #820537) + * Bring back llvm-3.8-tools to life + * ship clang-tblgen & yaml-bench as part of the libclang-common-X.Y-dev + package + + -- Sylvestre Ledru Wed, 20 Jul 2016 10:20:46 +0200 + +llvm-toolchain-3.8 (1:3.8.1-3) unstable; urgency=medium + + * Add -gsplit-dwarf to CXXFLAGS to workaround the memory allocation + issue on i386 (hopefully) + + -- Sylvestre Ledru Sat, 02 Jul 2016 20:59:08 +0200 + +llvm-toolchain-3.8 (1:3.8.1-2) unstable; urgency=medium + + [ Sylvestre Ledru ] + * Add a symlink from usr/lib/llvm-3.8/share/llvm/cmake + pointing to usr/share/llvm-3.8/cmake + + [ Gianfranco Costamagna ] + * Remove python-lldb-3.8 where liblldb-3.8-dev is not built + + -- Sylvestre Ledru Tue, 28 Jun 2016 14:44:48 +0200 + +llvm-toolchain-3.8 (1:3.8.1-1) unstable; urgency=medium + + * New maintenance release + + [ Kai Wasserbäch ] + * debian/rules: Ensure ld-gold is used. CMake invokes the linker through + g++ most of the time, therefore we need to set -Wl,-fuse-ld=gold. + + [ Brad King ] + * Followup to fix the cmake install (Closes: #819072) + + [ YunQiang Su ] + * Enable FPXX by default on mips/mipsel (Closes: #826749) + + -- Sylvestre Ledru Thu, 23 Jun 2016 08:49:29 +0200 + +llvm-toolchain-3.8 (1:3.8.1~+rc1-1~exp1) experimental; urgency=medium + + * New RC release + * Improve the cmake detection (used for llvm.org/apt) + * Standards-Version updated to 3.9.8 + * Ignore outdated-autotools-helper-file + + [ Brad King ] + * Install cmake files in usr/share/llvm-@LLVM_VERSION@/cmake/ instead of + usr/share/llvm-@LLVM_VERSION@/cmake/ + * Also install libLLVM-3.8.so.1 as a symlink + * debian/patches/fix-cmake-config-prefix.diff: + cover the CMake build system too + (Closes: #819072) + + [ Pablo Oliveira ] + * Fix python-lldb dependencies and make proper symlinks to libLLVM + and liblldb as suggested by Graham Inggs (Closes: #821022) + * Fix liblldb suffix in lldb/scripts/Python/finishSwigPythonLLDB.py + (Closes: #813798) + * Fix LLVM bug 26158 - clang packages don't provide man pages + * Add python-six as a dependency of python-lldb (thanks to Askar Safin). + + [ Gianfranco Costamagna ] + * Make python-lldb-3.8 depend on lldb-3.8-dev, to pick all + the required dependencies + * Unbreak circular dependency by Suggesting the python binding from + liblldb-3.8-dev + + [ Alexis La Goutte ] + * Fix an issue with scan-view (Closes: #825101) + + -- Sylvestre Ledru Thu, 26 May 2016 17:30:00 +0200 + +llvm-toolchain-3.8 (1:3.8-2) unstable; urgency=medium + + * Team upload. + * Disable polly on s390x and fix polly check. + * Fix VCS fields. + + [ Sylvestre Ledru ] + * Fix txt file installation issue, by putting a README.txt file + with some explanation. + + [ Graham Inggs ] + * Tighten llvm dev dependency (Closes: #814142). + + -- Gianfranco Costamagna Mon, 07 Mar 2016 10:56:05 +0100 + +llvm-toolchain-3.8 (1:3.8-1) unstable; urgency=medium + + * New upstream release + * Install a missing library to unbreak lldb (Closes: #815809) + + -- Sylvestre Ledru Thu, 03 Mar 2016 21:16:21 +0100 + +llvm-toolchain-3.8 (1:3.8~+rc3-1~exp1) experimental; urgency=medium + + * New snapshot release + * Update the clang description for something more accurate (C++-11, 14, etc) + * Update debian/orig-tar.sh to remove autoconf/config.sub autoconf/config.guess + in polly + + [ Matthias Klose ] + * clang-tidy-3.8: Remove Breaks/Replaces on clang-modernize-3.8. + * Disable lldb on s390x. + + -- Sylvestre Ledru Thu, 25 Feb 2016 14:26:14 +0100 + +llvm-toolchain-3.8 (1:3.8~+rc2-1~exp1) experimental; urgency=medium + + * New snapshot release + * Remove build-llvm/ after the install step to save space. + Most of the rc1 builds failed because of hd space. + + -- Sylvestre Ledru Wed, 03 Feb 2016 08:59:32 +0100 + +llvm-toolchain-3.8 (1:3.8~+rc1-1~exp1) experimental; urgency=medium + + * New snapshot release + * Cmake migration. Done by Andrew Wilkins. Many thanks to him + - Update patches to set SONAME in CMake build + - Create symlinks with ".links", don't install from build tree + - Remove LLVM-internal tools (lit, FileCheck, not, tblgen, etc.) + - Remove llvm-X.Y-tools package, because it contained only + internal tools that are not intended for distribution. + - Remove autotools-specific artifacts from packages. + - Remove "dummy" documentation artifacts from llvm-X.Y-docs + package. Not built/installed by CMake, not useful. + - Update control/rules to support CMake + - Patch LLDB SWIG interfaces to workaround a bug in SWIG + See https://llvm.org/bugs/show_bug.cgi?id=25468 + - add missing files to clang-format + - Add patch to fix sanitizer lit invocation + - removed LLVM-internal tools (lit, FileCheck, not, *-tblgen, etc.); + not installed by CMake, not intended for distribution + - removed llvm-X.Y-tools (contained only internal tools) + - removed autotools-specific artifacts (configure, Makefile, etc.) + - removed dummy documentation files + + -- Sylvestre Ledru Wed, 20 Jan 2016 16:09:01 +0100 + +llvm-toolchain-snapshot (1:3.8~svn255217-1~exp1) experimental; urgency=medium + + * New snapshot release + * Fix an install issue with clang-tidy + * clang-modernize has been removed. Long live to clang-tidy, its + replacement + + -- Sylvestre Ledru Thu, 10 Dec 2015 05:18:29 +0100 + +llvm-toolchain-snapshot (1:3.8~svn254193-2) UNRELEASED; urgency=medium + + * disable lldb and polly on powerpc, currently ftbfs. + setting the lldb archs in debian/control in just one + place would be appreciated. + * quoting fixes in debian/rules, when make macros + are empty + Thanks to Doko for the two previous changes (Closes: #806729) + + -- Sylvestre Ledru Mon, 30 Nov 2015 15:34:12 +0100 + +llvm-toolchain-snapshot (1:3.8~svn254193-1) unstable; urgency=medium + + * New snapshot release + * Remove some warnings in the manpages generation (Closes: #795310) + * Also ship sancov in clang-3.8 + * Fix the links to scan-build-3.8 & scan-view-3.8 + + -- Sylvestre Ledru Tue, 20 Oct 2015 14:07:06 +0200 + +llvm-toolchain-snapshot (1:3.8~svn250696-1) unstable; urgency=medium + + * Remove macho-dump from LLVM (removed by upstream r248302) + * Introduce clang-tidy-3.8 as a separate package. Replaces clang-modernize + * Ship run-clang-tidy.py & clang-tidy-diff.py in clang-tidy-3.8 + * Remove cpp11-migrate-3.8 package. Has been replaced by clang-modernize + for a while (which will be replaced by clang-tidy) + * Add three new symbols in libclang1 + - clang_CompileCommand_getFilename@Base + - clang_CompileCommand_getMappedSourceContent@Base 3.8 + - clang_CompileCommand_getMappedSourcePath@Base 3.8 + + -- Sylvestre Ledru Mon, 21 Sep 2015 13:16:35 +0200 + +llvm-toolchain-snapshot (1:3.8~svn247576-1) unstable; urgency=medium + + [ Sylvestre Ledru ] + * New snapshot release + * Remove CVE-2015-2305.patch. Already fixed upstream in a different + way + * remove patches merge upstream + - lit-lang.diff + - locale-issue-ld.diff + * Also generate liblldb-3.8-dbg + * Select LLVM OpenMP as the default backend + + [ Gianfranco Costamagna ] + * d/control: Add more conflicting packages (python-clang and python-lldb) + (Closes: #796811, #796843) + * Remove an obsolete declaration about dragonegg + (cherry-pick from 3.7 branch) + + [ James Price ] + * d/p/fix-cmake-config-prefix.diff: fix cmake path, + needs a change after upstream revision r241080 + (Addresses: #794905) + + -- Sylvestre Ledru Mon, 14 Sep 2015 18:29:09 +0200 + +llvm-toolchain-snapshot (1:3.8~svn245286-1) unstable; urgency=medium + + * New snapshot release (3.7 => 3.8) + No need to rename libllvm as 3.8 was not part of the debian archive + + [ Gianfranco Costamagna ] + * Fix VCS fields. + * d/p/CVE-2015-2305.patch, fix security issue on regcomp.c + * Fix many lintian warning/errors + - copyright fixes + - control files + - disabled ocaml documentation + + -- Sylvestre Ledru Tue, 18 Aug 2015 14:28:36 +0200 + +llvm-toolchain-snapshot (1:3.7~svn231060-1~exp2) UNRELEASED; urgency=medium + + * Reflect upstream changes wrt vim package. Split the files into different + directories + * Disable the patch force-gcc-header-obj.diff. Seems to cause bug #23556 + * Fix the CMake build. thanks to Paweł Bylica for the fix. + Fix upstream bug #23352 + * No longer building some clang help page, removing them + + -- Sylvestre Ledru Tue, 21 Apr 2015 09:41:41 +0200 + +llvm-toolchain-snapshot (1:3.7~svn231060-1~exp1) experimental; urgency=medium + + * New snapshot release + * Force the version of clang in the analyzer scripts + clang-analyzer-force-version.diff + + -- Sylvestre Ledru Tue, 03 Mar 2015 09:19:38 +0100 + +llvm-toolchain-snapshot (1:3.7~svn230857-1) unstable; urgency=medium + + * New snapshot release + * Support of gcc 5.0 (Closes: #777988) + * compiler-rt-i586.diff: fix a build issue of compiler-rt under i386 + * lldb-gdbserver & lldb-platform have been merged into lldb-server + * Bring back polly and remove libcloog-isl-dev & libisl-dev as build deps + (shipped in the polly source tree) + * Set the correct conflicts (Closes: #777580, #777581, #777582) + * lit-lang.diff: Force the call to ld to be in english + (was failing with a french locale) + * silent-MCJIIT-tests.diff: enable some tests and silents some other + + -- Sylvestre Ledru Sat, 28 Feb 2015 18:44:59 +0100 + +llvm-toolchain-snapshot (1:3.7~svn227076-1) unstable; urgency=medium + + * New snapshot release + * Switch to version 3.7 + * Standards-Version updated to 3.9.6 + + -- Sylvestre Ledru Mon, 26 Jan 2015 09:23:41 +0100 + +llvm-toolchain-snapshot (1:3.6~svn224810-1) unstable; urgency=medium + + * New snapshot release + * Update library filename declaration 3.5 => 3.6 (Closes: #772006) + + -- Sylvestre Ledru Fri, 05 Dec 2014 17:46:56 -0800 + +llvm-toolchain-snapshot (1:3.6~svn221998-1~exp1) experimental; urgency=medium + + * Disable ocaml binding. Needs libctypes-ocaml 0.3.3 which is not available + * libllvm*.a is not longer built + * Update of the libclang symbols + * Improve the copyright file. Thanks to Dann Frazier (Closes: #766778) + + -- Sylvestre Ledru Tue, 04 Nov 2014 14:43:28 +0100 + +llvm-toolchain-snapshot (1:3.6~svn218612-1) unstable; urgency=medium + + * Fix my screw up. Add .1 to the libclang soname to make + dpkg-shlibdeps happy + * Remove useless dependency on doxygen + * scan-build could not find clang binary (Closes: #758998) + + -- Sylvestre Ledru Fri, 26 Sep 2014 17:05:26 +0200 + +llvm-toolchain-snapshot (1:3.6~svn218446-1) unstable; urgency=medium + + * New snapshot release + * Upload in unstable + * Disable the co-instability of lldb & python-lldb + (Python stuff conflicts) + * Fix bad dependencies on lldb 3.6 + * Refresh of the list of symbol in libclang + * Try to workaround the FTBFS under ppc64el (create an empty directory) + + -- Sylvestre Ledru Wed, 24 Sep 2014 14:20:49 +0200 + +llvm-toolchain-snapshot (1:3.6~svn216933-1~exp1) experimental; urgency=medium + + * New snapshot release + * sync from 1:3.5~+rc4-2~exp1 + * libclang-3.6.so should be used instead libclang.so. Update the soname + to match the new lib name (Closes: #759538) + * Rename liblldb.so to liblldb-3.6.so + update of the soname. + * python-clang-3.6 description updated + * liblldb-3.6 and python-lldb-3.6 added + * lldb-3.6-dev renamed to liblldb-3.6-dev to match the previous changes + * Manpages for llvm-ranlib, clang-apply-replacements, pp-trace and clang-tidy + added + * clang-3.6 should depends on binutils (for ld, at least) + (Closes: #751030) + * clang/www/analyzer/scripts/dbtree.js removed + + -- Sylvestre Ledru Sat, 30 Aug 2014 18:09:20 +0200 + +llvm-toolchain-snapshot (1:3.6~svn215195-3) unstable; urgency=medium + + * Just like in 3.4 & 3.5, bring back lldb & lldb-dev under mips & mipsel + * Ship clang-rename/clang-rename-3.6 + * Disable libstdc++-header-i386.diff & include-target.diff (merged upstream) + + -- Sylvestre Ledru Mon, 18 Aug 2014 09:02:30 +0200 + +llvm-toolchain-snapshot (1:3.6~svn215195-2) unstable; urgency=medium + + * try to build lldb-mi under kfreebsd (kfreebsd-lldb-mi.diff) + * kfreebsd-lldb-gdbserver.diff removed (applied upstream) + + -- Sylvestre Ledru Mon, 11 Aug 2014 08:44:13 +0200 + +llvm-toolchain-snapshot (1:3.6~svn215195-1) unstable; urgency=medium + + * Upload in unstable + * Enable compressed debug sections (Closes: #757002) + * Force scan-build to use the same version of clang + * Old JIT has been removed. 0050-powerpcspe-fp.diff is useless + * try to build lldb-gdbserver under kfreebsd (kfreebsd-lldb-gdbserver.diff) + * Second try to fix build under HURD (hurd-EIEIO-undef.diff) + + -- Sylvestre Ledru Mon, 04 Aug 2014 13:36:15 +0200 + +llvm-toolchain-3.4 (1:3.4.2-8) unstable; urgency=medium + + * Try to bring back lldb-3.4-dev on mips & mipsel (Closes: #758314) + + -- Sylvestre Ledru Sat, 16 Aug 2014 22:39:13 +0200 + +llvm-toolchain-3.4 (1:3.4.2-7) unstable; urgency=medium + + * Upload in unstable + * Try to bring back lldb on mips & mipsel + * Force scan-build to use the same version of clang + * Try to fix hurd (hurd-EIEIO-undef.diff) + + -- Sylvestre Ledru Tue, 05 Aug 2014 14:40:05 +0200 + +llvm-toolchain-3.5 (1:3.5~+rc4-1) unstable; urgency=medium + + * New snapshot release + + -- Sylvestre Ledru Wed, 27 Aug 2014 23:09:59 +0200 + +llvm-toolchain-3.5 (1:3.5~+rc3-1) unstable; urgency=medium + + * New snapshot release + * Cherry-pick to commit from upstream (revisions 214906 214907) + to improve the gcc compat + * Remove scan-build-clang-path.diff (applied upstream) + * Just like in 3.4, bring back lldb & lldb-dev under mips & mipsel + + -- Sylvestre Ledru Wed, 20 Aug 2014 23:43:06 +0200 + +llvm-toolchain-3.5 (1:3.5~+rc2-1) unstable; urgency=medium + + * Fix the version + * try to build lldb-gdbserver under kfreebsd (kfreebsd-lldb-gdbserver.diff) + * Second try to fix build under HURD (hurd-EIEIO-undef.diff) + + -- Sylvestre Ledru Fri, 08 Aug 2014 10:42:13 +0200 + +llvm-toolchain-3.5 (1:3.5~+rc2-1~exp1) unstable; urgency=medium + + * New snapshot release + * Enable compressed debug sections (Closes: #757002) + * Force scan-build to use the same version of clang + * Bring back scan-build-search-path.diff (Closes: #757219) + + -- Sylvestre Ledru Mon, 04 Aug 2014 13:35:35 +0200 + +llvm-toolchain-snapshot (1:3.6~svn214630-1~exp1) experimental; urgency=medium + + * New snapshot release (3.5 => 3.6) + * Co installation of clang (Closes: #736057) + - scan-build => scan-build-3.6 + - scan-view => scan-view-3.6 + - asan_symbolize => asan_symbolize-3.6 + * Refresh of the patches + * Install yaml2obj, obj2yaml & verify-uselistorder in llvm-3.6 + * Remove of pollycc + * clang alternatives are managed by llvm-defaults + + -- Sylvestre Ledru Thu, 31 Jul 2014 18:12:59 +0200 + +llvm-toolchain-3.5 (1:3.5~+rc1-2) unstable; urgency=medium + + * Sync with 3.4 svn to retrieve some changes: + * Replace $(CURDIR)/debian/tmp by a variable + * Move the polly installation in the dh_auto_install rules instead + of using *.install files. In llvm.org/apt/, I have to sometime disable + polly + * hurd-EIEIO-undef.diff: try to undef an errno.h to fix the ftbfs + * clang-X suggests clang-X-doc (Closes: #755922) + * Manage all files using .in mechanism. It will simplify the upgrade of + version + * Disable lldb for ppc64el. Thanks to Dimitri John Ledkov (Closes: #756380) + * Fix the FTBFS under PowerPC. Thanks to Dimitri John Ledkov for the patch + + -- Sylvestre Ledru Thu, 24 Jul 2014 11:42:56 +0200 + +llvm-toolchain-3.5 (1:3.5~+rc1-1) unstable; urgency=medium + + * First RC release of the 3.5 llvm toolchain + * Apply lldb-kfreebsd.diff patch to fix FTBFS under KFreeBSD + Thanks to Ed Maste + + -- Sylvestre Ledru Wed, 23 Jul 2014 08:57:59 +0200 + +llvm-toolchain-snapshot (1:3.5~svn213451-1) unstable; urgency=medium + + * New snapshot release + * If the version of gcc is too old, force the usage of gcc 4.8 + * Clang will now show the full version. Example: 3.5.0-svn213052-1~exp1 + + -- Sylvestre Ledru Sat, 19 Jul 2014 15:27:11 +0200 + +llvm-toolchain-snapshot (1:3.5~svn211669-2) unstable; urgency=medium + + * Remove useless dependency on g++ + * Use the option stable '-analyzer-config stable-report-filename=true' + to the llvm scan-build reports + + -- Sylvestre Ledru Sun, 29 Jun 2014 19:13:05 +0200 + +llvm-toolchain-snapshot (1:3.5~svn211669-1) unstable; urgency=medium + + * New snapshot release + * Fix CVE-2014-2893 (Closes: #744817) + * Merge with 3.4/debian + * Ship lldb-mi in lldb + * Remove scan-build-fix-clang-detection.diff (applied upstream) + * Ship the compiler-rt static libraries + * Running tests respect DEB_BUILD_OPTIONS=parallel=X + (Closes: #751943) + * Fix FTBFS on powerpc and powerpcspe (Closes: #733890) + * Broken library symlink fixed in lldb-3.5 (Closes: #715130) + * Fix --use-cc when no absolute path is provided (Closes: #748777) + + -- Sylvestre Ledru Wed, 25 Jun 2014 07:58:03 +0200 + +llvm-toolchain-snapshot (1:3.5~svn209039-2) unstable; urgency=medium + + * Provide a link as compatibility with previous lib name (Closes: #748569) + * Be less permissive when installing lldb. Remove duplication of the install + of liblldb.so.1 + + -- Sylvestre Ledru Sun, 18 May 2014 20:01:40 +0200 + +llvm-toolchain-snapshot (1:3.5~svn209039-1) unstable; urgency=medium + + * New snapshot release + * Fix the cmake install patch + * Disable profile_rt.diff for now + * Refresh of libclang1-3.5.symbols + * Fix path to /usr/lib/clang/3.5.0/ (Closes upstream #19088) + * Fix the wrong dependency declaration on llvm-3.5-tools + * Add gnustep & gnustep-devel as suggests of clang-3.5 + * Add libc6-dev as an explicit dependency of clang-3.5 + * Build with dh_install --fail-missing + * Start to use /usr/bin/foo-X.Y. First step to have several clang versions + installed together + * Add some missing files: + - lli-child-target - llvm-3.5-runtime + - count - llvm-3.5-tools + - html.tar.gz - llvm-3.5-doc + - ocamldoc.tar.gz - llvm-3.5-doc + - BugpointPasses.so - llvm-3.5-dev + - liblldb* - lldb-3.5-dev + - clang-apply-replacements - clang-3.5 + - clang-tidy - clang-3.5 + - clang-query - clang-3.5 + - pp-trace - clang-3.5 + - lldb-platform - lldb-3.5 + - lldb-gdbserver - lldb-3.5 + + -- Sylvestre Ledru Fri, 16 May 2014 23:23:50 +0200 + +llvm-toolchain-3.4 (1:3.4.2-2) unstable; urgency=medium + + * Improve the CVE-2014-2893 fix (Closes: #744817) + * Add a check to avoid an error on arch where compiler-rt is not available + + -- Sylvestre Ledru Mon, 16 Jun 2014 23:00:47 +0200 + +llvm-toolchain-3.4 (1:3.4.2-1) unstable; urgency=medium + + * New upstream release + * Add build conflict on libllvm-3.5-ocaml-dev + * Also disable lldb tests under armel (like armhf). Timeout + * Update of the repack script + * Use llvm-3.4-dev.links.in to manage the symlinks + * Fix the soname of liblldb.so to see it treated as a real library + (Closes: #750868) + * Switch to the default gcc/g++ compiler. Currently 4.9 (Closes: #751322) + * Fixes CVE-2014-2893 (Closes: #744817) + + -- Sylvestre Ledru Fri, 06 Jun 2014 15:55:57 +0200 + +llvm-toolchain-3.4 (1:3.4.1-4) unstable; urgency=medium + + * Be less permissive when installing lldb. Remove duplication of the install + of liblldb.so.1 + * Add symlinks lldb-3.4, lldb-platform-3.4 & lldb-gdbserver-3.4 without 3.4 + * Clang was unusable with libstdc++ from gcc 4.9 (Closes: #744792) + + -- Sylvestre Ledru Sun, 18 May 2014 20:18:19 +0200 + +llvm-toolchain-3.4 (1:3.4.1-3) unstable; urgency=medium + + * Fix path for arch without support of compiler-rt. Should fix most of the + FTBFS + + -- Sylvestre Ledru Fri, 16 May 2014 15:27:37 +0200 + +llvm-toolchain-3.4 (1:3.4.1-2) unstable; urgency=medium + + * Fix the soname. No changes in the ABI, so, no need to update the soname + (Closes: #747701) + + -- Sylvestre Ledru Sun, 11 May 2014 17:29:22 +0200 + +llvm-toolchain-3.4 (1:3.4.1-1) unstable; urgency=medium + + * New upstream release. Note that only LLVM & Clang had a new release. + I just copied the 3.4 tarballs for clang-extra-tools, polly, lldb and + compiler-rt. + * Symlink for current build mode missing (Closes upstream #18836) + * Add link usr/lib/llvm-3.4/ to usr/lib/llvm-3.4/build/Debug+Asserts + * Backport of a r201586 from upstream. scan-build was failing on some project + like firefox build system. (Yeh, advantage to be the packager of a software + that I use ;) ). See scan-build-fix-clang-detection.diff + * Fix the version in the symbol list (libclang1-3.4.symbols) + * Update the path regarding upstream changed (3.4 => 3.4.1) + (Patch improved also by Martin Nowack) + * Remove generated file libllvm3.4.install + * Add gnustep & gnustep-devel as suggests of clang-3.4 + * Add libc6-dev as an explicit dependency of clang-3.4 + * Build with dh_install --fail-missing + * Start to use /usr/bin/foo-X.Y. First step to have several clang versions + installed together + * Add some missing files: + - lli-child-target - llvm-3.4-runtime + - count - llvm-3.4-tools + - html.tar.gz - llvm-3.4-doc + - ocamldoc.tar.gz - llvm-3.4-doc + - BugpointPasses.so - llvm-3.4-dev + - liblldb* - lldb-3.4-dev + - lldb-platform-3.4 - lldb-3.4 + - clang-apply-replacements - clang-3.4 + - clang-tidy - clang-3.4 + - pp-trace - clang-3.4 + + -- Sylvestre Ledru Fri, 09 May 2014 19:57:33 +0200 + +llvm-toolchain-snapshot (1:3.5~svn200375-1) unstable; urgency=medium + + * New snapshot release + * polly unnopstream is now using the isl trunk. Disabling it for now. + * Only explicit the link against atomic when running mips & mipsel + * Fix the cindex.py declaration (3.3 => 3.5). Closes upstream bug #18365 + * Bring back the dependency on gcc 4.8. It breaks the nightly snapshot + packages and it should be the norm now... + + [ Martin Nowack ] + * Fixed build directory for llvm-config + * Add Unittests for running tests for llvm-based projects + * Install FileCheck and not for testing + + -- Sylvestre Ledru Wed, 29 Jan 2014 07:36:29 -0800 + +llvm-toolchain-snapshot (1:3.5~svn199601-1) unstable; urgency=low + + * New snapshot release + * Update clang-format declaration from 3.4 => 3.5. Closes upstream bug #18451 + * Fix the cindex.py declaration (3.3 => 3.5). Closes upstream bug #18365 + * Force gcc 4.8. LLVM & Co are now in C++ 11. + * Also make clang-3.5 breaks/replaces clang. Conflicts on + /usr/share/clang/scan-view/ScanView.py (Closes: #730266) + + -- Sylvestre Ledru Wed, 15 Jan 2014 15:08:03 +0100 + +llvm-toolchain-snapshot (1:3.5~svn197556-1) unstable; urgency=low + + * New snapshot release + * Merge changes from 1:3.4~+rc3-1 + * Disable much of the display of the lldb display + + -- Sylvestre Ledru Tue, 17 Dec 2013 12:02:52 +0100 + +llvm-toolchain-snapshot (1:3.5~svn195337-1) unstable; urgency=low + + * Sync from 3.4~+rc2-1 + * Make lldb 3.5 also conflict with 3.4 (Closes: #730163) + * Make python-clang 3.5 also conflict with 3.4 (Closes: #730164) + * Fix a FTBFS with clang + * Refresh the /usr/include/clang mess + + -- Sylvestre Ledru Tue, 10 Dec 2013 09:57:15 +0100 + +llvm-toolchain-snapshot (1:3.5~svn195337-1) unstable; urgency=low + + * Switch from 3.4 to 3.5 + * Remove patch 0046-Revert-Patch-to-set-is_stmt-a-little-better-for-prol.patch + Useless now and missleading + * Standards-Version updated to 3.9.5 + * kfreebsd.diff remove (applied upstream) + + -- Sylvestre Ledru Wed, 20 Nov 2013 21:24:28 +0100 + +llvm-toolchain-3.4 (1:3.4-2) unstable; urgency=medium + + * Only explicit the link against atomic when running mips & mipsel + * Fix the cindex.py declaration (3.3 => 3.5). Closes upstream bug #18365 + * Bring back the dependency on gcc 4.8. It breaks the nightly snapshot + packages and it should be the norm now... + * Introduce llvm-3.4-tools to contain the new files needed by Martin + + [ Matthias Klose ] + * Disable the lldb build for AArch64. + * Don't run the lldb tests on armhf (time out on the buildd). + + [ Martin Nowack ] + * Fixed build directory for llvm-config + * Add Unittests for running tests for llvm-based projects + * Install FileCheck and not for testing + + -- Sylvestre Ledru Tue, 11 Feb 2014 11:19:21 +0100 + +llvm-toolchain-3.4 (1:3.4-1) unstable; urgency=medium + + * New upstream release + * Remove explicit dep on gcc 4.8 + + -- Sylvestre Ledru Fri, 20 Dec 2013 18:36:58 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc3-1ubuntu4) trusty; urgency=medium + + * Rebuild for ocaml-4.01. + + -- Matthias Klose Mon, 23 Dec 2013 12:11:17 +0000 + +llvm-toolchain-3.4 (1:3.4~+rc3-1ubuntu3) trusty; urgency=low + + * Bring over Ubuntu changes from 3.3: + - Revert to using the static copy of libjsoncpp, since the shared + library lacks sane versioning, and this is only a few thousand + lines of cargo-culted code from a reasonably stagnant upstream. + - Drop lcov build-dep to avoid pulling it into main, due to its + being fundamentally incompatibe with our newer GCC versions. + + -- Matthias Klose Fri, 20 Dec 2013 12:59:01 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc3-1ubuntu2) trusty; urgency=low + + * Don't run the lldb tests on armhf (time out on the buildd). + + -- Matthias Klose Wed, 18 Dec 2013 12:29:56 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc3-1ubuntu1) trusty; urgency=low + + * Disable the lldb build for AArch64. + * Build-depend on gcc-multilib on amd64 and i386. + + -- Matthias Klose Tue, 17 Dec 2013 18:44:50 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc3-1) unstable; urgency=low + + * New testing upstream release + * Relative call in the chroot without proc failed. + See: fix-an-issue-in-chroot-witout-proc.diff + * Bring back lldb-link-atomic.diff to make sure lldb builds under + powerpc + * Also limit the number of archs for liblldb-dev + + -- Sylvestre Ledru Tue, 17 Dec 2013 11:27:40 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc2-3) unstable; urgency=low + + * Fix the bad declaration on the lldb desactivation + * Also disable lldb under powerpc + * Hopefully, fix lldb under Kfreebsd-* (thanks to Ed Maste if it works) + + -- Sylvestre Ledru Wed, 04 Dec 2013 23:53:49 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc2-2) unstable; urgency=low + + * Add the Ocaml ABI dependency (Closes: #731344) + * Disable LLDB also for ia64, mips & mipsel + + -- Sylvestre Ledru Wed, 04 Dec 2013 15:37:39 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc2-1) unstable; urgency=low + + * New testing upstream release + * 0047-version-name.diff ocamldoc.diff removed (applied upstream) + * r600 is now compiled by default (remove the configure arg) + + -- Sylvestre Ledru Tue, 03 Dec 2013 10:25:59 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc1-3) unstable; urgency=low + + * Remove the usage of --with-c-include-dirs, --with-cxx-include-root, + --with-cxx-include-arch and --with-cxx-include-64bit-dir + It was blocking the automatic detection of the path of clang. + In particular in the context of the usage of -target. + However, it does not completely fix the detection of the i386 C++ path. + See the next item. + (Closes: #729933) + * Bring back the path to libstdc++ under i386. Still not fixed upstream + (Closes: #730857) + * Define also MAXPATHLEN in Path.inc for HURD. + * Silent the trillion of warnings in the LLDB Python wrapper (swig generated) + See silent-swig-warning.diff + * Silent some i386 tests failing (it is expected) + See silent-MCJIIT-tests.diff + * Make lldb 3.4 also conflict with 3.5 (Closes: #730163) + * Make python-clang 3.4 also conflict with 3.5 (Closes: #730164) + * Port LLVM to mips64el. Thanks to YunQiang Su. Initially done for + 3.3 and ported on the 3.4 (Closes: #730808) + * If we get an unexpected pass, do not break the tests + do-not-fail-on-unexpected-pass.diff (I am disabling some tests) + * Fix the path detection of the objective h headers. + * Also add usr/lib/llvm-3.4/lib/clang/3.4/include => + usr/lib/clang/3.4/include symlink to simplify the path detection + + -- Sylvestre Ledru Sun, 01 Dec 2013 17:49:46 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc1-2) unstable; urgency=low + + * Force the build to gcc 4.8... gcc 4.6 used on some Debian archs does not + support some C++ features. + * Fail the build when llvm tests are failing under amd64 + i386. More to come. + * Fix a libclang.so.1 issue during the clang tests + * Improve the patch 23-strlcpy_strlcat_warning_removed.diff + (also remove the tests) + * Make lldb 3.4 also conflict with 3.5 (Closes: #730163) + * Make python-clang 3.4 also conflict with 3.5 (Closes: #730164) + * Remove usr/lib/llvm-3.4/build/autoconf/LICENSE.TXT + * silent warning "manpage-has-useless-whatis-entry" in lldb-3.4 + * silent warning "package-name-doesnt-match-sonames libclang1" + * Refresh patch kfreebsd_v2.diff to, maybe, fix lldb build under kfreebsd. + Thanks to Ed Maste for the patch. + + -- Sylvestre Ledru Tue, 26 Nov 2013 18:32:49 +0100 + +llvm-toolchain-3.4 (1:3.4~+rc1-1) unstable; urgency=low + + * New testing upstream release + * kfreebsd.diff removed. Applied upstream + * Remove patch 0046-Revert-Patch-to-set-is_stmt-a-little-better-for-prol.patch + Useless now and missleading + * Branch from llvm-toolchain-snapshot + * Standards-Version updated to 3.9.5 + + -- Sylvestre Ledru Wed, 20 Nov 2013 21:24:28 +0100 + +llvm-toolchain-snapshot (1:3.4~svn194079-1) unstable; urgency=low + + * New snapshot release + * Also install clang 3.4 examples (clang-3.4-examples) (Closes: #728260) + * Move c-index-test* from llvm-3.4 => clang-3.4. It was triggering an + unnecessary dependency from llvm-3.4 to libclang + + -- Sylvestre Ledru Fri, 01 Nov 2013 05:19:55 +0100 + +llvm-toolchain-snapshot (1:3.4~svn193628-1) unstable; urgency=low + + * New snapshot release + - Fix the scan-build warning (Closes: #725332) + * Merge changes from the 3.3 branch (see 1:3.3-12) + * Add lldb-3.4-dev package + * Remove mipsel-ftbfs.diff (applied upstream) + * Add support of coverity checker (non-free and not packaged) + * libprofile_rt and runtime has been removed upstream (r191835) + Features are provided by compiler-rt + * Update the build dependency from tcl8.5 to tcl (Closes: #725954) + * clang-modernize-3.4 was not coinstallable with clang 3.4 + (Closes: #724245) + * The package wasn't cleaned correctly (Closes: #722155) + * libtinfo-dev is now a dependency of llvm-3.4-dev (Closes: #727129) + * Install libclang.so in /usr/lib/*/libclang-3.4.so + * Install libclang.so.1 in /usr/lib/*/libclang-3.4.so.1 + * Also ship the python clang binding (python-clang-3.4) + * Enable polly if the dependencies are OK (only Debian unstable for now) + * Bring back /usr/lib/llvm-3.4/lib/libclang.so (libclang-3.4-dev) and + /usr/lib/llvm-3.4/lib/libclang.so.1 (libclang1-3.4) + * Honor the option "nocheck" + * Disable the build of lldb under HURD + * Ship the lldb headers into lldb-X.Y-dev (Closes: #723743) + I might create a liblldb-X.Y library at some point but I think it is too + early. + * Update the build dependency from tcl8.5 to tcl (Closes: #725953) + * Update of the clang descriptions (Closes: #727684) + + -- Sylvestre Ledru Tue, 29 Oct 2013 17:56:18 +0100 + +llvm-toolchain-snapshot (1:3.4~svn190846-1) unstable; urgency=low + + * New snapshot release + * Merge changes from the 3.3 branch (see 1:3.3-9) + * Remove ia64-fix.diff (applied upstream) + * cpp11-migrate renamed to clang-modernize + * lldb-3.4 is back to Architectures: any + * Patch lldb-hurd.diff removed (applied upstream) + * Directory www/ from tarballs polly & lldb removed + * Update of the description of LLVM packages + (LLVM no longer mean Low Level Virtual Machine) + + [ Luca Falavigna ] + * debian/control: + - Add llvm-3.4-dev to lldb-3.4 Depends field. + + -- Sylvestre Ledru Thu, 05 Sep 2013 12:04:35 +0200 + +llvm-toolchain-3.3 (1:3.3-9) unstable; urgency=low + + [ Luca Falavigna ] + * debian/control: + - Add llvm-3.3-dev to lldb-3.3 Depends field (Closes: #715129). + + [ Sylvestre Ledru ] + * Only use -fuse-ld=gold on supported distribution. Simplify the + backports. + * Fix 'bits/c++config.h' file not found under i386 + See libstdc++-header-i386.diff. (Closes: #714890) + * Add more fixes for the HURD port... (but still fails) + + [ Robert Millan ] + * clang under KfFreeBSD was not exporting the correct defines + (Closes: #721880) + + [ Jon Severinsson ] + * Merge from llvm-toolchain-3.2 branch up to 3.2repack-11. + * Drop auto-generated file debian/libllvm3.3.install. + * Automatically determine GCC_VERSION and dep:devlibs based on g++ package + version. + * Automatically determine if -fuse-ld=gold is supported based on binutils + package version. + + [ Adam Conrad ] + * debian/patches/lldb-link-atomic.diff: Link lldb with -latomic to get + builtin GCC atomic helpers on arches (like powerpc) that need them. + + -- Sylvestre Ledru Mon, 26 Aug 2013 14:48:42 +0200 + +llvm-toolchain-3.3 (1:3.3-8) unstable; urgency=low + + [ Sylvestre Ledru ] + * Fix another issues under HURD... + + [ Luca Falavigna ] + * debian/patches/libprofile_rt_sparc.patch: + - Re-enable libprofile_rt on Sparc, fix FTBFS. + + -- Sylvestre Ledru Fri, 23 Aug 2013 15:02:05 +0200 + +llvm-toolchain-3.3 (1:3.3-7) unstable; urgency=low + + * debhelper version 9.20130720 fails on the call to dh_auto_clean + Remove it. It was anyway useless. + + -- Sylvestre Ledru Thu, 22 Aug 2013 14:28:25 +0200 + +llvm-toolchain-3.3 (1:3.3-6) unstable; urgency=low + + * Fix the FTBFS under hurd and KFreeBSD + * Do not remove all *.o in tests. Some of them are from upstream source + tarball. Thanks to Maarten Lankhorst for the fix. + * Fix the lintian error 'lldb-3.3: postinst-must-call-ldconfig' + * Add the manpages of clang-format-3.3 + * Overrides the manpages warnings + * Also apply unwind-chain-inclusion.diff from the snapshot branch to make sure + we can build the package locally even if libclang-dev is installed + + -- Sylvestre Ledru Thu, 22 Aug 2013 09:01:04 +0200 + +llvm-toolchain-3.3 (1:3.3-5) unstable; urgency=low + + * Install llvm-c headers also in usr/include/llvm-3.3/llvm-c + * Fix the FTBFS under mips & mipsel + * Refresh of the kfreebsd i386 patch + + -- Sylvestre Ledru Wed, 07 Aug 2013 13:12:23 +0200 + +llvm-toolchain-3.3 (1:3.3-4) unstable; urgency=low + + * Use the static library libjsoncpp.a instead of the ship library in polly + + -- Sylvestre Ledru Sun, 11 Aug 2013 09:54:17 +0200 + +llvm-toolchain-snapshot (1:3.4~svn185325-1) unstable; urgency=low + + * binutils-gold no longer exists. Use -fuse-ld=gold instead. + + -- Sylvestre Ledru Thu, 01 Aug 2013 14:06:38 +0200 + +llvm-toolchain-snapshot (1:3.3-2) unstable; urgency=low + + * Fix warning python-script-but-no-python-dep on clang-format-X.Y + * manpages are generated during build time (simplifies maintenance) + * Fix duplicate underscore.js and jquery.js + * Move libjs-jquery & libjs-underscore dependencies to llvm-X.Y-doc + * Add lldb-X.Y manpage + * Hopefully fix the ftbfs under mipsel (mipsel-ftbfs.diff) + * Disable the usage of binutils-gold under armel. It currently fails with: + "attempt to map 2752512 bytes at offset 2066666 exceeds size of file; + the file may be corrupt" + + [ Léo Cavaillé ] + * Add patch to find correctly LLVMGold.so with -O4 (Closes: #712437) + + -- Sylvestre Ledru Thu, 20 Jun 2013 15:39:11 +0200 + +llvm-toolchain-snapshot (1:3.4~svn184294-1~exp1) experimental; urgency=low + + * New snapshot release + * Improve some scripts and fix cpp11-migrate install from + clang-tools-extra. + * Fix "versionless" clang manpages install. + * Fix Toolchain patch from change of scope (add namespaces). + + -- Sylvestre Ledru Wed, 19 Jun 2013 14:20:12 +0200 + +llvm-toolchain-snapshot (1:3.4~svn183914-1) unstable; urgency=low + + * New snapshot release + * Upload to unstable (will be blocked by a RC bug) + * Sync changes from llvm-toolchain-3.3: + - Introduce cpp11-migrate-3.4 and clang-format-3.4 + - Install the vim llvm script at the right place + + -- Sylvestre Ledru Thu, 13 Jun 2013 18:47:08 +0200 + +llvm-toolchain-snapshot (1:3.4~svn182733-1~exp1) experimental; urgency=low + + * New snapshot release (3.4 release) + * Add a symlink of libLLVM-3.4.so.1 to usr/lib/llvm-3.4/lib/libLLVM-3.4.so + to fix make the llvm-config-3.4 --libdir work (Closes: #708677) + * Various packages rename to allow co installations: + * libclang1 => libclang1-3.4 + * libclang1-dbg => libclang1-3.4-dbg + * libclang-dev => libclang-3.4-dev + * libclang-common-dev => libclang-common-3.4-dev + + -- Sylvestre Ledru Mon, 27 May 2013 15:01:57 +0200 + +llvm-toolchain-snapshot (1:3.3~svn179851-1~exp1) experimental; urgency=low + + * Draft of a snapshot release (3.3) + * Enable r600 experimental backend + * Improve the dependencies: + * clang-3.3 depends on the exact same libllvm3.3 release + * idem for lldb-3.3 + + -- Sylvestre Ledru Fri, 19 Apr 2013 09:31:38 +0200 + +llvm-toolchain-3.2 (1:3.2repack-11) unstable; urgency=low + + * dh_auto_clean removed, just like in the 3.3 + * Use the static library libjsoncpp.a instead of shipping library in polly + Backport of the modification of 3.3 + + [ Adam Conrad ] + * Revive deltas from the previous Ubuntu versions of llvm and clang: + - debian/patches/35-ubuntu-releases.diff: Add UbuntuSaucy to table. + - debian/patches/JITEmitter.patch: Fix a segfault in the exception + table of the JIT code emitter (See Launchpad bug #1160587) + + [ Luca Falavigna ] + * debian/patches/libprofile_rt_sparc.patch: + - Re-enable libprofile_rt on Sparc, fix FTBFS. + + -- Sylvestre Ledru Fri, 23 Aug 2013 11:49:09 +0200 + +llvm-toolchain-3.2 (1:3.2repack-10) unstable; urgency=low + + * Fix the wrong package declaration on libstdc++-4.8-dev (Closes: #713944) + + -- Sylvestre Ledru Mon, 24 Jun 2013 23:00:47 +0200 + +llvm-toolchain-3.2 (1:3.2repack-9) unstable; urgency=low + + * Switch to libstdc++ 4.8 instead of 4.7 for the headers (Closes: #712520) + * Depends against libobjc-4.8-dev and libgcc-4.8-dev + * Disable the usage of binutils-gold under armel. It currently fails with: + "attempt to map 2752512 bytes at offset 2066666 exceeds size of file; + the file may be corrupt" + * Add DEBUGMAKE=1 to get information about compiler-rt compilation + * Fix "libclang-common-dev: missing-depends-line" + + -- Sylvestre Ledru Sat, 22 Jun 2013 07:38:41 +0200 + +llvm-toolchain-3.2 (1:3.2repack-8) unstable; urgency=low + + * Fix the build under ia64. Thanks to Luca Falavigna for the patch + (ia64-fix.diff) + * Disable lldb-3.2: + - the quality is not good enough + - We have lldb-3.3 now in the archive + - Too many backported patches would be necessary for lldb-3.2 to work + - It blocks some important transitions (mesa) + * Add the detection of Ubuntu saucy + + -- Sylvestre Ledru Mon, 03 Jun 2013 11:32:29 +0200 + +llvm-toolchain-3.2 (1:3.2repack-7) unstable; urgency=low + + * For now, enable only lldb for amd64 and i386 (blocks too many things) + (Bis) (Closes: #707866) + * Add a symlink of libLLVM-3.2.so.1 to usr/lib/llvm-3.2/lib/libLLVM-3.2.so + to fix make the llvm-config-3.2 --libdir work (Closes: #708677) + + -- Sylvestre Ledru Mon, 27 May 2013 13:20:30 +0200 + +llvm-toolchain-3.2 (1:3.2repack-6) unstable; urgency=low + + * Create the compiler-rt directory to make the install of compiler-rt works + + -- Sylvestre Ledru Sat, 18 May 2013 18:08:52 +0200 + +llvm-toolchain-3.2 (1:3.2repack-5) unstable; urgency=low + + * For now, enable only lldb for amd64 and i386 (blocks too many things) + + -- Sylvestre Ledru Sat, 18 May 2013 10:24:04 +0200 + +llvm-toolchain-3.2 (1:3.2repack-4) unstable; urgency=low + + * Add several patches which, hopefully, will fix the build under ARM, S390, + S390X, etc (lldb-apple_only.diff, lldb-user-remove.diff & lldb-hurd.diff) + * Include sys/wait.h also under kfreebsd (kfreebsd-thread.diff) + + -- Sylvestre Ledru Wed, 15 May 2013 12:04:24 +0200 + +llvm-toolchain-3.2 (1:3.2repack-3) unstable; urgency=low + + * Before the configure, show which version of CC is being used. + * Add support of kfreebsd and hurd in lldb (kfreebsd-hurd-lldb.diff) + * Force the usage of gcc 4.7 for all archs. Should fix some FTBFS + (Closes: #707866) + * Fix the symlink on clang++.1.gz llvm-clang.1.gz (Closes: #707832) + + [ Jon Severinsson ] + * Re-enable the r600 backend and update it to the mesa-9.1.1 tag. + (Closes: #708009) + + -- Sylvestre Ledru Tue, 14 May 2013 12:10:07 +0200 + +llvm-toolchain-3.2 (1:3.2repack-2) unstable; urgency=low + + * Do not depend on libobjc-4.7-dev & libgcc-4.7-dev. + They are still only in experimental + * Disable the usage of binutils-gold under [powerpc powerpcspe ppc64 sparc + sparc64] to fix FTBFS + + -- Sylvestre Ledru Tue, 07 May 2013 13:15:20 +0200 + +llvm-toolchain-3.2 (1:3.2repack-1) unstable; urgency=low + + * Upload to unstable + * Standards-Version update to 3.9.4 + * clang pure virtual function call crash with binaries built with C++11's + std::thread. Upstream commit 178816 (Closes: #705838) + * Introduce a symbols file for libclang1 (Closes: #705672) + + -- Sylvestre Ledru Sun, 21 Apr 2013 14:06:23 +0200 + +llvm-toolchain-3.2 (1:3.2repack-1~exp4) experimental; urgency=low + + * Build using binutls-gold to improve the quality of the binaries. + See: http://allievi.sssup.it/techblog/?p=791 + * Detect the vendor (Debian or Ubuntu) and update the configuration + * Port to powerpcspe. Thanks to Roland Stigge (Closes: #701587) + See: 31-powerpcspe.diff + * Fix the path detection of scan-build (Closes: #698352) + See: 32-scan-build-path.diff + * debian/patches/r600-snapshot.diff: Move backports into individual patches. + * debian/patches/r600-snapshot.diff: Update to mesa-9.1 git tag. + (Closes: #703671, #697356) + * Fix a typo in the detection of the vendor + + [ Peter Michael Green ] + * Use binutils-gold only on architectures where it is actually available + * 33-armhf-defaults.diff Fix defaults to use correct CPU and FPU for + debian armhf (Closes: #704111) + * 34-powerpc-no-altivec.diff disable altivec by default on powerpc because + debian powerpc does not require altivec (patch cherry picked from ubuntu) + + -- Sylvestre Ledru Thu, 14 Mar 2013 17:47:12 +0100 + +llvm-toolchain-3.2 (1:3.2repack-1~exp3) experimental; urgency=low + + * Remove package "clang". It is now provided by llvm-defaults. + * Fix some issues relative to the epoch change + * Fix a wrong path in the _lldb.so Python symlink + * Install cmake files to build LLVM extensions (Closes: #701153) + * Remove the embedded copy of libjs-jquery (Closes: #701087) + * Fix the install of lli manpage (Closes: #697117) + + -- Sylvestre Ledru Sun, 17 Feb 2013 12:05:15 +0100 + +llvm-toolchain-3.2 (1:3.2repack-1~exp2) experimental; urgency=low + + * Install the python files for lldb. Thanks to Daniel Malea for spotting this. + * Update of the clean target + * Introduce an epoch to match the changes in bug #699899 + + -- Sylvestre Ledru Wed, 13 Feb 2013 12:22:30 +0100 + +llvm-toolchain-3.2 (3.2repack-1~exp1) experimental; urgency=low + + * Build the whole LLVM toolchain at once. This includes: + - LLVM + - Clang + - compiler-rt + - lldb + - polly + * Also install clang-check & clang-tblgen in the clang-3.2 package + * Fix the patch detection of clang from scan-build (Closes: #698352) + * debian/patches/0050-powerpcspe-fp.diff: Add, hopefully fix FTBFS on + powerpcspe, by disabling save / restore of floating point registers which + don't exist on powerpcspe. Thanks to Roland Stigge for the patch. + (Closes: #696474) + * libLLVM-3.2.so.1 is now shipped only once (Closes: #696913) + * Enable RTTI (Closes: #697754) + * Introduce lldb as a new package (Closes: #698601) + * Add a script pollycc which will call clang with the right arguments. + * Use __builtin___clear_cache on ARM to fix a clang bug. + Thanks to Matthias Klose. + + -- Sylvestre Ledru Sat, 09 Feb 2013 12:14:10 +0100 diff --git a/clang-X.Y-doc.docs.in b/clang-X.Y-doc.docs.in new file mode 100644 index 00000000..b3cc6a07 --- /dev/null +++ b/clang-X.Y-doc.docs.in @@ -0,0 +1,2 @@ +tools/clang/docs/_build/html/ + diff --git a/clang-X.Y-examples.examples.in b/clang-X.Y-examples.examples.in new file mode 100644 index 00000000..49cbc5fe --- /dev/null +++ b/clang-X.Y-examples.examples.in @@ -0,0 +1 @@ +clang/examples/* diff --git a/clang-X.Y.install.in b/clang-X.Y.install.in new file mode 100644 index 00000000..c92899f2 --- /dev/null +++ b/clang-X.Y.install.in @@ -0,0 +1,12 @@ +usr/lib/llvm-@LLVM_VERSION@/bin/clang +usr/lib/llvm-@LLVM_VERSION@/bin/clang++ +usr/lib/llvm-@LLVM_VERSION@/bin/clang-cpp + +#usr/share/man/man1/clang.1 usr/share/man/man1/ +usr/lib/llvm-@LLVM_VERSION@/lib/cmake/clang/*.cmake +usr/lib/llvm-@LLVM_VERSION@/share/clang/bash-autocomplete.sh + +usr/bin/clang-@LLVM_VERSION@ +usr/bin/clang++-@LLVM_VERSION@ +usr/bin/clang-cpp-@LLVM_VERSION@ + diff --git a/clang-X.Y.links.in b/clang-X.Y.links.in new file mode 100644 index 00000000..4ba8a3b9 --- /dev/null +++ b/clang-X.Y.links.in @@ -0,0 +1,2 @@ +usr/lib/llvm-@LLVM_VERSION@/bin/clang usr/lib/llvm-@LLVM_VERSION@/bin/clang-@LLVM_VERSION@ +usr/lib/llvm-@LLVM_VERSION@/lib/cmake/clang usr/lib/cmake/clang-@LLVM_VERSION@ diff --git a/clang-X.Y.lintian-overrides.in b/clang-X.Y.lintian-overrides.in new file mode 100644 index 00000000..a389e011 --- /dev/null +++ b/clang-X.Y.lintian-overrides.in @@ -0,0 +1,2 @@ +# Does not link otherwise +clang-@LLVM_VERSION@: embedded-library usr/lib/llvm-@LLVM_VERSION@/bin/clang: libjsoncpp diff --git a/clang-X.Y.manpages.in b/clang-X.Y.manpages.in new file mode 100644 index 00000000..b19400af --- /dev/null +++ b/clang-X.Y.manpages.in @@ -0,0 +1 @@ +clang/docs/_build/man/clang-@LLVM_VERSION@.1 diff --git a/clang-format-X.Y.install.in b/clang-format-X.Y.install.in new file mode 100644 index 00000000..d3a18a58 --- /dev/null +++ b/clang-format-X.Y.install.in @@ -0,0 +1,10 @@ +clang/tools/clang-format/clang-format-@LLVM_VERSION@.py usr/share/vim/addons/syntax/ +clang/tools/clang-format/clang-format-diff-@LLVM_VERSION@ /usr/bin/ +usr/bin/clang-format-@LLVM_VERSION@ +usr/bin/git-clang-format-@LLVM_VERSION@ +usr/lib/llvm-@LLVM_VERSION@/bin/clang-format +usr/lib/llvm-@LLVM_VERSION@/bin/git-clang-format +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-format-diff.py usr/share/clang/clang-format-@LLVM_VERSION@/ +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-format.py usr/share/clang/clang-format-@LLVM_VERSION@/ +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-format.el usr/share/emacs/site-lisp/clang-format-@LLVM_VERSION@/ +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-format-sublime.py usr/share/clang/clang-format-@LLVM_VERSION@/ diff --git a/clang-format-X.Y.lintian-overrides.in b/clang-format-X.Y.lintian-overrides.in new file mode 100644 index 00000000..aa786799 --- /dev/null +++ b/clang-format-X.Y.lintian-overrides.in @@ -0,0 +1,4 @@ +# I know but well... +clang-format-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/clang-format-diff-@LLVM_VERSION@.1.gz +clang-format-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/clang-format-@LLVM_VERSION@.1.gz + diff --git a/clang-format-X.Y.manpages.in b/clang-format-X.Y.manpages.in new file mode 100644 index 00000000..db4dd8f7 --- /dev/null +++ b/clang-format-X.Y.manpages.in @@ -0,0 +1,3 @@ +debian/man/clang-format-diff-@LLVM_VERSION@.1 +debian/man/clang-format-@LLVM_VERSION@.1 + diff --git a/clang-tidy-X.Y.install.in b/clang-tidy-X.Y.install.in new file mode 100644 index 00000000..ef992c58 --- /dev/null +++ b/clang-tidy-X.Y.install.in @@ -0,0 +1,5 @@ +usr/lib/llvm-@LLVM_VERSION@/bin/clang-tidy +usr/lib/llvm-@LLVM_VERSION@/share/clang/run-clang-tidy.py +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-tidy-diff.py + +usr/bin/clang-tidy-@LLVM_VERSION@ diff --git a/clang-tidy-X.Y.links.in b/clang-tidy-X.Y.links.in new file mode 100644 index 00000000..ad03ae1d --- /dev/null +++ b/clang-tidy-X.Y.links.in @@ -0,0 +1,4 @@ +usr/lib/llvm-@LLVM_VERSION@/share/clang/run-clang-tidy.py usr/bin/run-clang-tidy-@LLVM_VERSION@.py +usr/lib/llvm-@LLVM_VERSION@/share/clang/run-clang-tidy.py usr/bin/run-clang-tidy-@LLVM_VERSION@ +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-tidy-diff.py usr/bin/clang-tidy-diff-@LLVM_VERSION@.py + diff --git a/clang-tidy-X.Y.lintian-overrides.in b/clang-tidy-X.Y.lintian-overrides.in new file mode 100644 index 00000000..c915da60 --- /dev/null +++ b/clang-tidy-X.Y.lintian-overrides.in @@ -0,0 +1,3 @@ +# I know but well... +clang-tidy-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/clang-tidy-@LLVM_VERSION@.1.gz + diff --git a/clang-tidy-X.Y.manpages.in b/clang-tidy-X.Y.manpages.in new file mode 100644 index 00000000..fa4a8146 --- /dev/null +++ b/clang-tidy-X.Y.manpages.in @@ -0,0 +1 @@ +debian/man/clang-tidy-@LLVM_VERSION@.1 diff --git a/clang-tools-X.Y.install.in b/clang-tools-X.Y.install.in new file mode 100644 index 00000000..fed92633 --- /dev/null +++ b/clang-tools-X.Y.install.in @@ -0,0 +1,54 @@ +usr/lib/llvm-@LLVM_VERSION@/bin/clang-check +usr/lib/llvm-@LLVM_VERSION@/bin/clang-apply-replacements +usr/lib/llvm-@LLVM_VERSION@/bin/clang-query +usr/lib/llvm-@LLVM_VERSION@/bin/clang-rename +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-rename.el +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-rename.py +usr/lib/llvm-@LLVM_VERSION@/bin/scan-view +usr/lib/llvm-@LLVM_VERSION@/bin/scan-build +usr/lib/llvm-@LLVM_VERSION@/bin/clang-cl +usr/lib/llvm-@LLVM_VERSION@/bin/sancov +usr/lib/llvm-@LLVM_VERSION@/share/scan-view/ +usr/lib/llvm-@LLVM_VERSION@/share/scan-build/ +usr/lib/llvm-@LLVM_VERSION@/share/man/man1/scan-build.1 +usr/lib/llvm-@LLVM_VERSION@/libexec/ccc-analyzer +usr/lib/llvm-@LLVM_VERSION@/libexec/c++-analyzer +usr/lib/llvm-@LLVM_VERSION@/bin/clang-offload-bundler +usr/lib/llvm-@LLVM_VERSION@/bin/clang-reorder-fields +usr/lib/llvm-@LLVM_VERSION@/bin/clang-change-namespace +usr/lib/llvm-@LLVM_VERSION@/bin/clang-import-test +usr/lib/llvm-@LLVM_VERSION@/bin/modularize +usr/lib/llvm-@LLVM_VERSION@/bin/c-index-test +usr/lib/llvm-@LLVM_VERSION@/bin/clang-include-fixer +usr/lib/llvm-@LLVM_VERSION@/bin/find-all-symbols +usr/lib/llvm-@LLVM_VERSION@/bin/clangd +usr/lib/llvm-@LLVM_VERSION@/bin/clang-refactor +usr/lib/llvm-@LLVM_VERSION@/bin/clang-func-mapping + +tools/clang/tools/scan-build-@LLVM_VERSION@ usr/share/clang/ +tools/clang/tools/scan-build-py-@LLVM_VERSION@ usr/share/clang/ +tools/clang/tools/scan-view-@LLVM_VERSION@ usr/share/clang/ + +usr/lib/llvm-@LLVM_VERSION@/share/clang/run-find-all-symbols.py +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-include-fixer.py +usr/lib/llvm-@LLVM_VERSION@/share/clang/clang-include-fixer.el +usr/bin/clang-check-@LLVM_VERSION@ +usr/bin/clang-apply-replacements-@LLVM_VERSION@ +usr/bin/clang-query-@LLVM_VERSION@ +usr/bin/clang-rename-@LLVM_VERSION@ +usr/bin/sancov-@LLVM_VERSION@ +usr/bin/clang-cl-@LLVM_VERSION@ +usr/bin/modularize-@LLVM_VERSION@ +usr/bin/scan-build-@LLVM_VERSION@ +usr/bin/scan-view-@LLVM_VERSION@ +usr/bin/c-index-test-@LLVM_VERSION@ +usr/bin/clang-offload-bundler-@LLVM_VERSION@ +usr/bin/clang-reorder-fields-@LLVM_VERSION@ +usr/bin/find-all-symbols-@LLVM_VERSION@ +usr/bin/clang-include-fixer-@LLVM_VERSION@ +usr/bin/clang-change-namespace-@LLVM_VERSION@ +usr/bin/clang-import-test-@LLVM_VERSION@ +usr/bin/clangd-@LLVM_VERSION@ +usr/bin/clang-refactor-@LLVM_VERSION@ +usr/bin/clang-func-mapping-@LLVM_VERSION@ + diff --git a/clang-tools-X.Y.links.in b/clang-tools-X.Y.links.in new file mode 100644 index 00000000..985ab16e --- /dev/null +++ b/clang-tools-X.Y.links.in @@ -0,0 +1,3 @@ +usr/share/clang/scan-build-@LLVM_VERSION@/bin/scan-build usr/bin/scan-build-@LLVM_VERSION@ +usr/share/clang/scan-build-py-@LLVM_VERSION@/bin/scan-build usr/bin/scan-build-py-@LLVM_VERSION@ +usr/share/clang/scan-view-@LLVM_VERSION@/bin/scan-view usr/bin/scan-view-@LLVM_VERSION@ diff --git a/clang-tools-X.Y.lintian-overrides.in b/clang-tools-X.Y.lintian-overrides.in new file mode 100644 index 00000000..eb04eb71 --- /dev/null +++ b/clang-tools-X.Y.lintian-overrides.in @@ -0,0 +1,6 @@ +# I know but well... +clang-tools-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/clang-check.1.gz +clang-tools-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/scan-view.1.gz +clang-tools-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/clang-apply-replacements-@LLVM_VERSION@.1.gz +clang-tools-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/clang-check-@LLVM_VERSION@.1.gz +clang-tools-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/scan-view-@LLVM_VERSION@.1.gz diff --git a/clang-tools-X.Y.manpages.in b/clang-tools-X.Y.manpages.in new file mode 100644 index 00000000..5cb7dbd0 --- /dev/null +++ b/clang-tools-X.Y.manpages.in @@ -0,0 +1,11 @@ +clang/tools/scan-build/man/scan-build-@LLVM_VERSION@.1 +debian/man/clang-check-@LLVM_VERSION@.1 +debian/man/clang-rename-@LLVM_VERSION@.1 +debian/man/clang-query-@LLVM_VERSION@.1 +debian/man/clang-apply-replacements-@LLVM_VERSION@.1 +debian/man/sancov-@LLVM_VERSION@.1 +debian/man/scan-view-@LLVM_VERSION@.1 +debian/man/modularize-@LLVM_VERSION@.1 +debian/man/find-all-symbols-@LLVM_VERSION@.1 +debian/man/clang-include-fixer-@LLVM_VERSION@.1 +debian/man/clang-reorder-fields-@LLVM_VERSION@.1 diff --git a/compat b/compat new file mode 100644 index 00000000..ec635144 --- /dev/null +++ b/compat @@ -0,0 +1 @@ +9 diff --git a/control b/control new file mode 100644 index 00000000..8f36c89d --- /dev/null +++ b/control @@ -0,0 +1,474 @@ +Source: llvm-toolchain-6.0 +Section: devel +Priority: optional +Maintainer: LLVM Packaging Team +Uploaders: Sylvestre Ledru +Build-Depends: debhelper (>= 9.0), cmake, chrpath, texinfo, sharutils, + libffi-dev (>= 3.0.9), + lsb-release, patchutils, diffstat, xz-utils, python-dev, + libedit-dev, libncurses5-dev, swig, python-six, python-sphinx, binutils-dev, + libjsoncpp-dev, pkg-config, + lcov, procps, help2man, zlib1g-dev, + g++-multilib [amd64 i386 kfreebsd-amd64 mips mips64 mips64el mipsel powerpc ppc64 s390 s390x sparc sparc64 x32], + libjs-mathjax +# ocaml-nox [amd64 arm64 armel armhf i386 ppc64el s390x], +# ocaml-findlib [amd64 arm64 armel armhf i386 ppc64el s390x], +# libctypes-ocaml-dev [amd64 arm64 armel armhf i386 ppc64el s390x], +# dh-ocaml [amd64 arm64 armel armhf i386 ppc64el s390x], +Build-Conflicts: oprofile, ocaml, libllvm-3.8-ocaml-dev, libllvm-3.9-ocaml-dev +Standards-Version: 4.2.0 +Homepage: https://www.llvm.org/ +Vcs-Git: https://salsa.debian.org/pkg-llvm-team/llvm-toolchain.git -b 6.0 +Vcs-Browser: https://salsa.debian.org/pkg-llvm-team/llvm-toolchain/tree/6.0 + +# ------------- clang ------------- + +Package: clang-6.0 +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, ${dep:devlibs}, + ${dep:devlibs-objc}, libclang-common-6.0-dev (= ${binary:Version}), + libclang1-6.0 (= ${binary:Version}), libc6-dev, binutils +Provides: c-compiler, objc-compiler, c++-compiler +Recommends: llvm-6.0-dev, python, libomp-dev +Suggests: gnustep, gnustep-devel, clang-6.0-doc +Description: C, C++ and Objective-C compiler + Clang project is a C, C++, Objective C and Objective C++ front-end + based on the LLVM compiler. Its goal is to offer a replacement to the + GNU Compiler Collection (GCC). + . + Clang implements all of the ISO C++ 1998, 11 and 14 standards and also + provides most of the support of C++17. + +Package: clang-tools-6.0 +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, clang-6.0 (= ${binary:Version}) +Description: clang-based tools for C/C++ developments + Clang project is a C, C++, Objective C and Objective C++ front-end + based on the LLVM compiler. Its goal is to offer a replacement to the + GNU Compiler Collection (GCC). + . + Clang implements all of the ISO C++ 1998, 11 and 14 standards and also + provides most of the support of C++17. + . + This package contains some clang-based tools like scan-build, clangd, + clang-cl, etc. + +Package: clang-format-6.0 +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, python, + libllvm6.0 (= ${binary:Version}) +Description: Tool to format C/C++/Obj-C code + Clang-format is both a library and a stand-alone tool with the goal of + automatically reformatting C++ sources files according to configurable + style guides. To do so, clang-format uses Clang's Lexer to transform an + input file into a token stream and then changes all the whitespace around + those tokens. The goal is for clang-format to both serve both as a user + tool (ideally with powerful IDE integrations) and part of other + refactoring tools, e.g. to do a reformatting of all the lines changed + during a renaming. + . + This package also provides vim and emacs plugins. + +Package: clang-tidy-6.0 +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, python, + libllvm6.0 (= ${binary:Version}), libclang-common-6.0-dev, + clang-tools-6.0, python-yaml +Replaces: clang-modernize-6.0, clang-6.0 (<< 1:6.0~svn250696-1) +Breaks: clang-modernize-6.0, clang-6.0 (<< 1:6.0~svn250696-1) +Description: clang-based C++ linter tool + Provide an extensible framework for diagnosing and fixing typical programming + errors, like style violations, interface misuse, or bugs that can be deduced + via static analysis. clang-tidy is modular and provides a convenient interface + for writing new checks. + +Package: clang-6.0-doc +Architecture: all +Section: doc +Depends: ${shlibs:Depends}, ${misc:Depends}, libjs-mathjax +Description: C, C++ and Objective-C compiler - Documentation + Clang project is a C, C++, Objective C and Objective C++ front-end + based on the LLVM compiler. Its goal is to offer a replacement to the + GNU Compiler Collection (GCC). + . + Clang implements all of the ISO C++ 1998, 11 and 14 standards and also + provides most of the support of C++17. + . + This package contains the documentation. + +Package: libclang1-6.0 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Pre-Depends: ${misc:Pre-Depends} +Description: C interface to the clang library + Clang project is a C, C++, Objective C and Objective C++ front-end + based on the LLVM compiler. Its goal is to offer a replacement to the + GNU Compiler Collection (GCC). + . + Clang implements all of the ISO C++ 1998, 11 and 14 standards and also + provides most of the support of C++17. + . + This package contains the clang library. + . + The C Interface to Clang provides a relatively small API that exposes + facilities for parsing source code into an abstract syntax tree (AST), + loading already-parsed ASTs, traversing the AST, associating physical source + locations with elements within the AST, and other facilities that support + Clang-based development tools. + +Package: libclang-6.0-dev +Architecture: any +Section: libdevel +Depends: ${shlibs:Depends}, ${misc:Depends}, ${dep:devlibs}, + ${dep:devlibs-objc}, libclang1-6.0 (= ${binary:Version}), + libclang-common-6.0-dev (= ${binary:Version}) +Description: clang library - Development package + Clang project is a C, C++, Objective C and Objective C++ front-end + based on the LLVM compiler. Its goal is to offer a replacement to the + GNU Compiler Collection (GCC). + . + Clang implements all of the ISO C++ 1998, 11 and 14 standards and also + provides most of the support of C++17. + . + This package contains the clang headers to develop extensions over + libclang1-6.0. + +Package: libclang-common-6.0-dev +Architecture: any +Section: libdevel +Depends: ${shlibs:Depends}, ${misc:Depends}, libllvm6.0 (= ${binary:Version}) +Description: clang library - Common development package + Clang project is a C, C++, Objective C and Objective C++ front-end + based on the LLVM compiler. Its goal is to offer a replacement to the + GNU Compiler Collection (GCC). + . + Clang implements all of the ISO C++ 1998, 11 and 14 standards and also + provides most of the support of C++17. + . + This package contains the clang generic headers and some libraries + (profiling, etc). + + +Package: libfuzzer-6.0-dev +Architecture: linux-any +Section: libdevel +Depends: ${shlibs:Depends}, ${misc:Depends}, clang-6.0 (= ${binary:Version}) +Description: Library for coverage-guided fuzz testing + LibFuzzer is a library for in-process, coverage-guided, evolutionary fuzzing + of other libraries. + . + LibFuzzer is similar in concept to American Fuzzy Lop (AFL), but it performs + all of its fuzzing inside a single process. This in-process fuzzing can be + more restrictive and fragile, but is potentially much faster as there is no + overhead for process start-up. + . + The fuzzer is linked with the library under test, and feeds fuzzed inputs to + the library via a specific fuzzing entrypoint (aka 'target function'); the + fuzzer then tracks which areas of the code are reached, and generates mutations + on the corpus of input data in order to maximize the code coverage. The code + coverage information for libFuzzer is provided by LLVM's SanitizerCoverage + instrumentation. + + +Package: python-clang-6.0 +Section: python +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, python +Replaces: python-clang-3.8, python-clang-3.9, python-clang-x.y +Breaks: python-clang-3.8, python-clang-3.9 +Conflicts: python-clang-x.y +Provides: python-clang-x.y +Description: Clang Python Bindings + Clang project is a C, C++, Objective C and Objective C++ front-end + based on the LLVM compiler. Its goal is to offer a replacement to the + GNU Compiler Collection (GCC). + . + Clang implements all of the ISO C++ 1998, 11 and 14 standards and also + provides most of the support of C++17. + . + This binding package provides access to the Clang compiler and libraries. + + +Package: clang-6.0-examples +Architecture: any +Section: doc +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Clang examples + Clang project is a C, C++, Objective C and Objective C++ front-end + based on the LLVM compiler. Its goal is to offer a replacement to the + GNU Compiler Collection (GCC). + . + Clang implements all of the ISO C++ 1998, 11 and 14 standards and also + provides most of the support of C++17. + . + This package contains the clang examples. + +# ------------- LLVM ------------- + +Package: libllvm6.0 +Architecture: any +Section: libs +Depends: ${shlibs:Depends}, ${misc:Depends} +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Breaks: libllvm3.9v4 +Replaces: libllvm3.9v4 +Description: Modular compiler and toolchain technologies, runtime library + LLVM is a collection of libraries and tools that make it easy to build + compilers, optimizers, just-in-time code generators, and many other + compiler-related programs. + . + This package contains the LLVM runtime library. + +Package: llvm-6.0 +Architecture: any +Suggests: llvm-6.0-doc +Depends: llvm-6.0-runtime (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Recommends: llvm-6.0-dev +Description: Modular compiler and toolchain technologies + LLVM is a collection of libraries and tools that make it easy to build + compilers, optimizers, just-in-time code generators, and many other + compiler-related programs. + . + LLVM uses a single, language-independent virtual instruction set both + as an offline code representation (to communicate code between + compiler phases and to run-time systems) and as the compiler internal + representation (to analyze and transform programs). This persistent + code representation allows a common set of sophisticated compiler + techniques to be applied at compile-time, link-time, install-time, + run-time, or "idle-time" (between program runs). + . + The strengths of the LLVM infrastructure are its extremely + simple design (which makes it easy to understand and use), + source-language independence, powerful mid-level optimizer, automated + compiler debugging support, extensibility, and its stability and + reliability. LLVM is currently being used to host a wide variety of + academic research projects and commercial projects. LLVM includes C + and C++ front-ends, a front-end for a Forth-like language (Stacker), + a young scheme front-end, and Java support is in development. LLVM can + generate code for X86, SparcV9, PowerPC or many other architectures. + +Package: llvm-6.0-runtime +Architecture: any +Depends: binfmt-support, ${shlibs:Depends}, ${misc:Depends} +Conflicts: llvm (<< 2.7-1) +Replaces: llvm (<< 2.7-1) +Description: Modular compiler and toolchain technologies, IR interpreter + LLVM is a collection of libraries and tools that make it easy to build + compilers, optimizers, just-in-time code generators, and many other + compiler-related programs. + . + LLVM uses a single, language-independent virtual instruction set both + as an offline code representation (to communicate code between + compiler phases and to run-time systems) and as the compiler internal + representation (to analyze and transform programs). This persistent + code representation allows a common set of sophisticated compiler + techniques to be applied at compile-time, link-time, install-time, + run-time, or "idle-time" (between program runs). + . + This package provides the minimal required to execute programs in LLVM + format. + +Package: llvm-6.0-dev +Architecture: any +Depends: ${shlibs:Depends}, libffi-dev (>= 3.0.9), ${misc:Depends}, + llvm-6.0 (= ${binary:Version}), libllvm6.0 (= ${binary:Version}), libtinfo-dev +Replaces: llvm (<< 2.2-3) +Description: Modular compiler and toolchain technologies, libraries and headers + LLVM is a collection of libraries and tools that make it easy to build + compilers, optimizers, just-in-time code generators, and many other + compiler-related programs. + . + LLVM uses a single, language-independent virtual instruction set both + as an offline code representation (to communicate code between + compiler phases and to run-time systems) and as the compiler internal + representation (to analyze and transform programs). This persistent + code representation allows a common set of sophisticated compiler + techniques to be applied at compile-time, link-time, install-time, + run-time, or "idle-time" (between program runs). + . + This package provides the libraries and headers to develop applications + using llvm. + +Package: llvm-6.0-tools +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, python, + llvm-6.0-dev (= ${binary:Version}) +Description: Modular compiler and toolchain technologies, tools + LLVM is a collection of libraries and tools that make it easy to build + compilers, optimizers, just-in-time code generators, and many other + compiler-related programs. + . + LLVM uses a single, language-independent virtual instruction set both + as an offline code representation (to communicate code between + compiler phases and to run-time systems) and as the compiler internal + representation (to analyze and transform programs). This persistent + code representation allows a common set of sophisticated compiler + techniques to be applied at compile-time, link-time, install-time, + run-time, or "idle-time" (between program runs). + . + This package provides tools for testing. + +# Package: libllvm-6.0-ocaml-dev +# Section: ocaml +# Architecture: amd64 arm64 armel armhf i386 ppc64el s390x +# Suggests: llvm-6.0-doc +# Depends: ${shlibs:Depends}, ${misc:Depends}, ${ocaml:Depends}, llvm-6.0-dev (= ${binary:Version}) +# Replaces: libllvm-x.y-ocaml-dev +# Conflicts: libllvm-x.y-ocaml-dev +# Provides: ${ocaml:Provides}, libllvm-x.y-ocaml-dev +# Description: Modular compiler and toolchain technologies, OCaml bindings +# LLVM is a collection of libraries and tools that make it easy to build +# compilers, optimizers, just-in-time code generators, and many other +# compiler-related programs. +# . +# LLVM uses a single, language-independent virtual instruction set both +# as an offline code representation (to communicate code between +# compiler phases and to run-time systems) and as the compiler internal +# representation (to analyze and transform programs). This persistent +# code representation allows a common set of sophisticated compiler +# techniques to be applied at compile-time, link-time, install-time, +# run-time, or "idle-time" (between program runs). +# . +# This package provides the OCaml bindings to develop applications using llvm. + +Package: llvm-6.0-doc +Section: doc +Architecture: all +Depends: ${misc:Depends}, libjs-jquery, libjs-underscore +Description: Modular compiler and toolchain technologies, documentation + LLVM is a collection of libraries and tools that make it easy to build + compilers, optimizers, just-in-time code generators, and many other + compiler-related programs. + . + LLVM uses a single, language-independent virtual instruction set both + as an offline code representation (to communicate code between + compiler phases and to run-time systems) and as the compiler internal + representation (to analyze and transform programs). This persistent + code representation allows a common set of sophisticated compiler + techniques to be applied at compile-time, link-time, install-time, + run-time, or "idle-time" (between program runs). + . + This package contains all documentation (extensive). + +Package: llvm-6.0-examples +Section: doc +Architecture: all +Depends: ${misc:Depends}, llvm-6.0-dev (>= ${source:Version}), llvm-6.0-dev (<< ${source:Version}+c~) +Description: Modular compiler and toolchain technologies, examples + LLVM is a collection of libraries and tools that make it easy to build + compilers, optimizers, just-in-time code generators, and many other + compiler-related programs. + . + LLVM uses a single, language-independent virtual instruction set both + as an offline code representation (to communicate code between + compiler phases and to run-time systems) and as the compiler internal + representation (to analyze and transform programs). This persistent + code representation allows a common set of sophisticated compiler + techniques to be applied at compile-time, link-time, install-time, + run-time, or "idle-time" (between program runs). + . + This package contains examples for using LLVM, both in developing + extensions to LLVM and in using it to compile code. + + +# ------------- lld ------------- + +Package: lld-6.0 +Architecture: amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el kfreebsd-amd64 kfreebsd-i386 s390 sparc alpha hppa m68k powerpcspe ppc64 sh4 sparc64 x32 +# ia64 hurd powerpc have been removed +Depends: ${shlibs:Depends}, ${misc:Depends}, libllvm6.0 (= ${binary:Version}), llvm-6.0-dev +Pre-Depends: ${misc:Pre-Depends} +Description: LLVM-based linker + LLD is a new, high-performance linker. It is built as a set of reusable + components which highly leverage existing libraries in the larger LLVM + Project. + +Package: liblld-6.0 +Architecture: amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el kfreebsd-amd64 kfreebsd-i386 s390 sparc alpha hppa m68k powerpcspe ppc64 sh4 sparc64 x32 +# ia64 hurd powerpc have been removed +Depends: ${shlibs:Depends}, ${misc:Depends}, libllvm6.0 (= ${binary:Version}) +Pre-Depends: ${misc:Pre-Depends} +Section: libs +Description: LLVM-based linker, library + LLD is a new, high-performance linker. It is built as a set of reusable + components which highly leverage existing libraries in the larger LLVM + Project. + . + This package contains the LLD runtime library. + +Package: liblld-6.0-dev +Section: libdevel +Architecture: amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el kfreebsd-amd64 kfreebsd-i386 s390 sparc alpha hppa m68k powerpcspe ppc64 sh4 sparc64 x32 +# ia64 hurd powerpc have been removed +Depends: ${shlibs:Depends}, ${misc:Depends}, lld-6.0 (= ${binary:Version}), + liblld-6.0 (= ${binary:Version}) +Pre-Depends: ${misc:Pre-Depends} +Description: LLVM-based linker, header files + LLD is a new, high-performance linker. It is built as a set of reusable + components which highly leverage existing libraries in the larger LLVM + Project. + . + This package provides the header files to build extension over lld. + + +# ------------- lldb ------------- + +Package: lldb-6.0 +Architecture: amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el kfreebsd-amd64 kfreebsd-i386 s390 sparc hppa m68k sh4 x32 +# ia64 hurd powerpc powerpcspe ppc64 alpha s390x sparc64 have been removed +Depends: ${shlibs:Depends}, ${misc:Depends}, libllvm6.0 (= ${binary:Version}), llvm-6.0-dev, + python-lldb-6.0 +Pre-Depends: ${misc:Pre-Depends} +Description: Next generation, high-performance debugger + LLDB is a next generation, high-performance debugger. It is built as a set of + reusable components which highly leverage existing libraries in the larger LLVM + Project, such as the Clang expression parser and LLVM disassembler. + +Package: liblldb-6.0 +Architecture: amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el kfreebsd-amd64 kfreebsd-i386 s390 sparc hppa m68k sh4 x32 +# ia64 hurd powerpc powerpcspe ppc64 alpha s390x sparc64 have been removed +Depends: ${shlibs:Depends}, ${misc:Depends}, libllvm6.0 (= ${binary:Version}) +Pre-Depends: ${misc:Pre-Depends} +Section: libs +Replaces: lldb-6.0 (<= 1:6.0~svn215195-2) +Breaks: lldb-6.0 (<< 1:6.0~svn215195-2) +Description: Next generation, high-performance debugger, library + LLDB is a next generation, high-performance debugger. It is built as a set of + reusable components which highly leverage existing libraries in the larger LLVM + Project, such as the Clang expression parser and LLVM disassembler. + . + This package contains the LLDB runtime library. + +Package: python-lldb-6.0 +Section: python +Architecture: amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el kfreebsd-amd64 kfreebsd-i386 s390 sparc hppa m68k sh4 x32 +# ia64 hurd powerpc powerpcspe ppc64 alpha s390x sparc64 have been removed +Depends: ${shlibs:Depends}, ${misc:Depends}, liblldb-6.0-dev, python, python-six +Conflicts: python-lldb-3.8, python-lldb-3.9, python-lldb-x.y +Replaces: python-lldb-x.y +Provides: python-lldb-x.y +Pre-Depends: ${misc:Pre-Depends} +Description: Next generation, high-performance debugger, python lib + LLDB is a next generation, high-performance debugger. It is built as a set of + reusable components which highly leverage existing libraries in the larger LLVM + Project, such as the Clang expression parser and LLVM disassembler. + . + This binding package provides access to lldb. + + +Package: liblldb-6.0-dev +Section: libdevel +Architecture: amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el kfreebsd-amd64 kfreebsd-i386 s390 sparc hppa m68k sh4 x32 +# ia64 hurd powerpc powerpcspe ppc64 alpha s390x sparc64 have been removed +Depends: ${shlibs:Depends}, ${misc:Depends}, lldb-6.0 (= ${binary:Version}) +Replaces: lldb-6.0-dev (<= 1:6.0~svn215195-2) +Breaks: lldb-6.0-dev (<< 1:6.0~svn215195-2) +Pre-Depends: ${misc:Pre-Depends} +Description: Next generation, high-performance debugger, header files + LLDB is a next generation, high-performance debugger. It is built as a set of + reusable components which highly leverage existing libraries in the larger LLVM + Project, such as the Clang expression parser and LLVM disassembler. + . + This package provides the header files to build extension over lldb. diff --git a/copyright b/copyright new file mode 100644 index 00000000..ae2def30 --- /dev/null +++ b/copyright @@ -0,0 +1,443 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: LLVM/Clang +Source: https://llvm.org/releases/download.html + +Files: * +Copyright: 2003-2017 University of Illinois at Urbana-Champaign. +License: U-OF-I-BSD-LIKE + +Files: */install-sh +Copyright: 1994 X Consortium +License: LLVM + This script is licensed under the LLVM license, with the following + additional copyrights and restrictions: + . + Copyright 1991 by the Massachusetts Institute of Technology + . + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of M.I.T. not be used in advertising or + publicity pertaining to distribution of the software without specific, + written prior permission. M.I.T. makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. + . + ============================================================================== + LLVM Release License + ============================================================================== + University of Illinois/NCSA + Open Source License + . + Copyright (c) 2003-2013 University of Illinois at Urbana-Champaign. + All rights reserved. + . + Developed by: + . + LLVM Team + . + University of Illinois at Urbana-Champaign + . + http://llvm.org + . + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal with + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + . + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + . + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE + SOFTWARE. + +Files: clang/lib/Headers/* +Copyright: 2003-2007 University of Illinois at Urbana-Champaign +License: Expat + +Files: clang/lib/Headers/iso646.h +Copyright: 2008 Eli Friedman +License: Expat + +Files: clang/lib/Headers/limits.h +Copyright: 2009 Chris Lattner +License: Expat + +Files: clang/lib/Headers/stdarg.h +Copyright: 2008 Eli Friedman +License: Expat + +Files: clang/lib/Headers/stdbool.h +Copyright: 2008 Eli Friedman +License: Expat + +Files: clang/lib/Headers/stddef.h +Copyright: 2008 Eli Friedman +License: Expat + +Files: clang/lib/Headers/stdint.h +Copyright: 2009 Chris Lattner +License: Expat + +Files: clang/lib/Headers/tgmath.h +Copyright: 2009 Howard Hinnant +License: Expat + +Files: compiler-rt/* +Copyright: 2009-2013 Craig van Vliet + 2009-2013 Edward O'Callaghan + 2009-2013 Howard Hinnant +License: U-OF-I-BSD-LIKE or MIT + +Files: compiler-rt/lib/BlocksRuntime/Block.h +Copyright: 2008-2010 Apple, Inc. +License: MIT + +Files: compiler-rt/lib/BlocksRuntime/Block_private.h +Copyright: 2008-2010 Apple, Inc. +License: MIT + +Files: compiler-rt/lib/BlocksRuntime/data.c +Copyright: 2008-2010 Apple, Inc. +License: MIT + +Files: compiler-rt/lib/BlocksRuntime/runtime.c +Copyright: 2008-2010 Apple, Inc. +License: MIT + +Files: include/llvm/Support/* +Copyright: 2003-2013 University of Illinois at Urbana-Champaign. + Copyright (C) 2004 eXtensible Systems, Inc. +License: U-OF-I-BSD-LIKE + +Files: lib/Support/reg* +Copyright: 1992, 1993, 1994 Henry Spencer + 1992, 1993, 1994 The Regents of the University of California +License: BSD-3-clause + +Files: lib/Support/MD5.cpp llvm/include/llvm/Support/MD5.h +Copyright: 2001 Alexander Peslyak aka Solar Designer +License: solar-public-domain + This software was written by Alexander Peslyak in 2001. No copyright is + claimed, and the software is hereby placed in the public domain. + In case this attempt to disclaim copyright and place the software in the + public domain is deemed null and void, then the software is + Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + general public under the following terms: + . + Redistribution and use in source and binary forms, with or without + modification, are permitted. + . + * There's ABSOLUTELY NO WARRANTY, express or implied. + +Files: lib/Target/ARM/* +Copyright: ARM Limited +License: ARM + ARM Limited + . + Software Grant License Agreement ("Agreement") + . + Except for the license granted herein to you, ARM Limited ("ARM") reserves all + right, title, and interest in and to the Software (defined below). + . + Definition + . + "Software" means the code and documentation as well as any original work of + authorship, including any modifications or additions to an existing work, that + is intentionally submitted by ARM to llvm.org (http://llvm.org) ("LLVM") for + inclusion in, or documentation of, any of the products owned or managed by LLVM + (the "Work"). For the purposes of this definition, "submitted" means any form of + electronic, verbal, or written communication sent to LLVM or its + representatives, including but not limited to communication on electronic + mailing lists, source code control systems, and issue tracking systems that are + managed by, or on behalf of, LLVM for the purpose of discussing and improving + the Work, but excluding communication that is conspicuously marked otherwise. + . + 1. Grant of Copyright License. Subject to the terms and conditions of this + Agreement, ARM hereby grants to you and to recipients of the Software + distributed by LLVM a perpetual, worldwide, non-exclusive, no-charge, + royalty-free, irrevocable copyright license to reproduce, prepare derivative + works of, publicly display, publicly perform, sublicense, and distribute the + Software and such derivative works. + . + 2. Grant of Patent License. Subject to the terms and conditions of this + Agreement, ARM hereby grants you and to recipients of the Software + distributed by LLVM a perpetual, worldwide, non-exclusive, no-charge, + royalty-free, irrevocable (except as stated in this section) patent license + to make, have made, use, offer to sell, sell, import, and otherwise transfer + the Work, where such license applies only to those patent claims licensable + by ARM that are necessarily infringed by ARM's Software alone or by + combination of the Software with the Work to which such Software was + submitted. If any entity institutes patent litigation against ARM or any + other entity (including a cross-claim or counterclaim in a lawsuit) alleging + that ARM's Software, or the Work to which ARM has contributed constitutes + direct or contributory patent infringement, then any patent licenses granted + to that entity under this Agreement for the Software or Work shall terminate + as of the date such litigation is filed. + . + Unless required by applicable law or agreed to in writing, the software is + provided on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + either express or implied, including, without limitation, any warranties or + conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. + +Files: lldb/* +Copyright: 2010, 2012 Apple Inc. +License: NCSA + University of Illinois/NCSA + Open Source License + . + Copyright (c) 2010 Apple Inc. + All rights reserved. + . + Developed by: + . + LLDB Team + . + http://lldb.llvm.org/ + . + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal with + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + . + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + . + * Neither the names of the LLDB Team, copyright holders, nor the names of + its contributors may be used to endorse or promote products derived from + this Software without specific prior written permission. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE + SOFTWARE. + +Files: lldb/test/pexpect-2.4/* +Copyright: 2008 Noah Spurrier +License: Expat + +License: Expat + . + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + +Files: lldb/test/unittest2/* +Copyright: 1999-2003 Steve Purcell + 2003-2010 Python Software Foundation +License: Python + This module is free software, and you may redistribute it and/or modify + it under the same terms as Python itself, so long as this copyright message + and disclaimer are retained in their original form. + . + IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, + SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF + THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + . + THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, + AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, + SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +Files: polly/* +Copyright: 2009-2013 Polly Team +License: Polly + ============================================================================== + Polly Release License + ============================================================================== + University of Illinois/NCSA + Open Source License + . + Copyright (c) 2009-2013 Polly Team + All rights reserved. + . + Developed by: + . + Polly Team + . + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal with + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + . + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + . + * Neither the names of the Polly Team, copyright holders, nor the names of + its contributors may be used to endorse or promote products derived from + this Software without specific prior written permission. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE + SOFTWARE. + +Files: polly/lib/JSON/* +Copyright: Polly Team +License: public-domain + **FIXME** + polly/lib/JSON/LICENSE.txt claims that these files are in the public domain, but + the machine-readable copyright spec requires additional clarification. + +Files: polly/tools/GPURuntime/* +Copyright: Polly Team +License: U-OF-I-BSD-LIKE or MIT + +Files: test/YAMLParser/* +Copyright: 2006 Kirill Simonov +License: MIT + +Files: lldb/tools/debugserver/source/MacOSX/stack_logging.h +Copyright: 1999-2007 Apple Inc. +License: Apple + This file contains Original Code and/or Modifications of Original Code + as defined in and that are subject to the Apple Public Source License + Version 2.0 (the 'License'). You may not use this file except in + compliance with the License. Please obtain a copy of the License at + http://www.opensource.apple.com/apsl/ and read it before using this + file. + . + The Original Code and all software distributed under the License are + distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + Please see the License for the specific language governing rights and + limitations under the License. + +Files: utils/unittest/googletest/* +Copyright: 2006-2008, Google Inc. +License: BSD-3-Clause + +License: BSD-3-Clause + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + . + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + . + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +License: U-OF-I-BSD-LIKE + ============================================================================== + LLVM Release License + ============================================================================== + University of Illinois/NCSA + Open Source License + . + Copyright (c) 2003-2017 University of Illinois at Urbana-Champaign. + All rights reserved. + . + Developed by: + . + LLVM Team + . + University of Illinois at Urbana-Champaign + . + http://llvm.org + . + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal with + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + . + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + . + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE + SOFTWARE. + +License: MIT + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. diff --git a/debian_path.h b/debian_path.h new file mode 100644 index 00000000..539636f8 --- /dev/null +++ b/debian_path.h @@ -0,0 +1,16 @@ +//===----------------------------------------------------------------------===// +// +// Debian paths declaration management +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef DEBIAN_PATH_H +#define DEBIAN_PATH_H + +// Provides the debian revision +#define DEB_PATCHSETVERSION "@DEB_PATCHSETVERSION@" + +#endif diff --git a/libclang-X.Y-dev.install.in b/libclang-X.Y-dev.install.in new file mode 100644 index 00000000..79d9db7d --- /dev/null +++ b/libclang-X.Y-dev.install.in @@ -0,0 +1,10 @@ +usr/lib/llvm-@LLVM_VERSION@/include/clang +usr/lib/llvm-@LLVM_VERSION@/include/clang-c +usr/lib/llvm-@LLVM_VERSION@/lib/libclang*a +usr/lib/llvm-@LLVM_VERSION@/lib/libclang*so +usr/lib/llvm-@LLVM_VERSION@/lib/libfindAllSymbols.a + +#usr/include/clang /usr/include/ +#usr/include/clang-c /usr/include/ +#usr/lib/libclang.so /usr/lib/ +#usr/lib/libclang*a /usr/lib/ diff --git a/libclang-X.Y-dev.links.in b/libclang-X.Y-dev.links.in new file mode 100644 index 00000000..6f99d5bf --- /dev/null +++ b/libclang-X.Y-dev.links.in @@ -0,0 +1,3 @@ +usr/lib/@DEB_HOST_MULTIARCH@/libclang-@LLVM_VERSION@.so.1 usr/lib/@DEB_HOST_MULTIARCH@/libclang-@LLVM_VERSION@.so +usr/lib/@DEB_HOST_MULTIARCH@/libclang-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/libclang.so +usr/lib/@DEB_HOST_MULTIARCH@/libclang-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/libclang-@LLVM_VERSION@.so diff --git a/libclang-common-X.Y-dev.install.in b/libclang-common-X.Y-dev.install.in new file mode 100644 index 00000000..17b24297 --- /dev/null +++ b/libclang-common-X.Y-dev.install.in @@ -0,0 +1,13 @@ +usr/lib/llvm-@LLVM_VERSION@/lib/clang/@LLVM_VERSION_FULL@/include + +usr/lib/llvm-@LLVM_VERSION@/lib/clang/@LLVM_VERSION_FULL@/lib +usr/lib/llvm-@LLVM_VERSION@/lib/clang/@LLVM_VERSION_FULL@/*.txt + +#usr/lib/clang/@LLVM_VERSION_FULL@/lib /usr/lib/clang/@LLVM_VERSION@/ +#usr/lib/clang/@LLVM_VERSION_FULL@/include/ /usr/include/clang/@LLVM_VERSION@/ + +usr/lib/llvm-@LLVM_VERSION@/bin/yaml-bench + +usr/bin/yaml-bench-@LLVM_VERSION@ + + diff --git a/libclang-common-X.Y-dev.links.in b/libclang-common-X.Y-dev.links.in new file mode 100644 index 00000000..717c6b2c --- /dev/null +++ b/libclang-common-X.Y-dev.links.in @@ -0,0 +1,7 @@ +usr/lib/llvm-@LLVM_VERSION@/lib/clang/@LLVM_VERSION_FULL@/include usr/include/clang/@LLVM_VERSION@/include +usr/lib/llvm-@LLVM_VERSION@/lib/clang/@LLVM_VERSION_FULL@/include usr/lib/clang/@LLVM_VERSION@/include +usr/lib/llvm-@LLVM_VERSION@/lib/clang/@LLVM_VERSION_FULL@/lib usr/lib/clang/@LLVM_VERSION@/lib +usr/lib/llvm-@LLVM_VERSION@/lib/clang/@LLVM_VERSION_FULL@/include usr/include/clang/@LLVM_VERSION_FULL@/include +usr/lib/llvm-@LLVM_VERSION@/lib/clang/@LLVM_VERSION_FULL@/include usr/lib/clang/@LLVM_VERSION_FULL@/include +usr/lib/llvm-@LLVM_VERSION@/lib/clang/@LLVM_VERSION_FULL@/lib usr/lib/clang/@LLVM_VERSION_FULL@/lib + diff --git a/libclang1-X.Y.install.in b/libclang1-X.Y.install.in new file mode 100644 index 00000000..d44e84f6 --- /dev/null +++ b/libclang1-X.Y.install.in @@ -0,0 +1,2 @@ +usr/lib/llvm-@LLVM_VERSION@/lib/libclang-@LLVM_VERSION@.so.1 /usr/lib/@DEB_HOST_MULTIARCH@/ +usr/lib/llvm-@LLVM_VERSION@/lib/libclang.so.1 diff --git a/libclang1-X.Y.links.in b/libclang1-X.Y.links.in new file mode 100644 index 00000000..3ea44c8d --- /dev/null +++ b/libclang1-X.Y.links.in @@ -0,0 +1,3 @@ +# as upstream +usr/lib/@DEB_HOST_MULTIARCH@/libclang-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/libclang-@LLVM_VERSION@.so.1 +usr/lib/llvm-@LLVM_VERSION@/lib/libclang-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/libclang.so.1 diff --git a/libclang1-X.Y.lintian-overrides.in b/libclang1-X.Y.lintian-overrides.in new file mode 100644 index 00000000..9fc47a74 --- /dev/null +++ b/libclang1-X.Y.lintian-overrides.in @@ -0,0 +1,5 @@ +# I know and I am not planning to change that yet. +libclang1-@LLVM_VERSION@: package-name-doesnt-match-sonames libclang1-@LLVM_VERSION@-1 +# Provided as transition +libclang1-@LLVM_VERSION@: dev-pkg-without-shlib-symlink usr/lib/*/libclang-@LLVM_VERSION@.so.1 usr/lib/*/libclang.so +libclang1-@LLVM_VERSION@: ldconfig-symlink-missing-for-shlib usr/lib/*/libclang-LLVM_VERSION@.so usr/lib/*/libclang-LLVM_VERSION@.so.1 libclang-LLVM_VERSION@.so diff --git a/libclang1-X.Y.symbols.in b/libclang1-X.Y.symbols.in new file mode 100644 index 00000000..a50eb655 --- /dev/null +++ b/libclang1-X.Y.symbols.in @@ -0,0 +1,362 @@ +libclang-@LLVM_VERSION@.so.1 libclang1-@LLVM_VERSION@ #MINVER# + (optional)LLVM_@LLVM_VERSION@@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_BlockCommandComment_getArgText@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_BlockCommandComment_getCommandName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_BlockCommandComment_getNumArgs@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_BlockCommandComment_getParagraph@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXCursorSet_contains@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXCursorSet_insert@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXIndex_getGlobalOptions@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXIndex_setGlobalOptions@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXIndex_setInvocationEmissionPathOption@LLVM_@LLVM_VERSION@ 1:6.0~svn320926-1~ + clang_CXXConstructor_isConvertingConstructor@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXConstructor_isCopyConstructor@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXConstructor_isDefaultConstructor@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXConstructor_isMoveConstructor@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXField_isMutable@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXMethod_isConst@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXMethod_isDefaulted@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXMethod_isPureVirtual@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXMethod_isStatic@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXMethod_isVirtual@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CXXRecord_isAbstract@LLVM_@LLVM_VERSION@ 1:6.0~svn320926-1~ + clang_Comment_getChild@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Comment_getKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Comment_getNumChildren@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Comment_isWhitespace@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompilationDatabase_dispose@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompilationDatabase_fromDirectory@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompilationDatabase_getAllCompileCommands@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompilationDatabase_getCompileCommands@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompileCommand_getArg@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompileCommand_getDirectory@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompileCommand_getFilename@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompileCommand_getMappedSourceContent@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompileCommand_getMappedSourcePath@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompileCommand_getNumArgs@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompileCommands_dispose@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompileCommands_getCommand@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_CompileCommands_getSize@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_Evaluate@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getArgument@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getBriefCommentText@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getCXXManglings@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getCommentRange@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getMangling@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getModule@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getNumArguments@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getNumTemplateArguments@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getObjCDeclQualifiers@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getObjCManglings@LLVM_@LLVM_VERSION@ 1:6.0~svn320926-1~ + clang_Cursor_getObjCPropertyAttributes@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getObjCSelectorIndex@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getOffsetOfField@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getParsedComment@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getRawCommentText@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getReceiverType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getSpellingNameRange@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getStorageClass@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getTemplateArgumentKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getTemplateArgumentType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getTemplateArgumentUnsignedValue@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getTemplateArgumentValue@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_getTranslationUnit@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_hasAttrs@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_isAnonymous@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_isBitField@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_isDynamicCall@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_isExternalSymbol@LLVM_@LLVM_VERSION@ 1:5.0~+rc1~ + clang_Cursor_isFunctionInlined@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_isMacroBuiltin@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_isMacroFunctionLike@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_isNull@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_isObjCOptional@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Cursor_isVariadic@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_EnumDecl_isScoped@LLVM_@LLVM_VERSION@ 1:5.0~+rc1~ + clang_EvalResult_dispose@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_EvalResult_getAsDouble@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_EvalResult_getAsInt@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_EvalResult_getAsLongLong@LLVM_@LLVM_VERSION@ 1:5.0~svn302377-1~ + clang_EvalResult_getAsStr@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_EvalResult_getAsUnsigned@LLVM_@LLVM_VERSION@ 1:5.0~svn302377-1~ + clang_EvalResult_getKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_EvalResult_isUnsignedInt@LLVM_@LLVM_VERSION@ 1:5.0~svn302377-1~ + clang_File_isEqual@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_FullComment_getAsHTML@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_FullComment_getAsXML@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_HTMLStartTagComment_isSelfClosing@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_HTMLStartTag_getAttrName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_HTMLStartTag_getAttrValue@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_HTMLStartTag_getNumAttrs@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_HTMLTagComment_getAsString@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_HTMLTagComment_getTagName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_IndexAction_create@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_IndexAction_dispose@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_InlineCommandComment_getArgText@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_InlineCommandComment_getCommandName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_InlineCommandComment_getNumArgs@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_InlineCommandComment_getRenderKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_InlineContentComment_hasTrailingNewline@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Location_isFromMainFile@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Location_isInSystemHeader@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ModuleMapDescriptor_create@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ModuleMapDescriptor_dispose@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ModuleMapDescriptor_setFrameworkModuleName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ModuleMapDescriptor_setUmbrellaHeader@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ModuleMapDescriptor_writeToBuffer@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Module_getASTFile@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Module_getFullName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Module_getName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Module_getNumTopLevelHeaders@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Module_getParent@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Module_getTopLevelHeader@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Module_isSystem@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ParamCommandComment_getDirection@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ParamCommandComment_getParamIndex@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ParamCommandComment_getParamName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ParamCommandComment_isDirectionExplicit@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_ParamCommandComment_isParamIndexValid@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Range_isNull@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_TParamCommandComment_getDepth@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_TParamCommandComment_getIndex@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_TParamCommandComment_getParamName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_TParamCommandComment_isParamPositionValid@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_TargetInfo_dispose@LLVM_@LLVM_VERSION@ 1:5.0~svn302377-1~ + clang_TargetInfo_getPointerWidth@LLVM_@LLVM_VERSION@ 1:5.0~svn302377-1~ + clang_TargetInfo_getTriple@LLVM_@LLVM_VERSION@ 1:5.0~svn302377-1~ + clang_TextComment_getText@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_getAlignOf@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_getCXXRefQualifier@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_getClassType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_getNamedType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_getNumTemplateArguments@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_getObjCEncoding@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_getOffsetOf@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_getSizeOf@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_getTemplateArgumentAsType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_Type_isTransparentTagTypedef@LLVM_@LLVM_VERSION@ 1:5.0~svn302377-1~ + clang_Type_visitFields@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_VerbatimBlockLineComment_getText@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_VerbatimLineComment_getText@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_VirtualFileOverlay_addFileMapping@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_VirtualFileOverlay_create@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_VirtualFileOverlay_dispose@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_VirtualFileOverlay_setCaseSensitivity@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_VirtualFileOverlay_writeToBuffer@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_annotateTokens@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_codeCompleteAt@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_codeCompleteGetContainerKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_codeCompleteGetContainerUSR@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_codeCompleteGetContexts@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_codeCompleteGetDiagnostic@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_codeCompleteGetNumDiagnostics@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_codeCompleteGetObjCSelector@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_constructUSR_ObjCCategory@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_constructUSR_ObjCClass@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_constructUSR_ObjCIvar@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_constructUSR_ObjCMethod@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_constructUSR_ObjCProperty@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_constructUSR_ObjCProtocol@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_createCXCursorSet@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_createIndex@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_createTranslationUnit2@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_createTranslationUnit@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_createTranslationUnitFromSourceFile@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_defaultCodeCompleteOptions@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_defaultDiagnosticDisplayOptions@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_defaultEditingTranslationUnitOptions@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_defaultReparseOptions@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_defaultSaveOptions@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeCXCursorSet@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeCXPlatformAvailability@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeCXTUResourceUsage@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeCodeCompleteResults@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeDiagnostic@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeDiagnosticSet@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeIndex@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeOverriddenCursors@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeSourceRangeList@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeString@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeStringSet@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeTokens@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_disposeTranslationUnit@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_enableStackTraces@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_equalCursors@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_equalLocations@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_equalRanges@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_equalTypes@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_executeOnThread@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_findIncludesInFile@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_findIncludesInFileWithBlock@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_findReferencesInFile@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_findReferencesInFileWithBlock@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_formatDiagnostic@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_free@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getAddressSpace@LLVM_@LLVM_VERSION@ 1:5.0~+rc1~ + clang_getAllSkippedRanges@LLVM_@LLVM_VERSION@ 1:5.0~svn302377-1~ + clang_getArgType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getArrayElementType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getArraySize@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getBuildSessionTimestamp@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCString@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCXTUResourceUsage@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCXXAccessSpecifier@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCanonicalCursor@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCanonicalType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getChildDiagnostics@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getClangVersion@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCompletionAnnotation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCompletionAvailability@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCompletionBriefComment@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCompletionChunkCompletionString@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCompletionChunkKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCompletionChunkText@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCompletionNumAnnotations@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCompletionParent@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCompletionPriority@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursor@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorAvailability@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorCompletionString@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorDefinition@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorDisplayName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorExceptionSpecificationType@LLVM_@LLVM_VERSION@ 1:5.0~+rc1~ + clang_getCursorExtent@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorKindSpelling@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorLanguage@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorLexicalParent@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorLinkage@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorPlatformAvailability@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorReferenceNameRange@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorReferenced@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorResultType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorSemanticParent@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorSpelling@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorTLSKind@LLVM_@LLVM_VERSION@ 1:6.0~svn320926-1~ + clang_getCursorType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorUSR@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getCursorVisibility@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDeclObjCTypeEncoding@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDefinitionSpellingAndExtent@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnostic@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticCategory@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticCategoryName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticCategoryText@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticFixIt@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticInSet@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticNumFixIts@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticNumRanges@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticOption@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticRange@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticSetFromTU@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticSeverity@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getDiagnosticSpelling@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getElementType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getEnumConstantDeclUnsignedValue@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getEnumConstantDeclValue@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getEnumDeclIntegerType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getExceptionSpecificationType@LLVM_@LLVM_VERSION@ 1:5.0~+rc1~ + clang_getExpansionLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getFieldDeclBitWidth@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getFile@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getFileContents@LLVM_@LLVM_VERSION@ 1:6.0~svn321745-1~ + clang_getFileLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getFileName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getFileTime@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getFileUniqueID@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getFunctionTypeCallingConv@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getIBOutletCollectionType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getIncludedFile@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getInclusions@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getInstantiationLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getLocationForOffset@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getModuleForFile@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getNullCursor@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getNullLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getNullRange@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getNumArgTypes@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getNumCompletionChunks@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getNumDiagnostics@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getNumDiagnosticsInSet@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getNumElements@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getNumOverloadedDecls@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getOverloadedDecl@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getOverriddenCursors@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getPointeeType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getPresumedLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getRange@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getRangeEnd@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getRangeStart@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getRemappings@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getRemappingsFromFileList@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getResultType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getSkippedRanges@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getSpecializedCursorTemplate@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getSpellingLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTUResourceUsageName@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTemplateCursorKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTokenExtent@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTokenKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTokenLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTokenSpelling@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTranslationUnitCursor@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTranslationUnitSpelling@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTranslationUnitTargetInfo@LLVM_@LLVM_VERSION@ 1:5.0~svn302377-1~ + clang_getTypeDeclaration@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTypeKindSpelling@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTypeSpelling@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTypedefDeclUnderlyingType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_getTypedefName@LLVM_@LLVM_VERSION@ 1:5.0~+rc1~ + clang_hashCursor@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_indexLoc_getCXSourceLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_indexLoc_getFileLocation@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_indexSourceFile@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_indexSourceFileFullArgv@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_indexTranslationUnit@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_getCXXClassDeclInfo@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_getClientContainer@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_getClientEntity@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_getIBOutletCollectionAttrInfo@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_getObjCCategoryDeclInfo@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_getObjCContainerDeclInfo@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_getObjCInterfaceDeclInfo@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_getObjCPropertyDeclInfo@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_getObjCProtocolRefListInfo@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_isEntityObjCContainerKind@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_setClientContainer@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_index_setClientEntity@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isAttribute@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isConstQualifiedType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isCursorDefinition@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isDeclaration@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isExpression@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isFileMultipleIncludeGuarded@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isFunctionTypeVariadic@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isInvalid@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isPODType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isPreprocessing@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isReference@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isRestrictQualifiedType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isStatement@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isTranslationUnit@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isUnexposed@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isVirtualBase@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_isVolatileQualifiedType@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_loadDiagnostics@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_parseTranslationUnit2@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_parseTranslationUnit2FullArgv@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_parseTranslationUnit@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_remap_dispose@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_remap_getFilenames@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_remap_getNumFiles@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_reparseTranslationUnit@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_saveTranslationUnit@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_sortCodeCompletionResults@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_suspendTranslationUnit@LLVM_@LLVM_VERSION@ 1:5.0~+rc1~ + clang_toggleCrashRecovery@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_tokenize@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_visitChildren@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ + clang_visitChildrenWithBlock@LLVM_@LLVM_VERSION@ 1:5.0~svn298832-1~ diff --git a/liblld-X.Y-dev.install.in b/liblld-X.Y-dev.install.in new file mode 100644 index 00000000..b1446f06 --- /dev/null +++ b/liblld-X.Y-dev.install.in @@ -0,0 +1,2 @@ +/usr/lib/llvm-@LLVM_VERSION@/include/lld + diff --git a/liblld-X.Y.install.in b/liblld-X.Y.install.in new file mode 100644 index 00000000..3d86306c --- /dev/null +++ b/liblld-X.Y.install.in @@ -0,0 +1,11 @@ +#usr/lib/llvm-@LLVM_VERSION@/lib/liblld-@LLVM_VERSION@.so.1 /usr/lib/@DEB_HOST_MULTIARCH@/ +usr/lib/llvm-@LLVM_VERSION@/lib/liblldReaderWriter.a +usr/lib/llvm-@LLVM_VERSION@/lib/liblldDriver.a +usr/lib/llvm-@LLVM_VERSION@/lib/liblldYAML.a +usr/lib/llvm-@LLVM_VERSION@/lib/liblldELF.a +usr/lib/llvm-@LLVM_VERSION@/lib/liblldCore.a +usr/lib/llvm-@LLVM_VERSION@/lib/liblldMachO.a +usr/lib/llvm-@LLVM_VERSION@/lib/liblldCOFF.a +usr/lib/llvm-@LLVM_VERSION@/lib/liblldMinGW.a +usr/lib/llvm-@LLVM_VERSION@/lib/liblldCommon.a +usr/lib/llvm-@LLVM_VERSION@/lib/liblldWasm.a diff --git a/liblld-X.Y.links.in b/liblld-X.Y.links.in new file mode 100644 index 00000000..5d16d10b --- /dev/null +++ b/liblld-X.Y.links.in @@ -0,0 +1,4 @@ +usr/lib/@DEB_HOST_MULTIARCH@/liblld-@LLVM_VERSION@.so.1 usr/lib/@DEB_HOST_MULTIARCH@/liblld-@LLVM_VERSION@.so +usr/lib/@DEB_HOST_MULTIARCH@/liblld-@LLVM_VERSION@.so usr/lib/python2.7/dist-packages/lld-@LLVM_VERSION@/_lld.so +usr/lib/@DEB_HOST_MULTIARCH@/liblld-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/liblld.so.1 + diff --git a/liblldb-X.Y-dev.install.in b/liblldb-X.Y-dev.install.in new file mode 100644 index 00000000..d6dd2e16 --- /dev/null +++ b/liblldb-X.Y-dev.install.in @@ -0,0 +1,3 @@ +/usr/lib/llvm-@LLVM_VERSION@/include/lldb +/usr/lib/llvm-@LLVM_VERSION@/lib/liblldb*a +/usr/lib/llvm-@LLVM_VERSION@/lib/liblldb*so diff --git a/liblldb-X.Y-dev.links.in b/liblldb-X.Y-dev.links.in new file mode 100644 index 00000000..3c6aef90 --- /dev/null +++ b/liblldb-X.Y-dev.links.in @@ -0,0 +1,3 @@ +usr/lib/@DEB_HOST_MULTIARCH@/liblldb-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/liblldb.so +usr/lib/@DEB_HOST_MULTIARCH@/liblldb-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/liblldb-@LLVM_VERSION@.so +usr/lib/@DEB_HOST_MULTIARCH@/liblldb-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/liblldb-@LLVM_VERSION@.so.1 diff --git a/liblldb-X.Y.install.in b/liblldb-X.Y.install.in new file mode 100644 index 00000000..73f1b98b --- /dev/null +++ b/liblldb-X.Y.install.in @@ -0,0 +1,4 @@ +usr/lib/llvm-@LLVM_VERSION@/lib/liblldb-@LLVM_VERSION@.so.1 /usr/lib/@DEB_HOST_MULTIARCH@/ +usr/lib/llvm-@LLVM_VERSION@/lib/python2.7/site-packages/readline.so + +usr/lib/llvm-@LLVM_VERSION@/lib/liblldbIntelFeatures.so.* diff --git a/liblldb-X.Y.links.in b/liblldb-X.Y.links.in new file mode 100644 index 00000000..ae73a199 --- /dev/null +++ b/liblldb-X.Y.links.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/liblldb-@LLVM_VERSION@.so.1 usr/lib/@DEB_HOST_MULTIARCH@/liblldb-@LLVM_VERSION@.so +usr/lib/@DEB_HOST_MULTIARCH@/liblldb-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/liblldb.so.1 diff --git a/liblldb-X.Y.lintian-overrides.in b/liblldb-X.Y.lintian-overrides.in new file mode 100644 index 00000000..180aec35 --- /dev/null +++ b/liblldb-X.Y.lintian-overrides.in @@ -0,0 +1,5 @@ +# That is normal. The lib is not (yet?) shipped as a new package +liblldb-@LLVM_VERSION@: package-name-doesnt-match-sonames liblldb-@LLVM_VERSION@-1 +# For now, override this warning. We might create a -dev at some point +liblldb-@LLVM_VERSION@: non-dev-pkg-with-shlib-symlink usr/lib/*/liblldb.so.1 usr/lib/*/liblldb.so +liblldb-@LLVM_VERSION@: non-dev-pkg-with-shlib-symlink usr/lib/*/liblldb-@LLVM_VERSION@.so.1 usr/lib/*/liblldb-@LLVM_VERSION@.so diff --git a/libllvm-X.Y-ocaml-dev.META.in b/libllvm-X.Y-ocaml-dev.META.in new file mode 100644 index 00000000..366820d9 --- /dev/null +++ b/libllvm-X.Y-ocaml-dev.META.in @@ -0,0 +1,63 @@ +description = "Low Level Virtual Machine bindings" +version = "@LLVM_VERSION@" + +directory = "+llvm-@LLVM_VERSION@" + +archive(byte) = "llvm.cma" +archive(native) = "llvm.cmxa" +linkopts = "-cclib -lstdc++ -cclib -lllvm" + +package "executionengine" +( + requires = "llvm-@LLVM_VERSION@" + version = "@LLVM_VERSION@" + archive(native) = "llvm_executionengine.cmxa" + archive(byte) = "llvm_executionengine.cma" + linkopts = "-cclib -lllvm_executionengine" +) + +package "target" +( + requires = "llvm-@LLVM_VERSION@" + version = "@LLVM_VERSION@" + archive(native) = "llvm_target.cmxa" + archive(byte) = "llvm_target.cma" + linkopts = "-cclib -lllvm_target" +) + +package "scalar_opts" +( + requires = "llvm-@LLVM_VERSION@ llvm-@LLVM_VERSION@.target" + version = "@LLVM_VERSION@" + archive(native) = "llvm_scalar_opts.cmxa" + archive(byte) = "llvm_scalar_opts.cma" + linkopts = "-cclib -lllvm_scalar_opts" +) + +package "analysis" +( + requires = "llvm-@LLVM_VERSION@" + version = "@LLVM_VERSION@" + archive(native) = "llvm_analysis.cmxa" + archive(byte) = "llvm_analysis.cma" + linkopts = "-cclib -lllvm_analysis" +) + +package "bitwriter" +( + requires = "llvm-@LLVM_VERSION@" + version = "@LLVM_VERSION@" + archive(native) = "llvm_bitwriter.cmxa" + archive(byte) = "llvm_bitwriter.cma" + linkopts = "-cclib -lllvm_bitwriter" +) + +package "bitreader" +( + requires = "llvm-@LLVM_VERSION@ llvm-@LLVM_VERSION@.bitwriter" + version = "@LLVM_VERSION@" + archive(native) = "llvm_bitreader.cmxa" + archive(byte) = "llvm_bitreader.cma" + linkopts = "-cclib -lllvm_bitreader" +) + diff --git a/libllvm-X.Y-ocaml-dev.dirs.in b/libllvm-X.Y-ocaml-dev.dirs.in new file mode 100644 index 00000000..6c9c7364 --- /dev/null +++ b/libllvm-X.Y-ocaml-dev.dirs.in @@ -0,0 +1,2 @@ +@OCAML_STDLIB_DIR@/META/ + diff --git a/libllvm-X.Y-ocaml-dev.install.in b/libllvm-X.Y-ocaml-dev.install.in new file mode 100644 index 00000000..4c68fb7b --- /dev/null +++ b/libllvm-X.Y-ocaml-dev.install.in @@ -0,0 +1,2 @@ +@OCAML_STDLIB_DIR@ +usr/lib/llvm-@LLVM_VERSION@/share/doc/llvm/ocaml-html/ usr/share/doc/libllvm-@LLVM_VERSION@-ocaml-dev/ diff --git a/libllvm-X.Y-ocaml-dev.lintian-overrides.in b/libllvm-X.Y-ocaml-dev.lintian-overrides.in new file mode 100644 index 00000000..5d25d442 --- /dev/null +++ b/libllvm-X.Y-ocaml-dev.lintian-overrides.in @@ -0,0 +1,2 @@ +# It is in the section ocaml which is fine. +libllvm-@LLVM_VERSION@-ocaml-dev: wrong-section-according-to-package-name libllvm-@LLVM_VERSION@-ocaml-dev => libdevel diff --git a/libllvmX.Y.install.in b/libllvmX.Y.install.in new file mode 100644 index 00000000..f8d968f8 --- /dev/null +++ b/libllvmX.Y.install.in @@ -0,0 +1 @@ +usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM-@LLVM_VERSION@.so.1 /usr/lib/@DEB_HOST_MULTIARCH@/ diff --git a/libllvmX.Y.links.in b/libllvmX.Y.links.in new file mode 100644 index 00000000..067b0884 --- /dev/null +++ b/libllvmX.Y.links.in @@ -0,0 +1,4 @@ +# Should be uncommented for @LLVM_VERSION@.1 and other +# usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM-@LLVM_VERSION@.so.1 /usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION@.so.1 +usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION@.so.1 /usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION@.so + diff --git a/libllvmX.Y.lintian-overrides.in b/libllvmX.Y.lintian-overrides.in new file mode 100644 index 00000000..49f7ef24 --- /dev/null +++ b/libllvmX.Y.lintian-overrides.in @@ -0,0 +1,2 @@ +# That is normal. Upstream does not match the debian convention +libllvm@LLVM_VERSION@: package-name-doesnt-match-sonames libLLVM-@LLVM_VERSION@-1 diff --git a/lld-X.Y.install.in b/lld-X.Y.install.in new file mode 100644 index 00000000..4d392c9d --- /dev/null +++ b/lld-X.Y.install.in @@ -0,0 +1,11 @@ +usr/lib/llvm-@LLVM_VERSION@/bin/ld.lld* +usr/lib/llvm-@LLVM_VERSION@/bin/ld64.lld +usr/lib/llvm-@LLVM_VERSION@/bin/lld-* +usr/lib/llvm-@LLVM_VERSION@/bin/lld +usr/lib/llvm-@LLVM_VERSION@/bin/wasm-ld + +usr/bin/lld-link-@LLVM_VERSION@ +usr/bin/ld.lld-@LLVM_VERSION@ +usr/bin/ld64.lld-@LLVM_VERSION@ +usr/bin/lld-@LLVM_VERSION@* +usr/bin/wasm-ld-@LLVM_VERSION@ diff --git a/lld-X.Y.manpages.in b/lld-X.Y.manpages.in new file mode 100644 index 00000000..51943dc6 --- /dev/null +++ b/lld-X.Y.manpages.in @@ -0,0 +1 @@ +debian/man/ld.lld-@LLVM_VERSION@.1 diff --git a/lldb-X.Y.install.in b/lldb-X.Y.install.in new file mode 100644 index 00000000..e6fe07e9 --- /dev/null +++ b/lldb-X.Y.install.in @@ -0,0 +1,11 @@ +usr/lib/llvm-@LLVM_VERSION@/bin/lldb* +usr/lib/llvm-@LLVM_VERSION@/bin/lldb-mi* +usr/lib/llvm-@LLVM_VERSION@/bin/lldb-server* +usr/lib/llvm-@LLVM_VERSION@/bin/lldb-argdumper + +usr/bin/lldb-@LLVM_VERSION@* +usr/bin/lldb-server-@LLVM_VERSION@* +usr/bin/lldb-mi-@LLVM_VERSION@* +usr/bin/lldb-argdumper-@LLVM_VERSION@ +usr/bin/lldb-test-@LLVM_VERSION@ + diff --git a/lldb-X.Y.links.in b/lldb-X.Y.links.in new file mode 100644 index 00000000..d30a5f69 --- /dev/null +++ b/lldb-X.Y.links.in @@ -0,0 +1,2 @@ +usr/lib/llvm-@LLVM_VERSION@/bin/lldb-server usr/lib/llvm-@LLVM_VERSION@/bin/lldb-server-@LLVM_VERSION_FULL@ +usr/lib/llvm-@LLVM_VERSION@/bin/lldb-server usr/lib/llvm-@LLVM_VERSION@/bin/lldb-server-@LLVM_VERSION@ diff --git a/lldb-X.Y.lintian-overrides.in b/lldb-X.Y.lintian-overrides.in new file mode 100644 index 00000000..a456a341 --- /dev/null +++ b/lldb-X.Y.lintian-overrides.in @@ -0,0 +1,3 @@ +lldb-@LLVM_VERSION@: non-dev-pkg-with-shlib-symlink usr/lib/*/liblldb.so.1 usr/lib/*/liblldb.so +# Does not really matter +lldb-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/lldb-@LLVM_VERSION@.1.gz diff --git a/lldb-X.Y.manpages.in b/lldb-X.Y.manpages.in new file mode 100644 index 00000000..36a62aea --- /dev/null +++ b/lldb-X.Y.manpages.in @@ -0,0 +1,2 @@ +debian/man/lldb-@LLVM_VERSION@.1 +debian/man/lldb-mi-@LLVM_VERSION@.1 diff --git a/lldb-X.Y.postinst.in b/lldb-X.Y.postinst.in new file mode 100644 index 00000000..a5a60710 --- /dev/null +++ b/lldb-X.Y.postinst.in @@ -0,0 +1,8 @@ +#!/bin/sh -e + +if [ "$1" = "configure" ] +then + ldconfig +fi + +#DEBHELPER# diff --git a/llvm-X.Y-dev.dirs.in b/llvm-X.Y-dev.dirs.in new file mode 100644 index 00000000..3b3b5862 --- /dev/null +++ b/llvm-X.Y-dev.dirs.in @@ -0,0 +1,5 @@ +/usr/lib/llvm-@LLVM_VERSION@/lib +/usr/lib/llvm-@LLVM_VERSION@/build +/usr/lib/llvm-@LLVM_VERSION@/include +usr/share/doc/llvm-@LLVM_VERSION@-dev +usr/share/emacs/site-lisp/llvm-@LLVM_VERSION@ diff --git a/llvm-X.Y-dev.install.in b/llvm-X.Y-dev.install.in new file mode 100644 index 00000000..13c9d4fd --- /dev/null +++ b/llvm-X.Y-dev.install.in @@ -0,0 +1,31 @@ +usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM*.a +#usr/lib/llvm-@LLVM_VERSION@/lib/libllvm*.a +usr/lib/llvm-@LLVM_VERSION@/lib/LLVM*.so +usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM.so +usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM-@LLVM_VERSION@.so +usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM-@LLVM_VERSION_FULL@.so +usr/lib/llvm-@LLVM_VERSION@/lib/libLTO.* +usr/lib/llvm-@LLVM_VERSION@/lib/BugpointPasses.so +usr/lib/llvm-@LLVM_VERSION@/include/llvm/ usr/include/llvm-@LLVM_VERSION@/ +usr/lib/llvm-@LLVM_VERSION@/include/llvm-c/ usr/include/llvm-c-@LLVM_VERSION@/ +# Explicit debian/tmp since there are multiple declarations +debian/tmp/usr/lib/llvm-@LLVM_VERSION@/lib/cmake/llvm/*.cmake + +utils/vim/indent/llvm-@LLVM_VERSION@.vim usr/share/vim/addons/indent/ + +utils/vim/syntax/llvm-@LLVM_VERSION@.vim usr/share/vim/addons/syntax/ +utils/vim/syntax/tablegen-@LLVM_VERSION@.vim usr/share/vim/addons/syntax/ + +utils/vim/ftdetect/llvm-@LLVM_VERSION@.vim usr/share/vim/addons/ftdetect/ +utils/vim/ftdetect/tablegen-@LLVM_VERSION@.vim usr/share/vim/addons/ftdetect/ + +utils/vim/ftplugin/llvm-@LLVM_VERSION@.vim usr/share/vim/addons/ftplugin/ +utils/vim/ftplugin/tablegen-@LLVM_VERSION@.vim usr/share/vim/addons/ftplugin/ + +utils/vim/llvm-@LLVM_VERSION@-vimrc usr/share/vim/addons + + +utils/emacs/emacs.el usr/share/emacs/site-lisp/llvm-@LLVM_VERSION@/ +utils/emacs/llvm-mode.el usr/share/emacs/site-lisp/llvm-@LLVM_VERSION@/ +utils/emacs/tablegen-mode.el usr/share/emacs/site-lisp/llvm-@LLVM_VERSION@/ + diff --git a/llvm-X.Y-dev.links.in b/llvm-X.Y-dev.links.in new file mode 100644 index 00000000..b3a2a2ae --- /dev/null +++ b/llvm-X.Y-dev.links.in @@ -0,0 +1,19 @@ +usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM-@LLVM_VERSION@.so +usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM-@LLVM_VERSION@.so.1 +usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM-@LLVM_VERSION_FULL@.so.1 +usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/libLLVM-@LLVM_VERSION_FULL@.so +usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION@.so.1 usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION_FULL@.so.1 + +usr/include/llvm-c-@LLVM_VERSION@/llvm-c usr/lib/llvm-@LLVM_VERSION@/include/llvm-c +usr/include/llvm-@LLVM_VERSION@/llvm usr/lib/llvm-@LLVM_VERSION@/include/llvm +usr/include/llvm-c-@LLVM_VERSION@/llvm-c usr/lib/llvm-@LLVM_VERSION@/build/include/llvm-c +usr/include/llvm-@LLVM_VERSION@/llvm usr/lib/llvm-@LLVM_VERSION@/build/include/llvm + +usr/lib/llvm-@LLVM_VERSION@/include/ usr/lib/llvm-@LLVM_VERSION@/build/include +usr/lib/llvm-@LLVM_VERSION@/lib/ usr/lib/llvm-@LLVM_VERSION@/build/lib +usr/lib/llvm-@LLVM_VERSION@/share/ usr/lib/llvm-@LLVM_VERSION@/build/share +usr/lib/llvm-@LLVM_VERSION@/ usr/lib/llvm-@LLVM_VERSION@/build/Release +usr/lib/llvm-@LLVM_VERSION@/ usr/lib/llvm-@LLVM_VERSION@/build/Debug+Asserts + +usr/lib/llvm-@LLVM_VERSION@/lib/cmake/llvm usr/lib/llvm-@LLVM_VERSION@/cmake +usr/lib/llvm-@LLVM_VERSION@/lib/cmake/llvm usr/lib/llvm-@LLVM_VERSION@/share/llvm/cmake diff --git a/llvm-X.Y-doc.dirs.in b/llvm-X.Y-doc.dirs.in new file mode 100644 index 00000000..5379e8ec --- /dev/null +++ b/llvm-X.Y-doc.dirs.in @@ -0,0 +1 @@ +usr/share/doc/llvm-@LLVM_VERSION@-doc diff --git a/llvm-X.Y-doc.install.in b/llvm-X.Y-doc.install.in new file mode 100644 index 00000000..6ac115a5 --- /dev/null +++ b/llvm-X.Y-doc.install.in @@ -0,0 +1,6 @@ +docs/_build/html usr/share/doc/llvm-@LLVM_VERSION@-doc/ +#usr/lib/llvm-@LLVM_VERSION@/docs/llvm/html.tar.gz +#usr/lib/llvm-@LLVM_VERSION@/docs/llvm/ocamldoc.tar.gz +#usr/lib/llvm-@LLVM_VERSION@/docs/llvm/html/Dummy.html +#usr/lib/llvm-@LLVM_VERSION@/docs/llvm/html/doxygen.css +#usr/lib/llvm-@LLVM_VERSION@/docs/llvm/html/LibASTMatchersReference.html diff --git a/llvm-X.Y-examples.dirs.in b/llvm-X.Y-examples.dirs.in new file mode 100644 index 00000000..a8b75c66 --- /dev/null +++ b/llvm-X.Y-examples.dirs.in @@ -0,0 +1 @@ +usr/share/doc/llvm-@LLVM_VERSION@-examples diff --git a/llvm-X.Y-examples.examples.in b/llvm-X.Y-examples.examples.in new file mode 100644 index 00000000..e39721e2 --- /dev/null +++ b/llvm-X.Y-examples.examples.in @@ -0,0 +1 @@ +examples/* diff --git a/llvm-X.Y-examples.links.in b/llvm-X.Y-examples.links.in new file mode 100644 index 00000000..a8d74aa2 --- /dev/null +++ b/llvm-X.Y-examples.links.in @@ -0,0 +1,3 @@ +/usr/lib/llvm-@LLVM_VERSION@/build/Makefile.common usr/share/doc/llvm-@LLVM_VERSION@-examples/Makefile.common +/usr/lib/llvm-@LLVM_VERSION@/build/Makefile.config usr/share/doc/llvm-@LLVM_VERSION@-examples/Makefile.config +/usr/lib/llvm-@LLVM_VERSION@/build/Makefile.rules usr/share/doc/llvm-@LLVM_VERSION@-examples/Makefile.rules diff --git a/llvm-X.Y-runtime.binfmt.in b/llvm-X.Y-runtime.binfmt.in new file mode 100644 index 00000000..6bb1df78 --- /dev/null +++ b/llvm-X.Y-runtime.binfmt.in @@ -0,0 +1,3 @@ +package llvm-@LLVM_VERSION@-runtime +interpreter /usr/bin/lli-@LLVM_VERSION@ +magic BC diff --git a/llvm-X.Y-runtime.install.in b/llvm-X.Y-runtime.install.in new file mode 100644 index 00000000..d8e16a7c --- /dev/null +++ b/llvm-X.Y-runtime.install.in @@ -0,0 +1,8 @@ +usr/lib/llvm-@LLVM_VERSION@/bin/lli +usr/lib/llvm-@LLVM_VERSION@/bin/lli-child-target + +usr/bin/lli-@LLVM_VERSION@ +usr/bin/lli-child-target-@LLVM_VERSION@ + +debian/llvm-@LLVM_VERSION@-runtime.binfmt usr/share/binfmts/ + diff --git a/llvm-X.Y-runtime.lintian-overrides.in b/llvm-X.Y-runtime.lintian-overrides.in new file mode 100644 index 00000000..e94e7130 --- /dev/null +++ b/llvm-X.Y-runtime.lintian-overrides.in @@ -0,0 +1 @@ +llvm-@LLVM_VERSION@-runtime: binary-without-manpage usr/bin/lli-child-target-@LLVM_VERSION@ diff --git a/llvm-X.Y-runtime.manpages.in b/llvm-X.Y-runtime.manpages.in new file mode 100644 index 00000000..839952d0 --- /dev/null +++ b/llvm-X.Y-runtime.manpages.in @@ -0,0 +1 @@ +debian/man/lli* diff --git a/llvm-X.Y-runtime.postinst.in b/llvm-X.Y-runtime.postinst.in new file mode 100644 index 00000000..987b3ea2 --- /dev/null +++ b/llvm-X.Y-runtime.postinst.in @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +if test "$1" = "configure"; then + if test -x /usr/sbin/update-binfmts; then + update-binfmts --import llvm-@LLVM_VERSION@-runtime.binfmt || true + fi +fi + +#DEBHELPER# diff --git a/llvm-X.Y-runtime.prerm.in b/llvm-X.Y-runtime.prerm.in new file mode 100644 index 00000000..3f16015a --- /dev/null +++ b/llvm-X.Y-runtime.prerm.in @@ -0,0 +1,18 @@ +#!/bin/sh + +set -e + +if test "$1" = "remove"; then + if test -x /usr/sbin/update-binfmts; then + update-binfmts --package llvm-@LLVM_VERSION@-runtime \ + --remove llvm-@LLVM_VERSION@-runtime.binfmt /usr/bin/lli-@LLVM_VERSION@ || true + if test -f /var/lib/binfmts/llvm-@LLVM_VERSION@.binfmt; then + # Purge old file + update-binfmts --package llvm-@LLVM_VERSION@-runtime \ + --remove llvm-@LLVM_VERSION@.binfmt /usr/bin/lli-@LLVM_VERSION@ || true + fi + fi +fi + +#DEBHELPER# + diff --git a/llvm-X.Y-tools.dirs.in b/llvm-X.Y-tools.dirs.in new file mode 100644 index 00000000..401df068 --- /dev/null +++ b/llvm-X.Y-tools.dirs.in @@ -0,0 +1,2 @@ +/usr/lib/llvm-@LLVM_VERSION@/build/unittests +/usr/lib/llvm-@LLVM_VERSION@/build/utils/lit/ diff --git a/llvm-X.Y-tools.install.in b/llvm-X.Y-tools.install.in new file mode 100644 index 00000000..9fec1e27 --- /dev/null +++ b/llvm-X.Y-tools.install.in @@ -0,0 +1,17 @@ + +usr/lib/llvm-@LLVM_VERSION@/bin/count +usr/lib/llvm-@LLVM_VERSION@/bin/FileCheck +usr/lib/llvm-@LLVM_VERSION@/bin/not +usr/lib/llvm-@LLVM_VERSION@/share/opt-viewer/opt-viewer.py +usr/lib/llvm-@LLVM_VERSION@/share/opt-viewer/optrecord.py +usr/lib/llvm-@LLVM_VERSION@/share/opt-viewer/style.css +usr/lib/llvm-@LLVM_VERSION@/share/opt-viewer/opt-diff.py +usr/lib/llvm-@LLVM_VERSION@/share/opt-viewer/optpmap.py +usr/lib/llvm-@LLVM_VERSION@/share/opt-viewer/opt-stats.py + +utils/lit/* /usr/lib/llvm-@LLVM_VERSION@/build/utils/lit/ + +usr/bin/count-@LLVM_VERSION@ +usr/bin/FileCheck-@LLVM_VERSION@ +usr/bin/not-@LLVM_VERSION@ + diff --git a/llvm-X.Y.dirs.in b/llvm-X.Y.dirs.in new file mode 100644 index 00000000..56a9655f --- /dev/null +++ b/llvm-X.Y.dirs.in @@ -0,0 +1,3 @@ +/usr/lib/llvm-@LLVM_VERSION@/bin +usr/share/man/man1 +usr/share/doc/llvm-@LLVM_VERSION@ diff --git a/llvm-X.Y.install.in b/llvm-X.Y.install.in new file mode 100644 index 00000000..88934484 --- /dev/null +++ b/llvm-X.Y.install.in @@ -0,0 +1,16 @@ +usr/lib/llvm-@LLVM_VERSION@/bin/llvm-* +usr/lib/llvm-@LLVM_VERSION@/bin/opt* +usr/lib/llvm-@LLVM_VERSION@/bin/bugpoint* +usr/lib/llvm-@LLVM_VERSION@/bin/llc* +usr/lib/llvm-@LLVM_VERSION@/bin/obj2yaml +usr/lib/llvm-@LLVM_VERSION@/bin/yaml2obj +usr/lib/llvm-@LLVM_VERSION@/bin/verify-uselistorder +usr/lib/llvm-@LLVM_VERSION@/bin/sanstats +usr/bin/llvm-* +usr/bin/opt* +usr/bin/bugpoint* +usr/bin/llc* +usr/bin/obj2yaml-* +usr/bin/yaml2obj-* +usr/bin/verify-uselistorder-* +usr/bin/sanstats-* diff --git a/llvm-X.Y.lintian-overrides.in b/llvm-X.Y.lintian-overrides.in new file mode 100644 index 00000000..35c86946 --- /dev/null +++ b/llvm-X.Y.lintian-overrides.in @@ -0,0 +1,12 @@ +# I know but well... +llvm-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/llvm-dwarfdump-@LLVM_VERSION@.1.gz +llvm-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/llvm-mc-@LLVM_VERSION@.1.gz +llvm-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/llvm-mcmarkup-@LLVM_VERSION@.1.gz +llvm-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/llvm-objdump-@LLVM_VERSION@.1.gz +llvm-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/llvm-rtdyld-@LLVM_VERSION@.1.gz +llvm-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/llvm-size-@LLVM_VERSION@.1.gz +llvm-@LLVM_VERSION@: manpage-has-useless-whatis-entry usr/share/man/man1/llvm-ranlib-@LLVM_VERSION@.1.gz +# Does not link otherwise +llvm-@LLVM_VERSION@: embedded-library usr/lib/llvm-@LLVM_VERSION@/bin/bugpoint: libjsoncpp +llvm-@LLVM_VERSION@: embedded-library usr/lib/llvm-@LLVM_VERSION@/bin/opt: libjsoncpp + diff --git a/llvm-X.Y.manpages.in b/llvm-X.Y.manpages.in new file mode 100644 index 00000000..98f095fb --- /dev/null +++ b/llvm-X.Y.manpages.in @@ -0,0 +1,8 @@ +docs/_build/man/* +debian/man/llvm-dwarfdump-@LLVM_VERSION@.1 +debian/man/llvm-mc-@LLVM_VERSION@.1 +debian/man/llvm-mcmarkup-@LLVM_VERSION@.1 +debian/man/llvm-objdump-@LLVM_VERSION@.1 +debian/man/llvm-rtdyld-@LLVM_VERSION@.1 +debian/man/llvm-size-@LLVM_VERSION@.1 +debian/man/llvm-ranlib-@LLVM_VERSION@.1 diff --git a/llvm-priv-dev.dirs b/llvm-priv-dev.dirs new file mode 100644 index 00000000..dab86638 --- /dev/null +++ b/llvm-priv-dev.dirs @@ -0,0 +1 @@ +/usr/lib/llvm-3.1/build diff --git a/orig-tar.sh b/orig-tar.sh new file mode 100755 index 00000000..5dba8f54 --- /dev/null +++ b/orig-tar.sh @@ -0,0 +1,201 @@ +#!/bin/sh +# This script will create the following tarballs: +# llvm-toolchain-snapshot-3.2_3.2repack.orig-clang.tar.bz2 +# llvm-toolchain-snapshot-3.2_3.2repack.orig-clang-extra.tar.bz2 +# llvm-toolchain-snapshot-3.2_3.2repack.orig-compiler-rt.tar.bz2 +# llvm-toolchain-snapshot-3.2_3.2repack.orig-lld.tar.bz2 +# llvm-toolchain-snapshot-3.2_3.2repack.orig-lldb.tar.bz2 +# llvm-toolchain-snapshot-3.2_3.2repack.orig-polly.tar.bz2 +# llvm-toolchain-snapshot-3.2_3.2repack.orig.tar.bz2 +set -e + +# TODO rest of the options + +# To create an rc1 release: +# sh 4.0/debian/orig-tar.sh RELEASE_40 rc1 + +SVN_BASE_URL=https://llvm.org/svn/llvm-project/ +MAJOR_VERSION=6.0 +CURRENT_VERSION=6.0.1 # Should be changed to 3.5.1 later + +if test -n "$1"; then +# https://llvm.org/svn/llvm-project/{cfe,llvm,compiler-rt,...}/branches/google/stable/ +# For example: sh 4.0/debian/orig-tar.sh release_400 + BRANCH=$1 +fi + +if test -n "$1" -a -n "$2"; then +# https://llvm.org/svn/llvm-project/{cfe,llvm,compiler-rt,...}/tags/RELEASE_34/rc1/ +# For example: sh 4.0/debian/orig-tar.sh RELEASE_401 rc3 4.0.1 + BRANCH=$1 + TAG=$2 + RCRELEASE="true" + if test -z "$3"; then + echo "Please provide the exact version. Used for the tarball name Ex: 4.0.1" + fi + EXACT_VERSION=$3 +fi + +get_svn_url() { + MODULE=$1 + BRANCH=$2 + TAG=$3 + if test -n "$TAG"; then + SVN_URL="$SVN_BASE_URL/$MODULE/tags/$BRANCH/$TAG" + else + if test -n "$BRANCH"; then + SVN_URL="$SVN_BASE_URL/$MODULE/branches/$BRANCH" + else + SVN_URL="$SVN_BASE_URL/$MODULE/trunk/" + fi + fi + echo $SVN_URL +} + +get_higher_revision() { + PROJECTS="llvm cfe compiler-rt polly lld lldb clang-tools-extra" + REVISION_MAX=0 + for f in $PROJECTS; do + REVISION=$(LANG=C svn info $(get_svn_url $f $BRANCH $TAG)|grep "^Last Changed Rev:"|awk '{print $4}') + if test $REVISION -gt $REVISION_MAX; then + REVISION_MAX=$REVISION + fi + done + echo $REVISION_MAX +} + +SVN_ARCHIVES=svn-archives + +checkout_sources() { + PROJECT=$1 + URL=$2 + TARGET=$3 + BRANCH=$4 + if test -n "$BRANCH"; then + REVISION=$5 + fi + echo "$PROJECT / $URL / $BRANCH / $TARGET / $REVISION" + + cd $SVN_ARCHIVES/ + DEST=$PROJECT-$BRANCH + if test -n "$TAG"; then + DEST=$DEST-$TAG + fi + if test -d $DEST; then + cd $DEST + if test -n "$BRANCH"; then + svn cleanup + svn up + else + svn cleanup + svn up -r $REVISION + fi + cd .. + else + if test -n "$BRANCH"; then + svn co $URL $DEST + else + svn co -r $REVISION $URL $DEST + fi + fi + rm -rf ../$TARGET + rsync -r --exclude=.svn $DEST/ ../$TARGET + cd .. +} + +if test -n "$BRANCH"; then + REVISION=$(get_higher_revision) + # Do not use the revision when exporting branch. We consider that all the + # branch are sync + SVN_CMD="svn export" +else + REVISION=$(LANG=C svn info $(get_svn_url llvm)|grep "^Revision:"|awk '{print $2}') + SVN_CMD="svn export -r $REVISION" +fi + +if test -n "$RCRELEASE"; then + if test "$TAG" = "final"; then + VERSION=$EXACT_VERSION + else + VERSION=$EXACT_VERSION"~+"$TAG + fi + FULL_VERSION="llvm-toolchain-"$MAJOR_VERSION"_"$VERSION +else + VERSION=$CURRENT_VERSION"~svn"$REVISION + if echo $BRANCH|grep -q release_; then + FULL_VERSION="llvm-toolchain-"$MAJOR_VERSION"_"$VERSION + else + FULL_VERSION="llvm-toolchain-snapshot_"$VERSION + fi +fi + +mkdir -p $SVN_ARCHIVES + +# LLVM +LLVM_TARGET=$FULL_VERSION +checkout_sources llvm $(get_svn_url llvm $BRANCH $TAG) $LLVM_TARGET "$BRANCH" $REVISION +tar jcf $FULL_VERSION.orig.tar.bz2 $LLVM_TARGET +rm -rf $LLVM_TARGET + + +# Clang +CLANG_TARGET=clang_$VERSION +checkout_sources clang $(get_svn_url cfe $BRANCH $TAG) $CLANG_TARGET "$BRANCH" $REVISION +tar jcf $FULL_VERSION.orig-clang.tar.bz2 $CLANG_TARGET +rm -rf $CLANG_TARGET + + +# Clang extra +CLANG_TARGET=clang-tools-extra_$VERSION +checkout_sources clang-tools-extra $(get_svn_url clang-tools-extra $BRANCH $TAG) $CLANG_TARGET "$BRANCH" $REVISION +tar jcf $FULL_VERSION.orig-clang-tools-extra.tar.bz2 $CLANG_TARGET +rm -rf $CLANG_TARGET + +# Compiler-rt +COMPILER_RT_TARGET=compiler-rt_$VERSION +checkout_sources compiler-rt $(get_svn_url compiler-rt $BRANCH $TAG) $COMPILER_RT_TARGET "$BRANCH" $REVISION +#$SVN_CMD $(get_svn_url compiler-rt $BRANCH $TAG) $COMPILER_RT_TARGET +tar jcf $FULL_VERSION.orig-compiler-rt.tar.bz2 $COMPILER_RT_TARGET +rm -rf $COMPILER_RT_TARGET + +# Polly +POLLY_TARGET=polly_$VERSION +checkout_sources polly $(get_svn_url polly $BRANCH $TAG) $POLLY_TARGET "$BRANCH" $REVISION +#$SVN_CMD $(get_svn_url polly $BRANCH $TAG) $POLLY_TARGET +rm -rf $POLLY_TARGET/www $POLLY_TARGET/autoconf/config.sub $POLLY_TARGET/autoconf/config.guess +tar jcf $FULL_VERSION.orig-polly.tar.bz2 $POLLY_TARGET +rm -rf $POLLY_TARGET + +# LLD +LLD_TARGET=lld_$VERSION +checkout_sources lld $(get_svn_url lld $BRANCH $TAG) $LLD_TARGET "$BRANCH" $REVISION +#$SVN_CMD $(get_svn_url lld $BRANCH $TAG) $LLD_TARGET +rm -rf $LLD_TARGET/www/ +tar jcf $FULL_VERSION.orig-lld.tar.bz2 $LLD_TARGET +rm -rf $LLD_TARGET + +# LLDB +LLDB_TARGET=lldb_$VERSION +checkout_sources lldb $(get_svn_url lldb $BRANCH $TAG) $LLDB_TARGET "$BRANCH" $REVISION +#$SVN_CMD $(get_svn_url lldb $BRANCH $TAG) $LLDB_TARGET +rm -rf $LLDB_TARGET/www/ +tar jcf $FULL_VERSION.orig-lldb.tar.bz2 $LLDB_TARGET +rm -rf $LLDB_TARGET + +PATH_DEBIAN="$(pwd)/$(dirname $0)/../" +echo "going into $PATH_DEBIAN" +export DEBFULLNAME="Sylvestre Ledru" +export DEBEMAIL="sylvestre@debian.org" +cd $PATH_DEBIAN + +if test -z "$DISTRIBUTION"; then + DISTRIBUTION="experimental" +fi + +if test -n "$RCRELEASE" -o -n "$BRANCH"; then + EXTRA_DCH_FLAGS="--force-bad-version --allow-lower-version" +fi + +dch $EXTRA_DCH_FLAGS --distribution $DISTRIBUTION --newversion 1:$VERSION-1~exp1 "New snapshot release" + +exit 0 diff --git a/patches/0001-llvm-cmake-resolve-symlinks-in-LLVMConfig.cmake.patch b/patches/0001-llvm-cmake-resolve-symlinks-in-LLVMConfig.cmake.patch new file mode 100644 index 00000000..1aa87919 --- /dev/null +++ b/patches/0001-llvm-cmake-resolve-symlinks-in-LLVMConfig.cmake.patch @@ -0,0 +1,34 @@ +From d0d969074f6e0f975ad53d21e7ce6c7b40cf2957 Mon Sep 17 00:00:00 2001 +From: Peter Wu +Date: Fri, 4 May 2018 15:43:06 +0200 +Subject: [PATCH] [llvm] cmake: resolve symlinks in LLVMConfig.cmake + +Ensure that symlinks such as /usr/lib/llvm-X.Y/cmake (pointing to +lib/cmake/llvm) are resolved. This ensures that LLVM_INSTALL_PREFIX +becomes /usr/lib/llvm-X.Y instead of /usr. + +Partially addresses PR37128 +--- + cmake/modules/CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index 6074e835859..1cf4569b884 100644 +--- a/cmake/modules/CMakeLists.txt ++++ b/cmake/modules/CMakeLists.txt +@@ -76,10 +76,10 @@ file(COPY . + # Generate LLVMConfig.cmake for the install tree. + set(LLVM_CONFIG_CODE " + # Compute the installation prefix from this LLVMConfig.cmake file location. +-get_filename_component(LLVM_INSTALL_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)") ++get_filename_component(LLVM_INSTALL_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" REALPATH)") + # Construct the proper number of get_filename_component(... PATH) + # calls to compute the installation prefix. +-string(REGEX REPLACE "/" ";" _count "${LLVM_INSTALL_PACKAGE_DIR}") ++string(REGEX REPLACE "/" ";" _count "prefix/${LLVM_INSTALL_PACKAGE_DIR}") + foreach(p ${_count}) + set(LLVM_CONFIG_CODE "${LLVM_CONFIG_CODE} + get_filename_component(LLVM_INSTALL_PREFIX \"\${LLVM_INSTALL_PREFIX}\" PATH)") +-- +2.17.0 + diff --git a/patches/0001-tools-clang-cmake-resolve-symlinks-in-ClangConfig.cmake.patch b/patches/0001-tools-clang-cmake-resolve-symlinks-in-ClangConfig.cmake.patch new file mode 100644 index 00000000..dca84e36 --- /dev/null +++ b/patches/0001-tools-clang-cmake-resolve-symlinks-in-ClangConfig.cmake.patch @@ -0,0 +1,34 @@ +From c830d84bc802ca1e9219415a5784c4ad97a34819 Mon Sep 17 00:00:00 2001 +From: Peter Wu +Date: Fri, 4 May 2018 15:55:26 +0200 +Subject: [PATCH] [clang] cmake: resolve symlinks in ClangConfig.cmake + +Ensure that symlinks such as /usr/lib/cmake/clang-X.Y (pointing to +/usr/lib/llvm-X.Y/lib/cmake/llvm) are resolved. This ensures that +CLANG_INSTALL_PREFIX ends up to be /usr/lib/llvm-X.Y instead of /usr. + +Partially addresses PR37128 +--- + cmake/modules/CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt +index be6d1d7257..bcb61f6cc8 100644 +--- a/clang/cmake/modules/CMakeLists.txt ++++ b/clang/cmake/modules/CMakeLists.txt +@@ -30,10 +30,10 @@ set(CLANG_CONFIG_EXPORTS_FILE) + # Generate ClangConfig.cmake for the install tree. + set(CLANG_CONFIG_CODE " + # Compute the installation prefix from this LLVMConfig.cmake file location. +-get_filename_component(CLANG_INSTALL_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)") ++get_filename_component(CLANG_INSTALL_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" REALPATH)") + # Construct the proper number of get_filename_component(... PATH) + # calls to compute the installation prefix. +-string(REGEX REPLACE "/" ";" _count "${CLANG_INSTALL_PACKAGE_DIR}") ++string(REGEX REPLACE "/" ";" _count "prefix/${CLANG_INSTALL_PACKAGE_DIR}") + foreach(p ${_count}) + set(CLANG_CONFIG_CODE "${CLANG_CONFIG_CODE} + get_filename_component(CLANG_INSTALL_PREFIX \"\${CLANG_INSTALL_PREFIX}\" PATH)") +-- +2.17.0 + diff --git a/patches/0003-Debian-version-info-and-bugreport.patch b/patches/0003-Debian-version-info-and-bugreport.patch new file mode 100644 index 00000000..6c8a1d53 --- /dev/null +++ b/patches/0003-Debian-version-info-and-bugreport.patch @@ -0,0 +1,19 @@ +--- + lib/Support/CommandLine.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +Index: llvm-toolchain-snapshot_5.0~svn296106/lib/Support/CommandLine.cpp +=================================================================== +--- llvm-toolchain-snapshot_5.0~svn296106.orig/lib/Support/CommandLine.cpp ++++ llvm-toolchain-snapshot_5.0~svn296106/lib/Support/CommandLine.cpp +@@ -2064,6 +2064,10 @@ public: + OS << " " << LLVM_VERSION_INFO; + #endif + OS << "\n "; ++#ifdef LLVM_DEBIAN_INFO ++ OS << LLVM_DEBIAN_INFO; ++#endif ++ OS << "\n "; + #ifndef __OPTIMIZE__ + OS << "DEBUG build"; + #else diff --git a/patches/0044-soname.diff b/patches/0044-soname.diff new file mode 100644 index 00000000..89b23922 --- /dev/null +++ b/patches/0044-soname.diff @@ -0,0 +1,30 @@ +--- + clang/tools/libclang/CMakeLists.txt | 2 +- + tools/llvm-shlib/CMakeLists.txt | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +Index: llvm-toolchain-snapshot_6.0~svn309319/clang/tools/libclang/CMakeLists.txt +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn309319.orig/clang/tools/libclang/CMakeLists.txt ++++ llvm-toolchain-snapshot_6.0~svn309319/clang/tools/libclang/CMakeLists.txt +@@ -84,7 +84,7 @@ else() + set(output_name "clang") + endif() + +-add_clang_library(libclang ${ENABLE_SHARED} ${ENABLE_STATIC} ++add_clang_library(libclang ${ENABLE_SHARED} ${ENABLE_STATIC} SONAME + OUTPUT_NAME ${output_name} + ${SOURCES} + DEPENDS clang-headers +Index: llvm-toolchain-snapshot_6.0~svn309319/tools/llvm-shlib/CMakeLists.txt +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn309319.orig/tools/llvm-shlib/CMakeLists.txt ++++ llvm-toolchain-snapshot_6.0~svn309319/tools/llvm-shlib/CMakeLists.txt +@@ -35,6 +35,7 @@ if(LLVM_DYLIB_EXPORTED_SYMBOL_FILE) + endif() + + add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB SONAME ${SOURCES}) ++set_property(TARGET LLVM PROPERTY VERSION "1") # Append .1 to SONAME + + list(REMOVE_DUPLICATES LIB_NAMES) + if(("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR (MINGW) OR (HAIKU) diff --git a/patches/0048-Set-html_static_path-_static-everywhere.patch b/patches/0048-Set-html_static_path-_static-everywhere.patch new file mode 100644 index 00000000..10663a82 --- /dev/null +++ b/patches/0048-Set-html_static_path-_static-everywhere.patch @@ -0,0 +1,63 @@ +From: Nicholas D Steeves +Date: Sat, 10 Feb 2018 21:00:55 -0500 +Subject: Set html_static_path = ['_static'] everywhere. + +--- + clang-tools-extra/docs/conf.py | 2 +- + clang/docs/analyzer/conf.py | 2 +- + clang/docs/conf.py | 2 +- + polly/docs/conf.py | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/clang-tools-extra/docs/conf.py b/clang-tools-extra/docs/conf.py +index e872c55..69f425a 100644 +--- a/clang-tools-extra/docs/conf.py ++++ b/clang-tools-extra/docs/conf.py +@@ -121,7 +121,7 @@ html_theme = 'haiku' + # Add any paths that contain custom static files (such as style sheets) here, + # relative to this directory. They are copied after the builtin static files, + # so a file named "default.css" will overwrite the builtin "default.css". +-html_static_path = [] ++html_static_path = ['_static'] + + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, + # using the given strftime format. +diff --git a/clang/docs/analyzer/conf.py b/clang/docs/analyzer/conf.py +index c40af7a..666308d 100644 +--- a/clang/docs/analyzer/conf.py ++++ b/clang/docs/analyzer/conf.py +@@ -121,7 +121,7 @@ html_theme = 'haiku' + # Add any paths that contain custom static files (such as style sheets) here, + # relative to this directory. They are copied after the builtin static files, + # so a file named "default.css" will overwrite the builtin "default.css". +-html_static_path = [] ++html_static_path = ['_static'] + + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, + # using the given strftime format. +diff --git a/clang/docs/conf.py b/clang/docs/conf.py +index a9861cd..d125dc6 100644 +--- a/clang/docs/conf.py ++++ b/clang/docs/conf.py +@@ -121,7 +121,7 @@ html_theme = 'haiku' + # Add any paths that contain custom static files (such as style sheets) here, + # relative to this directory. They are copied after the builtin static files, + # so a file named "default.css" will overwrite the builtin "default.css". +-html_static_path = [] ++html_static_path = ['_static'] + + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, + # using the given strftime format. +diff --git a/polly/docs/conf.py b/polly/docs/conf.py +index 64d3968..aa854ad 100644 +--- a/polly/docs/conf.py ++++ b/polly/docs/conf.py +@@ -127,7 +127,7 @@ except ImportError: + # Add any paths that contain custom static files (such as style sheets) here, + # relative to this directory. They are copied after the builtin static files, + # so a file named "default.css" will overwrite the builtin "default.css". +-html_static_path = [] ++html_static_path = ['_static'] + + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, + # using the given strftime format. diff --git a/patches/0049-Use-Debian-provided-MathJax-everywhere.patch b/patches/0049-Use-Debian-provided-MathJax-everywhere.patch new file mode 100644 index 00000000..dce925ee --- /dev/null +++ b/patches/0049-Use-Debian-provided-MathJax-everywhere.patch @@ -0,0 +1,122 @@ +From: Nicholas D Steeves +Date: Sat, 10 Feb 2018 21:02:17 -0500 +Subject: Use Debian-provided MathJax everywhere. + +--- + clang-tools-extra/docs/Doxyfile | 2 +- + clang-tools-extra/docs/conf.py | 3 +++ + clang-tools-extra/docs/doxygen.cfg.in | 2 +- + clang/docs/analyzer/conf.py | 3 +++ + clang/docs/conf.py | 3 +++ + clang/docs/doxygen.cfg.in | 2 +- + docs/doxygen.cfg.in | 2 +- + polly/docs/doxygen.cfg.in | 2 +- + 8 files changed, 14 insertions(+), 5 deletions(-) + +diff --git a/clang-tools-extra/docs/Doxyfile b/clang-tools-extra/docs/Doxyfile +index d674390..1bf4f72 100644 +--- a/clang-tools-extra/docs/Doxyfile ++++ b/clang-tools-extra/docs/Doxyfile +@@ -1206,7 +1206,7 @@ USE_MATHJAX = NO + # MathJax, but it is strongly recommended to install a local copy of MathJax + # before deployment. + +-MATHJAX_RELPATH = http://www.mathjax.org/mathjax ++MATHJAX_RELPATH = /usr/share/javascript/mathjax + + # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension + # names that should be enabled during MathJax rendering. +diff --git a/clang-tools-extra/docs/conf.py b/clang-tools-extra/docs/conf.py +index 69f425a..46f8eea 100644 +--- a/clang-tools-extra/docs/conf.py ++++ b/clang-tools-extra/docs/conf.py +@@ -123,6 +123,9 @@ html_theme = 'haiku' + # so a file named "default.css" will overwrite the builtin "default.css". + html_static_path = ['_static'] + ++# Use Debian-provided MathJax ++mathjax_path = '/usr/share/javascript/mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML' ++ + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, + # using the given strftime format. + #html_last_updated_fmt = '%b %d, %Y' +diff --git a/clang-tools-extra/docs/doxygen.cfg.in b/clang-tools-extra/docs/doxygen.cfg.in +index 6dbf6db..da44cfc 100644 +--- a/clang-tools-extra/docs/doxygen.cfg.in ++++ b/clang-tools-extra/docs/doxygen.cfg.in +@@ -1438,7 +1438,7 @@ MATHJAX_FORMAT = HTML-CSS + # The default value is: http://cdn.mathjax.org/mathjax/latest. + # This tag requires that the tag USE_MATHJAX is set to YES. + +-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest ++MATHJAX_RELPATH = /usr/share/javascript/mathjax + + # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax + # extension names that should be enabled during MathJax rendering. For example +diff --git a/clang/docs/analyzer/conf.py b/clang/docs/analyzer/conf.py +index 666308d..2881bcc 100644 +--- a/clang/docs/analyzer/conf.py ++++ b/clang/docs/analyzer/conf.py +@@ -123,6 +123,9 @@ html_theme = 'haiku' + # so a file named "default.css" will overwrite the builtin "default.css". + html_static_path = ['_static'] + ++# Use Debian-provided MathJax ++mathjax_path = '/usr/share/javascript/mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML' ++ + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, + # using the given strftime format. + #html_last_updated_fmt = '%b %d, %Y' +diff --git a/clang/docs/conf.py b/clang/docs/conf.py +index d125dc6..2ce1a91 100644 +--- a/clang/docs/conf.py ++++ b/clang/docs/conf.py +@@ -123,6 +123,9 @@ html_theme = 'haiku' + # so a file named "default.css" will overwrite the builtin "default.css". + html_static_path = ['_static'] + ++# Use Debian-provided MathJax ++mathjax_path = '/usr/share/javascript/mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML' ++ + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, + # using the given strftime format. + #html_last_updated_fmt = '%b %d, %Y' +diff --git a/clang/docs/doxygen.cfg.in b/clang/docs/doxygen.cfg.in +index 13ed722..77bed6e 100644 +--- a/clang/docs/doxygen.cfg.in ++++ b/clang/docs/doxygen.cfg.in +@@ -1432,7 +1432,7 @@ MATHJAX_FORMAT = HTML-CSS + # The default value is: http://cdn.mathjax.org/mathjax/latest. + # This tag requires that the tag USE_MATHJAX is set to YES. + +-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest ++MATHJAX_RELPATH = /usr/share/javascript/mathjax + + # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax + # extension names that should be enabled during MathJax rendering. For example +diff --git a/docs/doxygen.cfg.in b/docs/doxygen.cfg.in +index e3c7f47..dcdade1 100644 +--- a/docs/doxygen.cfg.in ++++ b/docs/doxygen.cfg.in +@@ -1433,7 +1433,7 @@ MATHJAX_FORMAT = HTML-CSS + # The default value is: http://cdn.mathjax.org/mathjax/latest. + # This tag requires that the tag USE_MATHJAX is set to YES. + +-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest ++MATHJAX_RELPATH = /usr/share/javascript/mathjax + + # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax + # extension names that should be enabled during MathJax rendering. For example +diff --git a/polly/docs/doxygen.cfg.in b/polly/docs/doxygen.cfg.in +index 36786aa..26a8984 100644 +--- a/polly/docs/doxygen.cfg.in ++++ b/polly/docs/doxygen.cfg.in +@@ -1433,7 +1433,7 @@ MATHJAX_FORMAT = HTML-CSS + # The default value is: http://cdn.mathjax.org/mathjax/latest. + # This tag requires that the tag USE_MATHJAX is set to YES. + +-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest ++MATHJAX_RELPATH = /usr/share/javascript/mathjax + + # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax + # extension names that should be enabled during MathJax rendering. For example diff --git a/patches/19-clang_debian_version.patch b/patches/19-clang_debian_version.patch new file mode 100644 index 00000000..c530e14f --- /dev/null +++ b/patches/19-clang_debian_version.patch @@ -0,0 +1,21 @@ +Index: llvm-toolchain-snapshot_3.5~svn210337/clang/lib/Basic/Version.cpp +=================================================================== +--- llvm-toolchain-snapshot_3.5~svn210337.orig/clang/lib/Basic/Version.cpp ++++ llvm-toolchain-snapshot_3.5~svn210337/clang/lib/Basic/Version.cpp +@@ -15,6 +15,7 @@ + #include "clang/Basic/LLVM.h" + #include "clang/Config/config.h" + #include "llvm/Support/raw_ostream.h" ++#include "clang/Debian/debian_path.h" + #include + #include + +@@ -125,7 +126,7 @@ std::string getClangToolFullVersion(Stri + #ifdef CLANG_VENDOR + OS << CLANG_VENDOR; + #endif +- OS << ToolName << " version " CLANG_VERSION_STRING " " ++ OS << ToolName << " version " CLANG_VERSION_STRING "-" DEB_PATCHSETVERSION " " + << getClangFullRepositoryVersion(); + + // If vendor supplied, include the base LLVM version as well. diff --git a/patches/23-strlcpy_strlcat_warning_removed.diff b/patches/23-strlcpy_strlcat_warning_removed.diff new file mode 100644 index 00000000..235ffd4d --- /dev/null +++ b/patches/23-strlcpy_strlcat_warning_removed.diff @@ -0,0 +1,195 @@ +--- + clang/include/clang/Basic/Builtins.def | 8 +- + clang/lib/AST/Decl.cpp | 12 +-- + clang/lib/Sema/SemaChecking.cpp | 11 +- + clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp | 6 - + clang/test/Sema/builtins.c | 11 +- + clang/test/Sema/warn-strlcpycat-size.c | 55 -------------- + 6 files changed, 25 insertions(+), 78 deletions(-) + +--- a/clang/include/clang/Basic/Builtins.def ++++ b/clang/include/clang/Basic/Builtins.def +@@ -488,8 +488,8 @@ BUILTIN(__builtin___memset_chk, "v*v*izz + BUILTIN(__builtin___stpcpy_chk, "c*c*cC*z", "nF") + BUILTIN(__builtin___strcat_chk, "c*c*cC*z", "nF") + BUILTIN(__builtin___strcpy_chk, "c*c*cC*z", "nF") +-BUILTIN(__builtin___strlcat_chk, "zc*cC*zz", "nF") +-BUILTIN(__builtin___strlcpy_chk, "zc*cC*zz", "nF") ++//BUILTIN(__builtin___strlcat_chk, "zc*cC*zz", "nF") ++//BUILTIN(__builtin___strlcpy_chk, "zc*cC*zz", "nF") + BUILTIN(__builtin___strncat_chk, "c*c*cC*zz", "nF") + BUILTIN(__builtin___strncpy_chk, "c*c*cC*zz", "nF") + BUILTIN(__builtin___stpncpy_chk, "c*c*cC*zz", "nF") +@@ -874,8 +874,8 @@ LIBBUILTIN(getcontext, "iK*", "fj", + LIBBUILTIN(_longjmp, "vJi", "fr", "setjmp.h", ALL_GNU_LANGUAGES) + LIBBUILTIN(siglongjmp, "vSJi", "fr", "setjmp.h", ALL_GNU_LANGUAGES) + // non-standard but very common +-LIBBUILTIN(strlcpy, "zc*cC*z", "f", "string.h", ALL_GNU_LANGUAGES) +-LIBBUILTIN(strlcat, "zc*cC*z", "f", "string.h", ALL_GNU_LANGUAGES) ++//LIBBUILTIN(strlcpy, "zc*cC*z", "f", "string.h", ALL_GNU_LANGUAGES) ++//LIBBUILTIN(strlcat, "zc*cC*z", "f", "string.h", ALL_GNU_LANGUAGES) + // id objc_msgSend(id, SEL, ...) + LIBBUILTIN(objc_msgSend, "GGH.", "f", "objc/message.h", OBJC_LANG) + // long double objc_msgSend_fpret(id self, SEL op, ...) +--- a/clang/lib/AST/Decl.cpp ++++ b/clang/lib/AST/Decl.cpp +@@ -3455,13 +3455,13 @@ unsigned FunctionDecl::getMemoryFunction + case Builtin::BImemmove: + return Builtin::BImemmove; + +- case Builtin::BIstrlcpy: +- case Builtin::BI__builtin___strlcpy_chk: +- return Builtin::BIstrlcpy; ++// case Builtin::BIstrlcpy: ++// case Builtin::BI__builtin___strlcpy_chk: ++// return Builtin::BIstrlcpy; + +- case Builtin::BIstrlcat: +- case Builtin::BI__builtin___strlcat_chk: +- return Builtin::BIstrlcat; ++// case Builtin::BIstrlcat: ++// case Builtin::BI__builtin___strlcat_chk: ++// return Builtin::BIstrlcat; + + case Builtin::BI__builtin_memcmp: + case Builtin::BImemcmp: +--- a/clang/lib/Sema/SemaChecking.cpp ++++ b/clang/lib/Sema/SemaChecking.cpp +@@ -975,8 +975,8 @@ Sema::CheckBuiltinFunctionCall(FunctionD + case Builtin::BI__builtin___memcpy_chk: + case Builtin::BI__builtin___memmove_chk: + case Builtin::BI__builtin___memset_chk: +- case Builtin::BI__builtin___strlcat_chk: +- case Builtin::BI__builtin___strlcpy_chk: ++// case Builtin::BI__builtin___strlcat_chk: ++// case Builtin::BI__builtin___strlcpy_chk: + case Builtin::BI__builtin___strncat_chk: + case Builtin::BI__builtin___strncpy_chk: + case Builtin::BI__builtin___stpncpy_chk: +@@ -2512,9 +2512,10 @@ bool Sema::CheckFunctionCall(FunctionDec + return false; + + // Handle memory setting and copying functions. +- if (CMId == Builtin::BIstrlcpy || CMId == Builtin::BIstrlcat) +- CheckStrlcpycatArguments(TheCall, FnInfo); +- else if (CMId == Builtin::BIstrncat) ++// if (CMId == Builtin::BIstrlcpy || CMId == Builtin::BIstrlcat) ++// CheckStrlcpycatArguments(TheCall, FnInfo); ++// else ++ if (CMId == Builtin::BIstrncat) + CheckStrncatArguments(TheCall, FnInfo); + else + CheckMemaccessArguments(TheCall, CMId, FnInfo); +--- a/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp ++++ b/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp +@@ -237,9 +237,9 @@ GenericTaintChecker::TaintPropagationRul + case Builtin::BIstrncpy: + case Builtin::BIstrncat: + return TaintPropagationRule(1, 2, 0, true); +- case Builtin::BIstrlcpy: +- case Builtin::BIstrlcat: +- return TaintPropagationRule(1, 2, 0, false); ++// case Builtin::BIstrlcpy: ++// case Builtin::BIstrlcat: ++// return TaintPropagationRule(1, 2, 0, false); + case Builtin::BIstrndup: + return TaintPropagationRule(0, 1, ReturnValueIndex); + +--- a/clang/test/Sema/builtins.c ++++ b/clang/test/Sema/builtins.c +@@ -190,11 +190,11 @@ void test18() { + + ptr = __builtin___memccpy_chk(dst, src, '\037', sizeof(src), sizeof(dst)); + result = __builtin___strlcpy_chk(dst, src, sizeof(dst), sizeof(dst)); +- result = __builtin___strlcat_chk(dst, src, sizeof(dst), sizeof(dst)); ++// result = __builtin___strlcat_chk(dst, src, sizeof(dst), sizeof(dst)); + + ptr = __builtin___memccpy_chk(dst, src, '\037', sizeof(src)); // expected-error {{too few arguments to function call}} + ptr = __builtin___strlcpy_chk(dst, src, sizeof(dst), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}} +- ptr = __builtin___strlcat_chk(dst, src, sizeof(dst), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}} ++// ptr = __builtin___strlcat_chk(dst, src, sizeof(dst), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}} + } + + void no_ms_builtins() { +@@ -209,12 +209,12 @@ void unavailable() { + } + + // rdar://18259539 +-size_t strlcpy(char * restrict dst, const char * restrict src, size_t size); +-size_t strlcat(char * restrict dst, const char * restrict src, size_t size); ++//size_t strlcpy(char * restrict dst, const char * restrict src, size_t size); ++//size_t strlcat(char * restrict dst, const char * restrict src, size_t size); + + void Test19(void) + { +- static char b[40]; ++/* static char b[40]; + static char buf[20]; + + strlcpy(buf, b, sizeof(b)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} \\ +@@ -229,6 +229,7 @@ void Test19(void) + __builtin___strlcat_chk(buf, b, sizeof(b), __builtin_object_size(buf, 0)); // expected-warning {{size argument in '__builtin___strlcat_chk' call appears to be size of the source; expected the size of the destination}} \ + // expected-note {{change size argument to be the size of the destination}} \ + // expected-warning {{'__builtin___strlcat_chk' will always overflow destination buffer}} ++ */ + } + + // rdar://11076881 +--- a/clang/test/Sema/warn-strlcpycat-size.c ++++ /dev/null +@@ -1,55 +0,0 @@ +-// RUN: %clang_cc1 -Wstrlcpy-strlcat-size -verify -fsyntax-only %s +- +-typedef __SIZE_TYPE__ size_t; +-size_t strlcpy (char * restrict dst, const char * restrict src, size_t size); +-size_t strlcat (char * restrict dst, const char * restrict src, size_t size); +-size_t strlen (const char *s); +- +-char s1[100]; +-char s2[200]; +-char * s3; +- +-struct { +- char f1[100]; +- char f2[100][3]; +-} s4, **s5; +- +-int x; +- +-void f(void) +-{ +- strlcpy(s1, s2, sizeof(s1)); // no warning +- strlcpy(s1, s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}} +- strlcpy(s1, s3, strlen(s3)+1); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}} +- strlcat(s2, s3, sizeof(s3)); // expected-warning {{size argument in 'strlcat' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}} +- strlcpy(s4.f1, s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}} +- strlcpy((*s5)->f2[x], s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}} +- strlcpy(s1+3, s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} +-} +- +-// Don't issue FIXIT for flexible arrays. +-struct S { +- int y; +- char x[]; +-}; +- +-void flexible_arrays(struct S *s) { +- char str[] = "hi"; +- strlcpy(s->x, str, sizeof(str)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} +-} +- +-// Don't issue FIXIT for destinations of size 1. +-void size_1() { +- char z[1]; +- char str[] = "hi"; +- +- strlcpy(z, str, sizeof(str)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} +-} +- +-// Support VLAs. +-void vlas(int size) { +- char z[size]; +- char str[] = "hi"; +- +- strlcpy(z, str, sizeof(str)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}} +-} diff --git a/patches/26-set-correct-float-abi.diff b/patches/26-set-correct-float-abi.diff new file mode 100644 index 00000000..c7fe9311 --- /dev/null +++ b/patches/26-set-correct-float-abi.diff @@ -0,0 +1,33 @@ +Description: set correct float abi settings for armel and armhf + debian armel supports systems that don't have a fpu so should use a "float abi" + setting of soft by default. + + Debian armhf needs a float abi setting of "hard" +Author: Peter Michael Green + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: http://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +Index: llvm-toolchain-snapshot_5.0~svn297449/clang/lib/Driver/ToolChains/Arch/ARM.cpp +=================================================================== +--- llvm-toolchain-snapshot_5.0~svn297449.orig/clang/lib/Driver/ToolChains/Arch/ARM.cpp ++++ llvm-toolchain-snapshot_5.0~svn297449/clang/lib/Driver/ToolChains/Arch/ARM.cpp +@@ -206,7 +206,7 @@ arm::FloatABI arm::getARMFloatABI(const + case llvm::Triple::MuslEABI: + case llvm::Triple::EABI: + // EABI is always AAPCS, and if it was not marked 'hard', it's softfp +- ABI = FloatABI::SoftFP; ++ ABI = FloatABI::Soft; + break; + case llvm::Triple::Android: + ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft; diff --git a/patches/27-fix_clang_stdint.diff b/patches/27-fix_clang_stdint.diff new file mode 100644 index 00000000..f1c751fa --- /dev/null +++ b/patches/27-fix_clang_stdint.diff @@ -0,0 +1,29 @@ +Index: llvm-toolchain-snapshot_5.0~svn301630/clang/lib/Headers/stdint.h +=================================================================== +--- llvm-toolchain-snapshot_5.0~svn301630.orig/clang/lib/Headers/stdint.h ++++ llvm-toolchain-snapshot_5.0~svn301630/clang/lib/Headers/stdint.h +@@ -22,8 +22,6 @@ + * + \*===----------------------------------------------------------------------===*/ + +-#ifndef __CLANG_STDINT_H +-#define __CLANG_STDINT_H + + /* If we're hosted, fall back to the system's stdint.h, which might have + * additional definitions. +@@ -72,6 +70,8 @@ + # endif + + #else ++#ifndef __CLANG_STDINT_H ++#define __CLANG_STDINT_H + + /* C99 7.18.1.1 Exact-width integer types. + * C99 7.18.1.2 Minimum-width integer types. +@@ -700,5 +700,5 @@ typedef __UINTMAX_TYPE__ uintmax_t; + #define INTMAX_C(v) __int_c(v, __INTMAX_C_SUFFIX__) + #define UINTMAX_C(v) __int_c(v, __UINTMAX_C_SUFFIX__) + +-#endif /* __STDC_HOSTED__ */ + #endif /* __CLANG_STDINT_H */ ++#endif /* __STDC_HOSTED__ */ diff --git a/patches/D40146-JumpThreading-backport-1.diff b/patches/D40146-JumpThreading-backport-1.diff new file mode 100644 index 00000000..25415a37 --- /dev/null +++ b/patches/D40146-JumpThreading-backport-1.diff @@ -0,0 +1,2148 @@ +Index: llvm-toolchain-6.0-6.0.1/include/llvm/IR/Dominators.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/IR/Dominators.h ++++ llvm-toolchain-6.0-6.0.1/include/llvm/IR/Dominators.h +@@ -290,6 +290,90 @@ public: + void print(raw_ostream &OS, const Module *M = nullptr) const override; + }; + ++//===------------------------------------- ++/// \brief Class to defer updates to a DominatorTree. ++/// ++/// Definition: Applying updates to every edge insertion and deletion is ++/// expensive and not necessary. When one needs the DominatorTree for analysis ++/// they can request a flush() to perform a larger batch update. This has the ++/// advantage of the DominatorTree inspecting the set of updates to find ++/// duplicates or unnecessary subtree updates. ++/// ++/// The scope of DeferredDominance operates at a Function level. ++/// ++/// It is not necessary for the user to scrub the updates for duplicates or ++/// updates that point to the same block (Delete, BB_A, BB_A). Performance ++/// can be gained if the caller attempts to batch updates before submitting ++/// to applyUpdates(ArrayRef) in cases where duplicate edge requests will ++/// occur. ++/// ++/// It is required for the state of the LLVM IR to be applied *before* ++/// submitting updates. The update routines must analyze the current state ++/// between a pair of (From, To) basic blocks to determine if the update ++/// needs to be queued. ++/// Example (good): ++/// TerminatorInstructionBB->removeFromParent(); ++/// DDT->deleteEdge(BB, Successor); ++/// Example (bad): ++/// DDT->deleteEdge(BB, Successor); ++/// TerminatorInstructionBB->removeFromParent(); ++class DeferredDominance { ++public: ++ DeferredDominance(DominatorTree &DT_) : DT(DT_) {} ++ ++ /// \brief Queues multiple updates and discards duplicates. ++ void applyUpdates(ArrayRef Updates); ++ ++ /// \brief Helper method for a single edge insertion. It's almost always ++ /// better to batch updates and call applyUpdates to quickly remove duplicate ++ /// edges. This is best used when there is only a single insertion needed to ++ /// update Dominators. ++ void insertEdge(BasicBlock *From, BasicBlock *To); ++ ++ /// \brief Helper method for a single edge deletion. It's almost always better ++ /// to batch updates and call applyUpdates to quickly remove duplicate edges. ++ /// This is best used when there is only a single deletion needed to update ++ /// Dominators. ++ void deleteEdge(BasicBlock *From, BasicBlock *To); ++ ++ /// \brief Delays the deletion of a basic block until a flush() event. ++ void deleteBB(BasicBlock *DelBB); ++ ++ /// \brief Returns true if DelBB is awaiting deletion at a flush() event. ++ bool pendingDeletedBB(BasicBlock *DelBB); ++ ++ /// \brief Flushes all pending updates and block deletions. Returns a ++ /// correct DominatorTree reference to be used by the caller for analysis. ++ DominatorTree &flush(); ++ ++ /// \brief Drops all internal state and forces a (slow) recalculation of the ++ /// DominatorTree based on the current state of the LLVM IR in F. This should ++ /// only be used in corner cases such as the Entry block of F being deleted. ++ void recalculate(Function &F); ++ ++ /// \brief Debug method to help view the state of pending updates. ++ LLVM_DUMP_METHOD void dump() const; ++ ++private: ++ DominatorTree &DT; ++ SmallVector PendUpdates; ++ SmallPtrSet DeletedBBs; ++ ++ /// Apply an update (Kind, From, To) to the internal queued updates. The ++ /// update is only added when determined to be necessary. Checks for ++ /// self-domination, unnecessary updates, duplicate requests, and balanced ++ /// pairs of requests are all performed. Returns true if the update is ++ /// queued and false if it is discarded. ++ bool applyUpdate(DominatorTree::UpdateKind Kind, BasicBlock *From, ++ BasicBlock *To); ++ ++ /// Performs all pending basic block deletions. We have to defer the deletion ++ /// of these blocks until after the DominatorTree updates are applied. The ++ /// internal workings of the DominatorTree code expect every update's From ++ /// and To blocks to exist and to be a member of the same Function. ++ bool flushDelBB(); ++}; ++ + } // end namespace llvm + + #endif // LLVM_IR_DOMINATORS_H +Index: llvm-toolchain-6.0-6.0.1/include/llvm/Transforms/Scalar/JumpThreading.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/Transforms/Scalar/JumpThreading.h ++++ llvm-toolchain-6.0-6.0.1/include/llvm/Transforms/Scalar/JumpThreading.h +@@ -34,6 +34,7 @@ class BinaryOperator; + class BranchInst; + class CmpInst; + class Constant; ++class DeferredDominance; + class Function; + class Instruction; + class IntrinsicInst; +@@ -77,6 +78,7 @@ class JumpThreadingPass : public PassInf + TargetLibraryInfo *TLI; + LazyValueInfo *LVI; + AliasAnalysis *AA; ++ DeferredDominance *DDT; + std::unique_ptr BFI; + std::unique_ptr BPI; + bool HasProfileData = false; +@@ -107,8 +109,8 @@ public: + + // Glue for old PM. + bool runImpl(Function &F, TargetLibraryInfo *TLI_, LazyValueInfo *LVI_, +- AliasAnalysis *AA_, bool HasProfileData_, +- std::unique_ptr BFI_, ++ AliasAnalysis *AA_, DeferredDominance *DDT_, ++ bool HasProfileData_, std::unique_ptr BFI_, + std::unique_ptr BPI_); + + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); +Index: llvm-toolchain-6.0-6.0.1/include/llvm/Transforms/Utils/BasicBlockUtils.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/Transforms/Utils/BasicBlockUtils.h ++++ llvm-toolchain-6.0-6.0.1/include/llvm/Transforms/Utils/BasicBlockUtils.h +@@ -27,6 +27,7 @@ namespace llvm { + + class BlockFrequencyInfo; + class BranchProbabilityInfo; ++class DeferredDominance; + class DominatorTree; + class Function; + class Instruction; +@@ -38,7 +39,7 @@ class TargetLibraryInfo; + class Value; + + /// Delete the specified block, which must have no predecessors. +-void DeleteDeadBlock(BasicBlock *BB); ++void DeleteDeadBlock(BasicBlock *BB, DeferredDominance *DDT = nullptr); + + /// We know that BB has one predecessor. If there are any single-entry PHI nodes + /// in it, fold them away. This handles the case when all entries to the PHI +Index: llvm-toolchain-6.0-6.0.1/include/llvm/Transforms/Utils/Local.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/Transforms/Utils/Local.h ++++ llvm-toolchain-6.0-6.0.1/include/llvm/Transforms/Utils/Local.h +@@ -117,7 +117,8 @@ struct SimplifyCFGOptions { + /// conditions and indirectbr addresses this might make dead if + /// DeleteDeadConditions is true. + bool ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions = false, +- const TargetLibraryInfo *TLI = nullptr); ++ const TargetLibraryInfo *TLI = nullptr, ++ DeferredDominance *DDT = nullptr); + + //===----------------------------------------------------------------------===// + // Local dead code elimination. +@@ -171,18 +172,21 @@ bool SimplifyInstructionsInBlock(BasicBl + /// + /// .. and delete the predecessor corresponding to the '1', this will attempt to + /// recursively fold the 'and' to 0. +-void RemovePredecessorAndSimplify(BasicBlock *BB, BasicBlock *Pred); ++void RemovePredecessorAndSimplify(BasicBlock *BB, BasicBlock *Pred, ++ DeferredDominance *DDT = nullptr); + + /// BB is a block with one predecessor and its predecessor is known to have one + /// successor (BB!). Eliminate the edge between them, moving the instructions in + /// the predecessor into BB. This deletes the predecessor block. +-void MergeBasicBlockIntoOnlyPred(BasicBlock *BB, DominatorTree *DT = nullptr); ++void MergeBasicBlockIntoOnlyPred(BasicBlock *BB, DominatorTree *DT = nullptr, ++ DeferredDominance *DDT = nullptr); + + /// BB is known to contain an unconditional branch, and contains no instructions + /// other than PHI nodes, potential debug intrinsics and the branch. If + /// possible, eliminate BB by rewriting all the predecessors to branch to the + /// successor block and return true. If we can't transform, return false. +-bool TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB); ++bool TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB, ++ DeferredDominance *DDT = nullptr); + + /// Check for and eliminate duplicate PHI nodes in this block. This doesn't try + /// to be clever about PHI nodes which differ only in the order of the incoming +@@ -382,7 +386,8 @@ unsigned removeAllNonTerminatorAndEHPadI + /// Insert an unreachable instruction before the specified + /// instruction, making it and the rest of the code in the block dead. + unsigned changeToUnreachable(Instruction *I, bool UseLLVMTrap, +- bool PreserveLCSSA = false); ++ bool PreserveLCSSA = false, ++ DeferredDominance *DDT = nullptr); + + /// Convert the CallInst to InvokeInst with the specified unwind edge basic + /// block. This also splits the basic block where CI is located, because +@@ -397,12 +402,13 @@ BasicBlock *changeToInvokeAndSplitBasicB + /// + /// \param BB Block whose terminator will be replaced. Its terminator must + /// have an unwind successor. +-void removeUnwindEdge(BasicBlock *BB); ++void removeUnwindEdge(BasicBlock *BB, DeferredDominance *DDT = nullptr); + + /// Remove all blocks that can not be reached from the function's entry. + /// + /// Returns true if any basic block was removed. +-bool removeUnreachableBlocks(Function &F, LazyValueInfo *LVI = nullptr); ++bool removeUnreachableBlocks(Function &F, LazyValueInfo *LVI = nullptr, ++ DeferredDominance *DDT = nullptr); + + /// Combine the metadata of two instructions so that K can replace J + /// +Index: llvm-toolchain-6.0-6.0.1/lib/IR/Dominators.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/IR/Dominators.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/IR/Dominators.cpp +@@ -18,6 +18,7 @@ + #include "llvm/ADT/DepthFirstIterator.h" + #include "llvm/ADT/SmallPtrSet.h" + #include "llvm/IR/CFG.h" ++#include "llvm/IR/Constants.h" + #include "llvm/IR/Instructions.h" + #include "llvm/IR/PassManager.h" + #include "llvm/Support/CommandLine.h" +@@ -389,3 +390,190 @@ void DominatorTreeWrapperPass::print(raw + DT.print(OS); + } + ++//===----------------------------------------------------------------------===// ++// DeferredDominance Implementation ++//===----------------------------------------------------------------------===// ++// ++// The implementation details of the DeferredDominance class which allows ++// one to queue updates to a DominatorTree. ++// ++//===----------------------------------------------------------------------===// ++ ++/// \brief Queues multiple updates and discards duplicates. ++void DeferredDominance::applyUpdates( ++ ArrayRef Updates) { ++ SmallVector Seen; ++ for (auto U : Updates) ++ // Avoid duplicates to applyUpdate() to save on analysis. ++ if (std::none_of(Seen.begin(), Seen.end(), ++ [U](DominatorTree::UpdateType S) { return S == U; })) { ++ Seen.push_back(U); ++ applyUpdate(U.getKind(), U.getFrom(), U.getTo()); ++ } ++} ++ ++/// \brief Helper method for a single edge insertion. It's almost always better ++/// to batch updates and call applyUpdates to quickly remove duplicate edges. ++/// This is best used when there is only a single insertion needed to update ++/// Dominators. ++void DeferredDominance::insertEdge(BasicBlock *From, BasicBlock *To) { ++ applyUpdate(DominatorTree::Insert, From, To); ++} ++ ++/// \brief Helper method for a single edge deletion. It's almost always better ++/// to batch updates and call applyUpdates to quickly remove duplicate edges. ++/// This is best used when there is only a single deletion needed to update ++/// Dominators. ++void DeferredDominance::deleteEdge(BasicBlock *From, BasicBlock *To) { ++ applyUpdate(DominatorTree::Delete, From, To); ++} ++ ++/// \brief Delays the deletion of a basic block until a flush() event. ++void DeferredDominance::deleteBB(BasicBlock *DelBB) { ++ assert(DelBB && "Invalid push_back of nullptr DelBB."); ++ assert(pred_empty(DelBB) && "DelBB has one or more predecessors."); ++ // DelBB is unreachable and all its instructions are dead. ++ while (!DelBB->empty()) { ++ Instruction &I = DelBB->back(); ++ // Replace used instructions with an arbitrary value (undef). ++ if (!I.use_empty()) ++ I.replaceAllUsesWith(llvm::UndefValue::get(I.getType())); ++ DelBB->getInstList().pop_back(); ++ } ++ // Make sure DelBB has a valid terminator instruction. As long as DelBB is a ++ // Child of Function F it must contain valid IR. ++ new UnreachableInst(DelBB->getContext(), DelBB); ++ DeletedBBs.insert(DelBB); ++} ++ ++/// \brief Returns true if DelBB is awaiting deletion at a flush() event. ++bool DeferredDominance::pendingDeletedBB(BasicBlock *DelBB) { ++ if (DeletedBBs.empty()) ++ return false; ++ return DeletedBBs.count(DelBB) != 0; ++} ++ ++/// \brief Flushes all pending updates and block deletions. Returns a ++/// correct DominatorTree reference to be used by the caller for analysis. ++DominatorTree &DeferredDominance::flush() { ++ // Updates to DT must happen before blocks are deleted below. Otherwise the ++ // DT traversal will encounter badref blocks and assert. ++ if (!PendUpdates.empty()) { ++ DT.applyUpdates(PendUpdates); ++ PendUpdates.clear(); ++ } ++ flushDelBB(); ++ return DT; ++} ++ ++/// \brief Drops all internal state and forces a (slow) recalculation of the ++/// DominatorTree based on the current state of the LLVM IR in F. This should ++/// only be used in corner cases such as the Entry block of F being deleted. ++void DeferredDominance::recalculate(Function &F) { ++ // flushDelBB must be flushed before the recalculation. The state of the IR ++ // must be consistent before the DT traversal algorithm determines the ++ // actual DT. ++ if (flushDelBB() || !PendUpdates.empty()) { ++ DT.recalculate(F); ++ PendUpdates.clear(); ++ } ++} ++ ++/// \brief Debug method to help view the state of pending updates. ++#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) ++LLVM_DUMP_METHOD void DeferredDominance::dump() const { ++ raw_ostream &OS = llvm::dbgs(); ++ OS << "PendUpdates:\n"; ++ int I = 0; ++ for (auto U : PendUpdates) { ++ OS << " " << I << " : "; ++ ++I; ++ if (U.getKind() == DominatorTree::Insert) ++ OS << "Insert, "; ++ else ++ OS << "Delete, "; ++ BasicBlock *From = U.getFrom(); ++ if (From) { ++ auto S = From->getName(); ++ if (!From->hasName()) ++ S = "(no name)"; ++ OS << S << "(" << From << "), "; ++ } else { ++ OS << "(badref), "; ++ } ++ BasicBlock *To = U.getTo(); ++ if (To) { ++ auto S = To->getName(); ++ if (!To->hasName()) ++ S = "(no_name)"; ++ OS << S << "(" << To << ")\n"; ++ } else { ++ OS << "(badref)\n"; ++ } ++ } ++ OS << "DeletedBBs:\n"; ++ I = 0; ++ for (auto BB : DeletedBBs) { ++ OS << " " << I << " : "; ++ ++I; ++ if (BB->hasName()) ++ OS << BB->getName() << "("; ++ else ++ OS << "(no_name)("; ++ OS << BB << ")\n"; ++ } ++} ++#endif ++ ++/// Apply an update (Kind, From, To) to the internal queued updates. The ++/// update is only added when determined to be necessary. Checks for ++/// self-domination, unnecessary updates, duplicate requests, and balanced ++/// pairs of requests are all performed. Returns true if the update is ++/// queued and false if it is discarded. ++bool DeferredDominance::applyUpdate(DominatorTree::UpdateKind Kind, ++ BasicBlock *From, BasicBlock *To) { ++ if (From == To) ++ return false; // Cannot dominate self; discard update. ++ ++ // Discard updates by inspecting the current state of successors of From. ++ // Since applyUpdate() must be called *after* the Terminator of From is ++ // altered we can determine if the update is unnecessary. ++ bool HasEdge = std::any_of(succ_begin(From), succ_end(From), ++ [To](BasicBlock *B) { return B == To; }); ++ if (Kind == DominatorTree::Insert && !HasEdge) ++ return false; // Unnecessary Insert: edge does not exist in IR. ++ if (Kind == DominatorTree::Delete && HasEdge) ++ return false; // Unnecessary Delete: edge still exists in IR. ++ ++ // Analyze pending updates to determine if the update is unnecessary. ++ DominatorTree::UpdateType Update = {Kind, From, To}; ++ DominatorTree::UpdateType Invert = {Kind != DominatorTree::Insert ++ ? DominatorTree::Insert ++ : DominatorTree::Delete, ++ From, To}; ++ for (auto I = PendUpdates.begin(), E = PendUpdates.end(); I != E; ++I) { ++ if (Update == *I) ++ return false; // Discard duplicate updates. ++ if (Invert == *I) { ++ // Update and Invert are both valid (equivalent to a no-op). Remove ++ // Invert from PendUpdates and discard the Update. ++ PendUpdates.erase(I); ++ return false; ++ } ++ } ++ PendUpdates.push_back(Update); // Save the valid update. ++ return true; ++} ++ ++/// Performs all pending basic block deletions. We have to defer the deletion ++/// of these blocks until after the DominatorTree updates are applied. The ++/// internal workings of the DominatorTree code expect every update's From ++/// and To blocks to exist and to be a member of the same Function. ++bool DeferredDominance::flushDelBB() { ++ if (DeletedBBs.empty()) ++ return false; ++ for (auto *BB : DeletedBBs) ++ BB->eraseFromParent(); ++ DeletedBBs.clear(); ++ return true; ++} +Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp +@@ -77,6 +77,7 @@ namespace { + bool runOnFunction(Function &F) override; + + void getAnalysisUsage(AnalysisUsage &AU) const override { ++ AU.addRequired(); + AU.addRequired(); + AU.addPreserved(); + } +@@ -88,6 +89,7 @@ char CorrelatedValuePropagation::ID = 0; + + INITIALIZE_PASS_BEGIN(CorrelatedValuePropagation, "correlated-propagation", + "Value Propagation", false, false) ++INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) + INITIALIZE_PASS_DEPENDENCY(LazyValueInfoWrapperPass) + INITIALIZE_PASS_END(CorrelatedValuePropagation, "correlated-propagation", + "Value Propagation", false, false) +Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/JumpThreading.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Scalar/JumpThreading.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/JumpThreading.cpp +@@ -131,10 +131,11 @@ namespace { + bool runOnFunction(Function &F) override; + + void getAnalysisUsage(AnalysisUsage &AU) const override { +- if (PrintLVIAfterJumpThreading) +- AU.addRequired(); ++ AU.addRequired(); ++ AU.addPreserved(); + AU.addRequired(); + AU.addRequired(); ++ AU.addPreserved(); + AU.addPreserved(); + AU.addRequired(); + } +@@ -148,6 +149,7 @@ char JumpThreading::ID = 0; + + INITIALIZE_PASS_BEGIN(JumpThreading, "jump-threading", + "Jump Threading", false, false) ++INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) + INITIALIZE_PASS_DEPENDENCY(LazyValueInfoWrapperPass) + INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) + INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) +@@ -278,8 +280,12 @@ bool JumpThreading::runOnFunction(Functi + if (skipFunction(F)) + return false; + auto TLI = &getAnalysis().getTLI(); ++ // Get DT analysis before LVI. When LVI is initialized it conditionally adds ++ // DT if it's available. ++ auto DT = &getAnalysis().getDomTree(); + auto LVI = &getAnalysis().getLVI(); + auto AA = &getAnalysis().getAAResults(); ++ DeferredDominance DDT(*DT); + std::unique_ptr BFI; + std::unique_ptr BPI; + bool HasProfileData = F.hasProfileData(); +@@ -289,12 +295,11 @@ bool JumpThreading::runOnFunction(Functi + BFI.reset(new BlockFrequencyInfo(F, *BPI, LI)); + } + +- bool Changed = Impl.runImpl(F, TLI, LVI, AA, HasProfileData, std::move(BFI), +- std::move(BPI)); ++ bool Changed = Impl.runImpl(F, TLI, LVI, AA, &DDT, HasProfileData, ++ std::move(BFI), std::move(BPI)); + if (PrintLVIAfterJumpThreading) { + dbgs() << "LVI for function '" << F.getName() << "':\n"; +- LVI->printLVI(F, getAnalysis().getDomTree(), +- dbgs()); ++ LVI->printLVI(F, *DT, dbgs()); + } + return Changed; + } +@@ -302,8 +307,12 @@ bool JumpThreading::runOnFunction(Functi + PreservedAnalyses JumpThreadingPass::run(Function &F, + FunctionAnalysisManager &AM) { + auto &TLI = AM.getResult(F); ++ // Get DT analysis before LVI. When LVI is initialized it conditionally adds ++ // DT if it's available. ++ auto &DT = AM.getResult(F); + auto &LVI = AM.getResult(F); + auto &AA = AM.getResult(F); ++ DeferredDominance DDT(DT); + + std::unique_ptr BFI; + std::unique_ptr BPI; +@@ -313,25 +322,28 @@ PreservedAnalyses JumpThreadingPass::run + BFI.reset(new BlockFrequencyInfo(F, *BPI, LI)); + } + +- bool Changed = runImpl(F, &TLI, &LVI, &AA, HasProfileData, std::move(BFI), +- std::move(BPI)); ++ bool Changed = runImpl(F, &TLI, &LVI, &AA, &DDT, HasProfileData, ++ std::move(BFI), std::move(BPI)); + + if (!Changed) + return PreservedAnalyses::all(); + PreservedAnalyses PA; + PA.preserve(); ++ PA.preserve(); ++ PA.preserve(); + return PA; + } + + bool JumpThreadingPass::runImpl(Function &F, TargetLibraryInfo *TLI_, + LazyValueInfo *LVI_, AliasAnalysis *AA_, +- bool HasProfileData_, ++ DeferredDominance *DDT_, bool HasProfileData_, + std::unique_ptr BFI_, + std::unique_ptr BPI_) { + DEBUG(dbgs() << "Jump threading on function '" << F.getName() << "'\n"); + TLI = TLI_; + LVI = LVI_; + AA = AA_; ++ DDT = DDT_; + BFI.reset(); + BPI.reset(); + // When profile data is available, we need to update edge weights after +@@ -353,7 +365,7 @@ bool JumpThreadingPass::runImpl(Function + // back edges. This works for normal cases but not for unreachable blocks as + // they may have cycle with no back edge. + bool EverChanged = false; +- EverChanged |= removeUnreachableBlocks(F, LVI); ++ EverChanged |= removeUnreachableBlocks(F, LVI, DDT); + + FindLoopHeaders(F); + +@@ -368,6 +380,10 @@ bool JumpThreadingPass::runImpl(Function + + ++I; + ++ // Don't thread branches over a block that's slated for deletion. ++ if (DDT->pendingDeletedBB(BB)) ++ continue; ++ + // If the block is trivially dead, zap it. This eliminates the successor + // edges which simplifies the CFG. + if (pred_empty(BB) && +@@ -376,7 +392,7 @@ bool JumpThreadingPass::runImpl(Function + << "' with terminator: " << *BB->getTerminator() << '\n'); + LoopHeaders.erase(BB); + LVI->eraseBlock(BB); +- DeleteDeadBlock(BB); ++ DeleteDeadBlock(BB, DDT); + Changed = true; + continue; + } +@@ -400,7 +416,7 @@ bool JumpThreadingPass::runImpl(Function + // awesome, but it allows us to use AssertingVH to prevent nasty + // dangling pointer issues within LazyValueInfo. + LVI->eraseBlock(BB); +- if (TryToSimplifyUncondBranchFromEmptyBlock(BB)) ++ if (TryToSimplifyUncondBranchFromEmptyBlock(BB, DDT)) + Changed = true; + } + } +@@ -408,6 +424,7 @@ bool JumpThreadingPass::runImpl(Function + } while (Changed); + + LoopHeaders.clear(); ++ DDT->flush(); + return EverChanged; + } + +@@ -931,8 +948,8 @@ static bool hasAddressTakenAndUsed(Basic + bool JumpThreadingPass::ProcessBlock(BasicBlock *BB) { + // If the block is trivially dead, just return and let the caller nuke it. + // This simplifies other transformations. +- if (pred_empty(BB) && +- BB != &BB->getParent()->getEntryBlock()) ++ if (DDT->pendingDeletedBB(BB) || ++ (pred_empty(BB) && BB != &BB->getParent()->getEntryBlock())) + return false; + + // If this block has a single predecessor, and if that pred has a single +@@ -948,7 +965,7 @@ bool JumpThreadingPass::ProcessBlock(Bas + LoopHeaders.insert(BB); + + LVI->eraseBlock(SinglePred); +- MergeBasicBlockIntoOnlyPred(BB); ++ MergeBasicBlockIntoOnlyPred(BB, nullptr, DDT); + + // Now that BB is merged into SinglePred (i.e. SinglePred Code followed by + // BB code within one basic block `BB`), we need to invalidate the LVI +@@ -1031,18 +1048,23 @@ bool JumpThreadingPass::ProcessBlock(Bas + // successors to branch to. Let GetBestDestForJumpOnUndef decide. + if (isa(Condition)) { + unsigned BestSucc = GetBestDestForJumpOnUndef(BB); ++ std::vector Updates; + + // Fold the branch/switch. + TerminatorInst *BBTerm = BB->getTerminator(); ++ Updates.reserve(BBTerm->getNumSuccessors()); + for (unsigned i = 0, e = BBTerm->getNumSuccessors(); i != e; ++i) { + if (i == BestSucc) continue; +- BBTerm->getSuccessor(i)->removePredecessor(BB, true); ++ BasicBlock *Succ = BBTerm->getSuccessor(i); ++ Succ->removePredecessor(BB, true); ++ Updates.push_back({DominatorTree::Delete, BB, Succ}); + } + + DEBUG(dbgs() << " In block '" << BB->getName() + << "' folding undef terminator: " << *BBTerm << '\n'); + BranchInst::Create(BBTerm->getSuccessor(BestSucc), BBTerm); + BBTerm->eraseFromParent(); ++ DDT->applyUpdates(Updates); + return true; + } + +@@ -1053,7 +1075,7 @@ bool JumpThreadingPass::ProcessBlock(Bas + DEBUG(dbgs() << " In block '" << BB->getName() + << "' folding terminator: " << *BB->getTerminator() << '\n'); + ++NumFolds; +- ConstantFoldTerminator(BB, true); ++ ConstantFoldTerminator(BB, true, nullptr, DDT); + return true; + } + +@@ -1086,7 +1108,8 @@ bool JumpThreadingPass::ProcessBlock(Bas + if (Ret != LazyValueInfo::Unknown) { + unsigned ToRemove = Ret == LazyValueInfo::True ? 1 : 0; + unsigned ToKeep = Ret == LazyValueInfo::True ? 0 : 1; +- CondBr->getSuccessor(ToRemove)->removePredecessor(BB, true); ++ BasicBlock *ToRemoveSucc = CondBr->getSuccessor(ToRemove); ++ ToRemoveSucc->removePredecessor(BB, true); + BranchInst::Create(CondBr->getSuccessor(ToKeep), CondBr); + CondBr->eraseFromParent(); + if (CondCmp->use_empty()) +@@ -1104,6 +1127,7 @@ bool JumpThreadingPass::ProcessBlock(Bas + ConstantInt::getFalse(CondCmp->getType()); + ReplaceFoldableUses(CondCmp, CI); + } ++ DDT->deleteEdge(BB, ToRemoveSucc); + return true; + } + +@@ -1182,9 +1206,12 @@ bool JumpThreadingPass::ProcessImpliedCo + Optional Implication = + isImpliedCondition(PBI->getCondition(), Cond, DL, CondIsTrue); + if (Implication) { +- BI->getSuccessor(*Implication ? 1 : 0)->removePredecessor(BB); +- BranchInst::Create(BI->getSuccessor(*Implication ? 0 : 1), BI); ++ BasicBlock *KeepSucc = BI->getSuccessor(*Implication ? 0 : 1); ++ BasicBlock *RemoveSucc = BI->getSuccessor(*Implication ? 1 : 0); ++ RemoveSucc->removePredecessor(BB); ++ BranchInst::Create(KeepSucc, BI); + BI->eraseFromParent(); ++ DDT->deleteEdge(BB, RemoveSucc); + return true; + } + CurrentBB = CurrentPred; +@@ -1594,17 +1621,22 @@ bool JumpThreadingPass::ProcessThreadabl + if (PredWithKnownDest == + (size_t)std::distance(pred_begin(BB), pred_end(BB))) { + bool SeenFirstBranchToOnlyDest = false; ++ std::vector Updates; ++ Updates.reserve(BB->getTerminator()->getNumSuccessors() - 1); + for (BasicBlock *SuccBB : successors(BB)) { +- if (SuccBB == OnlyDest && !SeenFirstBranchToOnlyDest) ++ if (SuccBB == OnlyDest && !SeenFirstBranchToOnlyDest) { + SeenFirstBranchToOnlyDest = true; // Don't modify the first branch. +- else ++ } else { + SuccBB->removePredecessor(BB, true); // This is unreachable successor. ++ Updates.push_back({DominatorTree::Delete, BB, SuccBB}); ++ } + } + + // Finally update the terminator. + TerminatorInst *Term = BB->getTerminator(); + BranchInst::Create(OnlyDest, Term); + Term->eraseFromParent(); ++ DDT->applyUpdates(Updates); + + // If the condition is now dead due to the removal of the old terminator, + // erase it. +@@ -1979,6 +2011,10 @@ bool JumpThreadingPass::ThreadEdge(Basic + PredTerm->setSuccessor(i, NewBB); + } + ++ DDT->applyUpdates({{DominatorTree::Insert, NewBB, SuccBB}, ++ {DominatorTree::Insert, PredBB, NewBB}, ++ {DominatorTree::Delete, PredBB, BB}}); ++ + // At this point, the IR is fully up to date and consistent. Do a quick scan + // over the new instructions and zap any that are constants or dead. This + // frequently happens because of phi translation. +@@ -1998,20 +2034,42 @@ bool JumpThreadingPass::ThreadEdge(Basic + BasicBlock *JumpThreadingPass::SplitBlockPreds(BasicBlock *BB, + ArrayRef Preds, + const char *Suffix) { ++ SmallVector NewBBs; ++ + // Collect the frequencies of all predecessors of BB, which will be used to +- // update the edge weight on BB->SuccBB. +- BlockFrequency PredBBFreq(0); ++ // update the edge weight of the result of splitting predecessors. ++ DenseMap FreqMap; + if (HasProfileData) + for (auto Pred : Preds) +- PredBBFreq += BFI->getBlockFreq(Pred) * BPI->getEdgeProbability(Pred, BB); ++ FreqMap.insert(std::make_pair( ++ Pred, BFI->getBlockFreq(Pred) * BPI->getEdgeProbability(Pred, BB))); ++ ++ // In the case when BB is a LandingPad block we create 2 new predecessors ++ // instead of just one. ++ if (BB->isLandingPad()) { ++ std::string NewName = std::string(Suffix) + ".split-lp"; ++ SplitLandingPadPredecessors(BB, Preds, Suffix, NewName.c_str(), NewBBs); ++ } else { ++ NewBBs.push_back(SplitBlockPredecessors(BB, Preds, Suffix)); ++ } + +- BasicBlock *PredBB = SplitBlockPredecessors(BB, Preds, Suffix); ++ std::vector Updates; ++ Updates.reserve((2 * Preds.size()) + NewBBs.size()); ++ for (auto NewBB : NewBBs) { ++ BlockFrequency NewBBFreq(0); ++ Updates.push_back({DominatorTree::Insert, NewBB, BB}); ++ for (auto Pred : predecessors(NewBB)) { ++ Updates.push_back({DominatorTree::Delete, Pred, BB}); ++ Updates.push_back({DominatorTree::Insert, Pred, NewBB}); ++ if (HasProfileData) // Update frequencies between Pred -> NewBB. ++ NewBBFreq += FreqMap.lookup(Pred); ++ } ++ if (HasProfileData) // Apply the summed frequency to NewBB. ++ BFI->setBlockFreq(NewBB, NewBBFreq.getFrequency()); ++ } + +- // Set the block frequency of the newly created PredBB, which is the sum of +- // frequencies of Preds. +- if (HasProfileData) +- BFI->setBlockFreq(PredBB, PredBBFreq.getFrequency()); +- return PredBB; ++ DDT->applyUpdates(Updates); ++ return NewBBs[0]; + } + + bool JumpThreadingPass::doesBlockHaveProfileData(BasicBlock *BB) { +@@ -2155,6 +2213,7 @@ bool JumpThreadingPass::DuplicateCondBra + } + + // And finally, do it! Start by factoring the predecessors if needed. ++ std::vector Updates; + BasicBlock *PredBB; + if (PredBBs.size() == 1) + PredBB = PredBBs[0]; +@@ -2163,6 +2222,7 @@ bool JumpThreadingPass::DuplicateCondBra + << " common predecessors.\n"); + PredBB = SplitBlockPreds(BB, PredBBs, ".thr_comm"); + } ++ Updates.push_back({DominatorTree::Delete, PredBB, BB}); + + // Okay, we decided to do this! Clone all the instructions in BB onto the end + // of PredBB. +@@ -2175,7 +2235,11 @@ bool JumpThreadingPass::DuplicateCondBra + BranchInst *OldPredBranch = dyn_cast(PredBB->getTerminator()); + + if (!OldPredBranch || !OldPredBranch->isUnconditional()) { +- PredBB = SplitEdge(PredBB, BB); ++ BasicBlock *OldPredBB = PredBB; ++ PredBB = SplitEdge(OldPredBB, BB); ++ Updates.push_back({DominatorTree::Insert, OldPredBB, PredBB}); ++ Updates.push_back({DominatorTree::Insert, PredBB, BB}); ++ Updates.push_back({DominatorTree::Delete, OldPredBB, BB}); + OldPredBranch = cast(PredBB->getTerminator()); + } + +@@ -2217,6 +2281,10 @@ bool JumpThreadingPass::DuplicateCondBra + // Otherwise, insert the new instruction into the block. + New->setName(BI->getName()); + PredBB->getInstList().insert(OldPredBranch->getIterator(), New); ++ // Update Dominance from simplified New instruction operands. ++ for (unsigned i = 0, e = New->getNumOperands(); i != e; ++i) ++ if (BasicBlock *SuccBB = dyn_cast(New->getOperand(i))) ++ Updates.push_back({DominatorTree::Insert, PredBB, SuccBB}); + } + } + +@@ -2272,6 +2340,7 @@ bool JumpThreadingPass::DuplicateCondBra + + // Remove the unconditional branch at the end of the PredBB block. + OldPredBranch->eraseFromParent(); ++ DDT->applyUpdates(Updates); + + ++NumDupes; + return true; +@@ -2344,6 +2413,8 @@ bool JumpThreadingPass::TryToUnfoldSelec + // The select is now dead. + SI->eraseFromParent(); + ++ DDT->applyUpdates({{DominatorTree::Insert, NewBB, BB}, ++ {DominatorTree::Insert, Pred, NewBB}}); + // Update any other PHI nodes in BB. + for (BasicBlock::iterator BI = BB->begin(); + PHINode *Phi = dyn_cast(BI); ++BI) +@@ -2422,11 +2493,25 @@ bool JumpThreadingPass::TryToUnfoldSelec + // Expand the select. + TerminatorInst *Term = + SplitBlockAndInsertIfThen(SI->getCondition(), SI, false); ++ BasicBlock *SplitBB = SI->getParent(); ++ BasicBlock *NewBB = Term->getParent(); + PHINode *NewPN = PHINode::Create(SI->getType(), 2, "", SI); + NewPN->addIncoming(SI->getTrueValue(), Term->getParent()); + NewPN->addIncoming(SI->getFalseValue(), BB); + SI->replaceAllUsesWith(NewPN); + SI->eraseFromParent(); ++ // NewBB and SplitBB are newly created blocks which require insertion. ++ std::vector Updates; ++ Updates.reserve((2 * SplitBB->getTerminator()->getNumSuccessors()) + 3); ++ Updates.push_back({DominatorTree::Insert, BB, SplitBB}); ++ Updates.push_back({DominatorTree::Insert, BB, NewBB}); ++ Updates.push_back({DominatorTree::Insert, NewBB, SplitBB}); ++ // BB's successors were moved to SplitBB, update DDT accordingly. ++ for (auto *Succ : successors(SplitBB)) { ++ Updates.push_back({DominatorTree::Delete, BB, Succ}); ++ Updates.push_back({DominatorTree::Insert, SplitBB, Succ}); ++ } ++ DDT->applyUpdates(Updates); + return true; + } + return false; +@@ -2513,8 +2598,8 @@ bool JumpThreadingPass::ThreadGuard(Basi + if (!TrueDestIsSafe && !FalseDestIsSafe) + return false; + +- BasicBlock *UnguardedBlock = TrueDestIsSafe ? TrueDest : FalseDest; +- BasicBlock *GuardedBlock = FalseDestIsSafe ? TrueDest : FalseDest; ++ BasicBlock *PredUnguardedBlock = TrueDestIsSafe ? TrueDest : FalseDest; ++ BasicBlock *PredGuardedBlock = FalseDestIsSafe ? TrueDest : FalseDest; + + ValueToValueMapTy UnguardedMapping, GuardedMapping; + Instruction *AfterGuard = Guard->getNextNode(); +@@ -2523,18 +2608,29 @@ bool JumpThreadingPass::ThreadGuard(Basi + return false; + // Duplicate all instructions before the guard and the guard itself to the + // branch where implication is not proved. +- GuardedBlock = DuplicateInstructionsInSplitBetween( +- BB, GuardedBlock, AfterGuard, GuardedMapping); ++ BasicBlock *GuardedBlock = DuplicateInstructionsInSplitBetween( ++ BB, PredGuardedBlock, AfterGuard, GuardedMapping); + assert(GuardedBlock && "Could not create the guarded block?"); + // Duplicate all instructions before the guard in the unguarded branch. + // Since we have successfully duplicated the guarded block and this block + // has fewer instructions, we expect it to succeed. +- UnguardedBlock = DuplicateInstructionsInSplitBetween(BB, UnguardedBlock, +- Guard, UnguardedMapping); ++ BasicBlock *UnguardedBlock = DuplicateInstructionsInSplitBetween( ++ BB, PredUnguardedBlock, Guard, UnguardedMapping); + assert(UnguardedBlock && "Could not create the unguarded block?"); + DEBUG(dbgs() << "Moved guard " << *Guard << " to block " + << GuardedBlock->getName() << "\n"); +- ++ // DuplicateInstructionsInSplitBetween inserts a new block "BB.split" between ++ // PredBB and BB. We need to perform two inserts and one delete for each of ++ // the above calls to update Dominators. ++ DDT->applyUpdates( ++ {// Guarded block split. ++ {DominatorTree::Delete, PredGuardedBlock, BB}, ++ {DominatorTree::Insert, PredGuardedBlock, GuardedBlock}, ++ {DominatorTree::Insert, GuardedBlock, BB}, ++ // Unguarded block split. ++ {DominatorTree::Delete, PredUnguardedBlock, BB}, ++ {DominatorTree::Insert, PredUnguardedBlock, UnguardedBlock}, ++ {DominatorTree::Insert, UnguardedBlock, BB}}); + // Some instructions before the guard may still have uses. For them, we need + // to create Phi nodes merging their copies in both guarded and unguarded + // branches. Those instructions that have no uses can be just removed. +Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Utils/BasicBlockUtils.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Utils/BasicBlockUtils.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Utils/BasicBlockUtils.cpp +@@ -45,16 +45,22 @@ + + using namespace llvm; + +-void llvm::DeleteDeadBlock(BasicBlock *BB) { ++void llvm::DeleteDeadBlock(BasicBlock *BB, DeferredDominance *DDT) { + assert((pred_begin(BB) == pred_end(BB) || + // Can delete self loop. + BB->getSinglePredecessor() == BB) && "Block is not dead!"); + TerminatorInst *BBTerm = BB->getTerminator(); ++ std::vector Updates; + + // Loop through all of our successors and make sure they know that one + // of their predecessors is going away. +- for (BasicBlock *Succ : BBTerm->successors()) ++ if (DDT) ++ Updates.reserve(BBTerm->getNumSuccessors()); ++ for (BasicBlock *Succ : BBTerm->successors()) { + Succ->removePredecessor(BB); ++ if (DDT) ++ Updates.push_back({DominatorTree::Delete, BB, Succ}); ++ } + + // Zap all the instructions in the block. + while (!BB->empty()) { +@@ -69,8 +75,12 @@ void llvm::DeleteDeadBlock(BasicBlock *B + BB->getInstList().pop_back(); + } + +- // Zap the block! +- BB->eraseFromParent(); ++ if (DDT) { ++ DDT->applyUpdates(Updates); ++ DDT->deleteBB(BB); // Deferred deletion of BB. ++ } else { ++ BB->eraseFromParent(); // Zap the block! ++ } + } + + void llvm::FoldSingleEntryPHINodes(BasicBlock *BB, +Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Utils/Local.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Utils/Local.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Utils/Local.cpp +@@ -100,7 +100,8 @@ STATISTIC(NumRemoved, "Number of unreach + /// conditions and indirectbr addresses this might make dead if + /// DeleteDeadConditions is true. + bool llvm::ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions, +- const TargetLibraryInfo *TLI) { ++ const TargetLibraryInfo *TLI, ++ DeferredDominance *DDT) { + TerminatorInst *T = BB->getTerminator(); + IRBuilder<> Builder(T); + +@@ -123,6 +124,8 @@ bool llvm::ConstantFoldTerminator(BasicB + // Replace the conditional branch with an unconditional one. + Builder.CreateBr(Destination); + BI->eraseFromParent(); ++ if (DDT) ++ DDT->deleteEdge(BB, OldDest); + return true; + } + +@@ -193,9 +196,12 @@ bool llvm::ConstantFoldTerminator(BasicB + createBranchWeights(Weights)); + } + // Remove this entry. +- DefaultDest->removePredecessor(SI->getParent()); ++ BasicBlock *ParentBB = SI->getParent(); ++ DefaultDest->removePredecessor(ParentBB); + i = SI->removeCase(i); + e = SI->case_end(); ++ if (DDT) ++ DDT->deleteEdge(ParentBB, DefaultDest); + continue; + } + +@@ -221,14 +227,20 @@ bool llvm::ConstantFoldTerminator(BasicB + // Insert the new branch. + Builder.CreateBr(TheOnlyDest); + BasicBlock *BB = SI->getParent(); ++ std::vector Updates; ++ if (DDT) ++ Updates.reserve(SI->getNumSuccessors() - 1); + + // Remove entries from PHI nodes which we no longer branch to... + for (BasicBlock *Succ : SI->successors()) { + // Found case matching a constant operand? +- if (Succ == TheOnlyDest) ++ if (Succ == TheOnlyDest) { + TheOnlyDest = nullptr; // Don't modify the first branch to TheOnlyDest +- else ++ } else { + Succ->removePredecessor(BB); ++ if (DDT) ++ Updates.push_back({DominatorTree::Delete, BB, Succ}); ++ } + } + + // Delete the old switch. +@@ -236,6 +248,8 @@ bool llvm::ConstantFoldTerminator(BasicB + SI->eraseFromParent(); + if (DeleteDeadConditions) + RecursivelyDeleteTriviallyDeadInstructions(Cond, TLI); ++ if (DDT) ++ DDT->applyUpdates(Updates); + return true; + } + +@@ -281,14 +295,23 @@ bool llvm::ConstantFoldTerminator(BasicB + if (auto *BA = + dyn_cast(IBI->getAddress()->stripPointerCasts())) { + BasicBlock *TheOnlyDest = BA->getBasicBlock(); ++ std::vector Updates; ++ if (DDT) ++ Updates.reserve(IBI->getNumDestinations() - 1); ++ + // Insert the new branch. + Builder.CreateBr(TheOnlyDest); + + for (unsigned i = 0, e = IBI->getNumDestinations(); i != e; ++i) { +- if (IBI->getDestination(i) == TheOnlyDest) ++ if (IBI->getDestination(i) == TheOnlyDest) { + TheOnlyDest = nullptr; +- else +- IBI->getDestination(i)->removePredecessor(IBI->getParent()); ++ } else { ++ BasicBlock *ParentBB = IBI->getParent(); ++ BasicBlock *DestBB = IBI->getDestination(i); ++ DestBB->removePredecessor(ParentBB); ++ if (DDT) ++ Updates.push_back({DominatorTree::Delete, ParentBB, DestBB}); ++ } + } + Value *Address = IBI->getAddress(); + IBI->eraseFromParent(); +@@ -303,6 +326,8 @@ bool llvm::ConstantFoldTerminator(BasicB + new UnreachableInst(BB->getContext(), BB); + } + ++ if (DDT) ++ DDT->applyUpdates(Updates); + return true; + } + } +@@ -579,7 +604,8 @@ bool llvm::SimplifyInstructionsInBlock(B + /// + /// .. and delete the predecessor corresponding to the '1', this will attempt to + /// recursively fold the and to 0. +-void llvm::RemovePredecessorAndSimplify(BasicBlock *BB, BasicBlock *Pred) { ++void llvm::RemovePredecessorAndSimplify(BasicBlock *BB, BasicBlock *Pred, ++ DeferredDominance *DDT) { + // This only adjusts blocks with PHI nodes. + if (!isa(BB->begin())) + return; +@@ -602,13 +628,18 @@ void llvm::RemovePredecessorAndSimplify( + // of the block. + if (PhiIt != OldPhiIt) PhiIt = &BB->front(); + } ++ if (DDT) ++ DDT->deleteEdge(Pred, BB); + } + + /// MergeBasicBlockIntoOnlyPred - DestBB is a block with one predecessor and its + /// predecessor is known to have one successor (DestBB!). Eliminate the edge + /// between them, moving the instructions in the predecessor into DestBB and + /// deleting the predecessor block. +-void llvm::MergeBasicBlockIntoOnlyPred(BasicBlock *DestBB, DominatorTree *DT) { ++void llvm::MergeBasicBlockIntoOnlyPred(BasicBlock *DestBB, DominatorTree *DT, ++ DeferredDominance *DDT) { ++ assert(!(DT && DDT) && "Cannot call with both DT and DDT."); ++ + // If BB has single-entry PHI nodes, fold them. + while (PHINode *PN = dyn_cast(DestBB->begin())) { + Value *NewVal = PN->getIncomingValue(0); +@@ -621,6 +652,25 @@ void llvm::MergeBasicBlockIntoOnlyPred(B + BasicBlock *PredBB = DestBB->getSinglePredecessor(); + assert(PredBB && "Block doesn't have a single predecessor!"); + ++ bool ReplaceEntryBB = false; ++ if (PredBB == &DestBB->getParent()->getEntryBlock()) ++ ReplaceEntryBB = true; ++ ++ // Deferred DT update: Collect all the edges that enter PredBB. These ++ // dominator edges will be redirected to DestBB. ++ std::vector Updates; ++ if (DDT && !ReplaceEntryBB) { ++ Updates.reserve(1 + ++ (2 * std::distance(pred_begin(PredBB), pred_end(PredBB)))); ++ Updates.push_back({DominatorTree::Delete, PredBB, DestBB}); ++ for (auto I = pred_begin(PredBB), E = pred_end(PredBB); I != E; ++I) { ++ Updates.push_back({DominatorTree::Delete, *I, PredBB}); ++ // This predecessor of PredBB may already have DestBB as a successor. ++ if (llvm::find(successors(*I), DestBB) == succ_end(*I)) ++ Updates.push_back({DominatorTree::Insert, *I, DestBB}); ++ } ++ } ++ + // Zap anything that took the address of DestBB. Not doing this will give the + // address an invalid value. + if (DestBB->hasAddressTaken()) { +@@ -641,7 +691,7 @@ void llvm::MergeBasicBlockIntoOnlyPred(B + + // If the PredBB is the entry block of the function, move DestBB up to + // become the entry block after we erase PredBB. +- if (PredBB == &DestBB->getParent()->getEntryBlock()) ++ if (ReplaceEntryBB) + DestBB->moveAfter(PredBB); + + if (DT) { +@@ -653,8 +703,19 @@ void llvm::MergeBasicBlockIntoOnlyPred(B + DT->eraseNode(PredBB); + } + } +- // Nuke BB. +- PredBB->eraseFromParent(); ++ ++ if (DDT) { ++ DDT->deleteBB(PredBB); // Deferred deletion of BB. ++ if (ReplaceEntryBB) ++ // The entry block was removed and there is no external interface for the ++ // dominator tree to be notified of this change. In this corner-case we ++ // recalculate the entire tree. ++ DDT->recalculate(*(DestBB->getParent())); ++ else ++ DDT->applyUpdates(Updates); ++ } else { ++ PredBB->eraseFromParent(); // Nuke BB. ++ } + } + + /// CanMergeValues - Return true if we can choose one of these values to use +@@ -861,7 +922,8 @@ static void redirectValuesFromPredecesso + /// potential side-effect free intrinsics and the branch. If possible, + /// eliminate BB by rewriting all the predecessors to branch to the successor + /// block and return true. If we can't transform, return false. +-bool llvm::TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB) { ++bool llvm::TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB, ++ DeferredDominance *DDT) { + assert(BB != &BB->getParent()->getEntryBlock() && + "TryToSimplifyUncondBranchFromEmptyBlock called on entry block!"); + +@@ -902,6 +964,19 @@ bool llvm::TryToSimplifyUncondBranchFrom + + DEBUG(dbgs() << "Killing Trivial BB: \n" << *BB); + ++ std::vector Updates; ++ if (DDT) { ++ Updates.reserve(1 + (2 * std::distance(pred_begin(BB), pred_end(BB)))); ++ Updates.push_back({DominatorTree::Delete, BB, Succ}); ++ // All predecessors of BB will be moved to Succ. ++ for (auto I = pred_begin(BB), E = pred_end(BB); I != E; ++I) { ++ Updates.push_back({DominatorTree::Delete, *I, BB}); ++ // This predecessor of BB may already have Succ as a successor. ++ if (llvm::find(successors(*I), Succ) == succ_end(*I)) ++ Updates.push_back({DominatorTree::Insert, *I, Succ}); ++ } ++ } ++ + if (isa(Succ->begin())) { + // If there is more than one pred of succ, and there are PHI nodes in + // the successor, then we need to add incoming edges for the PHI nodes +@@ -946,7 +1021,13 @@ bool llvm::TryToSimplifyUncondBranchFrom + // Everything that jumped to BB now goes to Succ. + BB->replaceAllUsesWith(Succ); + if (!Succ->hasName()) Succ->takeName(BB); +- BB->eraseFromParent(); // Delete the old basic block. ++ ++ if (DDT) { ++ DDT->deleteBB(BB); // Deferred deletion of the old basic block. ++ DDT->applyUpdates(Updates); ++ } else { ++ BB->eraseFromParent(); // Delete the old basic block. ++ } + return true; + } + +@@ -1448,13 +1529,19 @@ unsigned llvm::removeAllNonTerminatorAnd + } + + unsigned llvm::changeToUnreachable(Instruction *I, bool UseLLVMTrap, +- bool PreserveLCSSA) { ++ bool PreserveLCSSA, DeferredDominance *DDT) { + BasicBlock *BB = I->getParent(); ++ std::vector Updates; ++ + // Loop over all of the successors, removing BB's entry from any PHI + // nodes. +- for (BasicBlock *Successor : successors(BB)) ++ if (DDT) ++ Updates.reserve(BB->getTerminator()->getNumSuccessors()); ++ for (BasicBlock *Successor : successors(BB)) { + Successor->removePredecessor(BB, PreserveLCSSA); +- ++ if (DDT) ++ Updates.push_back({DominatorTree::Delete, BB, Successor}); ++ } + // Insert a call to llvm.trap right before this. This turns the undefined + // behavior into a hard fail instead of falling through into random code. + if (UseLLVMTrap) { +@@ -1474,11 +1561,13 @@ unsigned llvm::changeToUnreachable(Instr + BB->getInstList().erase(BBI++); + ++NumInstrsRemoved; + } ++ if (DDT) ++ DDT->applyUpdates(Updates); + return NumInstrsRemoved; + } + + /// changeToCall - Convert the specified invoke into a normal call. +-static void changeToCall(InvokeInst *II) { ++static void changeToCall(InvokeInst *II, DeferredDominance *DDT = nullptr) { + SmallVector Args(II->arg_begin(), II->arg_end()); + SmallVector OpBundles; + II->getOperandBundlesAsDefs(OpBundles); +@@ -1491,11 +1580,16 @@ static void changeToCall(InvokeInst *II) + II->replaceAllUsesWith(NewCall); + + // Follow the call by a branch to the normal destination. +- BranchInst::Create(II->getNormalDest(), II); ++ BasicBlock *NormalDestBB = II->getNormalDest(); ++ BranchInst::Create(NormalDestBB, II); + + // Update PHI nodes in the unwind destination +- II->getUnwindDest()->removePredecessor(II->getParent()); ++ BasicBlock *BB = II->getParent(); ++ BasicBlock *UnwindDestBB = II->getUnwindDest(); ++ UnwindDestBB->removePredecessor(BB); + II->eraseFromParent(); ++ if (DDT) ++ DDT->deleteEdge(BB, UnwindDestBB); + } + + BasicBlock *llvm::changeToInvokeAndSplitBasicBlock(CallInst *CI, +@@ -1536,7 +1630,8 @@ BasicBlock *llvm::changeToInvokeAndSplit + } + + static bool markAliveBlocks(Function &F, +- SmallPtrSetImpl &Reachable) { ++ SmallPtrSetImpl &Reachable, ++ DeferredDominance *DDT = nullptr) { + SmallVector Worklist; + BasicBlock *BB = &F.front(); + Worklist.push_back(BB); +@@ -1556,7 +1651,7 @@ static bool markAliveBlocks(Function &F, + if (II->getIntrinsicID() == Intrinsic::assume) { + if (match(II->getArgOperand(0), m_CombineOr(m_Zero(), m_Undef()))) { + // Don't insert a call to llvm.trap right before the unreachable. +- changeToUnreachable(II, false); ++ changeToUnreachable(II, false, false, DDT); + Changed = true; + break; + } +@@ -1573,7 +1668,8 @@ static bool markAliveBlocks(Function &F, + // still be useful for widening. + if (match(II->getArgOperand(0), m_Zero())) + if (!isa(II->getNextNode())) { +- changeToUnreachable(II->getNextNode(), /*UseLLVMTrap=*/ false); ++ changeToUnreachable(II->getNextNode(), /*UseLLVMTrap=*/false, ++ false, DDT); + Changed = true; + break; + } +@@ -1583,7 +1679,7 @@ static bool markAliveBlocks(Function &F, + if (auto *CI = dyn_cast(&I)) { + Value *Callee = CI->getCalledValue(); + if (isa(Callee) || isa(Callee)) { +- changeToUnreachable(CI, /*UseLLVMTrap=*/false); ++ changeToUnreachable(CI, /*UseLLVMTrap=*/false, false, DDT); + Changed = true; + break; + } +@@ -1593,7 +1689,7 @@ static bool markAliveBlocks(Function &F, + // though. + if (!isa(CI->getNextNode())) { + // Don't insert a call to llvm.trap right before the unreachable. +- changeToUnreachable(CI->getNextNode(), false); ++ changeToUnreachable(CI->getNextNode(), false, false, DDT); + Changed = true; + } + break; +@@ -1612,7 +1708,7 @@ static bool markAliveBlocks(Function &F, + if (isa(Ptr) || + (isa(Ptr) && + SI->getPointerAddressSpace() == 0)) { +- changeToUnreachable(SI, true); ++ changeToUnreachable(SI, true, false, DDT); + Changed = true; + break; + } +@@ -1624,16 +1720,20 @@ static bool markAliveBlocks(Function &F, + // Turn invokes that call 'nounwind' functions into ordinary calls. + Value *Callee = II->getCalledValue(); + if (isa(Callee) || isa(Callee)) { +- changeToUnreachable(II, true); ++ changeToUnreachable(II, true, false, DDT); + Changed = true; + } else if (II->doesNotThrow() && canSimplifyInvokeNoUnwind(&F)) { + if (II->use_empty() && II->onlyReadsMemory()) { + // jump to the normal destination branch. +- BranchInst::Create(II->getNormalDest(), II); +- II->getUnwindDest()->removePredecessor(II->getParent()); ++ BasicBlock *NormalDestBB = II->getNormalDest(); ++ BasicBlock *UnwindDestBB = II->getUnwindDest(); ++ BranchInst::Create(NormalDestBB, II); ++ UnwindDestBB->removePredecessor(II->getParent()); + II->eraseFromParent(); ++ if (DDT) ++ DDT->deleteEdge(BB, UnwindDestBB); + } else +- changeToCall(II); ++ changeToCall(II, DDT); + Changed = true; + } + } else if (auto *CatchSwitch = dyn_cast(Terminator)) { +@@ -1679,7 +1779,7 @@ static bool markAliveBlocks(Function &F, + } + } + +- Changed |= ConstantFoldTerminator(BB, true); ++ Changed |= ConstantFoldTerminator(BB, true, nullptr, DDT); + for (BasicBlock *Successor : successors(BB)) + if (Reachable.insert(Successor).second) + Worklist.push_back(Successor); +@@ -1687,11 +1787,11 @@ static bool markAliveBlocks(Function &F, + return Changed; + } + +-void llvm::removeUnwindEdge(BasicBlock *BB) { ++void llvm::removeUnwindEdge(BasicBlock *BB, DeferredDominance *DDT) { + TerminatorInst *TI = BB->getTerminator(); + + if (auto *II = dyn_cast(TI)) { +- changeToCall(II); ++ changeToCall(II, DDT); + return; + } + +@@ -1719,15 +1819,18 @@ void llvm::removeUnwindEdge(BasicBlock * + UnwindDest->removePredecessor(BB); + TI->replaceAllUsesWith(NewTI); + TI->eraseFromParent(); ++ if (DDT) ++ DDT->deleteEdge(BB, UnwindDest); + } + + /// removeUnreachableBlocks - Remove blocks that are not reachable, even + /// if they are in a dead cycle. Return true if a change was made, false + /// otherwise. If `LVI` is passed, this function preserves LazyValueInfo + /// after modifying the CFG. +-bool llvm::removeUnreachableBlocks(Function &F, LazyValueInfo *LVI) { ++bool llvm::removeUnreachableBlocks(Function &F, LazyValueInfo *LVI, ++ DeferredDominance *DDT) { + SmallPtrSet Reachable; +- bool Changed = markAliveBlocks(F, Reachable); ++ bool Changed = markAliveBlocks(F, Reachable, DDT); + + // If there are unreachable blocks in the CFG... + if (Reachable.size() == F.size()) +@@ -1737,25 +1840,39 @@ bool llvm::removeUnreachableBlocks(Funct + NumRemoved += F.size()-Reachable.size(); + + // Loop over all of the basic blocks that are not reachable, dropping all of +- // their internal references... +- for (Function::iterator BB = ++F.begin(), E = F.end(); BB != E; ++BB) { +- if (Reachable.count(&*BB)) ++ // their internal references. Update DDT and LVI if available. ++ std::vector Updates; ++ for (Function::iterator I = ++F.begin(), E = F.end(); I != E; ++I) { ++ auto *BB = &*I; ++ if (Reachable.count(BB)) + continue; +- +- for (BasicBlock *Successor : successors(&*BB)) ++ for (BasicBlock *Successor : successors(BB)) { + if (Reachable.count(Successor)) +- Successor->removePredecessor(&*BB); ++ Successor->removePredecessor(BB); ++ if (DDT) ++ Updates.push_back({DominatorTree::Delete, BB, Successor}); ++ } + if (LVI) +- LVI->eraseBlock(&*BB); ++ LVI->eraseBlock(BB); + BB->dropAllReferences(); + } + +- for (Function::iterator I = ++F.begin(); I != F.end();) +- if (!Reachable.count(&*I)) +- I = F.getBasicBlockList().erase(I); +- else ++ for (Function::iterator I = ++F.begin(); I != F.end();) { ++ auto *BB = &*I; ++ if (Reachable.count(BB)) { ++ ++I; ++ continue; ++ } ++ if (DDT) { ++ DDT->deleteBB(BB); // deferred deletion of BB. + ++I; ++ } else { ++ I = F.getBasicBlockList().erase(I); ++ } ++ } + ++ if (DDT) ++ DDT->applyUpdates(Updates); + return true; + } + +Index: llvm-toolchain-6.0-6.0.1/test/Analysis/LazyValueAnalysis/lvi-after-jumpthreading.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Analysis/LazyValueAnalysis/lvi-after-jumpthreading.ll ++++ llvm-toolchain-6.0-6.0.1/test/Analysis/LazyValueAnalysis/lvi-after-jumpthreading.ll +@@ -19,10 +19,13 @@ entry: + ; CHECK-NEXT: ; LatticeVal for: 'i32 %a' is: overdefined + ; CHECK-NEXT: ; LatticeVal for: 'i32 %length' is: overdefined + ; CHECK-NEXT: ; LatticeVal for: ' %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]' in BB: '%backedge' is: constantrange<0, 400> ++; CHECK-NEXT: ; LatticeVal for: ' %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]' in BB: '%exit' is: constantrange<399, 400> + ; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ] + ; CHECK-NEXT: ; LatticeVal for: ' %iv.next = add nsw i32 %iv, 1' in BB: '%backedge' is: constantrange<1, 401> ++; CHECK-NEXT: ; LatticeVal for: ' %iv.next = add nsw i32 %iv, 1' in BB: '%exit' is: constantrange<400, 401> + ; CHECK-NEXT: %iv.next = add nsw i32 %iv, 1 + ; CHECK-NEXT: ; LatticeVal for: ' %cont = icmp slt i32 %iv.next, 400' in BB: '%backedge' is: overdefined ++; CHECK-NEXT: ; LatticeVal for: ' %cont = icmp slt i32 %iv.next, 400' in BB: '%exit' is: constantrange<0, -1> + ; CHECK-NEXT: %cont = icmp slt i32 %iv.next, 400 + ; CHECK-NOT: loop + loop: +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/ddt-crash.ll +=================================================================== +--- /dev/null ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/ddt-crash.ll +@@ -0,0 +1,265 @@ ++; RUN: opt < %s -jump-threading -disable-output ++ ++%struct.ham = type { i8, i8, i16, i32 } ++%struct.zot = type { i32 (...)** } ++%struct.quux.0 = type { %struct.wombat } ++%struct.wombat = type { %struct.zot } ++ ++@global = external global %struct.ham*, align 8 ++@global.1 = external constant i8* ++ ++declare i32 @wombat.2() ++ ++define void @blam() { ++bb: ++ %tmp = load i32, i32* undef ++ %tmp1 = icmp eq i32 %tmp, 0 ++ br i1 %tmp1, label %bb11, label %bb2 ++ ++bb2: ++ %tmp3 = tail call i32 @wombat.2() ++ switch i32 %tmp3, label %bb4 [ ++ i32 0, label %bb5 ++ i32 1, label %bb7 ++ i32 2, label %bb7 ++ i32 3, label %bb11 ++ ] ++ ++bb4: ++ br label %bb7 ++ ++bb5: ++ %tmp6 = tail call i32 @wombat.2() ++ br label %bb7 ++ ++bb7: ++ %tmp8 = phi i32 [ 0, %bb5 ], [ 1, %bb4 ], [ 2, %bb2 ], [ 2, %bb2 ] ++ %tmp9 = icmp eq i32 %tmp8, 0 ++ br i1 %tmp9, label %bb11, label %bb10 ++ ++bb10: ++ ret void ++ ++bb11: ++ ret void ++} ++ ++define void @spam(%struct.ham* %arg) { ++bb: ++ %tmp = load i8, i8* undef, align 8 ++ switch i8 %tmp, label %bb11 [ ++ i8 1, label %bb11 ++ i8 2, label %bb11 ++ i8 3, label %bb1 ++ i8 4, label %bb1 ++ ] ++ ++bb1: ++ br label %bb2 ++ ++bb2: ++ %tmp3 = phi i32 [ 0, %bb1 ], [ %tmp3, %bb8 ] ++ br label %bb4 ++ ++bb4: ++ %tmp5 = load i8, i8* undef, align 8 ++ switch i8 %tmp5, label %bb11 [ ++ i8 0, label %bb11 ++ i8 1, label %bb10 ++ i8 2, label %bb10 ++ i8 3, label %bb6 ++ i8 4, label %bb6 ++ ] ++ ++bb6: ++ br label %bb7 ++ ++bb7: ++ br i1 undef, label %bb8, label %bb10 ++ ++bb8: ++ %tmp9 = icmp eq %struct.ham* undef, %arg ++ br i1 %tmp9, label %bb10, label %bb2 ++ ++bb10: ++ switch i32 %tmp3, label %bb4 [ ++ i32 0, label %bb14 ++ i32 1, label %bb11 ++ i32 2, label %bb12 ++ ] ++ ++bb11: ++ unreachable ++ ++bb12: ++ %tmp13 = load %struct.ham*, %struct.ham** undef ++ br label %bb14 ++ ++bb14: ++ %tmp15 = phi %struct.ham* [ %tmp13, %bb12 ], [ null, %bb10 ] ++ br label %bb16 ++ ++bb16: ++ %tmp17 = load i8, i8* undef, align 8 ++ switch i8 %tmp17, label %bb11 [ ++ i8 0, label %bb11 ++ i8 11, label %bb18 ++ i8 12, label %bb18 ++ ] ++ ++bb18: ++ br label %bb19 ++ ++bb19: ++ br label %bb20 ++ ++bb20: ++ %tmp21 = load %struct.ham*, %struct.ham** undef ++ switch i8 undef, label %bb22 [ ++ i8 0, label %bb4 ++ i8 11, label %bb10 ++ i8 12, label %bb10 ++ ] ++ ++bb22: ++ br label %bb23 ++ ++bb23: ++ %tmp24 = icmp eq %struct.ham* %tmp21, null ++ br i1 %tmp24, label %bb35, label %bb25 ++ ++bb25: ++ %tmp26 = icmp eq %struct.ham* %tmp15, null ++ br i1 %tmp26, label %bb34, label %bb27 ++ ++bb27: ++ %tmp28 = load %struct.ham*, %struct.ham** undef ++ %tmp29 = icmp eq %struct.ham* %tmp28, %tmp21 ++ br i1 %tmp29, label %bb35, label %bb30 ++ ++bb30: ++ br label %bb31 ++ ++bb31: ++ %tmp32 = load i8, i8* undef, align 8 ++ %tmp33 = icmp eq i8 %tmp32, 0 ++ br i1 %tmp33, label %bb31, label %bb34 ++ ++bb34: ++ br label %bb35 ++ ++bb35: ++ %tmp36 = phi i1 [ true, %bb34 ], [ false, %bb23 ], [ true, %bb27 ] ++ br label %bb37 ++ ++bb37: ++ %tmp38 = icmp eq %struct.ham* %tmp15, null ++ br i1 %tmp38, label %bb39, label %bb41 ++ ++bb39: ++ %tmp40 = load %struct.ham*, %struct.ham** @global ++ br label %bb41 ++ ++bb41: ++ %tmp42 = select i1 %tmp36, %struct.ham* undef, %struct.ham* undef ++ ret void ++} ++ ++declare i32 @foo(...) ++ ++define void @zot() align 2 personality i8* bitcast (i32 (...)* @foo to i8*) { ++bb: ++ invoke void @bar() ++ to label %bb1 unwind label %bb3 ++ ++bb1: ++ invoke void @bar() ++ to label %bb2 unwind label %bb4 ++ ++bb2: ++ invoke void @bar() ++ to label %bb6 unwind label %bb17 ++ ++bb3: ++ %tmp = landingpad { i8*, i32 } ++ catch i8* bitcast (i8** @global.1 to i8*) ++ catch i8* null ++ unreachable ++ ++bb4: ++ %tmp5 = landingpad { i8*, i32 } ++ catch i8* bitcast (i8** @global.1 to i8*) ++ catch i8* null ++ unreachable ++ ++bb6: ++ invoke void @bar() ++ to label %bb7 unwind label %bb19 ++ ++bb7: ++ invoke void @bar() ++ to label %bb10 unwind label %bb8 ++ ++bb8: ++ %tmp9 = landingpad { i8*, i32 } ++ cleanup ++ catch i8* bitcast (i8** @global.1 to i8*) ++ catch i8* null ++ unreachable ++ ++bb10: ++ %tmp11 = load i32 (%struct.zot*)*, i32 (%struct.zot*)** undef, align 8 ++ %tmp12 = invoke i32 %tmp11(%struct.zot* nonnull undef) ++ to label %bb13 unwind label %bb21 ++ ++bb13: ++ invoke void @bar() ++ to label %bb14 unwind label %bb23 ++ ++bb14: ++ %tmp15 = load i32 (%struct.zot*)*, i32 (%struct.zot*)** undef, align 8 ++ %tmp16 = invoke i32 %tmp15(%struct.zot* nonnull undef) ++ to label %bb26 unwind label %bb23 ++ ++bb17: ++ %tmp18 = landingpad { i8*, i32 } ++ catch i8* bitcast (i8** @global.1 to i8*) ++ catch i8* null ++ unreachable ++ ++bb19: ++ %tmp20 = landingpad { i8*, i32 } ++ catch i8* bitcast (i8** @global.1 to i8*) ++ catch i8* null ++ unreachable ++ ++bb21: ++ %tmp22 = landingpad { i8*, i32 } ++ catch i8* bitcast (i8** @global.1 to i8*) ++ catch i8* null ++ unreachable ++ ++bb23: ++ %tmp24 = phi %struct.quux.0* [ null, %bb26 ], [ null, %bb14 ], [ undef, %bb13 ] ++ %tmp25 = landingpad { i8*, i32 } ++ catch i8* bitcast (i8** @global.1 to i8*) ++ catch i8* null ++ br label %bb30 ++ ++bb26: ++ %tmp27 = load i32 (%struct.zot*)*, i32 (%struct.zot*)** undef, align 8 ++ %tmp28 = invoke i32 %tmp27(%struct.zot* nonnull undef) ++ to label %bb29 unwind label %bb23 ++ ++bb29: ++ unreachable ++ ++bb30: ++ %tmp31 = icmp eq %struct.quux.0* %tmp24, null ++ br i1 %tmp31, label %bb32, label %bb29 ++ ++bb32: ++ unreachable ++} ++ ++declare void @bar() +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/ddt-crash2.ll +=================================================================== +--- /dev/null ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/ddt-crash2.ll +@@ -0,0 +1,40 @@ ++; RUN: opt < %s -jump-threading -disable-output ++ ++%struct.aaa = type { i8 } ++ ++define void @chrome(%struct.aaa* noalias sret %arg) local_unnamed_addr #0 align 2 personality i8* bitcast (i32 (...)* @chrome2 to i8*) { ++bb: ++ %tmp = load i32, i32* undef, align 4 ++ %tmp1 = icmp eq i32 %tmp, 0 ++ br i1 %tmp1, label %bb2, label %bb13 ++ ++bb2: ++ %tmp3 = getelementptr inbounds %struct.aaa, %struct.aaa* %arg, i64 0, i32 0 ++ %tmp4 = load i8, i8* %tmp3, align 1 ++ %tmp5 = icmp eq i8 %tmp4, 0 ++ br i1 %tmp5, label %bb6, label %bb7 ++ ++bb6: ++ store i8 0, i8* %tmp3, align 1 ++ br label %bb7 ++ ++bb7: ++ %tmp8 = load i8, i8* %tmp3, align 1 ++ %tmp9 = icmp ne i8 %tmp8, 0 ++ %tmp10 = select i1 %tmp9, i1 true, i1 false ++ br i1 %tmp10, label %bb12, label %bb11 ++ ++bb11: ++ br label %bb12 ++ ++bb12: ++ br i1 %tmp9, label %bb14, label %bb13 ++ ++bb13: ++ unreachable ++ ++bb14: ++ ret void ++} ++ ++declare i32 @chrome2(...) +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/lvi-tristate.ll +=================================================================== +--- /dev/null ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/lvi-tristate.ll +@@ -0,0 +1,50 @@ ++; RUN: opt -jump-threading -simplifycfg -S < %s | FileCheck %s ++; CHECK-NOT: bb6: ++; CHECK-NOT: bb7: ++; CHECK-NOT: bb8: ++; CHECK-NOT: bb11: ++; CHECK-NOT: bb12: ++; CHECK: bb: ++; CHECK: bb2: ++; CHECK: bb4: ++; CHECK: bb10: ++; CHECK: bb13: ++declare void @ham() ++ ++define void @hoge() { ++bb: ++ %tmp = and i32 undef, 1073741823 ++ %tmp1 = icmp eq i32 %tmp, 2 ++ br i1 %tmp1, label %bb12, label %bb2 ++ ++bb2: ++ %tmp3 = icmp eq i32 %tmp, 3 ++ br i1 %tmp3, label %bb13, label %bb4 ++ ++bb4: ++ %tmp5 = icmp eq i32 %tmp, 5 ++ br i1 %tmp5, label %bb6, label %bb7 ++ ++bb6: ++ tail call void @ham() ++ br label %bb7 ++ ++bb7: ++ br i1 %tmp3, label %bb13, label %bb8 ++ ++bb8: ++ %tmp9 = icmp eq i32 %tmp, 4 ++ br i1 %tmp9, label %bb13, label %bb10 ++ ++bb10: ++ br i1 %tmp9, label %bb11, label %bb13 ++ ++bb11: ++ br label %bb13 ++ ++bb12: ++ br label %bb2 ++ ++bb13: ++ ret void ++} +Index: llvm-toolchain-6.0-6.0.1/unittests/IR/CMakeLists.txt +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/unittests/IR/CMakeLists.txt ++++ llvm-toolchain-6.0-6.0.1/unittests/IR/CMakeLists.txt +@@ -15,6 +15,7 @@ set(IRSources + ConstantsTest.cpp + DebugInfoTest.cpp + DebugTypeODRUniquingTest.cpp ++ DeferredDominanceTest.cpp + DominatorTreeTest.cpp + DominatorTreeBatchUpdatesTest.cpp + FunctionTest.cpp +Index: llvm-toolchain-6.0-6.0.1/unittests/IR/DeferredDominanceTest.cpp +=================================================================== +--- /dev/null ++++ llvm-toolchain-6.0-6.0.1/unittests/IR/DeferredDominanceTest.cpp +@@ -0,0 +1,344 @@ ++//===- llvm/unittests/IR/DeferredDominanceTest.cpp - DDT unit tests -------===// ++// ++// The LLVM Compiler Infrastructure ++// ++// This file is distributed under the University of Illinois Open Source ++// License. See LICENSE.TXT for details. ++// ++//===----------------------------------------------------------------------===// ++ ++#include "llvm/AsmParser/Parser.h" ++#include "llvm/IR/Constants.h" ++#include "llvm/IR/Dominators.h" ++#include "llvm/IR/Instructions.h" ++#include "llvm/IR/LLVMContext.h" ++#include "llvm/IR/Module.h" ++#include "llvm/Support/SourceMgr.h" ++#include "gtest/gtest.h" ++ ++using namespace llvm; ++ ++static std::unique_ptr makeLLVMModule(LLVMContext &Context, ++ StringRef ModuleStr) { ++ SMDiagnostic Err; ++ std::unique_ptr M = parseAssemblyString(ModuleStr, Err, Context); ++ assert(M && "Bad LLVM IR?"); ++ return M; ++} ++ ++TEST(DeferredDominance, BasicOperations) { ++ StringRef FuncName = "f"; ++ StringRef ModuleString = ++ "define i32 @f(i32 %i, i32 *%p) {\n" ++ " bb0:\n" ++ " store i32 %i, i32 *%p\n" ++ " switch i32 %i, label %bb1 [\n" ++ " i32 0, label %bb2\n" ++ " i32 1, label %bb2\n" ++ " i32 2, label %bb3\n" ++ " ]\n" ++ " bb1:\n" ++ " ret i32 1\n" ++ " bb2:\n" ++ " ret i32 2\n" ++ " bb3:\n" ++ " ret i32 3\n" ++ "}\n"; ++ // Make the module. ++ LLVMContext Context; ++ std::unique_ptr M = makeLLVMModule(Context, ModuleString); ++ Function *F = M->getFunction(FuncName); ++ ASSERT_NE(F, nullptr) << "Couldn't get function " << FuncName << "."; ++ ++ // Make the DDT. ++ DominatorTree DT(*F); ++ DeferredDominance DDT(DT); ++ ASSERT_TRUE(DDT.flush().verify()); ++ ++ Function::iterator FI = F->begin(); ++ BasicBlock *BB0 = &*FI++; ++ BasicBlock *BB1 = &*FI++; ++ BasicBlock *BB2 = &*FI++; ++ BasicBlock *BB3 = &*FI++; ++ ++ // Test discards of invalid self-domination updates. These use the single ++ // short-hand interface but are still queued inside DDT. ++ DDT.deleteEdge(BB0, BB0); ++ DDT.insertEdge(BB1, BB1); ++ ++ // Delete edge bb0 -> bb3 and push the update twice to verify duplicate ++ // entries are discarded. ++ std::vector Updates; ++ Updates.reserve(4); ++ Updates.push_back({DominatorTree::Delete, BB0, BB3}); ++ Updates.push_back({DominatorTree::Delete, BB0, BB3}); ++ ++ // Unnecessary Insert: no edge bb1 -> bb2 after change to bb0. ++ Updates.push_back({DominatorTree::Insert, BB1, BB2}); ++ // Unnecessary Delete: edge exists bb0 -> bb1 after change to bb0. ++ Updates.push_back({DominatorTree::Delete, BB0, BB1}); ++ ++ // CFG Change: remove edge bb0 -> bb3 and one duplicate edge bb0 -> bb2. ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 4u); ++ BB0->getTerminator()->eraseFromParent(); ++ BranchInst::Create(BB1, BB2, ConstantInt::getTrue(F->getContext()), BB0); ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 2u); ++ ++ // Deletion of a BasicBlock is an immediate event. We remove all uses to the ++ // contained Instructions and change the Terminator to "unreachable" when ++ // queued for deletion. Its parent is still F until DDT.flush() is called. We ++ // don't defer this action because it can cause problems for other transforms ++ // or analysis as it's part of the actual CFG. We only defer updates to the ++ // DominatorTree. This code will crash if it is placed before the ++ // BranchInst::Create() call above. ++ ASSERT_FALSE(isa(BB3->getTerminator())); ++ EXPECT_FALSE(DDT.pendingDeletedBB(BB3)); ++ DDT.deleteBB(BB3); ++ EXPECT_TRUE(DDT.pendingDeletedBB(BB3)); ++ ASSERT_TRUE(isa(BB3->getTerminator())); ++ EXPECT_EQ(BB3->getParent(), F); ++ ++ // Verify. Updates to DDT must be applied *after* all changes to the CFG ++ // (including block deletion). ++ DDT.applyUpdates(Updates); ++ ASSERT_TRUE(DDT.flush().verify()); ++} ++ ++TEST(DeferredDominance, PairedUpdate) { ++ StringRef FuncName = "f"; ++ StringRef ModuleString = ++ "define i32 @f(i32 %i, i32 *%p) {\n" ++ " bb0:\n" ++ " store i32 %i, i32 *%p\n" ++ " switch i32 %i, label %bb1 [\n" ++ " i32 0, label %bb2\n" ++ " i32 1, label %bb2\n" ++ " ]\n" ++ " bb1:\n" ++ " ret i32 1\n" ++ " bb2:\n" ++ " ret i32 2\n" ++ "}\n"; ++ // Make the module. ++ LLVMContext Context; ++ std::unique_ptr M = makeLLVMModule(Context, ModuleString); ++ Function *F = M->getFunction(FuncName); ++ ASSERT_NE(F, nullptr) << "Couldn't get function " << FuncName << "."; ++ ++ // Make the DDT. ++ DominatorTree DT(*F); ++ DeferredDominance DDT(DT); ++ ASSERT_TRUE(DDT.flush().verify()); ++ ++ Function::iterator FI = F->begin(); ++ BasicBlock *BB0 = &*FI++; ++ BasicBlock *BB1 = &*FI++; ++ BasicBlock *BB2 = &*FI++; ++ ++ // CFG Change: only edge from bb0 is bb0 -> bb1. ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 3u); ++ BB0->getTerminator()->eraseFromParent(); ++ BranchInst::Create(BB1, BB0); ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 1u); ++ ++ // Must be done after the CFG change. The applyUpdate() routine analyzes the ++ // current state of the CFG. ++ DDT.deleteEdge(BB0, BB2); ++ ++ // CFG Change: bb0 now has bb0 -> bb1 and bb0 -> bb2. ++ // With this change no dominance has been altered from the original IR. DT ++ // doesn't care if the type of TerminatorInstruction changed, only if the ++ // unique edges have. ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 1u); ++ BB0->getTerminator()->eraseFromParent(); ++ BranchInst::Create(BB1, BB2, ConstantInt::getTrue(F->getContext()), BB0); ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 2u); ++ ++ // Must be done after the CFG change. The applyUpdate() routine analyzes the ++ // current state of the CFG. This DDT update pairs with the previous one and ++ // is cancelled out before ever applying updates to DT. ++ DDT.insertEdge(BB0, BB2); ++ ++ // Test the empty DeletedBB list. ++ EXPECT_FALSE(DDT.pendingDeletedBB(BB0)); ++ EXPECT_FALSE(DDT.pendingDeletedBB(BB1)); ++ EXPECT_FALSE(DDT.pendingDeletedBB(BB2)); ++ ++ // The DT has no changes, this flush() simply returns a reference to the ++ // internal DT calculated at the beginning of this test. ++ ASSERT_TRUE(DDT.flush().verify()); ++} ++ ++TEST(DeferredDominance, ReplaceEntryBB) { ++ StringRef FuncName = "f"; ++ StringRef ModuleString = ++ "define i32 @f() {\n" ++ "bb0:\n" ++ " br label %bb1\n" ++ " bb1:\n" ++ " ret i32 1\n" ++ "}\n"; ++ // Make the module. ++ LLVMContext Context; ++ std::unique_ptr M = makeLLVMModule(Context, ModuleString); ++ Function *F = M->getFunction(FuncName); ++ ASSERT_NE(F, nullptr) << "Couldn't get function " << FuncName << "."; ++ ++ // Make the DDT. ++ DominatorTree DT(*F); ++ DeferredDominance DDT(DT); ++ ASSERT_TRUE(DDT.flush().verify()); ++ ++ Function::iterator FI = F->begin(); ++ BasicBlock *BB0 = &*FI++; ++ BasicBlock *BB1 = &*FI++; ++ ++ // Add a block as the new function entry BB. We also link it to BB0. ++ BasicBlock *NewEntry = ++ BasicBlock::Create(F->getContext(), "new_entry", F, BB0); ++ BranchInst::Create(BB0, NewEntry); ++ EXPECT_EQ(F->begin()->getName(), NewEntry->getName()); ++ EXPECT_TRUE(&F->getEntryBlock() == NewEntry); ++ ++ // Insert the new edge between new_eentry -> bb0. Without this the ++ // recalculate() call below will not actually recalculate the DT as there ++ // are no changes pending and no blocks deleted. ++ DDT.insertEdge(NewEntry, BB0); ++ ++ // Changing the Entry BB requires a full recalulation. ++ DDT.recalculate(*F); ++ ASSERT_TRUE(DDT.flush().verify()); ++ ++ // CFG Change: remove new_edge -> bb0 and redirect to new_edge -> bb1. ++ EXPECT_EQ(NewEntry->getTerminator()->getNumSuccessors(), 1u); ++ NewEntry->getTerminator()->eraseFromParent(); ++ BranchInst::Create(BB1, NewEntry); ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 1u); ++ ++ // Update the DDT. At this point bb0 now has no predecessors but is still a ++ // Child of F. ++ DDT.applyUpdates({{DominatorTree::Delete, NewEntry, BB0}, ++ {DominatorTree::Insert, NewEntry, BB1}}); ++ ASSERT_TRUE(DDT.flush().verify()); ++ ++ // Now remove bb0 from F. ++ ASSERT_FALSE(isa(BB0->getTerminator())); ++ EXPECT_FALSE(DDT.pendingDeletedBB(BB0)); ++ DDT.deleteBB(BB0); ++ EXPECT_TRUE(DDT.pendingDeletedBB(BB0)); ++ ASSERT_TRUE(isa(BB0->getTerminator())); ++ EXPECT_EQ(BB0->getParent(), F); ++ ++ // Perform a full recalculation of the DDT. It is not necessary here but we ++ // do this to test the case when there are no pending DT updates but there are ++ // pending deleted BBs. ++ DDT.recalculate(*F); ++ ASSERT_TRUE(DDT.flush().verify()); ++} ++ ++TEST(DeferredDominance, InheritedPreds) { ++ StringRef FuncName = "f"; ++ StringRef ModuleString = ++ "define i32 @f(i32 %i, i32 *%p) {\n" ++ " bb0:\n" ++ " store i32 %i, i32 *%p\n" ++ " switch i32 %i, label %bb1 [\n" ++ " i32 2, label %bb2\n" ++ " i32 3, label %bb3\n" ++ " ]\n" ++ " bb1:\n" ++ " br label %bb3\n" ++ " bb2:\n" ++ " br label %bb3\n" ++ " bb3:\n" ++ " ret i32 3\n" ++ "}\n"; ++ // Make the module. ++ LLVMContext Context; ++ std::unique_ptr M = makeLLVMModule(Context, ModuleString); ++ Function *F = M->getFunction(FuncName); ++ ASSERT_NE(F, nullptr) << "Couldn't get function " << FuncName << "."; ++ ++ // Make the DDT. ++ DominatorTree DT(*F); ++ DeferredDominance DDT(DT); ++ ASSERT_TRUE(DDT.flush().verify()); ++ ++ Function::iterator FI = F->begin(); ++ BasicBlock *BB0 = &*FI++; ++ BasicBlock *BB1 = &*FI++; ++ BasicBlock *BB2 = &*FI++; ++ BasicBlock *BB3 = &*FI++; ++ ++ // There are several CFG locations where we have: ++ // ++ // pred1..predN ++ // | | ++ // +> curr <+ converted into: pred1..predN curr ++ // | | | ++ // v +> succ <+ ++ // succ ++ // ++ // There is a specific shape of this we have to be careful of: ++ // ++ // pred1..predN ++ // || | ++ // |+> curr <+ converted into: pred1..predN curr ++ // | | | | ++ // | v +> succ <+ ++ // +-> succ ++ // ++ // While the final CFG form is functionally identical the updates to ++ // DDT are not. In the first case we must have DDT.insertEdge(Pred1, Succ) ++ // while in the latter case we must *NOT* have DDT.insertEdge(Pred1, Succ). ++ ++ // CFG Change: bb0 now only has bb0 -> bb1 and bb0 -> bb3. We are preparing to ++ // remove bb2. ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 3u); ++ BB0->getTerminator()->eraseFromParent(); ++ BranchInst::Create(BB1, BB3, ConstantInt::getTrue(F->getContext()), BB0); ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 2u); ++ ++ // Remove bb2 from F. This has to happen before the call to applyUpdates() for ++ // DDT to detect there is no longer an edge between bb2 -> bb3. The deleteBB() ++ // method converts bb2's TI into "unreachable". ++ ASSERT_FALSE(isa(BB2->getTerminator())); ++ EXPECT_FALSE(DDT.pendingDeletedBB(BB2)); ++ DDT.deleteBB(BB2); ++ EXPECT_TRUE(DDT.pendingDeletedBB(BB2)); ++ ASSERT_TRUE(isa(BB2->getTerminator())); ++ EXPECT_EQ(BB2->getParent(), F); ++ ++ // Queue up the DDT updates. ++ std::vector Updates; ++ Updates.reserve(4); ++ Updates.push_back({DominatorTree::Delete, BB0, BB2}); ++ Updates.push_back({DominatorTree::Delete, BB2, BB3}); ++ ++ // Handle the specific shape case next. ++ // CFG Change: bb0 now only branches to bb3. We are preparing to remove bb1. ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 2u); ++ BB0->getTerminator()->eraseFromParent(); ++ BranchInst::Create(BB3, BB0); ++ EXPECT_EQ(BB0->getTerminator()->getNumSuccessors(), 1u); ++ ++ // Remove bb1 from F. This has to happen before the call to applyUpdates() for ++ // DDT to detect there is no longer an edge between bb1 -> bb3. The deleteBB() ++ // method converts bb1's TI into "unreachable". ++ ASSERT_FALSE(isa(BB1->getTerminator())); ++ EXPECT_FALSE(DDT.pendingDeletedBB(BB1)); ++ DDT.deleteBB(BB1); ++ EXPECT_TRUE(DDT.pendingDeletedBB(BB1)); ++ ASSERT_TRUE(isa(BB1->getTerminator())); ++ EXPECT_EQ(BB1->getParent(), F); ++ ++ // Update the DDT. In this case we don't call DDT.insertEdge(BB0, BB3) because ++ // the edge previously existed at the start of this test when DT was first ++ // created. ++ Updates.push_back({DominatorTree::Delete, BB0, BB1}); ++ Updates.push_back({DominatorTree::Delete, BB1, BB3}); ++ ++ // Verify everything. ++ DDT.applyUpdates(Updates); ++ ASSERT_TRUE(DDT.flush().verify()); ++} diff --git a/patches/D42717-JumpThreading-backport-2.diff b/patches/D42717-JumpThreading-backport-2.diff new file mode 100644 index 00000000..3b1f8a30 --- /dev/null +++ b/patches/D42717-JumpThreading-backport-2.diff @@ -0,0 +1,267 @@ +Index: llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/LazyValueInfo.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/Analysis/LazyValueInfo.h ++++ llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/LazyValueInfo.h +@@ -113,6 +113,13 @@ public: + /// in LVI, so we need to pass it here as an argument. + void printLVI(Function &F, DominatorTree &DTree, raw_ostream &OS); + ++ /// Disables use of the DominatorTree within LVI. ++ void disableDT(); ++ ++ /// Enables use of the DominatorTree within LVI. Does nothing if the class ++ /// instance was initialized without a DT pointer. ++ void enableDT(); ++ + // For old PM pass. Delete once LazyValueInfoWrapperPass is gone. + void releaseMemory(); + +Index: llvm-toolchain-6.0-6.0.1/include/llvm/IR/Dominators.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/IR/Dominators.h ++++ llvm-toolchain-6.0-6.0.1/include/llvm/IR/Dominators.h +@@ -342,6 +342,9 @@ public: + /// \brief Returns true if DelBB is awaiting deletion at a flush() event. + bool pendingDeletedBB(BasicBlock *DelBB); + ++ /// \brief Returns true if pending DT updates are queued for a flush() event. ++ bool pending(); ++ + /// \brief Flushes all pending updates and block deletions. Returns a + /// correct DominatorTree reference to be used by the caller for analysis. + DominatorTree &flush(); +Index: llvm-toolchain-6.0-6.0.1/lib/Analysis/LazyValueInfo.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Analysis/LazyValueInfo.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Analysis/LazyValueInfo.cpp +@@ -401,6 +401,7 @@ namespace { + AssumptionCache *AC; ///< A pointer to the cache of @llvm.assume calls. + const DataLayout &DL; ///< A mandatory DataLayout + DominatorTree *DT; ///< An optional DT pointer. ++ DominatorTree *DisabledDT; ///< Stores DT if it's disabled. + + ValueLatticeElement getBlockValue(Value *Val, BasicBlock *BB); + bool getEdgeValue(Value *V, BasicBlock *F, BasicBlock *T, +@@ -463,13 +464,30 @@ namespace { + TheCache.eraseBlock(BB); + } + ++ /// Disables use of the DominatorTree within LVI. ++ void disableDT() { ++ if (DT) { ++ assert(!DisabledDT && "Both DT and DisabledDT are not nullptr!"); ++ std::swap(DT, DisabledDT); ++ } ++ } ++ ++ /// Enables use of the DominatorTree within LVI. Does nothing if the class ++ /// instance was initialized without a DT pointer. ++ void enableDT() { ++ if (DisabledDT) { ++ assert(!DT && "Both DT and DisabledDT are not nullptr!"); ++ std::swap(DT, DisabledDT); ++ } ++ } ++ + /// This is the update interface to inform the cache that an edge from + /// PredBB to OldSucc has been threaded to be from PredBB to NewSucc. + void threadEdge(BasicBlock *PredBB,BasicBlock *OldSucc,BasicBlock *NewSucc); + + LazyValueInfoImpl(AssumptionCache *AC, const DataLayout &DL, + DominatorTree *DT = nullptr) +- : AC(AC), DL(DL), DT(DT) {} ++ : AC(AC), DL(DL), DT(DT), DisabledDT(nullptr) {} + }; + } // end anonymous namespace + +@@ -1791,6 +1809,16 @@ void LazyValueInfo::printLVI(Function &F + } + } + ++void LazyValueInfo::disableDT() { ++ if (PImpl) ++ getImpl(PImpl, AC, DL, DT).disableDT(); ++} ++ ++void LazyValueInfo::enableDT() { ++ if (PImpl) ++ getImpl(PImpl, AC, DL, DT).enableDT(); ++} ++ + // Print the LVI for the function arguments at the start of each basic block. + void LazyValueInfoAnnotatedWriter::emitBasicBlockStartAnnot( + const BasicBlock *BB, formatted_raw_ostream &OS) { +Index: llvm-toolchain-6.0-6.0.1/lib/IR/Dominators.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/IR/Dominators.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/IR/Dominators.cpp +@@ -453,6 +453,9 @@ bool DeferredDominance::pendingDeletedBB + return DeletedBBs.count(DelBB) != 0; + } + ++/// \brief Returns true if pending DT updates are queued for a flush() event. ++bool DeferredDominance::pending() { return !PendUpdates.empty(); } ++ + /// \brief Flushes all pending updates and block deletions. Returns a + /// correct DominatorTree reference to be used by the caller for analysis. + DominatorTree &DeferredDominance::flush() { +Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/JumpThreading.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Scalar/JumpThreading.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/JumpThreading.cpp +@@ -425,6 +425,7 @@ bool JumpThreadingPass::runImpl(Function + + LoopHeaders.clear(); + DDT->flush(); ++ LVI->enableDT(); + return EverChanged; + } + +@@ -617,6 +618,10 @@ bool JumpThreadingPass::ComputeValueKnow + // "X < 4" and "X < 3" is known true but "X < 4" itself is not available. + // Perhaps getConstantOnEdge should be smart enough to do this? + ++ if (DDT->pending()) ++ LVI->disableDT(); ++ else ++ LVI->enableDT(); + for (BasicBlock *P : predecessors(BB)) { + // If the value is known by LazyValueInfo to be a constant in a + // predecessor, use that information to try to thread this block. +@@ -630,6 +635,10 @@ bool JumpThreadingPass::ComputeValueKnow + + /// If I is a PHI node, then we know the incoming values for any constants. + if (PHINode *PN = dyn_cast(I)) { ++ if (DDT->pending()) ++ LVI->disableDT(); ++ else ++ LVI->enableDT(); + for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) { + Value *InVal = PN->getIncomingValue(i); + if (Constant *KC = getKnownConstant(InVal, Preference)) { +@@ -759,6 +768,10 @@ bool JumpThreadingPass::ComputeValueKnow + const DataLayout &DL = PN->getModule()->getDataLayout(); + // We can do this simplification if any comparisons fold to true or false. + // See if any do. ++ if (DDT->pending()) ++ LVI->disableDT(); ++ else ++ LVI->enableDT(); + for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) { + BasicBlock *PredBB = PN->getIncomingBlock(i); + Value *LHS = PN->getIncomingValue(i); +@@ -792,6 +805,10 @@ bool JumpThreadingPass::ComputeValueKnow + + if (!isa(CmpLHS) || + cast(CmpLHS)->getParent() != BB) { ++ if (DDT->pending()) ++ LVI->disableDT(); ++ else ++ LVI->enableDT(); + for (BasicBlock *P : predecessors(BB)) { + // If the value is known by LazyValueInfo to be a constant in a + // predecessor, use that information to try to thread this block. +@@ -820,6 +837,10 @@ bool JumpThreadingPass::ComputeValueKnow + match(CmpLHS, m_Add(m_Value(AddLHS), m_ConstantInt(AddConst)))) { + if (!isa(AddLHS) || + cast(AddLHS)->getParent() != BB) { ++ if (DDT->pending()) ++ LVI->disableDT(); ++ else ++ LVI->enableDT(); + for (BasicBlock *P : predecessors(BB)) { + // If the value is known by LazyValueInfo to be a ConstantRange in + // a predecessor, use that information to try to thread this +@@ -901,6 +922,10 @@ bool JumpThreadingPass::ComputeValueKnow + } + + // If all else fails, see if LVI can figure out a constant value for us. ++ if (DDT->pending()) ++ LVI->disableDT(); ++ else ++ LVI->enableDT(); + Constant *CI = LVI->getConstant(V, BB, CxtI); + if (Constant *KC = getKnownConstant(CI, Preference)) { + for (BasicBlock *Pred : predecessors(BB)) +@@ -1102,6 +1127,10 @@ bool JumpThreadingPass::ProcessBlock(Bas + // threading is concerned. + assert(CondBr->isConditional() && "Threading on unconditional terminator"); + ++ if (DDT->pending()) ++ LVI->disableDT(); ++ else ++ LVI->enableDT(); + LazyValueInfo::Tristate Ret = + LVI->getPredicateAt(CondCmp->getPredicate(), CondCmp->getOperand(0), + CondConst, CondBr); +@@ -1914,6 +1943,10 @@ bool JumpThreadingPass::ThreadEdge(Basic + << ", across block:\n " + << *BB << "\n"); + ++ if (DDT->pending()) ++ LVI->disableDT(); ++ else ++ LVI->enableDT(); + LVI->threadEdge(PredBB, BB, SuccBB); + + // We are going to have to map operands from the original BB block to the new +@@ -2383,6 +2416,10 @@ bool JumpThreadingPass::TryToUnfoldSelec + // Now check if one of the select values would allow us to constant fold the + // terminator in BB. We don't do the transform if both sides fold, those + // cases will be threaded in any case. ++ if (DDT->pending()) ++ LVI->disableDT(); ++ else ++ LVI->enableDT(); + LazyValueInfo::Tristate LHSFolds = + LVI->getPredicateOnEdge(CondCmp->getPredicate(), SI->getOperand(1), + CondRHS, Pred, BB, CondCmp); +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/pr36133.ll +=================================================================== +--- /dev/null ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/pr36133.ll +@@ -0,0 +1,44 @@ ++; RUN: opt -jump-threading -S < %s | FileCheck %s ++@global = external global i8*, align 8 ++ ++define i32 @foo(i32 %arg) { ++; CHECK-LABEL: @foo ++; CHECK-LABEL: bb: ++; CHECK: icmp eq ++; CHECK-NEXT: br i1 %tmp1, label %bb7, label %bb7 ++bb: ++ %tmp = load i8*, i8** @global, align 8 ++ %tmp1 = icmp eq i8* %tmp, null ++ br i1 %tmp1, label %bb3, label %bb2 ++ ++; CHECK-NOT: bb2: ++bb2: ++ br label %bb3 ++ ++; CHECK-NOT: bb3: ++bb3: ++ %tmp4 = phi i8 [ 1, %bb2 ], [ 0, %bb ] ++ %tmp5 = icmp eq i8 %tmp4, 0 ++ br i1 %tmp5, label %bb7, label %bb6 ++ ++; CHECK-NOT: bb6: ++bb6: ++ br label %bb7 ++ ++; CHECK-LABEL: bb7: ++bb7: ++ %tmp8 = icmp eq i32 %arg, -1 ++ br i1 %tmp8, label %bb9, label %bb10 ++ ++; CHECK-LABEL: bb9: ++bb9: ++ ret i32 0 ++ ++; CHECK-LABEL: bb10: ++bb10: ++ %tmp11 = icmp sgt i32 %arg, -1 ++ call void @llvm.assume(i1 %tmp11) ++ ret i32 1 ++} ++ ++declare void @llvm.assume(i1) diff --git a/patches/D51108-rust-powerpc.diff b/patches/D51108-rust-powerpc.diff new file mode 100644 index 00000000..aa7f7196 --- /dev/null +++ b/patches/D51108-rust-powerpc.diff @@ -0,0 +1,65 @@ +Index: llvm-toolchain-6.0-6.0.1/lib/Target/PowerPC/PPCISelLowering.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Target/PowerPC/PPCISelLowering.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Target/PowerPC/PPCISelLowering.cpp +@@ -3351,9 +3351,14 @@ + // Argument stored in memory. + assert(VA.isMemLoc()); + ++ // Get the extended size of the argument type in stack + unsigned ArgSize = VA.getLocVT().getStoreSize(); +- int FI = MFI.CreateFixedObject(ArgSize, VA.getLocMemOffset(), +- isImmutable); ++ // Get the actual size of the argument type ++ unsigned ObjSize = VA.getValVT().getStoreSize(); ++ unsigned ArgOffset = VA.getLocMemOffset(); ++ // Stack objects in PPC32 are right justified. ++ ArgOffset += ArgSize - ObjSize; ++ int FI = MFI.CreateFixedObject(ArgSize, ArgOffset, isImmutable); + + // Create load nodes to retrieve arguments from the stack. + SDValue FIN = DAG.getFrameIndex(FI, PtrVT); +@@ -5303,10 +5308,11 @@ + Arg = PtrOff; + } + +- if (VA.isRegLoc()) { +- if (Arg.getValueType() == MVT::i1) +- Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, Arg); ++ // Ensure callee will get either 0x00000001 or 0x00000000. ++ if (Arg.getValueType() == MVT::i1) ++ Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, Arg); + ++ if (VA.isRegLoc()) { + seenFloatArg |= VA.getLocVT().isFloatingPoint(); + // Put argument in a physical register. + RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg)); +Index: llvm-toolchain-6.0-6.0.1/test/CodeGen/PowerPC/ppc32-i1-stack-arguments-abi-bug.ll +=================================================================== +--- /dev/null ++++ llvm-toolchain-6.0-6.0.1/test/CodeGen/PowerPC/ppc32-i1-stack-arguments-abi-bug.ll +@@ -0,0 +1,24 @@ ++; RUN: llc -verify-machineinstrs < %s -mcpu=ppc32 -mattr=+crbits | FileCheck %s ++target triple = "powerpc-unknown-linux-gnu" ++ ++define zeroext i1 @check_callee( ++ i1 zeroext, i1 zeroext, i1 zeroext, i1 zeroext, ++ i1 zeroext, i1 zeroext, i1 zeroext, i1 zeroext, ++ i1 zeroext %s1 ++) { ++ call void @check_caller( ++ i1 zeroext true, i1 zeroext true, i1 zeroext true, i1 zeroext true, ++ i1 zeroext true, i1 zeroext true, i1 zeroext true, i1 zeroext true, ++ i1 zeroext %s1) ++ ret i1 true ++} ++ ++; CHECK-LABEL: @check_callee ++; CHECK: lbz {{[0-9]+}}, 27(1) ++; CHECK: stw {{[0-9]+}}, 8(1) ++ ++declare void @check_caller( ++ i1 zeroext, i1 zeroext, i1 zeroext, i1 zeroext, ++ i1 zeroext, i1 zeroext, i1 zeroext, i1 zeroext, ++ i1 zeroext ++) diff --git a/patches/D51335-alignment-issue.diff b/patches/D51335-alignment-issue.diff new file mode 100644 index 00000000..6c8589cd --- /dev/null +++ b/patches/D51335-alignment-issue.diff @@ -0,0 +1,107 @@ +Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/SROA.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Scalar/SROA.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/SROA.cpp +@@ -2987,6 +2987,42 @@ private: + return true; + } + ++ void fixLoadStoreAlign(Instruction &Root) { ++ // This algorithm implements the same visitor loop as ++ // hasUnsafePHIOrSelectUse, and fixes the alignment of each load ++ // or store found. ++ SmallPtrSet Visited; ++ SmallVector Uses; ++ Visited.insert(&Root); ++ Uses.push_back(&Root); ++ do { ++ Instruction *I = Uses.pop_back_val(); ++ ++ if (LoadInst *LI = dyn_cast(I)) { ++ unsigned LoadAlign = LI->getAlignment(); ++ if (!LoadAlign) ++ LoadAlign = DL.getABITypeAlignment(LI->getType()); ++ LI->setAlignment(std::min(LoadAlign, getSliceAlign())); ++ continue; ++ } ++ if (StoreInst *SI = dyn_cast(I)) { ++ unsigned StoreAlign = SI->getAlignment(); ++ if (!StoreAlign) { ++ Value *Op = SI->getOperand(0); ++ StoreAlign = DL.getABITypeAlignment(Op->getType()); ++ } ++ SI->setAlignment(std::min(StoreAlign, getSliceAlign())); ++ continue; ++ } ++ ++ assert(isa(I) || isa(I) || ++ isa(I) || isa(I)); ++ for (User *U : I->users()) ++ if (Visited.insert(cast(U)).second) ++ Uses.push_back(cast(U)); ++ } while (!Uses.empty()); ++ } ++ + bool visitPHINode(PHINode &PN) { + DEBUG(dbgs() << " original: " << PN << "\n"); + assert(BeginOffset >= NewAllocaBeginOffset && "PHIs are unsplittable"); +@@ -3010,6 +3046,9 @@ private: + DEBUG(dbgs() << " to: " << PN << "\n"); + deleteIfTriviallyDead(OldPtr); + ++ // Fix the alignment of any loads or stores using this PHI node. ++ fixLoadStoreAlign(PN); ++ + // PHIs can't be promoted on their own, but often can be speculated. We + // check the speculation outside of the rewriter so that we see the + // fully-rewritten alloca. +@@ -3034,6 +3073,9 @@ private: + DEBUG(dbgs() << " to: " << SI << "\n"); + deleteIfTriviallyDead(OldPtr); + ++ // Fix the alignment of any loads or stores using this select. ++ fixLoadStoreAlign(SI); ++ + // Selects can't be promoted on their own, but often can be speculated. We + // check the speculation outside of the rewriter so that we see the + // fully-rewritten alloca. +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/SROA/phi-and-select.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/SROA/phi-and-select.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/SROA/phi-and-select.ll +@@ -600,3 +600,35 @@ if.then5: + store %struct.S undef, %struct.S* %f1, align 4 + ret void + } ++ ++define i32 @phi_align(i32* %z) { ++; CHECK-LABEL: @phi_align( ++entry: ++ %a = alloca [8 x i8], align 8 ++; CHECK: alloca [7 x i8] ++ ++ %a0x = getelementptr [8 x i8], [8 x i8]* %a, i64 0, i32 1 ++ %a0 = bitcast i8* %a0x to i32* ++ %a1x = getelementptr [8 x i8], [8 x i8]* %a, i64 0, i32 4 ++ %a1 = bitcast i8* %a1x to i32* ++; CHECK: store i32 0, {{.*}}, align 1 ++ store i32 0, i32* %a0, align 1 ++; CHECK: store i32 1, {{.*}}, align 1 ++ store i32 1, i32* %a1, align 4 ++; CHECK: load {{.*}}, align 1 ++ %v0 = load i32, i32* %a0, align 1 ++; CHECK: load {{.*}}, align 1 ++ %v1 = load i32, i32* %a1, align 4 ++ %cond = icmp sle i32 %v0, %v1 ++ br i1 %cond, label %then, label %exit ++ ++then: ++ br label %exit ++ ++exit: ++; CHECK: %phi = phi i32* [ {{.*}}, %then ], [ %z, %entry ] ++; CHECK-NEXT: %result = load i32, i32* %phi, align 1 ++ %phi = phi i32* [ %a1, %then ], [ %z, %entry ] ++ %result = load i32, i32* %phi, align 4 ++ ret i32 %result ++} diff --git a/patches/D51639-optim-issue.diff b/patches/D51639-optim-issue.diff new file mode 100644 index 00000000..4efd48c7 --- /dev/null +++ b/patches/D51639-optim-issue.diff @@ -0,0 +1,46 @@ +Index: llvm-toolchain/lib/Transforms/Vectorize/LoopVectorize.cpp +=================================================================== +--- llvm-toolchain.orig/lib/Transforms/Vectorize/LoopVectorize.cpp ++++ llvm-toolchain/lib/Transforms/Vectorize/LoopVectorize.cpp +@@ -5770,6 +5770,11 @@ void LoopVectorizationCostModel::collect + for (auto OV : I->operand_values()) { + if (isOutOfScope(OV)) + continue; ++ // First order recurrence Phi's should typically be considered ++ // non-uniform. ++ auto *OP = dyn_cast(OV); ++ if (OP && Legal->isFirstOrderRecurrence(OP)) ++ continue; + auto *OI = cast(OV); + if (llvm::all_of(OI->users(), [&](User *U) -> bool { + auto *J = cast(U); +Index: llvm-toolchain/test/Transforms/LoopVectorize/X86/uniform-phi.ll +=================================================================== +--- llvm-toolchain.orig/test/Transforms/LoopVectorize/X86/uniform-phi.ll ++++ llvm-toolchain/test/Transforms/LoopVectorize/X86/uniform-phi.ll +@@ -75,3 +75,25 @@ for.end: + ret i64 %retval + } + ++; CHECK-LABEL: PR38786 ++; Check that first order recurrence phis (%phi32 and %phi64) are not uniform. ++; CHECK-NOT: LV: Found uniform instruction: %phi ++define void @PR38786(double* %y, double* %x, i64 %n) { ++entry: ++ br label %for.body ++ ++for.body: ++ %phi32 = phi i32 [ 0, %entry ], [ %i32next, %for.body ] ++ %phi64 = phi i64 [ 0, %entry ], [ %i64next, %for.body ] ++ %i32next = add i32 %phi32, 1 ++ %i64next = zext i32 %i32next to i64 ++ %xip = getelementptr inbounds double, double* %x, i64 %i64next ++ %yip = getelementptr inbounds double, double* %y, i64 %phi64 ++ %xi = load double, double* %xip, align 8 ++ store double %xi, double* %yip, align 8 ++ %cmp = icmp slt i64 %i64next, %n ++ br i1 %cmp, label %for.body, label %for.end ++ ++for.end: ++ ret void ++} diff --git a/patches/D53557-hurd-self-exe-realpath.diff b/patches/D53557-hurd-self-exe-realpath.diff new file mode 100644 index 00000000..781a473b --- /dev/null +++ b/patches/D53557-hurd-self-exe-realpath.diff @@ -0,0 +1,72 @@ +[hurd] Make getMainExecutable get the real binary path + +On GNU/Hurd, llvm-config is returning bogus value, such as: + +$ llvm-config-6.0 --includedir +/usr/include + +while it should be: +$ llvm-config-6.0 --includedir +/usr/lib/llvm-6.0/include + +This is because getMainExecutable does not get the actual installation +path. On GNU/Hurd, /proc/self/exe is indeed a symlink to the path that +was used to start the program, and not the eventual binary file. Llvm's +getMainExecutable thus needs to run realpath over it to get the actual +place where llvm was installed (/usr/lib/llvm-6.0/bin/llvm-config), and +not /usr/bin/llvm-config-6.0. This will not change the result on Linux, +where /proc/self/exe already points to the eventual file. + +Patch by Samuel Thibault! + +While making changes here, I reformatted this block a bit to reduce +indentation and match 2 space indent style. + +Differential Revision: https://reviews.llvm.org/D53557 + +Index: llvm-toolchain-6.0-6.0.1/lib/Support/Unix/Path.inc +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Support/Unix/Path.inc ++++ llvm-toolchain-6.0-6.0.1/lib/Support/Unix/Path.inc +@@ -191,14 +191,34 @@ std::string getMainExecutable(const char + char exe_path[MAXPATHLEN]; + StringRef aPath("/proc/self/exe"); + if (sys::fs::exists(aPath)) { +- // /proc is not always mounted under Linux (chroot for example). +- ssize_t len = readlink(aPath.str().c_str(), exe_path, sizeof(exe_path)); +- if (len >= 0) +- return std::string(exe_path, len); ++ // /proc is not always mounted under Linux (chroot for example). ++ ssize_t len = readlink(aPath.str().c_str(), exe_path, sizeof(exe_path)); ++ if (len < 0) ++ return ""; ++ ++ // Null terminate the string for realpath. readlink never null ++ // terminates its output. ++ len = std::min(len, ssize_t(sizeof(exe_path) - 1)); ++ exe_path[len] = '\0'; ++ ++ // At least on GNU/Hurd, /proc/self/exe is a symlink to the path that ++ // was used to start the program, and not the eventual binary file. ++ // We thus needs to run realpath over it to get the actual place ++ // where llvm was installed. ++#if _POSIX_VERSION >= 200112 || defined(__GLIBC__) ++ char *real_path = realpath(exe_path, NULL); ++ std::string ret = std::string(real_path); ++ free(real_path); ++ return ret; ++#else ++ char real_path[MAXPATHLEN]; ++ realpath(exe_path, real_path); ++ return std::string(real_path); ++#endif + } else { +- // Fall back to the classical detection. +- if (getprogpath(exe_path, argv0)) +- return exe_path; ++ // Fall back to the classical detection. ++ if (getprogpath(exe_path, argv0)) ++ return exe_path; + } + #elif defined(HAVE_DLFCN_H) && defined(HAVE_DLADDR) + // Use dladdr to get executable path if available. diff --git a/patches/PowerPC-Make-AddrSpaceCast-noop.diff b/patches/PowerPC-Make-AddrSpaceCast-noop.diff new file mode 100644 index 00000000..bca07b55 --- /dev/null +++ b/patches/PowerPC-Make-AddrSpaceCast-noop.diff @@ -0,0 +1,43 @@ +Index: llvm-toolchain-6.0-6.0.1/CodeGen/PowerPC/addrspacecast.ll +=================================================================== +--- /dev/null ++++ llvm-toolchain-6.0-6.0.1/CodeGen/PowerPC/addrspacecast.ll +@@ -0,0 +1,22 @@ ++; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu %s -o - | FileCheck %s ++ ++; Check that codegen for an addrspace cast succeeds without error. ++define <4 x i32 addrspace(1)*> @f (<4 x i32*> %x) { ++ %1 = addrspacecast <4 x i32*> %x to <4 x i32 addrspace(1)*> ++ ret <4 x i32 addrspace(1)*> %1 ++ ; CHECK-LABEL: @f ++} ++ ++; Check that fairly complicated addrspace cast and operations succeed without error. ++%struct = type opaque ++define void @g (%struct addrspace(10)** %x) { ++ %1 = load %struct addrspace(10)*, %struct addrspace(10)** %x ++ %2 = addrspacecast %struct addrspace(10)* %1 to %struct addrspace(11)* ++ %3 = bitcast %struct addrspace(11)* %2 to i8 addrspace(11)* ++ %4 = getelementptr i8, i8 addrspace(11)* %3, i64 16 ++ %5 = bitcast i8 addrspace(11)* %4 to %struct addrspace(10)* addrspace(11)* ++ %6 = load %struct addrspace(10)*, %struct addrspace(10)* addrspace(11)* %5 ++ store %struct addrspace(10)* %6, %struct addrspace(10)** undef ++ ret void ++ ; CHECK-LABEL: @g ++} +Index: llvm-toolchain-6.0-6.0.1/lib/Target/PowerPC/PPCISelLowering.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Target/PowerPC/PPCISelLowering.h ++++ llvm-toolchain-6.0-6.0.1/lib/Target/PowerPC/PPCISelLowering.h +@@ -884,6 +884,11 @@ namespace llvm { + } + }; + ++ bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override { ++ // Addrspacecasts are always noops. ++ return true; ++ } ++ + bool canReuseLoadAddress(SDValue Op, EVT MemVT, ReuseLoadInfo &RLI, + SelectionDAG &DAG, + ISD::LoadExtType ET = ISD::NON_EXTLOAD) const; diff --git a/patches/atomic_library_1.diff b/patches/atomic_library_1.diff new file mode 100644 index 00000000..fb253e7e --- /dev/null +++ b/patches/atomic_library_1.diff @@ -0,0 +1,25 @@ +--- + clang/lib/Basic/Targets.cpp | 14 ++++++++++++++ + clang/test/CodeGen/linux-arm-atomic.c | 10 ++++++++++ + 2 files changed, 24 insertions(+) + +Index: llvm-toolchain-snapshot_6.0~svn309319/clang/test/CodeGen/linux-arm-atomic.c +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn309319.orig/clang/test/CodeGen/linux-arm-atomic.c ++++ llvm-toolchain-snapshot_6.0~svn309319/clang/test/CodeGen/linux-arm-atomic.c +@@ -1,5 +1,15 @@ + // RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv7-unknown-linux | FileCheck %s + // RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv6-unknown-linux | FileCheck %s ++ ++typedef int _Atomic_word; ++_Atomic_word exchange_and_add(volatile _Atomic_word *__mem, int __val) { ++ return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); ++} ++ ++// CHECK: define {{.*}} @exchange_and_add ++// CHECK: atomicrmw {{.*}} add ++// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv7-unknown-linux | FileCheck %s ++// RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv6-unknown-linux | FileCheck %s + // RUN: %clang_cc1 %s -emit-llvm -o - -triple=thumbv7-unknown-linux | FileCheck %s + // RUN: %clang_cc1 %s -emit-llvm -o - -triple=armv6-unknown-freebsd | FileCheck %s + diff --git a/patches/clang-analyzer-force-version.diff b/patches/clang-analyzer-force-version.diff new file mode 100644 index 00000000..c4bee912 --- /dev/null +++ b/patches/clang-analyzer-force-version.diff @@ -0,0 +1,25 @@ +# Force the version of clang in the analyzer +# This was causing the static analyzer to fail silently if the clang & clang++ are +# not installed +Index: llvm-toolchain-snapshot_6.0~svn256.06/clang/tools/scan-build/libexec/ccc-analyzer +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn256.06.orig/clang/tools/scan-build/libexec/ccc-analyzer ++++ llvm-toolchain-snapshot_6.0~svn256.06/clang/tools/scan-build/libexec/ccc-analyzer +@@ -91,7 +91,7 @@ if ($FindBin::Script =~ /c\+\+-analyzer/ + if (!defined $Compiler || (! -x $Compiler && ! SearchInPath($Compiler))) { $Compiler = $DefaultCXXCompiler; } + + $Clang = $ENV{'CLANG_CXX'}; +- if (!defined $Clang || ! -x $Clang) { $Clang = 'clang++'; } ++ if (!defined $Clang || ! -x $Clang) { $Clang = 'clang++-6.0'; } + + $IsCXX = 1 + } +@@ -100,7 +100,7 @@ else { + if (!defined $Compiler || (! -x $Compiler && ! SearchInPath($Compiler))) { $Compiler = $DefaultCCompiler; } + + $Clang = $ENV{'CLANG'}; +- if (!defined $Clang || ! -x $Clang) { $Clang = 'clang'; } ++ if (!defined $Clang || ! -x $Clang) { $Clang = 'clang-6.0'; } + + $IsCXX = 0 + } diff --git a/patches/clang-arm-default-vfp3-on-armv7a.patch b/patches/clang-arm-default-vfp3-on-armv7a.patch new file mode 100644 index 00000000..ec81b866 --- /dev/null +++ b/patches/clang-arm-default-vfp3-on-armv7a.patch @@ -0,0 +1,23 @@ +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/Support/ARMTargetParser.def ++++ llvm-toolchain-6.0-6.0.1/include/llvm/Support/ARMTargetParser.def +@@ -75,7 +75,7 @@ ARM_ARCH("armv6kz", ARMV6KZ, "6KZ", "v6k + ARM_ARCH("armv6-m", ARMV6M, "6-M", "v6m", ARMBuildAttrs::CPUArch::v6_M, + FK_NONE, ARM::AEK_NONE) + ARM_ARCH("armv7-a", ARMV7A, "7-A", "v7", ARMBuildAttrs::CPUArch::v7, +- FK_NEON, ARM::AEK_DSP) ++ FK_VFPV3_D16, ARM::AEK_DSP) + ARM_ARCH("armv7ve", ARMV7VE, "7VE", "v7ve", ARMBuildAttrs::CPUArch::v7, + FK_NEON, (ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | + ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP)) +--- llvm-toolchain-6.0-6.0.1.orig/lib/Target/ARM/ARM.td ++++ llvm-toolchain-6.0-6.0.1/lib/Target/ARM/ARM.td +@@ -530,7 +530,8 @@ def ARMv6sm : Architecture<"armv6s-m", + FeatureMClass]>; + + def ARMv7a : Architecture<"armv7-a", "ARMv7a", [HasV7Ops, +- FeatureNEON, ++ FeatureVFP3, ++ FeatureD16, + FeatureDB, + FeatureDSP, + FeatureAClass]>; diff --git a/patches/clang-fix-cmpxchg8-detection-on-i386.patch b/patches/clang-fix-cmpxchg8-detection-on-i386.patch new file mode 100644 index 00000000..eab2a4a0 --- /dev/null +++ b/patches/clang-fix-cmpxchg8-detection-on-i386.patch @@ -0,0 +1,46 @@ +libcxx atomic tests for old i386 fail with wrong Atomic inline width. +cmpxchg8b instruction is required for 8 byte atomics that clang was +assuming. + +Too bad _GCC_ATOMIC_LLONG_LOCK_FREE 2 isn't supported even with this change +because llvm doesn't support unaligned atomic compare and exchange operation. +Fallback calls to libatomic.so should handle long long lock free but clang +can't tell program if libatomic is always lock free. + +Related bug: https://llvm.org/bugs/show_bug.cgi?id=19355 + +Index: llvm-toolchain-snapshot_6.0~svn309319/clang/lib/Basic/Targets/X86.cpp +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn309319.orig/clang/lib/Basic/Targets/X86.cpp ++++ llvm-toolchain-snapshot_6.0~svn309319/clang/lib/Basic/Targets/X86.cpp +@@ -1133,7 +1133,7 @@ void X86TargetInfo::getTargetDefines(con + Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); + Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); + } +- if (CPU >= CK_i586) ++ if (isCmpXChg8Supported()) + Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); + + if (HasFloat128) +Index: llvm-toolchain-snapshot_6.0~svn309319/clang/lib/Basic/Targets/X86.h +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn309319.orig/clang/lib/Basic/Targets/X86.h ++++ llvm-toolchain-snapshot_6.0~svn309319/clang/lib/Basic/Targets/X86.h +@@ -281,6 +281,8 @@ class LLVM_LIBRARY_VISIBILITY X86TargetI + // acceptable. + // FIXME: This results in terrible diagnostics. Clang just says the CPU is + // invalid without explaining *why*. ++ if (!isCmpXChg8Supported()) ++ MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; + switch (Kind) { + case CK_Generic: + // No processor selected! +@@ -548,8 +550,6 @@ public: + (1 << TargetInfo::LongDouble)); + + // x86-32 has atomics up to 8 bytes +- // FIXME: Check that we actually have cmpxchg8b before setting +- // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.) + MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; + } + diff --git a/patches/clang-format-version.diff b/patches/clang-format-version.diff new file mode 100644 index 00000000..25ee3a1b --- /dev/null +++ b/patches/clang-format-version.diff @@ -0,0 +1,39 @@ +--- + clang/tools/clang-format/clang-format-diff.py | 2 +- + clang/tools/clang-format/clang-format.el | 2 +- + clang/tools/clang-format/clang-format.py | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +--- a/clang/tools/clang-format/clang-format-diff.py ++++ b/clang/tools/clang-format/clang-format-diff.py +@@ -55,7 +55,7 @@ def main(): + parser.add_argument('-style', + help='formatting style to apply (LLVM, Google, Chromium, ' + 'Mozilla, WebKit)') +- parser.add_argument('-binary', default='clang-format', ++ parser.add_argument('-binary', default='clang-format-6.0', + help='location of binary to use for clang-format') + args = parser.parse_args() + +--- a/clang/tools/clang-format/clang-format.el ++++ b/clang/tools/clang-format/clang-format.el +@@ -36,7 +36,7 @@ + :group 'tools) + + (defcustom clang-format-executable +- (or (executable-find "clang-format") ++ (or (executable-find "clang-format-6.0") + "clang-format") + "Location of the clang-format executable. + +--- a/clang/tools/clang-format/clang-format.py ++++ b/clang/tools/clang-format/clang-format.py +@@ -35,7 +35,7 @@ import vim + + # set g:clang_format_path to the path to clang-format if it is not on the path + # Change this to the full path if clang-format is not on the path. +-binary = 'clang-format' ++binary = 'clang-format-6.0' + if vim.eval('exists("g:clang_format_path")') == "1": + binary = vim.eval('g:clang_format_path') + diff --git a/patches/clang-tidy-run-bin.diff b/patches/clang-tidy-run-bin.diff new file mode 100644 index 00000000..0b9cb9a1 --- /dev/null +++ b/patches/clang-tidy-run-bin.diff @@ -0,0 +1,17 @@ +Index: llvm-toolchain-snapshot_6.0~svn309541/clang-tools-extra/clang-tidy/tool/run-clang-tidy.py +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn309541.orig/clang-tools-extra/clang-tidy/tool/run-clang-tidy.py ++++ llvm-toolchain-snapshot_6.0~svn309541/clang-tools-extra/clang-tidy/tool/run-clang-tidy.py +@@ -157,10 +157,10 @@ def main(): + 'clang-tidy and clang-apply-replacements in ' + '$PATH.') + parser.add_argument('-clang-tidy-binary', metavar='PATH', +- default='clang-tidy', ++ default='clang-tidy-6.0', + help='path to clang-tidy binary') + parser.add_argument('-clang-apply-replacements-binary', metavar='PATH', +- default='clang-apply-replacements', ++ default='clang-apply-replacements-6.0', + help='path to clang-apply-replacements binary') + parser.add_argument('-checks', default=None, + help='checks filter, when not specified, use clang-tidy ' diff --git a/patches/declare_clear_cache.diff b/patches/declare_clear_cache.diff new file mode 100644 index 00000000..9c559b07 --- /dev/null +++ b/patches/declare_clear_cache.diff @@ -0,0 +1,15 @@ +--- + lib/Support/Unix/Memory.inc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/lib/Support/Unix/Memory.inc ++++ b/lib/Support/Unix/Memory.inc +@@ -319,7 +319,7 @@ void Memory::InvalidateInstructionCache( + // FIXME: Can we safely always call this for __GNUC__ everywhere? + const char *Start = static_cast(Addr); + const char *End = Start + Len; +- __clear_cache(const_cast(Start), const_cast(End)); ++ __builtin___clear_cache(const_cast(Start), const_cast(End)); + # endif + + #endif // end apple diff --git a/patches/disable-display-PASS-UNSUPPORTED-XFAIL.diff b/patches/disable-display-PASS-UNSUPPORTED-XFAIL.diff new file mode 100644 index 00000000..cde5326d --- /dev/null +++ b/patches/disable-display-PASS-UNSUPPORTED-XFAIL.diff @@ -0,0 +1,17 @@ +Index: llvm-toolchain-snapshot_4.0~svn280802/lldb/third_party/Python/module/unittest2/unittest2/runner.py +=================================================================== +--- llvm-toolchain-snapshot_4.0~svn280802.orig/lldb/third_party/Python/module/unittest2/unittest2/runner.py ++++ llvm-toolchain-snapshot_4.0~svn280802/lldb/third_party/Python/module/unittest2/unittest2/runner.py +@@ -174,9 +174,9 @@ class TextTestRunner(unittest.TextTestRu + if hasattr(result, 'separator2'): + self.stream.writeln(result.separator2) + run = result.testsRun +- self.stream.writeln("Ran %d test%s in %.3fs" % +- (run, run != 1 and "s" or "", timeTaken)) +- self.stream.writeln() ++# self.stream.writeln("Ran %d test%s in %.3fs" % ++# (run, run != 1 and "s" or "", timeTaken)) ++# self.stream.writeln() + + expectedFails = unexpectedSuccesses = skipped = passed = failed = errored = 0 + try: diff --git a/patches/disable-error-xray.diff b/patches/disable-error-xray.diff new file mode 100644 index 00000000..2b77cf85 --- /dev/null +++ b/patches/disable-error-xray.diff @@ -0,0 +1,13 @@ +Index: llvm-toolchain-snapshot_5.0~svn300419/compiler-rt/lib/xray/xray_tsc.h +=================================================================== +--- llvm-toolchain-snapshot_5.0~svn300419.orig/compiler-rt/lib/xray/xray_tsc.h ++++ llvm-toolchain-snapshot_5.0~svn300419/compiler-rt/lib/xray/xray_tsc.h +@@ -61,8 +61,6 @@ inline uint64_t getTSCFrequency() XRAY_N + + } // namespace __xray + +-#else +-#error Target architecture is not supported. + #endif // CPU architecture + + #endif // XRAY_EMULATE_TSC_H diff --git a/patches/disable-llvm-symbolizer-test.diff b/patches/disable-llvm-symbolizer-test.diff new file mode 100644 index 00000000..988bb59e --- /dev/null +++ b/patches/disable-llvm-symbolizer-test.diff @@ -0,0 +1,25 @@ +Description: Silent a test failing on yakkety amd64 + /tmp/buildd/llvm-toolchain-snapshot-4.0~svn279801/test/tools/llvm-symbolizer/print_context.c:16:11: error: expected string not found in input + // CHECK: inc + ^ + :1:1: note: scanning from here + _fini + ^ + :1:3: note: possible intended match here + _fini + ^ +Author: Sylvestre +Last-Update: 2016-08-26 + +Index: llvm-toolchain-snapshot_6.0~svn311429/test/tools/llvm-symbolizer/print_context.c +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn311429.orig/test/tools/llvm-symbolizer/print_context.c ++++ llvm-toolchain-snapshot_6.0~svn311429/test/tools/llvm-symbolizer/print_context.c +@@ -14,6 +14,7 @@ int main() { + // RUN: cp %p/Inputs/print_context.o %t + // RUN: cd %t + // RUN: echo "%t/print_context.o 0x0" | llvm-symbolizer -print-source-context-lines=5 | FileCheck %s ++// XFAIL: * + + // Inputs/print_context.o built with plain -g -c from this source file + // Specifying -Xclang -fdebug-compilation-dir -Xclang . to make the debug info diff --git a/patches/disable-path-test-failing.diff b/patches/disable-path-test-failing.diff new file mode 100644 index 00000000..60a70d8e --- /dev/null +++ b/patches/disable-path-test-failing.diff @@ -0,0 +1,29 @@ +Index: llvm-toolchain-snapshot_6.0~svn309541/unittests/Support/Path.cpp +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn309541.orig/unittests/Support/Path.cpp ++++ llvm-toolchain-snapshot_6.0~svn309541/unittests/Support/Path.cpp +@@ -473,7 +473,7 @@ protected: + errs().flush(); + } + +- void TearDown() override { ASSERT_NO_ERROR(fs::remove(TestDirectory.str())); } ++// void TearDown() override { ASSERT_NO_ERROR(fs::remove(TestDirectory.str())); } + }; + + TEST_F(FileSystemTest, Unique) { +@@ -553,13 +553,13 @@ TEST_F(FileSystemTest, RealPath) { + + SmallString<64> HomeDir; + bool Result = llvm::sys::path::home_directory(HomeDir); +- if (Result) { ++/* if (Result) { + ASSERT_NO_ERROR(fs::real_path(HomeDir, Expected)); + ASSERT_NO_ERROR(fs::real_path("~", Actual, true)); + EXPECT_EQ(Expected, Actual); + ASSERT_NO_ERROR(fs::real_path("~/", Actual, true)); + EXPECT_EQ(Expected, Actual); +- } ++ }*/ + + ASSERT_NO_ERROR(fs::remove_directories(Twine(TestDirectory) + "/test1")); + } diff --git a/patches/disable-source-interleave.diff b/patches/disable-source-interleave.diff new file mode 100644 index 00000000..929098ea --- /dev/null +++ b/patches/disable-source-interleave.diff @@ -0,0 +1,12 @@ +Index: llvm-toolchain-snapshot_4.0~svn290969/test/tools/llvm-objdump/X86/source-interleave-x86_64.ll +=================================================================== +--- llvm-toolchain-snapshot_4.0~svn290969.orig/test/tools/llvm-objdump/X86/source-interleave-x86_64.ll ++++ llvm-toolchain-snapshot_4.0~svn290969/test/tools/llvm-objdump/X86/source-interleave-x86_64.ll +@@ -4,6 +4,7 @@ + ; RUN: llvm-objdump -d -l %t.o | FileCheck --check-prefix="LINES" %t.ll + ; RUN: llvm-objdump -d -S %t.o | FileCheck --check-prefix="SOURCE" %t.ll + ; ModuleID = 'source-interleave-x86_64.bc' ++; XFAIL: * + source_filename = "source-interleave-x86_64.c" + target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + target triple = "x86_64-unknown-linux-gnu" diff --git a/patches/disable-sse2-old-x86.diff b/patches/disable-sse2-old-x86.diff new file mode 100644 index 00000000..b84a4e29 --- /dev/null +++ b/patches/disable-sse2-old-x86.diff @@ -0,0 +1,12 @@ +Index: llvm-toolchain-6.0-6.0.1/clang/lib/Basic/Targets/X86.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/clang/lib/Basic/Targets/X86.cpp ++++ llvm-toolchain-6.0-6.0.1/clang/lib/Basic/Targets/X86.cpp +@@ -207,7 +207,6 @@ bool X86TargetInfo::initFeatureMap( + setFeatureEnabledImpl(Features, "cx16", true); + LLVM_FALLTHROUGH; + case CK_PentiumM: +- case CK_Pentium4: + case CK_x86_64: + setFeatureEnabledImpl(Features, "sse2", true); + LLVM_FALLTHROUGH; diff --git a/patches/do-not-fail-on-unexpected-pass.diff b/patches/do-not-fail-on-unexpected-pass.diff new file mode 100644 index 00000000..f9b8fabb --- /dev/null +++ b/patches/do-not-fail-on-unexpected-pass.diff @@ -0,0 +1,13 @@ +Index: llvm-toolchain-snapshot_3.9~svn268880/utils/lit/lit/Test.py +=================================================================== +--- llvm-toolchain-snapshot_3.9~svn268880.orig/utils/lit/lit/Test.py ++++ llvm-toolchain-snapshot_3.9~svn268880/utils/lit/lit/Test.py +@@ -30,7 +30,7 @@ PASS = ResultCode('PASS', False) + FLAKYPASS = ResultCode('FLAKYPASS', False) + XFAIL = ResultCode('XFAIL', False) + FAIL = ResultCode('FAIL', True) +-XPASS = ResultCode('XPASS', True) ++XPASS = ResultCode('XPASS', False) + UNRESOLVED = ResultCode('UNRESOLVED', True) + UNSUPPORTED = ResultCode('UNSUPPORTED', False) + TIMEOUT = ResultCode('TIMEOUT', True) diff --git a/patches/fix-clang-path-and-build.diff b/patches/fix-clang-path-and-build.diff new file mode 100644 index 00000000..1b47f0e9 --- /dev/null +++ b/patches/fix-clang-path-and-build.diff @@ -0,0 +1,24 @@ +--- + clang/lib/Driver/ToolChains.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +Index: llvm-toolchain-5.0-5.0~+rc2/clang/lib/Driver/ToolChains/Gnu.cpp +=================================================================== +--- llvm-toolchain-5.0-5.0~+rc2.orig/clang/lib/Driver/ToolChains/Gnu.cpp ++++ llvm-toolchain-5.0-5.0~+rc2/clang/lib/Driver/ToolChains/Gnu.cpp +@@ -15,6 +15,7 @@ + #include "Arch/SystemZ.h" + #include "CommonArgs.h" + #include "clang/Basic/VirtualFileSystem.h" ++#include "clang/Basic/Version.h" + #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX + #include "clang/Driver/Compilation.h" + #include "clang/Driver/Driver.h" +@@ -2368,6 +2369,7 @@ void Generic_GCC::AddClangCXXStdlibInclu + addLibStdCxxIncludePaths(DriverArgs, CC1Args); + break; + } ++ addSystemInclude(DriverArgs, CC1Args, "/usr/include/clang/" + std::string(CLANG_VERSION_STRING) + "/include/"); + } + + std::string Generic_GCC::findLibCxxIncludePath() const { diff --git a/patches/fix-llvm-config-obj-src-root.patch b/patches/fix-llvm-config-obj-src-root.patch new file mode 100644 index 00000000..bc1e679d --- /dev/null +++ b/patches/fix-llvm-config-obj-src-root.patch @@ -0,0 +1,20 @@ +--- + tools/llvm-config/llvm-config.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: llvm-toolchain-snapshot_5.0~svn298810/tools/llvm-config/llvm-config.cpp +=================================================================== +--- llvm-toolchain-snapshot_5.0~svn298810.orig/tools/llvm-config/llvm-config.cpp ++++ llvm-toolchain-snapshot_5.0~svn298810/tools/llvm-config/llvm-config.cpp +@@ -555,9 +555,9 @@ int main(int argc, char **argv) { + } else if (Arg == "--shared-mode") { + PrintSharedMode = true; + } else if (Arg == "--obj-root") { +- OS << ActivePrefix << '\n'; ++ OS << ActivePrefix << "/build/" << '\n'; + } else if (Arg == "--src-root") { +- OS << LLVM_SRC_ROOT << '\n'; ++ OS << ActivePrefix << "/build/" << '\n'; + } else if (Arg == "--ignore-libllvm") { + LinkDyLib = false; + LinkMode = BuiltSharedLibs ? LinkModeShared : LinkModeAuto; diff --git a/patches/fix-scan-view-path.diff b/patches/fix-scan-view-path.diff new file mode 100644 index 00000000..22a51214 --- /dev/null +++ b/patches/fix-scan-view-path.diff @@ -0,0 +1,21 @@ +Index: llvm-toolchain-3.9-3.9/clang/tools/scan-view/bin/scan-view +=================================================================== +--- llvm-toolchain-3.9-3.9.orig/clang/tools/scan-view/bin/scan-view ++++ llvm-toolchain-3.9-3.9/clang/tools/scan-view/bin/scan-view +@@ -23,6 +23,7 @@ kDefaultPort = 8181 + kMaxPortsToTry = 100 + + ### ++BASE_DIR = '/usr/share/clang/scan-view-6.0' + + + def url_is_up(url): +@@ -61,7 +62,7 @@ def start_browser(port, options): + + def run(port, options, root): + # Prefer to look relative to the installed binary +- share = os.path.dirname(__file__) + "/../share/" ++ share = os.path.join(BASE_DIR, 'share') + if not os.path.isdir(share): + # Otherwise look relative to the source + share = os.path.dirname(__file__) + "/../../scan-view/share" diff --git a/patches/force-gcc-header-obj.diff b/patches/force-gcc-header-obj.diff new file mode 100644 index 00000000..e47d28c3 --- /dev/null +++ b/patches/force-gcc-header-obj.diff @@ -0,0 +1,16 @@ +Index: llvm-toolchain-5.0-5.0.2~+rc1/clang/lib/Driver/ToolChains/Linux.cpp +=================================================================== +--- llvm-toolchain-5.0-5.0.2~+rc1.orig/clang/lib/Driver/ToolChains/Linux.cpp ++++ llvm-toolchain-5.0-5.0.2~+rc1/clang/lib/Driver/ToolChains/Linux.cpp +@@ -571,6 +571,11 @@ void Linux::AddClangSystemIncludeArgs(co + return; + } + ++ // Force the inclusion of the gcc headers (objc/objc.h) ++ addExternCSystemIncludeIfExists( ++ DriverArgs, CC1Args, GCCInstallation.getInstallPath() + "/include"); ++// std::cout << GCCInstallation.getInstallPath().str() << "/include" << std::endl; ++ + // Lacking those, try to detect the correct set of system includes for the + // target triple. + diff --git a/patches/hurd-EIEIO-undef.diff b/patches/hurd-EIEIO-undef.diff new file mode 100644 index 00000000..3b98ad92 --- /dev/null +++ b/patches/hurd-EIEIO-undef.diff @@ -0,0 +1,14 @@ +Index: llvm-toolchain-snapshot_3.9~svn268880/utils/TableGen/CodeEmitterGen.cpp +=================================================================== +--- llvm-toolchain-snapshot_3.9~svn268880.orig/utils/TableGen/CodeEmitterGen.cpp ++++ llvm-toolchain-snapshot_3.9~svn268880/utils/TableGen/CodeEmitterGen.cpp +@@ -229,6 +229,9 @@ void CodeEmitterGen::run(raw_ostream &o) + ArrayRef NumberedInstructions = + Target.getInstructionsByEnumValue(); + ++ o << "// Undef for HURD\n"; ++ o << "#ifdef EIEIO\n#undef EIEIO\n#endif\n"; ++ + // Emit function declaration + o << "uint64_t " << Target.getName(); + o << "MCCodeEmitter::getBinaryCodeForInstr(const MCInst &MI,\n" diff --git a/patches/hurd-lib_Support_Unix_Path.inc.diff b/patches/hurd-lib_Support_Unix_Path.inc.diff new file mode 100644 index 00000000..2aabaf3d --- /dev/null +++ b/patches/hurd-lib_Support_Unix_Path.inc.diff @@ -0,0 +1,52 @@ +Index: llvm-toolchain-6.0-6.0.1/lib/Support/Unix/Path.inc +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Support/Unix/Path.inc ++++ llvm-toolchain-6.0-6.0.1/lib/Support/Unix/Path.inc +@@ -98,7 +98,7 @@ + #define STATVFS_F_FRSIZE(vfs) static_cast(vfs.f_bsize) + #endif + +-#if defined(__NetBSD__) ++#if defined(__NetBSD__) || defined(__GNU__) + #define STATVFS_F_FLAG(vfs) (vfs).f_flag + #else + #define STATVFS_F_FLAG(vfs) (vfs).f_flags +@@ -111,7 +111,7 @@ namespace sys { + namespace fs { + #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ + defined(__minix) || defined(__FreeBSD_kernel__) || defined(__linux__) || \ +- defined(__CYGWIN__) || defined(__DragonFly__) || defined(_AIX) ++ defined(__CYGWIN__) || defined(__DragonFly__) || defined(_AIX) || defined(__GNU__) + static int + test_dir(char ret[PATH_MAX], const char *dir, const char *bin) + { +@@ -187,7 +187,7 @@ std::string getMainExecutable(const char + + if (getprogpath(exe_path, argv0) != NULL) + return exe_path; +-#elif defined(__linux__) || defined(__CYGWIN__) ++#elif defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) + char exe_path[MAXPATHLEN]; + StringRef aPath("/proc/self/exe"); + if (sys::fs::exists(aPath)) { +@@ -360,7 +360,7 @@ std::error_code remove(const Twine &path + } + + static bool is_local_impl(struct STATVFS &Vfs) { +-#if defined(__linux__) ++#if defined(__linux__) || defined(__GNU__) + #ifndef NFS_SUPER_MAGIC + #define NFS_SUPER_MAGIC 0x6969 + #endif +@@ -370,7 +370,11 @@ static bool is_local_impl(struct STATVFS + #ifndef CIFS_MAGIC_NUMBER + #define CIFS_MAGIC_NUMBER 0xFF534D42 + #endif ++#ifdef __GNU__ ++ switch ((uint32_t)Vfs.__f_type) { ++#else + switch ((uint32_t)Vfs.f_type) { ++#endif + case NFS_SUPER_MAGIC: + case SMB_SUPER_MAGIC: + case CIFS_MAGIC_NUMBER: diff --git a/patches/hurd-pathmax.diff b/patches/hurd-pathmax.diff new file mode 100644 index 00000000..d68cd4c1 --- /dev/null +++ b/patches/hurd-pathmax.diff @@ -0,0 +1,93 @@ +Index: llvm-toolchain-snapshot_6.0~svn317126/clang/lib/Basic/FileManager.cpp +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn317126.orig/clang/lib/Basic/FileManager.cpp ++++ llvm-toolchain-snapshot_6.0~svn317126/clang/lib/Basic/FileManager.cpp +@@ -501,6 +501,12 @@ void FileManager::invalidateCache(const + UniqueRealFiles.erase(Entry->getUniqueID()); + } + ++// For GNU Hurd ++#if defined(__GNU__) && !defined(PATH_MAX) ++# define PATH_MAX 4096 ++#endif ++ ++ + void FileManager::GetUniqueIDMapping( + SmallVectorImpl &UIDToFiles) const { + UIDToFiles.clear(); +Index: llvm-toolchain-snapshot_6.0~svn317126/lldb/include/lldb/lldb-defines.h +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn317126.orig/lldb/include/lldb/lldb-defines.h ++++ llvm-toolchain-snapshot_6.0~svn317126/lldb/include/lldb/lldb-defines.h +@@ -28,6 +28,11 @@ + #define INT32_MAX 2147483647 + #endif + ++// For GNU Hurd ++#if defined(__GNU__) && !defined(PATH_MAX) ++# define PATH_MAX 4096 ++#endif ++ + #if !defined(UINT32_MAX) + #define UINT32_MAX 4294967295U + #endif +Index: llvm-toolchain-snapshot_6.0~svn317126/lib/Support/Unix/Path.inc +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn317126.orig/lib/Support/Unix/Path.inc ++++ llvm-toolchain-snapshot_6.0~svn317126/lib/Support/Unix/Path.inc +@@ -64,6 +64,7 @@ + // For GNU Hurd + #if defined(__GNU__) && !defined(PATH_MAX) + # define PATH_MAX 4096 ++# define MAXPATHLEN 4096 + #endif + + #include +Index: llvm-toolchain-snapshot_6.0~svn317126/tools/dsymutil/DwarfLinker.cpp +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn317126.orig/tools/dsymutil/DwarfLinker.cpp ++++ llvm-toolchain-snapshot_6.0~svn317126/tools/dsymutil/DwarfLinker.cpp +@@ -93,6 +93,11 @@ + #include + #include + ++// For GNU Hurd ++#if defined(__GNU__) && !defined(PATH_MAX) ++# define PATH_MAX 4096 ++#endif ++ + namespace llvm { + namespace dsymutil { + +Index: llvm-toolchain-snapshot_6.0~svn317126/polly/lib/External/ppcg/cuda_common.c +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn317126.orig/polly/lib/External/ppcg/cuda_common.c ++++ llvm-toolchain-snapshot_6.0~svn317126/polly/lib/External/ppcg/cuda_common.c +@@ -15,6 +15,11 @@ + #include "cuda_common.h" + #include "ppcg.h" + ++// For GNU Hurd ++#if defined(__GNU__) && !defined(PATH_MAX) ++# define PATH_MAX 4096 ++#endif ++ + /* Open the host .cu file and the kernel .hu and .cu files for writing. + * Add the necessary includes. + */ +Index: llvm-toolchain-6.0-6.0.1/clang/lib/Frontend/ModuleDependencyCollector.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/clang/lib/Frontend/ModuleDependencyCollector.cpp ++++ llvm-toolchain-6.0-6.0.1/clang/lib/Frontend/ModuleDependencyCollector.cpp +@@ -97,6 +97,11 @@ struct ModuleDependencyMMCallbacks : pub + + } + ++// For GNU Hurd ++#if defined(__GNU__) && !defined(PATH_MAX) ++# define PATH_MAX 4096 ++#endif ++ + // TODO: move this to Support/Path.h and check for HAVE_REALPATH? + static bool real_path(StringRef SrcPath, SmallVectorImpl &RealPath) { + #ifdef LLVM_ON_UNIX diff --git a/patches/hurd-tools_llvm-shlib_CMakeLists.txt.diff b/patches/hurd-tools_llvm-shlib_CMakeLists.txt.diff new file mode 100644 index 00000000..987e2db4 --- /dev/null +++ b/patches/hurd-tools_llvm-shlib_CMakeLists.txt.diff @@ -0,0 +1,12 @@ +Index: llvm-toolchain-6.0-6.0.1/tools/llvm-shlib/CMakeLists.txt +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/tools/llvm-shlib/CMakeLists.txt ++++ llvm-toolchain-6.0-6.0.1/tools/llvm-shlib/CMakeLists.txt +@@ -40,6 +40,7 @@ set_property(TARGET LLVM PROPERTY VERSIO + list(REMOVE_DUPLICATES LIB_NAMES) + if(("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") OR (MINGW) OR (HAIKU) + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") ++ OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "GNU") + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "DragonFly") + OR ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")) # FIXME: It should be "GNU ld for elf" + configure_file( diff --git a/patches/install-scan-build-py.diff b/patches/install-scan-build-py.diff new file mode 100644 index 00000000..4f118f36 --- /dev/null +++ b/patches/install-scan-build-py.diff @@ -0,0 +1,16 @@ +--- + clang/tools/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +Index: llvm-toolchain-snapshot_6.0~svn314025/clang/tools/CMakeLists.txt +=================================================================== +--- llvm-toolchain-snapshot_6.0~svn314025.orig/clang/tools/CMakeLists.txt ++++ llvm-toolchain-snapshot_6.0~svn314025/clang/tools/CMakeLists.txt +@@ -23,6 +23,7 @@ if(CLANG_ENABLE_STATIC_ANALYZER) + add_clang_subdirectory(clang-check) + add_clang_subdirectory(clang-func-mapping) + add_clang_subdirectory(scan-build) ++ add_clang_subdirectory(scan-build-py) + add_clang_subdirectory(scan-view) + endif() + diff --git a/patches/julia/llvm-6.0-NVPTX-addrspaces.patch b/patches/julia/llvm-6.0-NVPTX-addrspaces.patch new file mode 100644 index 00000000..d8c519e0 --- /dev/null +++ b/patches/julia/llvm-6.0-NVPTX-addrspaces.patch @@ -0,0 +1,32 @@ +diff --git a/lib/Target/NVPTX/NVPTXISelLowering.cpp b/lib/Target/NVPTX/NVPTXISelLowering.cpp +index f1e4251a44b..73d49f5d7e4 100644 +--- a/lib/Target/NVPTX/NVPTXISelLowering.cpp ++++ b/lib/Target/NVPTX/NVPTXISelLowering.cpp +@@ -1248,6 +1248,14 @@ SDValue NVPTXTargetLowering::getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, + } + } + ++bool NVPTXTargetLowering::isNoopAddrSpaceCast(unsigned SrcAS, ++ unsigned DestAS) const { ++ assert(SrcAS != DestAS && "Expected different address spaces!"); ++ ++ return (SrcAS == ADDRESS_SPACE_GENERIC || SrcAS > ADDRESS_SPACE_LOCAL) && ++ (DestAS == ADDRESS_SPACE_GENERIC || DestAS > ADDRESS_SPACE_LOCAL); ++} ++ + SDValue + NVPTXTargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const { + SDLoc dl(Op); +diff --git a/lib/Target/NVPTX/NVPTXISelLowering.h b/lib/Target/NVPTX/NVPTXISelLowering.h +index ef04a8573d4..68a9a7195c4 100644 +--- a/lib/Target/NVPTX/NVPTXISelLowering.h ++++ b/lib/Target/NVPTX/NVPTXISelLowering.h +@@ -443,6 +443,8 @@ public: + const NVPTXSubtarget &STI); + SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; + ++ bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override; ++ + SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; + + const char *getTargetNodeName(unsigned Opcode) const override; diff --git a/patches/julia/llvm-D27629-AArch64-large_model_6.0.1.patch b/patches/julia/llvm-D27629-AArch64-large_model_6.0.1.patch new file mode 100644 index 00000000..1b815a2b --- /dev/null +++ b/patches/julia/llvm-D27629-AArch64-large_model_6.0.1.patch @@ -0,0 +1,24 @@ +From f76abe65e6d07fea5e838c4f8c9a9421c16debb0 Mon Sep 17 00:00:00 2001 +From: Valentin Churavy +Date: Thu, 5 Jul 2018 12:37:50 -0400 +Subject: [PATCH] Fix unwind info relocation with large code model on AArch64 + +--- + lib/MC/MCObjectFileInfo.cpp | 2 ++ + .../AArch64/ELF_ARM64_large-relocations.s | 20 +++++++++++++++++++ + 2 files changed, 22 insertions(+) + create mode 100644 test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_large-relocations.s + +Index: llvm-toolchain-6.0-6.0.1/lib/MC/MCObjectFileInfo.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/MC/MCObjectFileInfo.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/MC/MCObjectFileInfo.cpp +@@ -291,6 +291,8 @@ void MCObjectFileInfo::initELFMCObjectFi + break; + case Triple::ppc64: + case Triple::ppc64le: ++ case Triple::aarch64: ++ case Triple::aarch64_be: + case Triple::x86_64: + FDECFIEncoding = dwarf::DW_EH_PE_pcrel | + (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4); diff --git a/patches/julia/llvm-D34078-vectorize-fdiv.patch b/patches/julia/llvm-D34078-vectorize-fdiv.patch new file mode 100644 index 00000000..cd33b4a8 --- /dev/null +++ b/patches/julia/llvm-D34078-vectorize-fdiv.patch @@ -0,0 +1,53 @@ +From f94d12b6108b944199b715f31f25a022f75d2feb Mon Sep 17 00:00:00 2001 +From: Yichao Yu +Date: Sat, 10 Jun 2017 08:45:13 -0400 +Subject: [PATCH 4/4] Enable support for floating-point division reductions + +Similar to fsub, fdiv can also be vectorized using fmul. +--- + lib/Transforms/Utils/LoopUtils.cpp | 1 + + test/Transforms/LoopVectorize/float-reduction.ll | 22 ++++++++++++++++++++++ + 2 files changed, 23 insertions(+) + +Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Utils/LoopUtils.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Utils/LoopUtils.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Utils/LoopUtils.cpp +@@ -513,6 +513,7 @@ RecurrenceDescriptor::isRecurrenceInstr( + return InstDesc(Kind == RK_IntegerOr, I); + case Instruction::Xor: + return InstDesc(Kind == RK_IntegerXor, I); ++ case Instruction::FDiv: + case Instruction::FMul: + return InstDesc(Kind == RK_FloatMult, I, UAI); + case Instruction::FSub: +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/LoopVectorize/float-reduction.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/LoopVectorize/float-reduction.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/LoopVectorize/float-reduction.ll +@@ -44,3 +44,25 @@ for.body: + for.end: ; preds = %for.body + ret float %sub + } ++ ++;CHECK-LABEL: @foodiv( ++;CHECK: fdiv fast <4 x float> ++;CHECK: ret ++define float @foodiv(float* nocapture %A, i32* nocapture %n) nounwind uwtable readonly ssp { ++entry: ++ br label %for.body ++ ++for.body: ; preds = %for.body, %entry ++ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] ++ %sum.04 = phi float [ 1.000000e+00, %entry ], [ %sub, %for.body ] ++ %arrayidx = getelementptr inbounds float, float* %A, i64 %indvars.iv ++ %0 = load float, float* %arrayidx, align 4 ++ %sub = fdiv fast float %sum.04, %0 ++ %indvars.iv.next = add i64 %indvars.iv, 1 ++ %lftr.wideiv = trunc i64 %indvars.iv.next to i32 ++ %exitcond = icmp eq i32 %lftr.wideiv, 200 ++ br i1 %exitcond, label %for.end, label %for.body ++ ++for.end: ; preds = %for.body ++ ret float %sub ++} diff --git a/patches/julia/llvm-D42262-jumpthreading-not-i1.patch b/patches/julia/llvm-D42262-jumpthreading-not-i1.patch new file mode 100644 index 00000000..93643ff8 --- /dev/null +++ b/patches/julia/llvm-D42262-jumpthreading-not-i1.patch @@ -0,0 +1,82 @@ +commit 6a311a7a804831fea43cfb2f61322adcb407a1af +Author: Keno Fischer +Date: Thu Jan 18 15:57:05 2018 -0500 + + [JumpThreading] Don't restrict cast-traversal to i1 + + Summary: + In D17663, JumpThreading learned to look trough simple cast instructions, + but only if the source of those cast instructions was a phi/cmp i1 + (in an effort to limit compile time effects). I think this condition + is too restrictive. For switches with limited value range, InstCombine + will readily introduce an extra `trunc` instruction to a smaller + integer type (e.g. from i8 to i2), leaving us in the somewhat perverse + situation that jump-threading would work before running instcombine, + but not after. Since instcombine produces this pattern, I think we + need to consider it canonical and support it in JumpThreading. + In general, for limiting recursion, I think the existing restriction + to phi and cmp nodes should be sufficient to avoid looking through + unprofitable chains of instructions. + + Reviewers: haicheng, gberry, bmakam, mcrosier + + Subscribers: llvm-commits + + Differential Revision: https://reviews.llvm.org/D42262 + +Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/JumpThreading.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Scalar/JumpThreading.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/JumpThreading.cpp +@@ -656,11 +656,9 @@ bool JumpThreadingPass::ComputeValueKnow + } + + // Handle Cast instructions. Only see through Cast when the source operand is +- // PHI or Cmp and the source type is i1 to save the compilation time. ++ // PHI or Cmp to save the compilation time. + if (CastInst *CI = dyn_cast(I)) { + Value *Source = CI->getOperand(0); +- if (!Source->getType()->isIntegerTy(1)) +- return false; + if (!isa(Source) && !isa(Source)) + return false; + ComputeValueKnownInPredecessors(Source, BB, Result, Preference, CxtI); +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/basic.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/JumpThreading/basic.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/basic.ll +@@ -547,6 +547,34 @@ l5: + ; CHECK: } + } + ++define i1 @trunc_switch(i1 %arg) { ++; CHECK-LABEL: @trunc_switch ++top: ++; CHECK: br i1 %arg, label %exitA, label %exitB ++ br i1 %arg, label %common, label %B ++ ++B: ++ br label %common ++ ++common: ++ %phi = phi i8 [ 2, %B ], [ 1, %top ] ++ %trunc = trunc i8 %phi to i2 ++; CHECK-NOT: switch ++ switch i2 %trunc, label %unreach [ ++ i2 1, label %exitA ++ i2 -2, label %exitB ++ ] ++ ++unreach: ++ unreachable ++ ++exitA: ++ ret i1 true ++ ++exitB: ++ ret i1 false ++} ++ + ; CHECK-LABEL: define void @h_con(i32 %p) { + define void @h_con(i32 %p) { + %x = icmp ult i32 %p, 5 diff --git a/patches/julia/llvm-D44892-Perf-integration.patch b/patches/julia/llvm-D44892-Perf-integration.patch new file mode 100644 index 00000000..e849bcd3 --- /dev/null +++ b/patches/julia/llvm-D44892-Perf-integration.patch @@ -0,0 +1,677 @@ +From 45bc0f0badbdbabaed7d204757c2aad7ab49a3fe Mon Sep 17 00:00:00 2001 +From: DokFaust +Date: Mon, 11 Jun 2018 12:59:42 +0200 +Subject: [PATCH] PerfJITEventListener integration, requires compile flag + LLVM_USE_PERF + +--- + CMakeLists.txt | 13 + + include/llvm/Config/config.h.cmake | 3 + + include/llvm/Config/llvm-config.h.cmake | 3 + + .../llvm/ExecutionEngine/JITEventListener.h | 9 + + lib/ExecutionEngine/CMakeLists.txt | 4 + + lib/ExecutionEngine/LLVMBuild.txt | 2 +- + lib/ExecutionEngine/Orc/LLVMBuild.txt | 2 +- + .../PerfJITEvents/CMakeLists.txt | 5 + + .../PerfJITEvents/LLVMBuild.txt | 23 + + .../PerfJITEvents/PerfJITEventListener.cpp | 492 ++++++++++++++++++ + 10 files changed, 554 insertions(+), 2 deletions(-) + create mode 100644 lib/ExecutionEngine/PerfJITEvents/CMakeLists.txt + create mode 100644 lib/ExecutionEngine/PerfJITEvents/LLVMBuild.txt + create mode 100644 lib/ExecutionEngine/PerfJITEvents/PerfJITEventListener.cpp + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f8da6cf9211..fb92c825a46 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -426,6 +426,16 @@ if( LLVM_USE_OPROFILE ) + endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) + endif( LLVM_USE_OPROFILE ) + ++option(LLVM_USE_PERF ++ "Use perf JIT interface to inform perf about JIT code" OFF) ++ ++# If enabled, verify we are on a platform that supports perf. ++if( LLVM_USE_PERF ) ++ if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) ++ message(FATAL_ERROR "perf support is available on Linux only.") ++ endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" ) ++endif( LLVM_USE_PERF ) ++ + set(LLVM_USE_SANITIZER "" CACHE STRING + "Define the sanitizer used to build binaries and tests.") + set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH +@@ -634,6 +644,9 @@ endif (LLVM_USE_INTEL_JITEVENTS) + if (LLVM_USE_OPROFILE) + set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT) + endif (LLVM_USE_OPROFILE) ++if (LLVM_USE_PERF) ++ set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} PerfJITEvents) ++endif (LLVM_USE_PERF) + + message(STATUS "Constructing LLVMBuild project information") + execute_process( +diff --git a/include/llvm/Config/config.h.cmake b/include/llvm/Config/config.h.cmake +index 940f8420304..17787ed779b 100644 +--- a/include/llvm/Config/config.h.cmake ++++ b/include/llvm/Config/config.h.cmake +@@ -377,6 +377,9 @@ + /* Define if we have the oprofile JIT-support library */ + #cmakedefine01 LLVM_USE_OPROFILE + ++/* Define if we have the perf JIT-support library */ ++#cmakedefine01 LLVM_USE_PERF ++ + /* LLVM version information */ + #cmakedefine LLVM_VERSION_INFO "${LLVM_VERSION_INFO}" + +diff --git a/include/llvm/Config/llvm-config.h.cmake b/include/llvm/Config/llvm-config.h.cmake +index 4daa00f3bc4..8d9c3b24d52 100644 +--- a/include/llvm/Config/llvm-config.h.cmake ++++ b/include/llvm/Config/llvm-config.h.cmake +@@ -65,6 +65,9 @@ + /* Define if we have the oprofile JIT-support library */ + #cmakedefine01 LLVM_USE_OPROFILE + ++/* Define if we have the perf JIT-support library */ ++#cmakedefine01 LLVM_USE_PERF ++ + /* Major version of the LLVM API */ + #define LLVM_VERSION_MAJOR ${LLVM_VERSION_MAJOR} + +diff --git a/include/llvm/ExecutionEngine/JITEventListener.h b/include/llvm/ExecutionEngine/JITEventListener.h +index ff7840f00a4..1cc2c423a8b 100644 +--- a/include/llvm/ExecutionEngine/JITEventListener.h ++++ b/include/llvm/ExecutionEngine/JITEventListener.h +@@ -115,6 +115,15 @@ public: + } + #endif // USE_OPROFILE + ++#ifdef LLVM_USE_PERF ++ static JITEventListener *createPerfJITEventListener(); ++#else ++ static JITEventListener *createPerfJITEventListener() ++ { ++ return nullptr; ++ } ++#endif //USE_PERF ++ + private: + virtual void anchor(); + }; +diff --git a/lib/ExecutionEngine/CMakeLists.txt b/lib/ExecutionEngine/CMakeLists.txt +index 84b34919e44..893d113a685 100644 +--- a/lib/ExecutionEngine/CMakeLists.txt ++++ b/lib/ExecutionEngine/CMakeLists.txt +@@ -30,3 +30,7 @@ endif( LLVM_USE_OPROFILE ) + if( LLVM_USE_INTEL_JITEVENTS ) + add_subdirectory(IntelJITEvents) + endif( LLVM_USE_INTEL_JITEVENTS ) ++ ++if( LLVM_USE_PERF ) ++ add_subdirectory(PerfJITEvents) ++endif( LLVM_USE_PERF ) +diff --git a/lib/ExecutionEngine/LLVMBuild.txt b/lib/ExecutionEngine/LLVMBuild.txt +index 9d29a41f504..b6e1bda6a51 100644 +--- a/lib/ExecutionEngine/LLVMBuild.txt ++++ b/lib/ExecutionEngine/LLVMBuild.txt +@@ -16,7 +16,7 @@ + ;===------------------------------------------------------------------------===; + + [common] +-subdirectories = Interpreter MCJIT RuntimeDyld IntelJITEvents OProfileJIT Orc ++subdirectories = Interpreter MCJIT RuntimeDyld IntelJITEvents OProfileJIT Orc PerfJITEvents + + [component_0] + type = Library +diff --git a/lib/ExecutionEngine/Orc/LLVMBuild.txt b/lib/ExecutionEngine/Orc/LLVMBuild.txt +index 8f05172e77a..ef4ae64e823 100644 +--- a/lib/ExecutionEngine/Orc/LLVMBuild.txt ++++ b/lib/ExecutionEngine/Orc/LLVMBuild.txt +@@ -19,4 +19,4 @@ + type = Library + name = OrcJIT + parent = ExecutionEngine +-required_libraries = Core ExecutionEngine Object RuntimeDyld Support TransformUtils ++required_libraries = Core ExecutionEngine Object RuntimeDyld Support TransformUtils +diff --git a/lib/ExecutionEngine/PerfJITEvents/CMakeLists.txt b/lib/ExecutionEngine/PerfJITEvents/CMakeLists.txt +new file mode 100644 +index 00000000000..136cc429d02 +--- /dev/null ++++ b/lib/ExecutionEngine/PerfJITEvents/CMakeLists.txt +@@ -0,0 +1,5 @@ ++add_llvm_library(LLVMPerfJITEvents ++ PerfJITEventListener.cpp ++ ) ++ ++add_dependencies(LLVMPerfJITEvents LLVMCodeGen) +diff --git a/lib/ExecutionEngine/PerfJITEvents/LLVMBuild.txt b/lib/ExecutionEngine/PerfJITEvents/LLVMBuild.txt +new file mode 100644 +index 00000000000..b1958a69260 +--- /dev/null ++++ b/lib/ExecutionEngine/PerfJITEvents/LLVMBuild.txt +@@ -0,0 +1,23 @@ ++;===- ./lib/ExecutionEngine/PerfJITEvents/LLVMBuild.txt ----------------*- Conf -*--===; ++; ++; The LLVM Compiler Infrastructure ++; ++; This file is distributed under the University of Illinois Open Source ++; License. See LICENSE.TXT for details. ++; ++;===------------------------------------------------------------------------===; ++; ++; This is an LLVMBuild description file for the components in this subdirectory. ++; ++; For more information on the LLVMBuild system, please see: ++; ++; http://llvm.org/docs/LLVMBuild.html ++; ++;===------------------------------------------------------------------------===; ++ ++[component_0] ++type = OptionalLibrary ++name = PerfJITEvents ++parent = ExecutionEngine ++required_libraries = CodeGen Core DebugInfoDWARF ExecutionEngine Object Support TransformUtils ++ +diff --git a/lib/ExecutionEngine/PerfJITEvents/PerfJITEventListener.cpp b/lib/ExecutionEngine/PerfJITEvents/PerfJITEventListener.cpp +new file mode 100644 +index 00000000000..c2b97dd59f3 +--- /dev/null ++++ b/lib/ExecutionEngine/PerfJITEvents/PerfJITEventListener.cpp +@@ -0,0 +1,492 @@ ++//===-- PerfJITEventListener.cpp - Tell Linux's perf about JITted code ----===// ++// ++// The LLVM Compiler Infrastructure ++// ++// This file is distributed under the University of Illinois Open Source ++// License. See LICENSE.TXT for details. ++// ++//===----------------------------------------------------------------------===// ++// ++// This file defines a JITEventListener object that tells perf about JITted ++// functions, including source line information. ++// ++// Documentation for perf jit integration is available at: ++// https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/tools/perf/Documentation/jitdump-specification.txt ++// https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/tools/perf/Documentation/jit-interface.txt ++// ++//===----------------------------------------------------------------------===// ++ ++#include "llvm/ADT/Twine.h" ++#include "llvm/Config/config.h" ++#include "llvm/DebugInfo/DWARF/DWARFContext.h" ++#include "llvm/ExecutionEngine/JITEventListener.h" ++#include "llvm/Object/ObjectFile.h" ++#include "llvm/Object/SymbolSize.h" ++#include "llvm/Support/Debug.h" ++#include "llvm/Support/Errno.h" ++#include "llvm/Support/FileSystem.h" ++#include "llvm/Support/MemoryBuffer.h" ++#include "llvm/Support/Mutex.h" ++#include "llvm/Support/MutexGuard.h" ++#include "llvm/Support/Path.h" ++#include "llvm/Support/Process.h" ++#include "llvm/Support/Threading.h" ++#include "llvm/Support/raw_ostream.h" ++ ++#include // mmap() ++#include // getpid() ++#include // clock_gettime(), time(), localtime_r() */ ++#include // for getpid(), read(), close() ++ ++using namespace llvm; ++using namespace llvm::object; ++typedef DILineInfoSpecifier::FileLineInfoKind FileLineInfoKind; ++ ++namespace { ++ ++// language identifier (XXX: should we generate something better from debug ++// info?) ++#define JIT_LANG "llvm-IR" ++#define LLVM_PERF_JIT_MAGIC \ ++ ((uint32_t)'J' << 24 | (uint32_t)'i' << 16 | (uint32_t)'T' << 8 | \ ++ (uint32_t)'D') ++#define LLVM_PERF_JIT_VERSION 1 ++ ++// bit 0: set if the jitdump file is using an architecture-specific timestamp ++// clock source ++#define JITDUMP_FLAGS_ARCH_TIMESTAMP (1ULL << 0) ++ ++struct LLVMPerfJitHeader; ++ ++class PerfJITEventListener : public JITEventListener { ++public: ++ PerfJITEventListener(); ++ ~PerfJITEventListener() { ++ if (MarkerAddr) ++ CloseMarker(); ++ } ++ ++ void NotifyObjectEmitted(const ObjectFile &Obj, ++ const RuntimeDyld::LoadedObjectInfo &L) override; ++ void NotifyFreeingObject(const ObjectFile &Obj) override; ++ ++private: ++ bool InitDebuggingDir(); ++ bool OpenMarker(); ++ void CloseMarker(); ++ static bool FillMachine(LLVMPerfJitHeader &hdr); ++ ++ void NotifyCode(Expected &Symbol, uint64_t CodeAddr, ++ uint64_t CodeSize); ++ void NotifyDebug(uint64_t CodeAddr, DILineInfoTable Lines); ++ ++ // cache lookups ++ pid_t Pid; ++ ++ // base directory for output data ++ std::string JitPath; ++ ++ // output data stream, closed via Dumpstream ++ int DumpFd = -1; ++ ++ // output data stream ++ std::unique_ptr Dumpstream; ++ ++ // prevent concurrent dumps from messing up the output file ++ sys::Mutex Mutex; ++ ++ // perf mmap marker ++ void *MarkerAddr = NULL; ++ ++ // perf support ready ++ bool SuccessfullyInitialized = false; ++ ++ // identifier for functions, primarily to identify when moving them around ++ uint64_t CodeGeneration = 1; ++}; ++ ++// The following are POD struct definitions from the perf jit specification ++ ++enum LLVMPerfJitRecordType { ++ JIT_CODE_LOAD = 0, ++ JIT_CODE_MOVE = 1, // not emitted, code isn't moved ++ JIT_CODE_DEBUG_INFO = 2, ++ JIT_CODE_CLOSE = 3, // not emitted, unnecessary ++ JIT_CODE_UNWINDING_INFO = 4, // not emitted ++ ++ JIT_CODE_MAX ++}; ++ ++struct LLVMPerfJitHeader { ++ uint32_t Magic; // characters "JiTD" ++ uint32_t Version; // header version ++ uint32_t TotalSize; // total size of header ++ uint32_t ElfMach; // elf mach target ++ uint32_t Pad1; // reserved ++ uint32_t Pid; ++ uint64_t Timestamp; // timestamp ++ uint64_t Flags; // flags ++}; ++ ++// record prefix (mandatory in each record) ++struct LLVMPerfJitRecordPrefix { ++ uint32_t Id; // record type identifier ++ uint32_t TotalSize; ++ uint64_t Timestamp; ++}; ++ ++struct LLVMPerfJitRecordCodeLoad { ++ LLVMPerfJitRecordPrefix Prefix; ++ ++ uint32_t Pid; ++ uint32_t Tid; ++ uint64_t Vma; ++ uint64_t CodeAddr; ++ uint64_t CodeSize; ++ uint64_t CodeIndex; ++}; ++ ++struct LLVMPerfJitDebugEntry { ++ uint64_t Addr; ++ int Lineno; // source line number starting at 1 ++ int Discrim; // column discriminator, 0 is default ++ // followed by null terminated filename, \xff\0 if same as previous entry ++}; ++ ++struct LLVMPerfJitRecordDebugInfo { ++ LLVMPerfJitRecordPrefix Prefix; ++ ++ uint64_t CodeAddr; ++ uint64_t NrEntry; ++ // followed by NrEntry LLVMPerfJitDebugEntry records ++}; ++ ++static inline uint64_t timespec_to_ns(const struct timespec *ts) { ++ const uint64_t NanoSecPerSec = 1000000000; ++ return ((uint64_t)ts->tv_sec * NanoSecPerSec) + ts->tv_nsec; ++} ++ ++static inline uint64_t perf_get_timestamp(void) { ++ struct timespec ts; ++ int ret; ++ ++ ret = clock_gettime(CLOCK_MONOTONIC, &ts); ++ if (ret) ++ return 0; ++ ++ return timespec_to_ns(&ts); ++} ++ ++PerfJITEventListener::PerfJITEventListener() : Pid(::getpid()) { ++ // check if clock-source is supported ++ if (!perf_get_timestamp()) { ++ errs() << "kernel does not support CLOCK_MONOTONIC\n"; ++ return; ++ } ++ ++ if (!InitDebuggingDir()) { ++ errs() << "could not initialize debugging directory\n"; ++ return; ++ } ++ ++ std::string Filename; ++ raw_string_ostream FilenameBuf(Filename); ++ FilenameBuf << JitPath << "/jit-" << Pid << ".dump"; ++ ++ // Need to open ourselves, because we need to hand the FD to OpenMarker() and ++ // raw_fd_ostream doesn't expose the FD. ++ using sys::fs::openFileForWrite; ++ if (auto EC = ++ openFileForWrite(FilenameBuf.str(), DumpFd, sys::fs::F_RW, 0666)) { ++ errs() << "could not open JIT dump file " << FilenameBuf.str() << ": " ++ << EC.message() << "\n"; ++ return; ++ } ++ ++ Dumpstream = make_unique(DumpFd, true); ++ ++ LLVMPerfJitHeader Header = {0}; ++ if (!FillMachine(Header)) ++ return; ++ ++ // signal this process emits JIT information ++ if (!OpenMarker()) ++ return; ++ ++ // emit dumpstream header ++ Header.Magic = LLVM_PERF_JIT_MAGIC; ++ Header.Version = LLVM_PERF_JIT_VERSION; ++ Header.TotalSize = sizeof(Header); ++ Header.Pid = Pid; ++ Header.Timestamp = perf_get_timestamp(); ++ Dumpstream->write(reinterpret_cast(&Header), sizeof(Header)); ++ ++ // Everything initialized, can do profiling now. ++ if (!Dumpstream->has_error()) ++ SuccessfullyInitialized = true; ++} ++ ++void PerfJITEventListener::NotifyObjectEmitted( ++ const ObjectFile &Obj, const RuntimeDyld::LoadedObjectInfo &L) { ++ ++ if (!SuccessfullyInitialized) ++ return; ++ ++ OwningBinary DebugObjOwner = L.getObjectForDebug(Obj); ++ const ObjectFile &DebugObj = *DebugObjOwner.getBinary(); ++ ++ // Get the address of the object image for use as a unique identifier ++ std::unique_ptr Context = DWARFContext::create(DebugObj); ++ ++ // Use symbol info to iterate over functions in the object. ++ for (const std::pair &P : computeSymbolSizes(DebugObj)) { ++ SymbolRef Sym = P.first; ++ std::string SourceFileName; ++ ++ Expected SymTypeOrErr = Sym.getType(); ++ if (!SymTypeOrErr) { ++ // There's not much we can with errors here ++ consumeError(SymTypeOrErr.takeError()); ++ continue; ++ } ++ SymbolRef::Type SymType = *SymTypeOrErr; ++ if (SymType != SymbolRef::ST_Function) ++ continue; ++ ++ Expected Name = Sym.getName(); ++ if (!Name) { ++ consumeError(Name.takeError()); ++ continue; ++ } ++ ++ Expected AddrOrErr = Sym.getAddress(); ++ if (!AddrOrErr) { ++ consumeError(AddrOrErr.takeError()); ++ continue; ++ } ++ uint64_t Addr = *AddrOrErr; ++ uint64_t Size = P.second; ++ ++ // According to spec debugging info has to come before loading the ++ // corresonding code load. ++ DILineInfoTable Lines = Context->getLineInfoForAddressRange( ++ Addr, Size, FileLineInfoKind::AbsoluteFilePath); ++ ++ NotifyDebug(Addr, Lines); ++ NotifyCode(Name, Addr, Size); ++ } ++ ++ Dumpstream->flush(); ++} ++ ++void PerfJITEventListener::NotifyFreeingObject(const ObjectFile &Obj) { ++ // perf currently doesn't have an interface for unloading. But munmap()ing the ++ // code section does, so that's ok. ++} ++ ++bool PerfJITEventListener::InitDebuggingDir() { ++ time_t Time; ++ struct tm LocalTime; ++ char TimeBuffer[sizeof("YYYYMMDD")]; ++ SmallString<64> Path; ++ ++ // search for location to dump data to ++ if (const char *BaseDir = getenv("JITDUMPDIR")) ++ Path.append(BaseDir); ++ else if (!sys::path::home_directory(Path)) ++ Path = "."; ++ ++ // create debug directory ++ Path += "/.debug/jit/"; ++ if (auto EC = sys::fs::create_directories(Path)) { ++ errs() << "could not create jit cache directory " << Path << ": " ++ << EC.message() << "\n"; ++ return false; ++ } ++ ++ // create unique directory for dump data related to this process ++ time(&Time); ++ localtime_r(&Time, &LocalTime); ++ strftime(TimeBuffer, sizeof(TimeBuffer), "%Y%m%d", &LocalTime); ++ Path += JIT_LANG "-jit-"; ++ Path += TimeBuffer; ++ ++ SmallString<128> UniqueDebugDir; ++ ++ using sys::fs::createUniqueDirectory; ++ if (auto EC = createUniqueDirectory(Path, UniqueDebugDir)) { ++ errs() << "could not create unique jit cache directory " << UniqueDebugDir ++ << ": " << EC.message() << "\n"; ++ return false; ++ } ++ ++ JitPath = UniqueDebugDir.str(); ++ ++ return true; ++} ++ ++bool PerfJITEventListener::OpenMarker() { ++ // We mmap the jitdump to create an MMAP RECORD in perf.data file. The mmap ++ // is captured either live (perf record running when we mmap) or in deferred ++ // mode, via /proc/PID/maps. The MMAP record is used as a marker of a jitdump ++ // file for more meta data info about the jitted code. Perf report/annotate ++ // detect this special filename and process the jitdump file. ++ // ++ // Mapping must be PROT_EXEC to ensure it is captured by perf record ++ // even when not using -d option. ++ MarkerAddr = ::mmap(NULL, sys::Process::getPageSize(), PROT_READ | PROT_EXEC, ++ MAP_PRIVATE, DumpFd, 0); ++ ++ if (MarkerAddr == MAP_FAILED) { ++ errs() << "could not mmap JIT marker\n"; ++ return false; ++ } ++ return true; ++} ++ ++void PerfJITEventListener::CloseMarker() { ++ if (!MarkerAddr) ++ return; ++ ++ munmap(MarkerAddr, sys::Process::getPageSize()); ++ MarkerAddr = nullptr; ++} ++ ++bool PerfJITEventListener::FillMachine(LLVMPerfJitHeader &hdr) { ++ char id[16]; ++ struct { ++ uint16_t e_type; ++ uint16_t e_machine; ++ } info; ++ ++ size_t RequiredMemory = sizeof(id) + sizeof(info); ++ ++ ErrorOr> MB = ++ MemoryBuffer::getFileSlice("/proc/self/exe", ++ RequiredMemory, ++ 0); ++ ++ // This'll not guarantee that enough data was actually read from the ++ // underlying file. Instead the trailing part of the buffer would be ++ // zeroed. Given the ELF signature check below that seems ok though, ++ // it's unlikely that the file ends just after that, and the ++ // consequence would just be that perf wouldn't recognize the ++ // signature. ++ if (auto EC = MB.getError()) { ++ errs() << "could not open /proc/self/exe: " << EC.message() << "\n"; ++ return false; ++ } ++ ++ memcpy(&id, (*MB)->getBufferStart(), sizeof(id)); ++ memcpy(&info, (*MB)->getBufferStart() + sizeof(id), sizeof(info)); ++ ++ // check ELF signature ++ if (id[0] != 0x7f || id[1] != 'E' || id[2] != 'L' || id[3] != 'F') { ++ errs() << "invalid elf signature\n"; ++ return false; ++ } ++ ++ hdr.ElfMach = info.e_machine; ++ ++ return true; ++} ++ ++void PerfJITEventListener::NotifyCode(Expected &Symbol, ++ uint64_t CodeAddr, uint64_t CodeSize) { ++ assert(SuccessfullyInitialized); ++ ++ // 0 length functions can't have samples. ++ if (CodeSize == 0) ++ return; ++ ++ LLVMPerfJitRecordCodeLoad rec; ++ rec.Prefix.Id = JIT_CODE_LOAD; ++ rec.Prefix.TotalSize = sizeof(rec) + // debug record itself ++ Symbol->size() + 1 + // symbol name ++ CodeSize; // and code ++ rec.Prefix.Timestamp = perf_get_timestamp(); ++ ++ rec.CodeSize = CodeSize; ++ rec.Vma = 0; ++ rec.CodeAddr = CodeAddr; ++ rec.Pid = Pid; ++ rec.Tid = get_threadid(); ++ ++ // avoid interspersing output ++ MutexGuard Guard(Mutex); ++ ++ rec.CodeIndex = CodeGeneration++; // under lock! ++ ++ Dumpstream->write(reinterpret_cast(&rec), sizeof(rec)); ++ Dumpstream->write(Symbol->data(), Symbol->size() + 1); ++ Dumpstream->write(reinterpret_cast(CodeAddr), CodeSize); ++} ++ ++void PerfJITEventListener::NotifyDebug(uint64_t CodeAddr, ++ DILineInfoTable Lines) { ++ assert(SuccessfullyInitialized); ++ ++ // Didn't get useful debug info. ++ if (Lines.empty()) ++ return; ++ ++ LLVMPerfJitRecordDebugInfo rec; ++ rec.Prefix.Id = JIT_CODE_DEBUG_INFO; ++ rec.Prefix.TotalSize = sizeof(rec); // will be increased further ++ rec.Prefix.Timestamp = perf_get_timestamp(); ++ rec.CodeAddr = CodeAddr; ++ rec.NrEntry = Lines.size(); ++ ++ // compute total size size of record (variable due to filenames) ++ DILineInfoTable::iterator Begin = Lines.begin(); ++ DILineInfoTable::iterator End = Lines.end(); ++ for (DILineInfoTable::iterator It = Begin; It != End; ++It) { ++ DILineInfo &line = It->second; ++ rec.Prefix.TotalSize += sizeof(LLVMPerfJitDebugEntry); ++ rec.Prefix.TotalSize += line.FileName.size() + 1; ++ } ++ ++ // The debug_entry describes the source line information. It is defined as ++ // follows in order: ++ // * uint64_t code_addr: address of function for which the debug information ++ // is generated ++ // * uint32_t line : source file line number (starting at 1) ++ // * uint32_t discrim : column discriminator, 0 is default ++ // * char name[n] : source file name in ASCII, including null termination ++ ++ // avoid interspersing output ++ MutexGuard Guard(Mutex); ++ ++ Dumpstream->write(reinterpret_cast(&rec), sizeof(rec)); ++ ++ for (DILineInfoTable::iterator It = Begin; It != End; ++It) { ++ LLVMPerfJitDebugEntry LineInfo; ++ DILineInfo &Line = It->second; ++ ++ LineInfo.Addr = It->first; ++ // The function re-created by perf is preceded by a elf ++ // header. Need to adjust for that, otherwise the results are ++ // wrong. ++ LineInfo.Addr += 0x40; ++ LineInfo.Lineno = Line.Line; ++ LineInfo.Discrim = Line.Discriminator; ++ ++ Dumpstream->write(reinterpret_cast(&LineInfo), ++ sizeof(LineInfo)); ++ Dumpstream->write(Line.FileName.c_str(), Line.FileName.size() + 1); ++ } ++} ++ ++// There should be only a single event listener per process, otherwise perf gets ++// confused. ++llvm::ManagedStatic PerfListener; ++ ++} // end anonymous namespace ++ ++namespace llvm { ++JITEventListener *JITEventListener::createPerfJITEventListener() { ++ return &*PerfListener; ++} ++ ++} // namespace llvm ++ +-- +2.17.1 + diff --git a/patches/julia/llvm-D50010-VNCoercion-ni.patch b/patches/julia/llvm-D50010-VNCoercion-ni.patch new file mode 100644 index 00000000..cb658d1b --- /dev/null +++ b/patches/julia/llvm-D50010-VNCoercion-ni.patch @@ -0,0 +1,89 @@ +commit 8eb2b102a203d83fb713f3bf79acf235dabdd8cd +Author: Keno Fischer +Date: Mon Jul 30 16:59:08 2018 -0400 + + [VNCoercion] Disallow coercion between different ni addrspaces + + Summary: + I'm not sure if it would be legal by the IR reference to introduce + an addrspacecast here, since the IR reference is a bit vague on + the exact semantics, but at least for our usage of it (and I + suspect for many other's usage) it is not. For us, addrspacecasts + between non-integral address spaces carry frontend information that the + optimizer cannot deduce afterwards in a generic way (though we + have frontend specific passes in our pipline that do propagate + these). In any case, I'm sure nobody is using it this way at + the moment, since it would have introduced inttoptrs, which + are definitely illegal. + + Fixes PR38375 + + Reviewers: sanjoy, reames, dberlin + + Subscribers: llvm-commits + + Differential Revision: https://reviews.llvm.org/D50010 + +diff --git a/lib/Transforms/Utils/VNCoercion.cpp b/lib/Transforms/Utils/VNCoercion.cpp +index c3feea6a0a4..735d1e7b792 100644 +--- a/lib/Transforms/Utils/VNCoercion.cpp ++++ b/lib/Transforms/Utils/VNCoercion.cpp +@@ -20,14 +20,21 @@ bool canCoerceMustAliasedValueToLoad(Value *StoredVal, Type *LoadTy, + StoredVal->getType()->isStructTy() || StoredVal->getType()->isArrayTy()) + return false; + ++ Type *StoredValTy = StoredVal->getType(); ++ + // The store has to be at least as big as the load. + if (DL.getTypeSizeInBits(StoredVal->getType()) < DL.getTypeSizeInBits(LoadTy)) + return false; + +- // Don't coerce non-integral pointers to integers or vice versa. +- if (DL.isNonIntegralPointerType(StoredVal->getType()) != +- DL.isNonIntegralPointerType(LoadTy)) ++ bool StoredNI = DL.isNonIntegralPointerType(StoredValTy); ++ bool LoadNI = DL.isNonIntegralPointerType(LoadTy); ++ if (StoredNI != LoadNI) { + return false; ++ } else if (StoredNI && LoadNI && ++ cast(StoredValTy)->getAddressSpace() != ++ cast(LoadTy)->getAddressSpace()) { ++ return false; ++ } + + return true; + } +diff --git a/test/Transforms/GVN/non-integral-pointers.ll b/test/Transforms/GVN/non-integral-pointers.ll +index 9ae4132231d..5217fc1a06a 100644 +--- a/test/Transforms/GVN/non-integral-pointers.ll ++++ b/test/Transforms/GVN/non-integral-pointers.ll +@@ -1,6 +1,6 @@ + ; RUN: opt -gvn -S < %s | FileCheck %s + +-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:4" ++target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:4:5" + target triple = "x86_64-unknown-linux-gnu" + + define void @f0(i1 %alwaysFalse, i64 %val, i64* %loc) { +@@ -37,3 +37,21 @@ define i64 @f1(i1 %alwaysFalse, i8 addrspace(4)* %val, i8 addrspace(4)** %loc) { + alwaysTaken: + ret i64 42 + } ++ ++ define i8 addrspace(5)* @multini(i1 %alwaysFalse, i8 addrspace(4)* %val, i8 addrspace(4)** %loc) { ++ ; CHECK-LABEL: @multini( ++ ; CHECK-NOT: inttoptr ++ ; CHECK-NOT: ptrtoint ++ ; CHECK-NOT: addrspacecast ++ entry: ++ store i8 addrspace(4)* %val, i8 addrspace(4)** %loc ++ br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken ++ ++ neverTaken: ++ %loc.bc = bitcast i8 addrspace(4)** %loc to i8 addrspace(5)** ++ %differentas = load i8 addrspace(5)*, i8 addrspace(5)** %loc.bc ++ ret i8 addrspace(5)* %differentas ++ ++ alwaysTaken: ++ ret i8 addrspace(5)* null ++ } diff --git a/patches/julia/llvm-D50167-scev-umin.patch b/patches/julia/llvm-D50167-scev-umin.patch new file mode 100644 index 00000000..fd3d4db2 --- /dev/null +++ b/patches/julia/llvm-D50167-scev-umin.patch @@ -0,0 +1,1143 @@ +commit 556c30af1c797be294edde0ce621884f5acf11f0 +Author: Keno Fischer +Date: Wed Aug 1 20:45:11 2018 -0400 + + RFC: [SCEV] Add explicit representations of umin/smin + + Summary: + Currently we express umin as `~umax(~x, ~y)`. However, this becomes + a problem for operands in non-integral pointer spaces, because `~x` + is not something we can compute for `x` non-integral. However, since + comparisons are generally still allowed, we are actually able to + express `umin(x, y)` directly as long as we don't try to express is + as a umax. Support this by adding an explicit umin/smin representation + to SCEV. We do this by factoring the existing getUMax/getSMax functions + into a new function that does all four. The previous two functions + were largely identical, except that the SMax variant used `isKnownPredicate` + while the UMax variant used `isKnownViaNonRecursiveReasoning`. + + Trying to make the UMax variant also use `isKnownPredicate` yields to + an infinite recursion, while trying to make the `SMax` variant use + `isKnownViaNonRecursiveReasoning` causes + `Transforms/IndVarSimplify/backedge-on-min-max.ll` to fail. + + I would appreciate any insight into which predicate is correct here. + + Reviewers: reames, sanjoy + + Subscribers: javed.absar, llvm-commits + + Differential Revision: https://reviews.llvm.org/D50167 + +Index: llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/ScalarEvolution.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/Analysis/ScalarEvolution.h ++++ llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/ScalarEvolution.h +@@ -582,12 +582,15 @@ public: + /// \p IndexExprs The expressions for the indices. + const SCEV *getGEPExpr(GEPOperator *GEP, + const SmallVectorImpl &IndexExprs); ++ const SCEV *getUSMinMaxExpr(unsigned Kind, SmallVectorImpl &Operands); + const SCEV *getSMaxExpr(const SCEV *LHS, const SCEV *RHS); + const SCEV *getSMaxExpr(SmallVectorImpl &Operands); + const SCEV *getUMaxExpr(const SCEV *LHS, const SCEV *RHS); + const SCEV *getUMaxExpr(SmallVectorImpl &Operands); + const SCEV *getSMinExpr(const SCEV *LHS, const SCEV *RHS); ++ const SCEV *getSMinExpr(SmallVectorImpl &Operands); + const SCEV *getUMinExpr(const SCEV *LHS, const SCEV *RHS); ++ const SCEV *getUMinExpr(SmallVectorImpl &Operands); + const SCEV *getUnknown(Value *V); + const SCEV *getCouldNotCompute(); + +Index: llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/ScalarEvolutionExpander.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/Analysis/ScalarEvolutionExpander.h ++++ llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/ScalarEvolutionExpander.h +@@ -367,6 +367,10 @@ namespace llvm { + + Value *visitUMaxExpr(const SCEVUMaxExpr *S); + ++ Value *visitSMinExpr(const SCEVSMinExpr *S); ++ ++ Value *visitUMinExpr(const SCEVUMinExpr *S); ++ + Value *visitUnknown(const SCEVUnknown *S) { + return S->getValue(); + } +Index: llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/ScalarEvolutionExpressions.h +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/Analysis/ScalarEvolutionExpressions.h ++++ llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/ScalarEvolutionExpressions.h +@@ -40,7 +40,7 @@ class Type; + // These should be ordered in terms of increasing complexity to make the + // folders simpler. + scConstant, scTruncate, scZeroExtend, scSignExtend, scAddExpr, scMulExpr, +- scUDivExpr, scAddRecExpr, scUMaxExpr, scSMaxExpr, ++ scUDivExpr, scAddRecExpr, scUMaxExpr, scSMaxExpr, scUMinExpr, scSMinExpr, + scUnknown, scCouldNotCompute + }; + +@@ -187,6 +187,8 @@ class Type; + S->getSCEVType() == scMulExpr || + S->getSCEVType() == scSMaxExpr || + S->getSCEVType() == scUMaxExpr || ++ S->getSCEVType() == scSMinExpr || ++ S->getSCEVType() == scUMinExpr || + S->getSCEVType() == scAddRecExpr; + } + }; +@@ -204,7 +206,9 @@ class Type; + return S->getSCEVType() == scAddExpr || + S->getSCEVType() == scMulExpr || + S->getSCEVType() == scSMaxExpr || +- S->getSCEVType() == scUMaxExpr; ++ S->getSCEVType() == scUMaxExpr || ++ S->getSCEVType() == scSMinExpr || ++ S->getSCEVType() == scUMinExpr; + } + + /// Set flags for a non-recurrence without clearing previously set flags. +@@ -396,6 +400,42 @@ class Type; + } + }; + ++ /// This class represents a signed minimum selection. ++ class SCEVSMinExpr : public SCEVCommutativeExpr { ++ friend class ScalarEvolution; ++ ++ SCEVSMinExpr(const FoldingSetNodeIDRef ID, ++ const SCEV *const *O, size_t N) ++ : SCEVCommutativeExpr(ID, scSMinExpr, O, N) { ++ // Min never overflows. ++ setNoWrapFlags((NoWrapFlags)(FlagNUW | FlagNSW)); ++ } ++ ++ public: ++ /// Methods for support type inquiry through isa, cast, and dyn_cast: ++ static bool classof(const SCEV *S) { ++ return S->getSCEVType() == scSMinExpr; ++ } ++ }; ++ ++ /// This class represents an unsigned minimum selection. ++ class SCEVUMinExpr : public SCEVCommutativeExpr { ++ friend class ScalarEvolution; ++ ++ SCEVUMinExpr(const FoldingSetNodeIDRef ID, ++ const SCEV *const *O, size_t N) ++ : SCEVCommutativeExpr(ID, scUMinExpr, O, N) { ++ // Min never overflows. ++ setNoWrapFlags((NoWrapFlags)(FlagNUW | FlagNSW)); ++ } ++ ++ public: ++ /// Methods for support type inquiry through isa, cast, and dyn_cast: ++ static bool classof(const SCEV *S) { ++ return S->getSCEVType() == scUMinExpr; ++ } ++ }; ++ + /// This means that we are dealing with an entirely unknown SCEV + /// value, and only represent it as its LLVM Value. This is the + /// "bottom" value for the analysis. +@@ -468,6 +508,10 @@ class Type; + return ((SC*)this)->visitSMaxExpr((const SCEVSMaxExpr*)S); + case scUMaxExpr: + return ((SC*)this)->visitUMaxExpr((const SCEVUMaxExpr*)S); ++ case scSMinExpr: ++ return ((SC*)this)->visitSMinExpr((const SCEVSMinExpr*)S); ++ case scUMinExpr: ++ return ((SC*)this)->visitUMinExpr((const SCEVUMinExpr*)S); + case scUnknown: + return ((SC*)this)->visitUnknown((const SCEVUnknown*)S); + case scCouldNotCompute: +@@ -521,6 +565,8 @@ class Type; + case scMulExpr: + case scSMaxExpr: + case scUMaxExpr: ++ case scSMinExpr: ++ case scUMinExpr: + case scAddRecExpr: + for (const auto *Op : cast(S)->operands()) + push(Op); +@@ -683,6 +729,26 @@ class Type; + return !Changed ? Expr : SE.getUMaxExpr(Operands); + } + ++ const SCEV *visitSMinExpr(const SCEVSMinExpr *Expr) { ++ SmallVector Operands; ++ bool Changed = false; ++ for (auto *Op : Expr->operands()) { ++ Operands.push_back(((SC *)this)->visit(Op)); ++ Changed |= Op != Operands.back(); ++ } ++ return !Changed ? Expr : SE.getSMinExpr(Operands); ++ } ++ ++ const SCEV *visitUMinExpr(const SCEVUMinExpr *Expr) { ++ SmallVector Operands; ++ bool Changed = false; ++ for (auto *Op : Expr->operands()) { ++ Operands.push_back(((SC*)this)->visit(Op)); ++ Changed |= Op != Operands.back(); ++ } ++ return !Changed ? Expr : SE.getUMinExpr(Operands); ++ } ++ + const SCEV *visitUnknown(const SCEVUnknown *Expr) { + return Expr; + } +Index: llvm-toolchain-6.0-6.0.1/lib/Analysis/ScalarEvolution.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Analysis/ScalarEvolution.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Analysis/ScalarEvolution.cpp +@@ -271,7 +271,9 @@ void SCEV::print(raw_ostream &OS) const + case scAddExpr: + case scMulExpr: + case scUMaxExpr: +- case scSMaxExpr: { ++ case scSMaxExpr: ++ case scUMinExpr: ++ case scSMinExpr: { + const SCEVNAryExpr *NAry = cast(this); + const char *OpStr = nullptr; + switch (NAry->getSCEVType()) { +@@ -279,6 +281,8 @@ void SCEV::print(raw_ostream &OS) const + case scMulExpr: OpStr = " * "; break; + case scUMaxExpr: OpStr = " umax "; break; + case scSMaxExpr: OpStr = " smax "; break; ++ case scUMinExpr: OpStr = " umin "; break; ++ case scSMinExpr: OpStr = " smin "; break; + } + OS << "("; + for (SCEVNAryExpr::op_iterator I = NAry->op_begin(), E = NAry->op_end(); +@@ -347,6 +351,8 @@ Type *SCEV::getType() const { + case scMulExpr: + case scUMaxExpr: + case scSMaxExpr: ++ case scUMinExpr: ++ case scSMinExpr: + return cast(this)->getType(); + case scAddExpr: + return cast(this)->getType(); +@@ -718,7 +724,9 @@ static int CompareSCEVComplexity( + case scAddExpr: + case scMulExpr: + case scSMaxExpr: +- case scUMaxExpr: { ++ case scUMaxExpr: ++ case scSMinExpr: ++ case scUMinExpr: { + const SCEVNAryExpr *LC = cast(LHS); + const SCEVNAryExpr *RC = cast(RHS); + +@@ -922,6 +930,8 @@ public: + void visitUDivExpr(const SCEVUDivExpr *Numerator) {} + void visitSMaxExpr(const SCEVSMaxExpr *Numerator) {} + void visitUMaxExpr(const SCEVUMaxExpr *Numerator) {} ++ void visitSMinExpr(const SCEVSMinExpr *Numerator) {} ++ void visitUMinExpr(const SCEVUMinExpr *Numerator) {} + void visitUnknown(const SCEVUnknown *Numerator) {} + void visitCouldNotCompute(const SCEVCouldNotCompute *Numerator) {} + +@@ -2276,6 +2286,8 @@ bool ScalarEvolution::isAvailableAtLoopE + case scMulExpr: + case scUMaxExpr: + case scSMaxExpr: ++ case scUMinExpr: ++ case scSMinExpr: + case scUDivExpr: + return true; + case scUnknown: +@@ -3405,23 +3417,20 @@ ScalarEvolution::getGEPExpr(GEPOperator + return getAddExpr(BaseExpr, TotalOffset, Wrap); + } + +-const SCEV *ScalarEvolution::getSMaxExpr(const SCEV *LHS, +- const SCEV *RHS) { +- SmallVector Ops = {LHS, RHS}; +- return getSMaxExpr(Ops); +-} +- + const SCEV * +-ScalarEvolution::getSMaxExpr(SmallVectorImpl &Ops) { +- assert(!Ops.empty() && "Cannot get empty smax!"); ++ScalarEvolution::getUSMinMaxExpr(unsigned Kind, SmallVectorImpl &Ops) { ++ assert(!Ops.empty() && "Cannot get empty (u|s)(min|max)!"); + if (Ops.size() == 1) return Ops[0]; + #ifndef NDEBUG + Type *ETy = getEffectiveSCEVType(Ops[0]->getType()); + for (unsigned i = 1, e = Ops.size(); i != e; ++i) + assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy && +- "SCEVSMaxExpr operand types don't match!"); ++ "Operand types don't match!"); + #endif + ++ bool IsSigned = Kind == scSMaxExpr || Kind == scSMinExpr; ++ bool IsMax = Kind == scSMaxExpr || Kind == scUMaxExpr; ++ + // Sort by complexity, this groups all similar expression types together. + GroupByComplexity(Ops, &LI, DT); + +@@ -3430,61 +3439,85 @@ ScalarEvolution::getSMaxExpr(SmallVector + if (const SCEVConstant *LHSC = dyn_cast(Ops[0])) { + ++Idx; + assert(Idx < Ops.size()); ++ auto &FoldOp = ++ Kind == scSMaxExpr ? APIntOps::smax : ++ Kind == scSMinExpr ? APIntOps::smin : ++ Kind == scUMaxExpr ? APIntOps::umax : ++ APIntOps::umin; + while (const SCEVConstant *RHSC = dyn_cast(Ops[Idx])) { + // We found two constants, fold them together! + ConstantInt *Fold = ConstantInt::get( +- getContext(), APIntOps::smax(LHSC->getAPInt(), RHSC->getAPInt())); ++ getContext(), FoldOp(LHSC->getAPInt(), RHSC->getAPInt())); + Ops[0] = getConstant(Fold); + Ops.erase(Ops.begin()+1); // Erase the folded element + if (Ops.size() == 1) return Ops[0]; + LHSC = cast(Ops[0]); + } + +- // If we are left with a constant minimum-int, strip it off. +- if (cast(Ops[0])->getValue()->isMinValue(true)) { +- Ops.erase(Ops.begin()); +- --Idx; +- } else if (cast(Ops[0])->getValue()->isMaxValue(true)) { +- // If we have an smax with a constant maximum-int, it will always be +- // maximum-int. +- return Ops[0]; ++ if (IsMax) { ++ // If we are left with a constant minimum-int, strip it off. ++ if (cast(Ops[0])->getValue()->isMinValue(IsSigned)) { ++ Ops.erase(Ops.begin()); ++ --Idx; ++ } else if (cast(Ops[0])->getValue()->isMaxValue(IsSigned)) { ++ // If we have an smax with a constant maximum-int, it will always be ++ // maximum-int. ++ return Ops[0]; ++ } ++ } else { ++ // If we are left with a constant maximum-int, strip it off. ++ if (cast(Ops[0])->getValue()->isMaxValue(IsSigned)) { ++ Ops.erase(Ops.begin()); ++ --Idx; ++ } else if (cast(Ops[0])->getValue()->isMinValue(IsSigned)) { ++ // If we have an smax with a constant minimum-int, it will always be ++ // maximum-int. ++ return Ops[0]; ++ } + } + + if (Ops.size() == 1) return Ops[0]; + } + +- // Find the first SMax +- while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scSMaxExpr) ++ // Find the first operation of the same kind ++ while (Idx < Ops.size() && Ops[Idx]->getSCEVType() != Kind) + ++Idx; + + // Check to see if one of the operands is an SMax. If so, expand its operands + // onto our operand list, and recurse to simplify. + if (Idx < Ops.size()) { +- bool DeletedSMax = false; +- while (const SCEVSMaxExpr *SMax = dyn_cast(Ops[Idx])) { ++ bool DeletedAny = false; ++ while (Ops[Idx]->getSCEVType() == Kind) { ++ const SCEVCommutativeExpr *SCE = cast(Ops[Idx]); + Ops.erase(Ops.begin()+Idx); +- Ops.append(SMax->op_begin(), SMax->op_end()); +- DeletedSMax = true; ++ Ops.append(SCE->op_begin(), SCE->op_end()); ++ DeletedAny = true; + } + +- if (DeletedSMax) +- return getSMaxExpr(Ops); ++ if (DeletedAny) ++ return getUSMinMaxExpr(Kind, Ops); + } + + // Okay, check to see if the same value occurs in the operand list twice. If + // so, delete one. Since we sorted the list, these values are required to + // be adjacent. +- for (unsigned i = 0, e = Ops.size()-1; i != e; ++i) +- // X smax Y smax Y --> X smax Y +- // X smax Y --> X, if X is always greater than Y +- if (Ops[i] == Ops[i+1] || +- isKnownPredicate(ICmpInst::ICMP_SGE, Ops[i], Ops[i+1])) { +- Ops.erase(Ops.begin()+i+1, Ops.begin()+i+2); +- --i; --e; +- } else if (isKnownPredicate(ICmpInst::ICMP_SLE, Ops[i], Ops[i+1])) { +- Ops.erase(Ops.begin()+i, Ops.begin()+i+1); +- --i; --e; +- } ++ llvm::CmpInst::Predicate GEPred = IsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE; ++ llvm::CmpInst::Predicate LEPred = IsSigned ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE; ++ llvm::CmpInst::Predicate FirstPred = IsMax ? GEPred : LEPred; ++ llvm::CmpInst::Predicate SecondPred = IsMax ? LEPred : GEPred; ++ for (unsigned i = 0, e = Ops.size()-1; i != e; ++i) { ++ if (Ops[i] == Ops[i+1] || ++ isKnownPredicate(FirstPred, Ops[i], Ops[i+1])) { ++ // X op Y op Y --> X op Y ++ // X op Y --> X, if we know X, Y are ordered appropriately ++ Ops.erase(Ops.begin()+i+1, Ops.begin()+i+2); ++ --i; --e; ++ } else if (isKnownPredicate(SecondPred, Ops[i], Ops[i+1])) { ++ // X op Y --> Y, if we know X, Y are ordered appropriately ++ Ops.erase(Ops.begin()+i, Ops.begin()+i+1); ++ --i; --e; ++ } ++ } + + if (Ops.size() == 1) return Ops[0]; + +@@ -3493,132 +3526,73 @@ ScalarEvolution::getSMaxExpr(SmallVector + // Okay, it looks like we really DO need an smax expr. Check to see if we + // already have one, otherwise create a new one. + FoldingSetNodeID ID; +- ID.AddInteger(scSMaxExpr); ++ ID.AddInteger(Kind); + for (unsigned i = 0, e = Ops.size(); i != e; ++i) + ID.AddPointer(Ops[i]); + void *IP = nullptr; + if (const SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) return S; + const SCEV **O = SCEVAllocator.Allocate(Ops.size()); + std::uninitialized_copy(Ops.begin(), Ops.end(), O); +- SCEV *S = new (SCEVAllocator) SCEVSMaxExpr(ID.Intern(SCEVAllocator), +- O, Ops.size()); ++ SCEV *S = nullptr; ++ ++ if (Kind == scSMaxExpr) { ++ S = new (SCEVAllocator) SCEVSMaxExpr(ID.Intern(SCEVAllocator), ++ O, Ops.size()); ++ } else if (Kind == scUMaxExpr) { ++ S = new (SCEVAllocator) SCEVUMaxExpr(ID.Intern(SCEVAllocator), ++ O, Ops.size()); ++ } else if (Kind == scSMinExpr) { ++ S = new (SCEVAllocator) SCEVSMinExpr(ID.Intern(SCEVAllocator), ++ O, Ops.size()); ++ } else { ++ assert(Kind == scUMinExpr); ++ S = new (SCEVAllocator) SCEVUMinExpr(ID.Intern(SCEVAllocator), ++ O, Ops.size()); ++ } ++ + UniqueSCEVs.InsertNode(S, IP); + addToLoopUseLists(S); + return S; + } + +-const SCEV *ScalarEvolution::getUMaxExpr(const SCEV *LHS, ++const SCEV *ScalarEvolution::getSMaxExpr(const SCEV *LHS, + const SCEV *RHS) { + SmallVector Ops = {LHS, RHS}; +- return getUMaxExpr(Ops); ++ return getSMaxExpr(Ops); + } + +-const SCEV * +-ScalarEvolution::getUMaxExpr(SmallVectorImpl &Ops) { +- assert(!Ops.empty() && "Cannot get empty umax!"); +- if (Ops.size() == 1) return Ops[0]; +-#ifndef NDEBUG +- Type *ETy = getEffectiveSCEVType(Ops[0]->getType()); +- for (unsigned i = 1, e = Ops.size(); i != e; ++i) +- assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy && +- "SCEVUMaxExpr operand types don't match!"); +-#endif +- +- // Sort by complexity, this groups all similar expression types together. +- GroupByComplexity(Ops, &LI, DT); +- +- // If there are any constants, fold them together. +- unsigned Idx = 0; +- if (const SCEVConstant *LHSC = dyn_cast(Ops[0])) { +- ++Idx; +- assert(Idx < Ops.size()); +- while (const SCEVConstant *RHSC = dyn_cast(Ops[Idx])) { +- // We found two constants, fold them together! +- ConstantInt *Fold = ConstantInt::get( +- getContext(), APIntOps::umax(LHSC->getAPInt(), RHSC->getAPInt())); +- Ops[0] = getConstant(Fold); +- Ops.erase(Ops.begin()+1); // Erase the folded element +- if (Ops.size() == 1) return Ops[0]; +- LHSC = cast(Ops[0]); +- } +- +- // If we are left with a constant minimum-int, strip it off. +- if (cast(Ops[0])->getValue()->isMinValue(false)) { +- Ops.erase(Ops.begin()); +- --Idx; +- } else if (cast(Ops[0])->getValue()->isMaxValue(false)) { +- // If we have an umax with a constant maximum-int, it will always be +- // maximum-int. +- return Ops[0]; +- } +- +- if (Ops.size() == 1) return Ops[0]; +- } +- +- // Find the first UMax +- while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scUMaxExpr) +- ++Idx; +- +- // Check to see if one of the operands is a UMax. If so, expand its operands +- // onto our operand list, and recurse to simplify. +- if (Idx < Ops.size()) { +- bool DeletedUMax = false; +- while (const SCEVUMaxExpr *UMax = dyn_cast(Ops[Idx])) { +- Ops.erase(Ops.begin()+Idx); +- Ops.append(UMax->op_begin(), UMax->op_end()); +- DeletedUMax = true; +- } +- +- if (DeletedUMax) +- return getUMaxExpr(Ops); +- } +- +- // Okay, check to see if the same value occurs in the operand list twice. If +- // so, delete one. Since we sorted the list, these values are required to +- // be adjacent. +- for (unsigned i = 0, e = Ops.size()-1; i != e; ++i) +- // X umax Y umax Y --> X umax Y +- // X umax Y --> X, if X is always greater than Y +- if (Ops[i] == Ops[i+1] || +- isKnownPredicate(ICmpInst::ICMP_UGE, Ops[i], Ops[i+1])) { +- Ops.erase(Ops.begin()+i+1, Ops.begin()+i+2); +- --i; --e; +- } else if (isKnownPredicate(ICmpInst::ICMP_ULE, Ops[i], Ops[i+1])) { +- Ops.erase(Ops.begin()+i, Ops.begin()+i+1); +- --i; --e; +- } +- +- if (Ops.size() == 1) return Ops[0]; ++const SCEV *ScalarEvolution::getSMaxExpr(SmallVectorImpl &Ops) { ++ return getUSMinMaxExpr(scSMaxExpr, Ops); ++} + +- assert(!Ops.empty() && "Reduced umax down to nothing!"); ++const SCEV *ScalarEvolution::getUMaxExpr(const SCEV *LHS, ++ const SCEV *RHS) { ++ SmallVector Ops = {LHS, RHS}; ++ return getUMaxExpr(Ops); ++} + +- // Okay, it looks like we really DO need a umax expr. Check to see if we +- // already have one, otherwise create a new one. +- FoldingSetNodeID ID; +- ID.AddInteger(scUMaxExpr); +- for (unsigned i = 0, e = Ops.size(); i != e; ++i) +- ID.AddPointer(Ops[i]); +- void *IP = nullptr; +- if (const SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) return S; +- const SCEV **O = SCEVAllocator.Allocate(Ops.size()); +- std::uninitialized_copy(Ops.begin(), Ops.end(), O); +- SCEV *S = new (SCEVAllocator) SCEVUMaxExpr(ID.Intern(SCEVAllocator), +- O, Ops.size()); +- UniqueSCEVs.InsertNode(S, IP); +- addToLoopUseLists(S); +- return S; ++const SCEV *ScalarEvolution::getUMaxExpr(SmallVectorImpl &Ops) { ++ return getUSMinMaxExpr(scUMaxExpr, Ops); + } + + const SCEV *ScalarEvolution::getSMinExpr(const SCEV *LHS, + const SCEV *RHS) { +- // ~smax(~x, ~y) == smin(x, y). +- return getNotSCEV(getSMaxExpr(getNotSCEV(LHS), getNotSCEV(RHS))); ++ SmallVector Ops = { LHS, RHS }; ++ return getSMinExpr(Ops); ++} ++ ++const SCEV *ScalarEvolution::getSMinExpr(SmallVectorImpl &Ops) { ++ return getUSMinMaxExpr(scSMinExpr, Ops); + } + + const SCEV *ScalarEvolution::getUMinExpr(const SCEV *LHS, + const SCEV *RHS) { +- // ~umax(~x, ~y) == umin(x, y) +- return getNotSCEV(getUMaxExpr(getNotSCEV(LHS), getNotSCEV(RHS))); ++ SmallVector Ops = { LHS, RHS }; ++ return getUMinExpr(Ops); ++} ++ ++const SCEV *ScalarEvolution::getUMinExpr(SmallVectorImpl &Ops) { ++ return getUSMinMaxExpr(scUMinExpr, Ops); + } + + const SCEV *ScalarEvolution::getSizeOfExpr(Type *IntTy, Type *AllocTy) { +@@ -5002,6 +4976,7 @@ static bool IsAvailableOnEntry(const Loo + switch (S->getSCEVType()) { + case scConstant: case scTruncate: case scZeroExtend: case scSignExtend: + case scAddExpr: case scMulExpr: case scUMaxExpr: case scSMaxExpr: ++ case scUMinExpr: case scSMinExpr: + // These expressions are available if their operand(s) is/are. + return true; + +@@ -7885,7 +7860,9 @@ static Constant *BuildConstantFromSCEV(c + } + case scSMaxExpr: + case scUMaxExpr: +- break; // TODO: smax, umax. ++ case scSMinExpr: ++ case scUMinExpr: ++ break; // TODO: smax, umax, smin, umax. + } + return nullptr; + } +@@ -8015,6 +7992,10 @@ const SCEV *ScalarEvolution::computeSCEV + return getSMaxExpr(NewOps); + if (isa(Comm)) + return getUMaxExpr(NewOps); ++ if (isa(Comm)) ++ return getSMinExpr(NewOps); ++ if (isa(Comm)) ++ return getUMinExpr(NewOps); + llvm_unreachable("Unknown commutative SCEV type!"); + } + } +@@ -10998,7 +10979,9 @@ ScalarEvolution::computeLoopDisposition( + case scAddExpr: + case scMulExpr: + case scUMaxExpr: +- case scSMaxExpr: { ++ case scSMaxExpr: ++ case scUMinExpr: ++ case scSMinExpr: { + bool HasVarying = false; + for (auto *Op : cast(S)->operands()) { + LoopDisposition D = getLoopDisposition(Op, L); +@@ -11085,7 +11068,9 @@ ScalarEvolution::computeBlockDisposition + case scAddExpr: + case scMulExpr: + case scUMaxExpr: +- case scSMaxExpr: { ++ case scSMaxExpr: ++ case scUMinExpr: ++ case scSMinExpr: { + const SCEVNAryExpr *NAry = cast(S); + bool Proper = true; + for (const SCEV *NAryOp : NAry->operands()) { +Index: llvm-toolchain-6.0-6.0.1/lib/Analysis/ScalarEvolutionExpander.cpp +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/lib/Analysis/ScalarEvolutionExpander.cpp ++++ llvm-toolchain-6.0-6.0.1/lib/Analysis/ScalarEvolutionExpander.cpp +@@ -1629,14 +1629,15 @@ Value *SCEVExpander::visitSMaxExpr(const + for (int i = S->getNumOperands()-2; i >= 0; --i) { + // In the case of mixed integer and pointer types, do the + // rest of the comparisons as integer. +- if (S->getOperand(i)->getType() != Ty) { ++ Type *OpTy = S->getOperand(i)->getType(); ++ if (OpTy->isIntegerTy() != Ty->isIntegerTy()) { + Ty = SE.getEffectiveSCEVType(Ty); + LHS = InsertNoopCastOfTo(LHS, Ty); + } + Value *RHS = expandCodeFor(S->getOperand(i), Ty); + Value *ICmp = Builder.CreateICmpSGT(LHS, RHS); + rememberInstruction(ICmp); +- Value *Sel = Builder.CreateSelect(ICmp, LHS, RHS, "smax"); ++ Value *Sel = Builder.CreateSelect(ICmp, LHS, RHS, "smin"); + rememberInstruction(Sel); + LHS = Sel; + } +@@ -1653,13 +1654,64 @@ Value *SCEVExpander::visitUMaxExpr(const + for (int i = S->getNumOperands()-2; i >= 0; --i) { + // In the case of mixed integer and pointer types, do the + // rest of the comparisons as integer. +- if (S->getOperand(i)->getType() != Ty) { ++ Type *OpTy = S->getOperand(i)->getType(); ++ if (OpTy->isIntegerTy() != Ty->isIntegerTy()) { + Ty = SE.getEffectiveSCEVType(Ty); + LHS = InsertNoopCastOfTo(LHS, Ty); + } + Value *RHS = expandCodeFor(S->getOperand(i), Ty); + Value *ICmp = Builder.CreateICmpUGT(LHS, RHS); + rememberInstruction(ICmp); ++ Value *Sel = Builder.CreateSelect(ICmp, LHS, RHS, "umin"); ++ rememberInstruction(Sel); ++ LHS = Sel; ++ } ++ // In the case of mixed integer and pointer types, cast the ++ // final result back to the pointer type. ++ if (LHS->getType() != S->getType()) ++ LHS = InsertNoopCastOfTo(LHS, S->getType()); ++ return LHS; ++} ++ ++Value *SCEVExpander::visitSMinExpr(const SCEVSMinExpr *S) { ++ Value *LHS = expand(S->getOperand(S->getNumOperands()-1)); ++ Type *Ty = LHS->getType(); ++ for (int i = S->getNumOperands()-2; i >= 0; --i) { ++ // In the case of mixed integer and pointer types, do the ++ // rest of the comparisons as integer. ++ Type *OpTy = S->getOperand(i)->getType(); ++ if (OpTy->isIntegerTy() != Ty->isIntegerTy()) { ++ Ty = SE.getEffectiveSCEVType(Ty); ++ LHS = InsertNoopCastOfTo(LHS, Ty); ++ } ++ Value *RHS = expandCodeFor(S->getOperand(i), Ty); ++ Value *ICmp = Builder.CreateICmpSLT(LHS, RHS); ++ rememberInstruction(ICmp); ++ Value *Sel = Builder.CreateSelect(ICmp, LHS, RHS, "smax"); ++ rememberInstruction(Sel); ++ LHS = Sel; ++ } ++ // In the case of mixed integer and pointer types, cast the ++ // final result back to the pointer type. ++ if (LHS->getType() != S->getType()) ++ LHS = InsertNoopCastOfTo(LHS, S->getType()); ++ return LHS; ++} ++ ++Value *SCEVExpander::visitUMinExpr(const SCEVUMinExpr *S) { ++ Value *LHS = expand(S->getOperand(S->getNumOperands()-1)); ++ Type *Ty = LHS->getType(); ++ for (int i = S->getNumOperands()-2; i >= 0; --i) { ++ // In the case of mixed integer and pointer types, do the ++ // rest of the comparisons as integer. ++ Type *OpTy = S->getOperand(i)->getType(); ++ if (OpTy->isIntegerTy() != Ty->isIntegerTy()) { ++ Ty = SE.getEffectiveSCEVType(Ty); ++ LHS = InsertNoopCastOfTo(LHS, Ty); ++ } ++ Value *RHS = expandCodeFor(S->getOperand(i), Ty); ++ Value *ICmp = Builder.CreateICmpULT(LHS, RHS); ++ rememberInstruction(ICmp); + Value *Sel = Builder.CreateSelect(ICmp, LHS, RHS, "umax"); + rememberInstruction(Sel); + LHS = Sel; +Index: llvm-toolchain-6.0-6.0.1/test/Analysis/LoopAccessAnalysis/memcheck-ni.ll +=================================================================== +--- /dev/null ++++ llvm-toolchain-6.0-6.0.1/test/Analysis/LoopAccessAnalysis/memcheck-ni.ll +@@ -0,0 +1,50 @@ ++; RUN: opt -loop-versioning -S < %s | FileCheck %s ++ ++; NB: addrspaces 10-13 are non-integral ++target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:10:11:12:13" ++ ++%jl_value_t = type opaque ++%jl_array_t = type { i8 addrspace(13)*, i64, i16, i16, i32 } ++ ++define void @"japi1_permutedims!_33509"(%jl_value_t addrspace(10)**) { ++; CHECK: [[CMP:%[^ ]*]] = icmp ult double addrspace(13)* [[A:%[^ ]*]], [[B:%[^ ]*]] ++; CHECK: [[SELECT:%[^ ]*]] = select i1 %18, double addrspace(13)* [[A]], double addrspace(13)* [[B]] ++top: ++ %1 = alloca [3 x i64], align 8 ++ %2 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %0, align 8 ++ %3 = getelementptr inbounds %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %0, i64 1 ++ %4 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %3, align 8 ++ %5 = getelementptr inbounds [3 x i64], [3 x i64]* %1, i64 0, i64 0 ++ store i64 1, i64* %5, align 8 ++ %6 = getelementptr inbounds [3 x i64], [3 x i64]* %1, i64 0, i64 1 ++ %7 = load i64, i64* inttoptr (i64 24 to i64*), align 8 ++ %8 = addrspacecast %jl_value_t addrspace(10)* %4 to %jl_value_t addrspace(11)* ++ %9 = bitcast %jl_value_t addrspace(11)* %8 to double addrspace(13)* addrspace(11)* ++ %10 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %9, align 8 ++ %11 = addrspacecast %jl_value_t addrspace(10)* %2 to %jl_value_t addrspace(11)* ++ %12 = bitcast %jl_value_t addrspace(11)* %11 to double addrspace(13)* addrspace(11)* ++ %13 = load double addrspace(13)*, double addrspace(13)* addrspace(11)* %12, align 8 ++ %14 = load i64, i64* %6, align 8 ++ br label %L74 ++ ++L74: ++ %value_phi20 = phi i64 [ 1, %top ], [ %22, %L74 ] ++ %value_phi21 = phi i64 [ 1, %top ], [ %23, %L74 ] ++ %value_phi22 = phi i64 [ 1, %top ], [ %25, %L74 ] ++ %15 = add i64 %value_phi21, -1 ++ %16 = getelementptr inbounds double, double addrspace(13)* %10, i64 %15 ++ %17 = bitcast double addrspace(13)* %16 to i64 addrspace(13)* ++ %18 = load i64, i64 addrspace(13)* %17, align 8 ++ %19 = add i64 %value_phi20, -1 ++ %20 = getelementptr inbounds double, double addrspace(13)* %13, i64 %19 ++ %21 = bitcast double addrspace(13)* %20 to i64 addrspace(13)* ++ store i64 %18, i64 addrspace(13)* %21, align 8 ++ %22 = add i64 %value_phi20, 1 ++ %23 = add i64 %14, %value_phi21 ++ %24 = icmp eq i64 %value_phi22, %7 ++ %25 = add i64 %value_phi22, 1 ++ br i1 %24, label %L94, label %L74 ++ ++L94: ++ ret void ++} +Index: llvm-toolchain-6.0-6.0.1/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll ++++ llvm-toolchain-6.0-6.0.1/test/Analysis/LoopAccessAnalysis/reverse-memcheck-bounds.ll +@@ -58,7 +58,7 @@ for.end: + + ; Here it is not obvious what the limits are, since 'step' could be negative. + +-; CHECK: Low: (-1 + (-1 * ((-60001 + (-1 * %a)) umax (-60001 + (40000 * %step) + (-1 * %a))))) ++; CHECK: Low: ((60000 + %a) umin (60000 + (-40000 * %step) + %a)) + ; CHECK: High: (4 + ((60000 + %a) umax (60000 + (-40000 * %step) + %a))) + + define void @g(i64 %step) { +Index: llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/2008-07-29-SMinExpr.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Analysis/ScalarEvolution/2008-07-29-SMinExpr.ll ++++ llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/2008-07-29-SMinExpr.ll +@@ -22,5 +22,5 @@ afterfor: ; preds = %forinc, %entry + ret i32 %j.0.lcssa + } + +-; CHECK: backedge-taken count is (-2147483632 + ((-1 + (-1 * %{{[xy]}})) smax (-1 + (-1 * %{{[xy]}})))) ++; CHECK: backedge-taken count is (-2147483633 + (-1 * (%x smin %y))) + +Index: llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/min-max-exprs.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Analysis/ScalarEvolution/min-max-exprs.ll ++++ llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/min-max-exprs.ll +@@ -33,7 +33,7 @@ bb2: + %tmp9 = select i1 %tmp4, i64 %tmp5, i64 %tmp6 + ; min(N, i+3) + ; CHECK: select i1 %tmp4, i64 %tmp5, i64 %tmp6 +-; CHECK-NEXT: --> (-1 + (-1 * ((-1 + (-1 * (sext i32 {3,+,1}<%bb1> to i64))) smax (-1 + (-1 * (sext i32 %N to i64)))))) ++; CHECK-NEXT: --> ((sext i32 {3,+,1}<%bb1> to i64) smin (sext i32 %N to i64)) + %tmp11 = getelementptr inbounds i32, i32* %A, i64 %tmp9 + %tmp12 = load i32, i32* %tmp11, align 4 + %tmp13 = shl nsw i32 %tmp12, 1 +Index: llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/pr28705.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Analysis/ScalarEvolution/pr28705.ll ++++ llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/pr28705.ll +@@ -5,7 +5,7 @@ + ; with "%.sroa.speculated + 1". + ; + ; CHECK-LABEL: @foo( +-; CHECK: %[[EXIT:.+]] = sub i32 %.sroa.speculated, -1 ++; CHECK: %[[EXIT:.+]] = add i32 %.sroa.speculated, 1 + ; CHECK: %DB.sroa.9.0.lcssa = phi i32 [ 1, %entry ], [ %[[EXIT]], %loopexit ] + ; + define void @foo(i32 %sub.ptr.div.i, i8* %ref.i1174) local_unnamed_addr { +Index: llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/predicated-trip-count.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Analysis/ScalarEvolution/predicated-trip-count.ll ++++ llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/predicated-trip-count.ll +@@ -80,7 +80,7 @@ return: ; preds = %bb5 + ; CHECK-NEXT: --> (sext i16 {%Start,+,-1}<%bb3> to i32) + ; CHECK: Loop %bb3: Unpredictable backedge-taken count. + ; CHECK-NEXT: Loop %bb3: Unpredictable max backedge-taken count. +-; CHECK-NEXT: Loop %bb3: Predicated backedge-taken count is (2 + (sext i16 %Start to i32) + ((-2 + (-1 * (sext i16 %Start to i32))) smax (-1 + (-1 * %M)))) ++; CHECK-NEXT: Loop %bb3: Predicated backedge-taken count is (1 + (sext i16 %Start to i32) + (-1 * ((1 + (sext i16 %Start to i32)) smin %M))) + ; CHECK-NEXT: Predicates: + ; CHECK-NEXT: {%Start,+,-1}<%bb3> Added Flags: + +Index: llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/trip-count3.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Analysis/ScalarEvolution/trip-count3.ll ++++ llvm-toolchain-6.0-6.0.1/test/Analysis/ScalarEvolution/trip-count3.ll +@@ -4,7 +4,7 @@ + ; dividing by the stride will have a remainder. This could theoretically + ; be teaching it how to use a more elaborate trip count computation. + +-; CHECK: Loop %bb3.i: backedge-taken count is ((64 + (-64 smax (-1 + (-1 * %0))) + %0) /u 64) ++; CHECK: Loop %bb3.i: backedge-taken count is ((63 + (-1 * (63 smin %0)) + %0) /u 64) + ; CHECK: Loop %bb3.i: max backedge-taken count is 33554431 + + %struct.FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct.FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] } +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/conjunctive-checks.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/IRCE/conjunctive-checks.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/conjunctive-checks.ll +@@ -4,16 +4,6 @@ define void @f_0(i32 *%arr, i32 *%a_len_ + ; CHECK-LABEL: @f_0( + + ; CHECK: loop.preheader: +-; CHECK: [[not_n:[^ ]+]] = sub i32 -1, %n +-; CHECK: [[not_safe_range_end:[^ ]+]] = sub i32 3, %len +-; CHECK: [[not_exit_main_loop_at_hiclamp_cmp:[^ ]+]] = icmp sgt i32 [[not_n]], [[not_safe_range_end]] +-; CHECK: [[not_exit_main_loop_at_hiclamp:[^ ]+]] = select i1 [[not_exit_main_loop_at_hiclamp_cmp]], i32 [[not_n]], i32 [[not_safe_range_end]] +-; CHECK: [[exit_main_loop_at_hiclamp:[^ ]+]] = sub i32 -1, [[not_exit_main_loop_at_hiclamp]] +-; CHECK: [[exit_main_loop_at_loclamp_cmp:[^ ]+]] = icmp sgt i32 [[exit_main_loop_at_hiclamp]], 0 +-; CHECK: [[exit_main_loop_at_loclamp:[^ ]+]] = select i1 [[exit_main_loop_at_loclamp_cmp]], i32 [[exit_main_loop_at_hiclamp]], i32 0 +-; CHECK: [[enter_main_loop:[^ ]+]] = icmp slt i32 0, [[exit_main_loop_at_loclamp]] +-; CHECK: br i1 [[enter_main_loop]], label %loop.preheader2, label %main.pseudo.exit +- + ; CHECK: loop.preheader2: + ; CHECK: br label %loop + +@@ -57,14 +47,10 @@ define void @f_1( + ; CHECK-LABEL: @f_1( + + ; CHECK: loop.preheader: +-; CHECK: [[not_len_b:[^ ]+]] = sub i32 -1, %len.b +-; CHECK: [[not_len_a:[^ ]+]] = sub i32 -1, %len.a +-; CHECK: [[smax_not_len_cond:[^ ]+]] = icmp sgt i32 [[not_len_b]], [[not_len_a]] +-; CHECK: [[smax_not_len:[^ ]+]] = select i1 [[smax_not_len_cond]], i32 [[not_len_b]], i32 [[not_len_a]] +-; CHECK: [[not_n:[^ ]+]] = sub i32 -1, %n +-; CHECK: [[not_upper_limit_cond_loclamp:[^ ]+]] = icmp sgt i32 [[smax_not_len]], [[not_n]] +-; CHECK: [[not_upper_limit_loclamp:[^ ]+]] = select i1 [[not_upper_limit_cond_loclamp]], i32 [[smax_not_len]], i32 [[not_n]] +-; CHECK: [[upper_limit_loclamp:[^ ]+]] = sub i32 -1, [[not_upper_limit_loclamp]] ++; CHECK: [[smax_len_cond:[^ ]+]] = icmp slt i32 %len.b, %len.a ++; CHECK: [[smax_len:[^ ]+]] = select i1 [[smax_len_cond]], i32 %len.b, i32 %len.a ++; CHECK: [[upper_limit_cond_loclamp:[^ ]+]] = icmp slt i32 [[smax_len]], %n ++; CHECK: [[upper_limit_loclamp:[^ ]+]] = select i1 [[upper_limit_cond_loclamp]], i32 [[smax_len]], i32 %n + ; CHECK: [[upper_limit_cmp:[^ ]+]] = icmp sgt i32 [[upper_limit_loclamp]], 0 + ; CHECK: [[upper_limit:[^ ]+]] = select i1 [[upper_limit_cmp]], i32 [[upper_limit_loclamp]], i32 0 + +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/decrementing-loop.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/IRCE/decrementing-loop.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/decrementing-loop.ll +@@ -28,11 +28,8 @@ define void @decrementing_loop(i32 *%arr + ret void + + ; CHECK: loop.preheader: +-; CHECK: [[not_len:[^ ]+]] = sub i32 -1, %len +-; CHECK: [[not_n:[^ ]+]] = sub i32 -1, %n +-; CHECK: [[not_len_hiclamp_cmp:[^ ]+]] = icmp sgt i32 [[not_len]], [[not_n]] +-; CHECK: [[not_len_hiclamp:[^ ]+]] = select i1 [[not_len_hiclamp_cmp]], i32 [[not_len]], i32 [[not_n]] +-; CHECK: [[len_hiclamp:[^ ]+]] = sub i32 -1, [[not_len_hiclamp]] ++; CHECK: [[len_hiclamp_cmp:[^ ]+]] = icmp slt i32 %len, %n ++; CHECK: [[len_hiclamp:[^ ]+]] = select i1 [[len_hiclamp_cmp]], i32 %len, i32 %n + ; CHECK: [[not_exit_preloop_at_cmp:[^ ]+]] = icmp sgt i32 [[len_hiclamp]], 0 + ; CHECK: [[not_exit_preloop_at:[^ ]+]] = select i1 [[not_exit_preloop_at_cmp]], i32 [[len_hiclamp]], i32 0 + ; CHECK: %exit.preloop.at = add i32 [[not_exit_preloop_at]], -1 +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/multiple-access-no-preloop.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/IRCE/multiple-access-no-preloop.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/multiple-access-no-preloop.ll +@@ -37,14 +37,10 @@ define void @multiple_access_no_preloop( + ; CHECK-LABEL: @multiple_access_no_preloop( + + ; CHECK: loop.preheader: +-; CHECK: [[not_len_b:[^ ]+]] = sub i32 -1, %len.b +-; CHECK: [[not_len_a:[^ ]+]] = sub i32 -1, %len.a +-; CHECK: [[smax_not_len_cond:[^ ]+]] = icmp sgt i32 [[not_len_b]], [[not_len_a]] +-; CHECK: [[smax_not_len:[^ ]+]] = select i1 [[smax_not_len_cond]], i32 [[not_len_b]], i32 [[not_len_a]] +-; CHECK: [[not_n:[^ ]+]] = sub i32 -1, %n +-; CHECK: [[not_upper_limit_cond_loclamp:[^ ]+]] = icmp sgt i32 [[smax_not_len]], [[not_n]] +-; CHECK: [[not_upper_limit_loclamp:[^ ]+]] = select i1 [[not_upper_limit_cond_loclamp]], i32 [[smax_not_len]], i32 [[not_n]] +-; CHECK: [[upper_limit_loclamp:[^ ]+]] = sub i32 -1, [[not_upper_limit_loclamp]] ++; CHECK: [[smax_len_cond:[^ ]+]] = icmp slt i32 %len.b, %len.a ++; CHECK: [[smax_len:[^ ]+]] = select i1 [[smax_len_cond]], i32 %len.b, i32 %len.a ++; CHECK: [[upper_limit_cond_loclamp:[^ ]+]] = icmp slt i32 [[smax_len]], %n ++; CHECK: [[upper_limit_loclamp:[^ ]+]] = select i1 [[upper_limit_cond_loclamp]], i32 [[smax_len]], i32 %n + ; CHECK: [[upper_limit_cmp:[^ ]+]] = icmp sgt i32 [[upper_limit_loclamp]], 0 + ; CHECK: [[upper_limit:[^ ]+]] = select i1 [[upper_limit_cmp]], i32 [[upper_limit_loclamp]], i32 0 + +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/ranges_of_different_types.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/IRCE/ranges_of_different_types.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/ranges_of_different_types.ll +@@ -22,12 +22,11 @@ define void @test_01(i32* %arr, i32* %a_ + ; CHECK-NOT: preloop + ; CHECK: entry: + ; CHECK-NEXT: %len = load i32, i32* %a_len_ptr, !range !0 +-; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 12, %len +-; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp sgt i32 [[SUB1]], -102 +-; CHECK-NEXT: [[SMAX:%[^ ]+]] = select i1 [[CMP1]], i32 [[SUB1]], i32 -102 +-; CHECK-NEXT: [[SUB2:%[^ ]+]] = sub i32 -1, [[SMAX]] +-; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp sgt i32 [[SUB2]], 0 +-; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP2]], i32 [[SUB2]], i32 0 ++; CHECK-NEXT: [[SUB1:%[^ ]+]] = add i32 %len, -13 ++; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp slt i32 [[SUB1]], 101 ++; CHECK-NEXT: [[SMAX:%[^ ]+]] = select i1 [[CMP1]], i32 [[SUB1]], i32 101 ++; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp sgt i32 [[SMAX]], 0 ++; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP2]], i32 [[SMAX]], i32 0 + ; CHECK-NEXT: [[GOTO_LOOP:%[^ ]+]] = icmp slt i32 0, %exit.mainloop.at + ; CHECK-NEXT: br i1 [[GOTO_LOOP]], label %loop.preheader, label %main.pseudo.exit + ; CHECK: loop +@@ -82,13 +81,11 @@ define void @test_02(i32* %arr, i32* %a_ + ; CHECK-NEXT: [[LEN_MINUS_SMAX:%[^ ]+]] = add i32 %len, -2147483647 + ; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp sgt i32 [[LEN_MINUS_SMAX]], -13 + ; CHECK-NEXT: [[SMAX1:%[^ ]+]] = select i1 [[CMP1]], i32 [[LEN_MINUS_SMAX]], i32 -13 +-; CHECK-NEXT: [[ADD1:%[^ ]+]] = add i32 [[SMAX1]], -1 +-; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 [[ADD1]], %len +-; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp sgt i32 [[SUB1]], -102 +-; CHECK-NEXT: [[SMAX2:%[^ ]+]] = select i1 [[CMP2]], i32 [[SUB1]], i32 -102 +-; CHECK-NEXT: [[SUB2:%[^ ]+]] = sub i32 -1, [[SMAX2]] +-; CHECK-NEXT: [[CMP3:%[^ ]+]] = icmp sgt i32 [[SUB2]], 0 +-; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP3]], i32 [[SUB2]], i32 0 ++; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 %len, [[SMAX1]] ++; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp slt i32 [[SUB1]], 101 ++; CHECK-NEXT: [[SMAX2:%[^ ]+]] = select i1 [[CMP2]], i32 [[SUB1]], i32 101 ++; CHECK-NEXT: [[CMP3:%[^ ]+]] = icmp sgt i32 [[SMAX2]], 0 ++; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP3]], i32 [[SMAX2]], i32 0 + ; CHECK-NEXT: br i1 true, label %loop.preloop.preheader + ; CHECK: loop.preloop: + ; CHECK-NEXT: %idx.preloop = phi i32 [ %idx.next.preloop, %in.bounds.preloop ], [ 0, %loop.preloop.preheader ] +@@ -150,14 +147,11 @@ define void @test_03(i32* %arr, i32* %a_ + ; CHECK-NOT: preloop + ; CHECK: entry: + ; CHECK-NEXT: %len = load i32, i32* %a_len_ptr, !range !0 +-; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 -2, %len +-; CHECK-NEXT: [[SUB2:%[^ ]+]] = sub i32 -1, %len +-; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp sgt i32 [[SUB2]], -14 +-; CHECK-NEXT: [[SMAX1:%[^ ]+]] = select i1 [[CMP1]], i32 [[SUB2]], i32 -14 +-; CHECK-NEXT: [[SUB3:%[^ ]+]] = sub i32 [[SUB1]], [[SMAX1]] +-; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp ugt i32 [[SUB3]], -102 +-; CHECK-NEXT: [[UMAX1:%[^ ]+]] = select i1 [[CMP2]], i32 [[SUB3]], i32 -102 +-; CHECK-NEXT: %exit.mainloop.at = sub i32 -1, [[UMAX1]] ++; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp slt i32 %len, 13 ++; CHECK-NEXT: [[SMAX1:%[^ ]+]] = select i1 [[CMP1]], i32 %len, i32 13 ++; CHECK-NEXT: [[SUB3:%[^ ]+]] = sub i32 %len, [[SMAX1]] ++; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp ult i32 [[SUB3]], 101 ++; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP2]], i32 [[SUB3]], i32 101 + ; CHECK-NEXT: [[CMP3:%[^ ]+]] = icmp ult i32 0, %exit.mainloop.at + ; CHECK-NEXT: br i1 [[CMP3]], label %loop.preheader, label %main.pseudo.exit + ; CHECK: postloop: +@@ -207,10 +201,9 @@ define void @test_04(i32* %arr, i32* %a_ + ; CHECK-LABEL: test_04( + ; CHECK: entry: + ; CHECK-NEXT: %len = load i32, i32* %a_len_ptr, !range !0 +-; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 -14, %len +-; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp ugt i32 [[SUB1]], -102 +-; CHECK-NEXT: [[UMAX1:%[^ ]+]] = select i1 [[CMP1]], i32 [[SUB1]], i32 -102 +-; CHECK-NEXT: %exit.mainloop.at = sub i32 -1, [[UMAX1]] ++; CHECK-NEXT: [[SUB1:%[^ ]+]] = add i32 %len, 13 ++; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp ult i32 [[SUB1]], 101 ++; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP1]], i32 [[SUB1]], i32 101 + ; CHECK-NEXT: br i1 true, label %loop.preloop.preheader + ; CHECK: in.bounds.preloop: + ; CHECK-NEXT: %addr.preloop = getelementptr i32, i32* %arr, i32 %idx.preloop +@@ -251,12 +244,11 @@ define void @test_05(i32* %arr, i32* %a_ + ; CHECK-NOT: preloop + ; CHECK: entry: + ; CHECK-NEXT: %len = load i32, i32* %a_len_ptr, !range !0 +-; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 12, %len +-; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp sgt i32 [[SUB1]], -102 +-; CHECK-NEXT: [[SMAX:%[^ ]+]] = select i1 [[CMP1]], i32 [[SUB1]], i32 -102 +-; CHECK-NEXT: [[SUB2:%[^ ]+]] = sub i32 -1, [[SMAX]] +-; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp sgt i32 [[SUB2]], 0 +-; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP2]], i32 [[SUB2]], i32 0 ++; CHECK-NEXT: [[SUB1:%[^ ]+]] = add i32 %len, -13 ++; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp slt i32 [[SUB1]], 101 ++; CHECK-NEXT: [[SMAX:%[^ ]+]] = select i1 [[CMP1]], i32 [[SUB1]], i32 101 ++; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp sgt i32 [[SMAX]], 0 ++; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP2]], i32 [[SMAX]], i32 0 + ; CHECK-NEXT: [[GOTO_LOOP:%[^ ]+]] = icmp slt i32 0, %exit.mainloop.at + ; CHECK-NEXT: br i1 [[GOTO_LOOP]], label %loop.preheader, label %main.pseudo.exit + ; CHECK: loop +@@ -296,13 +288,11 @@ define void @test_06(i32* %arr, i32* %a_ + ; CHECK-NEXT: [[LEN_MINUS_SMAX:%[^ ]+]] = add i32 %len, -2147483647 + ; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp sgt i32 [[LEN_MINUS_SMAX]], -13 + ; CHECK-NEXT: [[SMAX1:%[^ ]+]] = select i1 [[CMP1]], i32 [[LEN_MINUS_SMAX]], i32 -13 +-; CHECK-NEXT: [[ADD1:%[^ ]+]] = add i32 [[SMAX1]], -1 +-; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 [[ADD1]], %len +-; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp sgt i32 [[SUB1]], -102 +-; CHECK-NEXT: [[SMAX2:%[^ ]+]] = select i1 [[CMP2]], i32 [[SUB1]], i32 -102 +-; CHECK-NEXT: [[SUB2:%[^ ]+]] = sub i32 -1, [[SMAX2]] +-; CHECK-NEXT: [[CMP3:%[^ ]+]] = icmp sgt i32 [[SUB2]], 0 +-; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP3]], i32 [[SUB2]], i32 0 ++; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 %len, [[SMAX1]] ++; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp slt i32 [[SUB1]], 101 ++; CHECK-NEXT: [[SMAX2:%[^ ]+]] = select i1 [[CMP2]], i32 [[SUB1]], i32 101 ++; CHECK-NEXT: [[CMP3:%[^ ]+]] = icmp sgt i32 [[SMAX2]], 0 ++; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP3]], i32 [[SMAX2]], i32 0 + ; CHECK-NEXT: br i1 true, label %loop.preloop.preheader + ; CHECK: in.bounds.preloop: + ; CHECK-NEXT: %addr.preloop = getelementptr i32, i32* %arr, i32 %idx.preloop +@@ -343,14 +333,11 @@ define void @test_07(i32* %arr, i32* %a_ + ; CHECK-NOT: preloop + ; CHECK: entry: + ; CHECK-NEXT: %len = load i32, i32* %a_len_ptr, !range !0 +-; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 -2, %len +-; CHECK-NEXT: [[SUB2:%[^ ]+]] = sub i32 -1, %len +-; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp sgt i32 [[SUB2]], -14 +-; CHECK-NEXT: [[SMAX1:%[^ ]+]] = select i1 [[CMP1]], i32 [[SUB2]], i32 -14 +-; CHECK-NEXT: [[SUB3:%[^ ]+]] = sub i32 [[SUB1]], [[SMAX1]] +-; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp ugt i32 [[SUB3]], -102 +-; CHECK-NEXT: [[UMAX1:%[^ ]+]] = select i1 [[CMP2]], i32 [[SUB3]], i32 -102 +-; CHECK-NEXT: %exit.mainloop.at = sub i32 -1, [[UMAX1]] ++; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp slt i32 %len, 13 ++; CHECK-NEXT: [[SMAX1:%[^ ]+]] = select i1 [[CMP1]], i32 %len, i32 13 ++; CHECK-NEXT: [[SUB3:%[^ ]+]] = sub i32 %len, [[SMAX1]] ++; CHECK-NEXT: [[CMP2:%[^ ]+]] = icmp ult i32 [[SUB3]], 101 ++; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP2]], i32 [[SUB3]], i32 101 + ; CHECK-NEXT: [[CMP3:%[^ ]+]] = icmp ult i32 0, %exit.mainloop.at + ; CHECK-NEXT: br i1 [[CMP3]], label %loop.preheader, label %main.pseudo.exit + ; CHECK: loop +@@ -387,10 +374,9 @@ define void @test_08(i32* %arr, i32* %a_ + ; CHECK-LABEL: test_08( + ; CHECK: entry: + ; CHECK-NEXT: %len = load i32, i32* %a_len_ptr, !range !0 +-; CHECK-NEXT: [[SUB1:%[^ ]+]] = sub i32 -14, %len +-; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp ugt i32 [[SUB1]], -102 +-; CHECK-NEXT: [[UMAX1:%[^ ]+]] = select i1 [[CMP1]], i32 [[SUB1]], i32 -102 +-; CHECK-NEXT: %exit.mainloop.at = sub i32 -1, [[UMAX1]] ++; CHECK-NEXT: [[SUB1:%[^ ]+]] = add i32 %len, 13 ++; CHECK-NEXT: [[CMP1:%[^ ]+]] = icmp ult i32 [[SUB1]], 101 ++; CHECK-NEXT: %exit.mainloop.at = select i1 [[CMP1]], i32 [[SUB1]], i32 101 + ; CHECK-NEXT: br i1 true, label %loop.preloop.preheader + ; CHECK: in.bounds.preloop: + ; CHECK-NEXT: %addr.preloop = getelementptr i32, i32* %arr, i32 %idx.preloop +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/single-access-no-preloop.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/IRCE/single-access-no-preloop.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/single-access-no-preloop.ll +@@ -85,11 +85,9 @@ define void @single_access_no_preloop_wi + ; CHECK-LABEL: @single_access_no_preloop_with_offset( + + ; CHECK: loop.preheader: +-; CHECK: [[not_n:[^ ]+]] = sub i32 -1, %n +-; CHECK: [[not_safe_range_end:[^ ]+]] = sub i32 3, %len +-; CHECK: [[not_exit_main_loop_at_hiclamp_cmp:[^ ]+]] = icmp sgt i32 [[not_n]], [[not_safe_range_end]] +-; CHECK: [[not_exit_main_loop_at_hiclamp:[^ ]+]] = select i1 [[not_exit_main_loop_at_hiclamp_cmp]], i32 [[not_n]], i32 [[not_safe_range_end]] +-; CHECK: [[exit_main_loop_at_hiclamp:[^ ]+]] = sub i32 -1, [[not_exit_main_loop_at_hiclamp]] ++; CHECK: [[safe_range_end:[^ ]+]] = add i32 %len, -4 ++; CHECK: [[exit_main_loop_at_hiclamp_cmp:[^ ]+]] = icmp slt i32 %n, [[safe_range_end]] ++; CHECK: [[exit_main_loop_at_hiclamp:[^ ]+]] = select i1 [[exit_main_loop_at_hiclamp_cmp]], i32 %n, i32 [[safe_range_end]] + ; CHECK: [[exit_main_loop_at_loclamp_cmp:[^ ]+]] = icmp sgt i32 [[exit_main_loop_at_hiclamp]], 0 + ; CHECK: [[exit_main_loop_at_loclamp:[^ ]+]] = select i1 [[exit_main_loop_at_loclamp_cmp]], i32 [[exit_main_loop_at_hiclamp]], i32 0 + ; CHECK: [[enter_main_loop:[^ ]+]] = icmp slt i32 0, [[exit_main_loop_at_loclamp]] +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/single-access-with-preloop.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/IRCE/single-access-with-preloop.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/IRCE/single-access-with-preloop.ll +@@ -33,11 +33,9 @@ define void @single_access_with_preloop( + ; CHECK: [[check_min_sint_offset:[^ ]+]] = icmp sgt i32 %offset, -2147483647 + ; CHECK: [[safe_offset_preloop:[^ ]+]] = select i1 [[check_min_sint_offset]], i32 %offset, i32 -2147483647 + ; If Offset was a SINT_MIN, we could have an overflow here. That is why we calculated its safe version. +-; CHECK: [[not_safe_start:[^ ]+]] = add i32 [[safe_offset_preloop]], -1 +-; CHECK: [[not_n:[^ ]+]] = sub i32 -1, %n +-; CHECK: [[not_exit_preloop_at_cond_loclamp:[^ ]+]] = icmp sgt i32 [[not_safe_start]], [[not_n]] +-; CHECK: [[not_exit_preloop_at_loclamp:[^ ]+]] = select i1 [[not_exit_preloop_at_cond_loclamp]], i32 [[not_safe_start]], i32 [[not_n]] +-; CHECK: [[exit_preloop_at_loclamp:[^ ]+]] = sub i32 -1, [[not_exit_preloop_at_loclamp]] ++; CHECK: [[safe_start:[^ ]+]] = sub i32 0, [[safe_offset_preloop]] ++; CHECK: [[exit_preloop_at_cond_loclamp:[^ ]+]] = icmp slt i32 %n, [[safe_start]] ++; CHECK: [[exit_preloop_at_loclamp:[^ ]+]] = select i1 [[exit_preloop_at_cond_loclamp]], i32 %n, i32 [[safe_start]] + ; CHECK: [[exit_preloop_at_cond:[^ ]+]] = icmp sgt i32 [[exit_preloop_at_loclamp]], 0 + ; CHECK: [[exit_preloop_at:[^ ]+]] = select i1 [[exit_preloop_at_cond]], i32 [[exit_preloop_at_loclamp]], i32 0 + +@@ -45,17 +43,15 @@ define void @single_access_with_preloop( + ; CHECK: [[len_minus_sint_max:[^ ]+]] = add i32 %len, -2147483647 + ; CHECK: [[check_len_min_sint_offset:[^ ]+]] = icmp sgt i32 %offset, [[len_minus_sint_max]] + ; CHECK: [[safe_offset_mainloop:[^ ]+]] = select i1 [[check_len_min_sint_offset]], i32 %offset, i32 [[len_minus_sint_max]] +-; CHECK: [[not_safe_start_2:[^ ]+]] = add i32 [[safe_offset_mainloop]], -1 + ; If Offset was a SINT_MIN, we could have an overflow here. That is why we calculated its safe version. +-; CHECK: [[not_safe_upper_end:[^ ]+]] = sub i32 [[not_safe_start_2]], %len +-; CHECK: [[not_exit_mainloop_at_cond_loclamp:[^ ]+]] = icmp sgt i32 [[not_safe_upper_end]], [[not_n]] +-; CHECK: [[not_exit_mainloop_at_loclamp:[^ ]+]] = select i1 [[not_exit_mainloop_at_cond_loclamp]], i32 [[not_safe_upper_end]], i32 [[not_n]] ++; CHECK: [[safe_upper_end:[^ ]+]] = sub i32 %len, [[safe_offset_mainloop]] ++; CHECK: [[exit_mainloop_at_cond_loclamp:[^ ]+]] = icmp slt i32 %n, [[safe_upper_end]] ++; CHECK: [[exit_mainloop_at_loclamp:[^ ]+]] = select i1 [[exit_mainloop_at_cond_loclamp]], i32 %n, i32 [[safe_upper_end]] + ; CHECK: [[check_offset_mainloop_2:[^ ]+]] = icmp sgt i32 %offset, 0 + ; CHECK: [[safe_offset_mainloop_2:[^ ]+]] = select i1 [[check_offset_mainloop_2]], i32 %offset, i32 0 +-; CHECK: [[not_safe_lower_end:[^ ]+]] = add i32 [[safe_offset_mainloop_2]], -2147483648 +-; CHECK: [[not_exit_mainloop_at_cond_hiclamp:[^ ]+]] = icmp sgt i32 [[not_exit_mainloop_at_loclamp]], [[not_safe_lower_end]] +-; CHECK: [[not_exit_mainloop_at_hiclamp:[^ ]+]] = select i1 [[not_exit_mainloop_at_cond_hiclamp]], i32 [[not_exit_mainloop_at_loclamp]], i32 [[not_safe_lower_end]] +-; CHECK: [[exit_mainloop_at_hiclamp:[^ ]+]] = sub i32 -1, [[not_exit_mainloop_at_hiclamp]] ++; CHECK: [[safe_lower_end:[^ ]+]] = sub i32 2147483647, [[safe_offset_mainloop_2]] ++; CHECK: [[exit_mainloop_at_cond_hiclamp:[^ ]+]] = icmp slt i32 [[exit_mainloop_at_loclamp]], [[safe_lower_end]] ++; CHECK: [[exit_mainloop_at_hiclamp:[^ ]+]] = select i1 [[exit_mainloop_at_cond_hiclamp]], i32 [[exit_mainloop_at_loclamp]], i32 [[safe_lower_end]] + ; CHECK: [[exit_mainloop_at_cmp:[^ ]+]] = icmp sgt i32 [[exit_mainloop_at_hiclamp]], 0 + ; CHECK: [[exit_mainloop_at:[^ ]+]] = select i1 [[exit_mainloop_at_cmp]], i32 [[exit_mainloop_at_hiclamp]], i32 0 + +Index: llvm-toolchain-6.0-6.0.1/test/Transforms/LoopStrengthReduce/2013-01-14-ReuseCast.ll +=================================================================== +--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/LoopStrengthReduce/2013-01-14-ReuseCast.ll ++++ llvm-toolchain-6.0-6.0.1/test/Transforms/LoopStrengthReduce/2013-01-14-ReuseCast.ll +@@ -14,8 +14,6 @@ target datalayout = "e-p:64:64:64-i1:8:8 + ; current LSR cost model. + ; CHECK-NOT: = ptrtoint i8* undef to i64 + ; CHECK: .lr.ph +-; CHECK: [[TMP:%[^ ]+]] = add i64 %tmp{{[0-9]+}}, -1 +-; CHECK: sub i64 [[TMP]], %tmp{{[0-9]+}} + ; CHECK: ret void + define void @VerifyDiagnosticConsumerTest() unnamed_addr nounwind uwtable align 2 { + bb: diff --git a/patches/julia/llvm-rL326967-aligned-load.patch b/patches/julia/llvm-rL326967-aligned-load.patch new file mode 100644 index 00000000..62c11230 --- /dev/null +++ b/patches/julia/llvm-rL326967-aligned-load.patch @@ -0,0 +1,301 @@ +commit b398d8e1fa5a5a914957fa22d0a64db97f6c265e +Author: Craig Topper +Date: Thu Mar 8 00:21:17 2018 +0000 + + [X86] Fix some isel patterns that used aligned vector load instructions with unaligned predicates. + + These patterns weren't checking the alignment of the load, but were using the aligned instructions. This will cause a GP fault if the data isn't aligned. + + I believe these were introduced in r312450. + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@326967 91177308-0d34-0410-b5e6-96231b3b80d8 + +diff --git a/lib/Target/X86/X86InstrVecCompiler.td b/lib/Target/X86/X86InstrVecCompiler.td +index db3dfe56531..50c7763a2c3 100644 +--- a/lib/Target/X86/X86InstrVecCompiler.td ++++ b/lib/Target/X86/X86InstrVecCompiler.td +@@ -261,10 +261,10 @@ let Predicates = [HasVLX] in { + // will zero the upper bits. + // TODO: Is there a safe way to detect whether the producing instruction + // already zeroed the upper bits? +-multiclass subvector_zero_lowering { ++multiclass subvector_zero_lowering { + def : Pat<(DstTy (insert_subvector (bitconvert (ZeroTy immAllZerosV)), + (SrcTy RC:$src), (iPTR 0))), + (SUBREG_TO_REG (i64 0), +@@ -274,91 +274,91 @@ multiclass subvector_zero_lowering("VMOV"#MoveStr#"rm") addr:$src), SubIdx)>; ++ (!cast("VMOV"#LoadStr#"rm") addr:$src), SubIdx)>; + } + + let Predicates = [HasAVX, NoVLX] in { +- defm : subvector_zero_lowering<"APD", VR128, v4f64, v2f64, v8i32, loadv2f64, +- sub_xmm>; +- defm : subvector_zero_lowering<"APS", VR128, v8f32, v4f32, v8i32, loadv4f32, +- sub_xmm>; +- defm : subvector_zero_lowering<"DQA", VR128, v4i64, v2i64, v8i32, loadv2i64, +- sub_xmm>; +- defm : subvector_zero_lowering<"DQA", VR128, v8i32, v4i32, v8i32, loadv2i64, +- sub_xmm>; +- defm : subvector_zero_lowering<"DQA", VR128, v16i16, v8i16, v8i32, loadv2i64, +- sub_xmm>; +- defm : subvector_zero_lowering<"DQA", VR128, v32i8, v16i8, v8i32, loadv2i64, +- sub_xmm>; +-} +- +-let Predicates = [HasVLX] in { +- defm : subvector_zero_lowering<"APDZ128", VR128X, v4f64, v2f64, v8i32, ++ defm : subvector_zero_lowering<"APD", "UPD", VR128, v4f64, v2f64, v8i32, + loadv2f64, sub_xmm>; +- defm : subvector_zero_lowering<"APSZ128", VR128X, v8f32, v4f32, v8i32, ++ defm : subvector_zero_lowering<"APS", "UPS", VR128, v8f32, v4f32, v8i32, + loadv4f32, sub_xmm>; +- defm : subvector_zero_lowering<"DQA64Z128", VR128X, v4i64, v2i64, v8i32, ++ defm : subvector_zero_lowering<"DQA", "DQU", VR128, v4i64, v2i64, v8i32, + loadv2i64, sub_xmm>; +- defm : subvector_zero_lowering<"DQA64Z128", VR128X, v8i32, v4i32, v8i32, ++ defm : subvector_zero_lowering<"DQA", "DQU", VR128, v8i32, v4i32, v8i32, + loadv2i64, sub_xmm>; +- defm : subvector_zero_lowering<"DQA64Z128", VR128X, v16i16, v8i16, v8i32, ++ defm : subvector_zero_lowering<"DQA", "DQU", VR128, v16i16, v8i16, v8i32, + loadv2i64, sub_xmm>; +- defm : subvector_zero_lowering<"DQA64Z128", VR128X, v32i8, v16i8, v8i32, +- loadv2i64, sub_xmm>; +- +- defm : subvector_zero_lowering<"APDZ128", VR128X, v8f64, v2f64, v16i32, +- loadv2f64, sub_xmm>; +- defm : subvector_zero_lowering<"APSZ128", VR128X, v16f32, v4f32, v16i32, +- loadv4f32, sub_xmm>; +- defm : subvector_zero_lowering<"DQA64Z128", VR128X, v8i64, v2i64, v16i32, +- loadv2i64, sub_xmm>; +- defm : subvector_zero_lowering<"DQA64Z128", VR128X, v16i32, v4i32, v16i32, +- loadv2i64, sub_xmm>; +- defm : subvector_zero_lowering<"DQA64Z128", VR128X, v32i16, v8i16, v16i32, +- loadv2i64, sub_xmm>; +- defm : subvector_zero_lowering<"DQA64Z128", VR128X, v64i8, v16i8, v16i32, ++ defm : subvector_zero_lowering<"DQA", "DQU", VR128, v32i8, v16i8, v8i32, + loadv2i64, sub_xmm>; ++} + +- defm : subvector_zero_lowering<"APDZ256", VR256X, v8f64, v4f64, v16i32, +- loadv4f64, sub_ymm>; +- defm : subvector_zero_lowering<"APSZ256", VR256X, v16f32, v8f32, v16i32, +- loadv8f32, sub_ymm>; +- defm : subvector_zero_lowering<"DQA64Z256", VR256X, v8i64, v4i64, v16i32, +- loadv4i64, sub_ymm>; +- defm : subvector_zero_lowering<"DQA64Z256", VR256X, v16i32, v8i32, v16i32, +- loadv4i64, sub_ymm>; +- defm : subvector_zero_lowering<"DQA64Z256", VR256X, v32i16, v16i16, v16i32, +- loadv4i64, sub_ymm>; +- defm : subvector_zero_lowering<"DQA64Z256", VR256X, v64i8, v32i8, v16i32, +- loadv4i64, sub_ymm>; ++let Predicates = [HasVLX] in { ++ defm : subvector_zero_lowering<"APDZ128", "UPDZ128", VR128X, v4f64, ++ v2f64, v8i32, loadv2f64, sub_xmm>; ++ defm : subvector_zero_lowering<"APSZ128", "UPSZ128", VR128X, v8f32, ++ v4f32, v8i32, loadv4f32, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA64Z128", "DQU64Z128", VR128X, v4i64, ++ v2i64, v8i32, loadv2i64, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA64Z128", "DQU64Z128", VR128X, v8i32, ++ v4i32, v8i32, loadv2i64, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA64Z128", "DQU64Z128", VR128X, v16i16, ++ v8i16, v8i32, loadv2i64, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA64Z128", "DQU64Z128", VR128X, v32i8, ++ v16i8, v8i32, loadv2i64, sub_xmm>; ++ ++ defm : subvector_zero_lowering<"APDZ128", "UPDZ128", VR128X, v8f64, ++ v2f64, v16i32, loadv2f64, sub_xmm>; ++ defm : subvector_zero_lowering<"APSZ128", "UPSZ128", VR128X, v16f32, ++ v4f32, v16i32, loadv4f32, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA64Z128", "DQU64Z128", VR128X, v8i64, ++ v2i64, v16i32, loadv2i64, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA64Z128", "DQU64Z128", VR128X, v16i32, ++ v4i32, v16i32, loadv2i64, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA64Z128", "DQU64Z128", VR128X, v32i16, ++ v8i16, v16i32, loadv2i64, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA64Z128", "DQU64Z128", VR128X, v64i8, ++ v16i8, v16i32, loadv2i64, sub_xmm>; ++ ++ defm : subvector_zero_lowering<"APDZ256", "UPDZ256", VR256X, v8f64, ++ v4f64, v16i32, loadv4f64, sub_ymm>; ++ defm : subvector_zero_lowering<"APSZ256", "UPDZ256", VR256X, v16f32, ++ v8f32, v16i32, loadv8f32, sub_ymm>; ++ defm : subvector_zero_lowering<"DQA64Z256", "DQU64Z256", VR256X, v8i64, ++ v4i64, v16i32, loadv4i64, sub_ymm>; ++ defm : subvector_zero_lowering<"DQA64Z256", "DQU64Z256", VR256X, v16i32, ++ v8i32, v16i32, loadv4i64, sub_ymm>; ++ defm : subvector_zero_lowering<"DQA64Z256", "DQU64Z256", VR256X, v32i16, ++ v16i16, v16i32, loadv4i64, sub_ymm>; ++ defm : subvector_zero_lowering<"DQA64Z256", "DQU64Z256", VR256X, v64i8, ++ v32i8, v16i32, loadv4i64, sub_ymm>; + } + + let Predicates = [HasAVX512, NoVLX] in { +- defm : subvector_zero_lowering<"APD", VR128, v8f64, v2f64, v16i32, loadv2f64, +- sub_xmm>; +- defm : subvector_zero_lowering<"APS", VR128, v16f32, v4f32, v16i32, loadv4f32, +- sub_xmm>; +- defm : subvector_zero_lowering<"DQA", VR128, v8i64, v2i64, v16i32, loadv2i64, +- sub_xmm>; +- defm : subvector_zero_lowering<"DQA", VR128, v16i32, v4i32, v16i32, loadv2i64, +- sub_xmm>; +- defm : subvector_zero_lowering<"DQA", VR128, v32i16, v8i16, v16i32, loadv2i64, +- sub_xmm>; +- defm : subvector_zero_lowering<"DQA", VR128, v64i8, v16i8, v16i32, loadv2i64, +- sub_xmm>; +- +- defm : subvector_zero_lowering<"APDY", VR256, v8f64, v4f64, v16i32, +- loadv4f64, sub_ymm>; +- defm : subvector_zero_lowering<"APSY", VR256, v16f32, v8f32, v16i32, +- loadv8f32, sub_ymm>; +- defm : subvector_zero_lowering<"DQAY", VR256, v8i64, v4i64, v16i32, +- loadv4i64, sub_ymm>; +- defm : subvector_zero_lowering<"DQAY", VR256, v16i32, v8i32, v16i32, +- loadv4i64, sub_ymm>; +- defm : subvector_zero_lowering<"DQAY", VR256, v32i16, v16i16, v16i32, +- loadv4i64, sub_ymm>; +- defm : subvector_zero_lowering<"DQAY", VR256, v64i8, v32i8, v16i32, +- loadv4i64, sub_ymm>; ++ defm : subvector_zero_lowering<"APD", "UPD", VR128, v8f64, v2f64, ++ v16i32,loadv2f64, sub_xmm>; ++ defm : subvector_zero_lowering<"APS", "UPS", VR128, v16f32, v4f32, ++ v16i32, loadv4f32, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA", "DQU", VR128, v8i64, v2i64, ++ v16i32, loadv2i64, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA", "DQU", VR128, v16i32, v4i32, ++ v16i32, loadv2i64, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA", "DQU", VR128, v32i16, v8i16, ++ v16i32, loadv2i64, sub_xmm>; ++ defm : subvector_zero_lowering<"DQA", "DQU", VR128, v64i8, v16i8, ++ v16i32, loadv2i64, sub_xmm>; ++ ++ defm : subvector_zero_lowering<"APDY", "UPDY", VR256, v8f64, v4f64, ++ v16i32, loadv4f64, sub_ymm>; ++ defm : subvector_zero_lowering<"APSY", "UPSY", VR256, v16f32, v8f32, ++ v16i32, loadv8f32, sub_ymm>; ++ defm : subvector_zero_lowering<"DQAY", "DQUY", VR256, v8i64, v4i64, ++ v16i32, loadv4i64, sub_ymm>; ++ defm : subvector_zero_lowering<"DQAY", "DQUY", VR256, v16i32, v8i32, ++ v16i32, loadv4i64, sub_ymm>; ++ defm : subvector_zero_lowering<"DQAY", "DQUY", VR256, v32i16, v16i16, ++ v16i32, loadv4i64, sub_ymm>; ++ defm : subvector_zero_lowering<"DQAY", "DQUY", VR256, v64i8, v32i8, ++ v16i32, loadv4i64, sub_ymm>; + } + + // List of opcodes that guaranteed to zero the upper elements of vector regs. +diff --git a/test/CodeGen/X86/merge-consecutive-loads-256.ll b/test/CodeGen/X86/merge-consecutive-loads-256.ll +index 6ecd8116443..0f2cf594b1c 100644 +--- a/test/CodeGen/X86/merge-consecutive-loads-256.ll ++++ b/test/CodeGen/X86/merge-consecutive-loads-256.ll +@@ -28,13 +28,13 @@ define <4 x double> @merge_4f64_2f64_23(<2 x double>* %ptr) nounwind uwtable noi + define <4 x double> @merge_4f64_2f64_2z(<2 x double>* %ptr) nounwind uwtable noinline ssp { + ; AVX-LABEL: merge_4f64_2f64_2z: + ; AVX: # %bb.0: +-; AVX-NEXT: vmovaps 32(%rdi), %xmm0 ++; AVX-NEXT: vmovups 32(%rdi), %xmm0 + ; AVX-NEXT: retq + ; + ; X32-AVX-LABEL: merge_4f64_2f64_2z: + ; X32-AVX: # %bb.0: + ; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +-; X32-AVX-NEXT: vmovaps 32(%eax), %xmm0 ++; X32-AVX-NEXT: vmovups 32(%eax), %xmm0 + ; X32-AVX-NEXT: retl + %ptr0 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 2 + %val0 = load <2 x double>, <2 x double>* %ptr0 +@@ -109,13 +109,13 @@ define <4 x double> @merge_4f64_f64_34uu(double* %ptr) nounwind uwtable noinline + define <4 x double> @merge_4f64_f64_45zz(double* %ptr) nounwind uwtable noinline ssp { + ; AVX-LABEL: merge_4f64_f64_45zz: + ; AVX: # %bb.0: +-; AVX-NEXT: vmovaps 32(%rdi), %xmm0 ++; AVX-NEXT: vmovups 32(%rdi), %xmm0 + ; AVX-NEXT: retq + ; + ; X32-AVX-LABEL: merge_4f64_f64_45zz: + ; X32-AVX: # %bb.0: + ; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +-; X32-AVX-NEXT: vmovaps 32(%eax), %xmm0 ++; X32-AVX-NEXT: vmovups 32(%eax), %xmm0 + ; X32-AVX-NEXT: retl + %ptr0 = getelementptr inbounds double, double* %ptr, i64 4 + %ptr1 = getelementptr inbounds double, double* %ptr, i64 5 +@@ -155,13 +155,13 @@ define <4 x double> @merge_4f64_f64_34z6(double* %ptr) nounwind uwtable noinline + define <4 x i64> @merge_4i64_2i64_3z(<2 x i64>* %ptr) nounwind uwtable noinline ssp { + ; AVX-LABEL: merge_4i64_2i64_3z: + ; AVX: # %bb.0: +-; AVX-NEXT: vmovaps 48(%rdi), %xmm0 ++; AVX-NEXT: vmovups 48(%rdi), %xmm0 + ; AVX-NEXT: retq + ; + ; X32-AVX-LABEL: merge_4i64_2i64_3z: + ; X32-AVX: # %bb.0: + ; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +-; X32-AVX-NEXT: vmovaps 48(%eax), %xmm0 ++; X32-AVX-NEXT: vmovups 48(%eax), %xmm0 + ; X32-AVX-NEXT: retl + %ptr0 = getelementptr inbounds <2 x i64>, <2 x i64>* %ptr, i64 3 + %val0 = load <2 x i64>, <2 x i64>* %ptr0 +@@ -217,13 +217,13 @@ define <4 x i64> @merge_4i64_i64_1zzu(i64* %ptr) nounwind uwtable noinline ssp { + define <4 x i64> @merge_4i64_i64_23zz(i64* %ptr) nounwind uwtable noinline ssp { + ; AVX-LABEL: merge_4i64_i64_23zz: + ; AVX: # %bb.0: +-; AVX-NEXT: vmovaps 16(%rdi), %xmm0 ++; AVX-NEXT: vmovups 16(%rdi), %xmm0 + ; AVX-NEXT: retq + ; + ; X32-AVX-LABEL: merge_4i64_i64_23zz: + ; X32-AVX: # %bb.0: + ; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +-; X32-AVX-NEXT: vmovaps 16(%eax), %xmm0 ++; X32-AVX-NEXT: vmovups 16(%eax), %xmm0 + ; X32-AVX-NEXT: retl + %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 2 + %ptr1 = getelementptr inbounds i64, i64* %ptr, i64 3 +diff --git a/test/CodeGen/X86/merge-consecutive-loads-512.ll b/test/CodeGen/X86/merge-consecutive-loads-512.ll +index 62102eb382c..3c6eaf65292 100644 +--- a/test/CodeGen/X86/merge-consecutive-loads-512.ll ++++ b/test/CodeGen/X86/merge-consecutive-loads-512.ll +@@ -106,13 +106,13 @@ define <8 x double> @merge_8f64_f64_23uuuuu9(double* %ptr) nounwind uwtable noin + define <8 x double> @merge_8f64_f64_12zzuuzz(double* %ptr) nounwind uwtable noinline ssp { + ; ALL-LABEL: merge_8f64_f64_12zzuuzz: + ; ALL: # %bb.0: +-; ALL-NEXT: vmovaps 8(%rdi), %xmm0 ++; ALL-NEXT: vmovups 8(%rdi), %xmm0 + ; ALL-NEXT: retq + ; + ; X32-AVX512F-LABEL: merge_8f64_f64_12zzuuzz: + ; X32-AVX512F: # %bb.0: + ; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +-; X32-AVX512F-NEXT: vmovaps 8(%eax), %xmm0 ++; X32-AVX512F-NEXT: vmovups 8(%eax), %xmm0 + ; X32-AVX512F-NEXT: retl + %ptr0 = getelementptr inbounds double, double* %ptr, i64 1 + %ptr1 = getelementptr inbounds double, double* %ptr, i64 2 +@@ -190,7 +190,7 @@ define <8 x i64> @merge_8i64_4i64_z3(<4 x i64>* %ptr) nounwind uwtable noinline + define <8 x i64> @merge_8i64_i64_56zz9uzz(i64* %ptr) nounwind uwtable noinline ssp { + ; ALL-LABEL: merge_8i64_i64_56zz9uzz: + ; ALL: # %bb.0: +-; ALL-NEXT: vmovaps 40(%rdi), %xmm0 ++; ALL-NEXT: vmovups 40(%rdi), %xmm0 + ; ALL-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero + ; ALL-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0 + ; ALL-NEXT: retq +@@ -198,7 +198,7 @@ define <8 x i64> @merge_8i64_i64_56zz9uzz(i64* %ptr) nounwind uwtable noinline s + ; X32-AVX512F-LABEL: merge_8i64_i64_56zz9uzz: + ; X32-AVX512F: # %bb.0: + ; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +-; X32-AVX512F-NEXT: vmovaps 40(%eax), %xmm0 ++; X32-AVX512F-NEXT: vmovups 40(%eax), %xmm0 + ; X32-AVX512F-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero + ; X32-AVX512F-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0 + ; X32-AVX512F-NEXT: retl diff --git a/patches/julia/llvm-rL327898.patch b/patches/julia/llvm-rL327898.patch new file mode 100644 index 00000000..f4d9a430 --- /dev/null +++ b/patches/julia/llvm-rL327898.patch @@ -0,0 +1,6131 @@ +commit 64c3384f94a1eb3e3510d6f66c3bccdfc9d9050b +Author: Nirav Dave +Date: Thu Feb 1 16:11:59 2018 +0000 + + r327898/dependencies roll up + + This is a squash of 13 commits required in the lead up to r327898, + which fixes https://github.com/JuliaLang/julia/issues/27603. The squashed + commits are: + + 332d15e981e86b9e058087174bb288ba18a15807 + b659d3fca5d24c25ee73f979edb382f7f24e05e2 + c01d1363ea080170fc5143d72f26eecd9270f03b + eab8a177a4caef9e42ef1d2aeb4ba15dc788d3f2 + bedb1391781b009ace95f5586e7fae5f03fe0689 + 11d041a905f82ac78e7ccf2394773e80b93d147c + e1ec36c55a0127988f42a3329ca835617b30de09 + b8d2903300c13d8fd151c8e5dc71017269617539 + 00884fea345f47ab05174a8f314ecd60d1676d02 + 28ab04cec0d9888af9d29946b3a048b8340abe0f + 3dd52e62ea3087efcca63c3772183d9471abc742 + bd3649ff6d6b4d18b3c6de253179d987a120518a + aea03035b9c633e6d745b6d3fc5b6378699f576c + + Their commit messages follow below: + + [SelectionDAG] Fix UpdateChains handling of TokenFactors + + Summary: + In Instruction Selection UpdateChains replaces all matched Nodes' + chain references including interior token factors and deletes them. + This may allow nodes which depend on these interior nodes but are not + part of the set of matched nodes to be left with a dangling dependence. + Avoid this by doing the replacement for matched non-TokenFactor nodes. + + Fixes PR36164. + + Reviewers: jonpa, RKSimon, bogner + + Subscribers: llvm-commits, hiraditya + + Differential Revision: https://reviews.llvm.org/D42754 + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323977 91177308-0d34-0410-b5e6-96231b3b80d8 + + Regenerate test result for vastart-defs-eflags.ll. NFC. + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323596 91177308-0d34-0410-b5e6-96231b3b80d8 + + Regenerate test result for testb-je-fusion.ll. NFC. + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323595 91177308-0d34-0410-b5e6-96231b3b80d8 + + [X86] Avoid using high register trick for test instruction + + Summary: + It seems it's main effect is to create addition copies when values are inr register that do not support this trick, which increase register pressure and makes the code bigger. + + Reviewers: craig.topper, niravd, spatel, hfinkel + + Subscribers: llvm-commits + + Differential Revision: https://reviews.llvm.org/D42646 + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323888 91177308-0d34-0410-b5e6-96231b3b80d8 + + Add a regression test for problems caused by D42646 . NFC + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323868 91177308-0d34-0410-b5e6-96231b3b80d8 + + Add test case for truncated and promotion to test. NFC + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323663 91177308-0d34-0410-b5e6-96231b3b80d8 + + [X86] Add test case to ensure testw is generated when optimizing for size. NFC + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323687 91177308-0d34-0410-b5e6-96231b3b80d8 + + [X86] Generate testl instruction through truncates. + + Summary: + This was introduced in D42646 but ended up being reverted because the original implementation was buggy. + + Depends on D42646 + + Reviewers: craig.topper, niravd, spatel, hfinkel + + Subscribers: llvm-commits + + Differential Revision: https://reviews.llvm.org/D42741 + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323899 91177308-0d34-0410-b5e6-96231b3b80d8 + + [X86] Don't look for TEST instruction shrinking opportunities when the root node is a X86ISD::SUB. + + I don't believe we ever create an X86ISD::SUB with a 0 constant which is what the TEST handling needs. The ternary operator at the end of this code shows up as only going one way in the llvm-cov report from the bots. + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@324865 91177308-0d34-0410-b5e6-96231b3b80d8 + + [X86] Teach LowerBUILD_VECTOR to recognize pair-wise splats of 32-bit elements and use a 64-bit broadcast + + If we are splatting pairs of 32-bit elements, we can use a 64-bit broadcast to get the job done. + + We could probably could probably do this with other sizes too, for example four 16-bit elements. Or we could broadcast pairs of 16-bit elements using a 32-bit element broadcast. But I've left that as a future improvement. + + I've also restricted this to AVX2 only because we can only broadcast loads under AVX. + + Differential Revision: https://reviews.llvm.org/D42086 + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@322730 91177308-0d34-0410-b5e6-96231b3b80d8 + + [DAG, X86] Revert r327197 "Revert r327170, r327171, r327172" + + Reland ISel cycle checking improvements after simplifying node id + invariant traversal and correcting typo. + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327898 91177308-0d34-0410-b5e6-96231b3b80d8 + + [ Modified for cherry-pick: Dropped Hexagon and SystemZ changes" + + [DAG, X86] Fix ISel-time node insertion ids + + As in SystemZ backend, correctly propagate node ids when inserting new + unselected nodes into the DAG during instruction Seleciton for X86 + target. + + Fixes PR36865. + + Reviewers: jyknight, craig.topper + + Subscribers: hiraditya, llvm-commits + + Differential Revision: https://reviews.llvm.org/D44797 + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328233 91177308-0d34-0410-b5e6-96231b3b80d8 + + [DAG] Fix node id invalidation in Instruction Selection. + + Invalidation should be bit negation. Add missing negation. + + git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@328287 91177308-0d34-0410-b5e6-96231b3b80d8 + + Remove failing tests + + This removes tests that are failing due to codegen differences, + after the latest set of backports. Fixing thse for the backport + branch does not seem worth it. + +diff --git a/include/llvm/CodeGen/SelectionDAGISel.h b/include/llvm/CodeGen/SelectionDAGISel.h +index de6849a1eae..e56eafc437c 100644 +--- a/include/llvm/CodeGen/SelectionDAGISel.h ++++ b/include/llvm/CodeGen/SelectionDAGISel.h +@@ -110,6 +110,11 @@ public: + CodeGenOpt::Level OptLevel, + bool IgnoreChains = false); + ++ static void InvalidateNodeId(SDNode *N); ++ static int getUninvalidatedNodeId(SDNode *N); ++ ++ static void EnforceNodeIdInvariant(SDNode *N); ++ + // Opcodes used by the DAG state machine: + enum BuiltinOpcodes { + OPC_Scope, +@@ -199,23 +204,28 @@ protected: + /// of the new node T. + void ReplaceUses(SDValue F, SDValue T) { + CurDAG->ReplaceAllUsesOfValueWith(F, T); ++ EnforceNodeIdInvariant(T.getNode()); + } + + /// ReplaceUses - replace all uses of the old nodes F with the use + /// of the new nodes T. + void ReplaceUses(const SDValue *F, const SDValue *T, unsigned Num) { + CurDAG->ReplaceAllUsesOfValuesWith(F, T, Num); ++ for (unsigned i = 0; i < Num; ++i) ++ EnforceNodeIdInvariant(T[i].getNode()); + } + + /// ReplaceUses - replace all uses of the old node F with the use + /// of the new node T. + void ReplaceUses(SDNode *F, SDNode *T) { + CurDAG->ReplaceAllUsesWith(F, T); ++ EnforceNodeIdInvariant(T); + } + + /// Replace all uses of \c F with \c T, then remove \c F from the DAG. + void ReplaceNode(SDNode *F, SDNode *T) { + CurDAG->ReplaceAllUsesWith(F, T); ++ EnforceNodeIdInvariant(T); + CurDAG->RemoveDeadNode(F); + } + +diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h +index 522c2f1b2cb..2d974234abf 100644 +--- a/include/llvm/CodeGen/SelectionDAGNodes.h ++++ b/include/llvm/CodeGen/SelectionDAGNodes.h +@@ -796,16 +796,44 @@ public: + /// searches to be performed in parallel, caching of results across + /// queries and incremental addition to Worklist. Stops early if N is + /// found but will resume. Remember to clear Visited and Worklists +- /// if DAG changes. ++ /// if DAG changes. MaxSteps gives a maximum number of nodes to visit before ++ /// giving up. The TopologicalPrune flag signals that positive NodeIds are ++ /// topologically ordered (Operands have strictly smaller node id) and search ++ /// can be pruned leveraging this. + static bool hasPredecessorHelper(const SDNode *N, + SmallPtrSetImpl &Visited, + SmallVectorImpl &Worklist, +- unsigned int MaxSteps = 0) { ++ unsigned int MaxSteps = 0, ++ bool TopologicalPrune = false) { ++ SmallVector DeferredNodes; + if (Visited.count(N)) + return true; ++ ++ // Node Id's are assigned in three places: As a topological ++ // ordering (> 0), during legalization (results in values set to ++ // 0), new nodes (set to -1). If N has a topolgical id then we ++ // know that all nodes with ids smaller than it cannot be ++ // successors and we need not check them. Filter out all node ++ // that can't be matches. We add them to the worklist before exit ++ // in case of multiple calls. Note that during selection the topological id ++ // may be violated if a node's predecessor is selected before it. We mark ++ // this at selection negating the id of unselected successors and ++ // restricting topological pruning to positive ids. ++ ++ int NId = N->getNodeId(); ++ // If we Invalidated the Id, reconstruct original NId. ++ if (NId < -1) ++ NId = -(NId + 1); ++ ++ bool Found = false; + while (!Worklist.empty()) { + const SDNode *M = Worklist.pop_back_val(); +- bool Found = false; ++ int MId = M->getNodeId(); ++ if (TopologicalPrune && M->getOpcode() != ISD::TokenFactor && (NId > 0) && ++ (MId > 0) && (MId < NId)) { ++ DeferredNodes.push_back(M); ++ continue; ++ } + for (const SDValue &OpV : M->op_values()) { + SDNode *Op = OpV.getNode(); + if (Visited.insert(Op).second) +@@ -814,11 +842,16 @@ public: + Found = true; + } + if (Found) +- return true; ++ break; + if (MaxSteps != 0 && Visited.size() >= MaxSteps) +- return false; ++ break; + } +- return false; ++ // Push deferred nodes back on worklist. ++ Worklist.append(DeferredNodes.begin(), DeferredNodes.end()); ++ // If we bailed early, conservatively return found. ++ if (MaxSteps != 0 && Visited.size() >= MaxSteps) ++ return true; ++ return Found; + } + + /// Return true if all the users of N are contained in Nodes. +diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +index bd9fcfb5c1e..17e42240133 100644 +--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp ++++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +@@ -937,6 +937,58 @@ public: + + } // end anonymous namespace + ++// This function is used to enforce the topological node id property ++// property leveraged during Instruction selection. Before selection all ++// nodes are given a non-negative id such that all nodes have a larger id than ++// their operands. As this holds transitively we can prune checks that a node N ++// is a predecessor of M another by not recursively checking through M's ++// operands if N's ID is larger than M's ID. This is significantly improves ++// performance of for various legality checks (e.g. IsLegalToFold / ++// UpdateChains). ++ ++// However, when we fuse multiple nodes into a single node ++// during selection we may induce a predecessor relationship between inputs and ++// outputs of distinct nodes being merged violating the topological property. ++// Should a fused node have a successor which has yet to be selected, our ++// legality checks would be incorrect. To avoid this we mark all unselected ++// sucessor nodes, i.e. id != -1 as invalid for pruning by bit-negating (x => ++// (-(x+1))) the ids and modify our pruning check to ignore negative Ids of M. ++// We use bit-negation to more clearly enforce that node id -1 can only be ++// achieved by selected nodes). As the conversion is reversable the original Id, ++// topological pruning can still be leveraged when looking for unselected nodes. ++// This method is call internally in all ISel replacement calls. ++void SelectionDAGISel::EnforceNodeIdInvariant(SDNode *Node) { ++ SmallVector Nodes; ++ Nodes.push_back(Node); ++ ++ while (!Nodes.empty()) { ++ SDNode *N = Nodes.pop_back_val(); ++ for (auto *U : N->uses()) { ++ auto UId = U->getNodeId(); ++ if (UId > 0) { ++ InvalidateNodeId(U); ++ Nodes.push_back(U); ++ } ++ } ++ } ++} ++ ++// InvalidateNodeId - As discusses in EnforceNodeIdInvariant, mark a ++// NodeId with the equivalent node id which is invalid for topological ++// pruning. ++void SelectionDAGISel::InvalidateNodeId(SDNode *N) { ++ int InvalidId = -(N->getNodeId() + 1); ++ N->setNodeId(InvalidId); ++} ++ ++// getUninvalidatedNodeId - get original uninvalidated node id. ++int SelectionDAGISel::getUninvalidatedNodeId(SDNode *N) { ++ int Id = N->getNodeId(); ++ if (Id < -1) ++ return -(Id + 1); ++ return Id; ++} ++ + void SelectionDAGISel::DoInstructionSelection() { + DEBUG(dbgs() << "===== Instruction selection begins: " + << printMBBReference(*FuncInfo->MBB) << " '" +@@ -972,6 +1024,33 @@ void SelectionDAGISel::DoInstructionSelection() { + if (Node->use_empty()) + continue; + ++#ifndef NDEBUG ++ SmallVector Nodes; ++ Nodes.push_back(Node); ++ ++ while (!Nodes.empty()) { ++ auto N = Nodes.pop_back_val(); ++ if (N->getOpcode() == ISD::TokenFactor || N->getNodeId() < 0) ++ continue; ++ for (const SDValue &Op : N->op_values()) { ++ if (Op->getOpcode() == ISD::TokenFactor) ++ Nodes.push_back(Op.getNode()); ++ else { ++ // We rely on topological ordering of node ids for checking for ++ // cycles when fusing nodes during selection. All unselected nodes ++ // successors of an already selected node should have a negative id. ++ // This assertion will catch such cases. If this assertion triggers ++ // it is likely you using DAG-level Value/Node replacement functions ++ // (versus equivalent ISEL replacement) in backend-specific ++ // selections. See comment in EnforceNodeIdInvariant for more ++ // details. ++ assert(Op->getNodeId() != -1 && ++ "Node has already selected predecessor node"); ++ } ++ } ++ } ++#endif ++ + // When we are using non-default rounding modes or FP exception behavior + // FP operations are represented by StrictFP pseudo-operations. They + // need to be simplified here so that the target-specific instruction +@@ -2134,52 +2213,44 @@ static SDNode *findGlueUse(SDNode *N) { + return nullptr; + } + +-/// findNonImmUse - Return true if "Use" is a non-immediate use of "Def". +-/// This function iteratively traverses up the operand chain, ignoring +-/// certain nodes. +-static bool findNonImmUse(SDNode *Use, SDNode* Def, SDNode *ImmedUse, +- SDNode *Root, SmallPtrSetImpl &Visited, ++/// findNonImmUse - Return true if "Def" is a predecessor of "Root" via a path ++/// beyond "ImmedUse". We may ignore chains as they are checked separately. ++static bool findNonImmUse(SDNode *Root, SDNode *Def, SDNode *ImmedUse, + bool IgnoreChains) { +- // The NodeID's are given uniques ID's where a node ID is guaranteed to be +- // greater than all of its (recursive) operands. If we scan to a point where +- // 'use' is smaller than the node we're scanning for, then we know we will +- // never find it. +- // +- // The Use may be -1 (unassigned) if it is a newly allocated node. This can +- // happen because we scan down to newly selected nodes in the case of glue +- // uses. +- std::vector WorkList; +- WorkList.push_back(Use); +- +- while (!WorkList.empty()) { +- Use = WorkList.back(); +- WorkList.pop_back(); +- if (Use->getNodeId() < Def->getNodeId() && Use->getNodeId() != -1) +- continue; ++ SmallPtrSet Visited; ++ SmallVector WorkList; ++ // Only check if we have non-immediate uses of Def. ++ if (ImmedUse->isOnlyUserOf(Def)) ++ return false; + +- // Don't revisit nodes if we already scanned it and didn't fail, we know we +- // won't fail if we scan it again. +- if (!Visited.insert(Use).second) ++ // We don't care about paths to Def that go through ImmedUse so mark it ++ // visited and mark non-def operands as used. ++ Visited.insert(ImmedUse); ++ for (const SDValue &Op : ImmedUse->op_values()) { ++ SDNode *N = Op.getNode(); ++ // Ignore chain deps (they are validated by ++ // HandleMergeInputChains) and immediate uses ++ if ((Op.getValueType() == MVT::Other && IgnoreChains) || N == Def) + continue; ++ if (!Visited.insert(N).second) ++ continue; ++ WorkList.push_back(N); ++ } + +- for (const SDValue &Op : Use->op_values()) { +- // Ignore chain uses, they are validated by HandleMergeInputChains. +- if (Op.getValueType() == MVT::Other && IgnoreChains) +- continue; +- ++ // Initialize worklist to operands of Root. ++ if (Root != ImmedUse) { ++ for (const SDValue &Op : Root->op_values()) { + SDNode *N = Op.getNode(); +- if (N == Def) { +- if (Use == ImmedUse || Use == Root) +- continue; // We are not looking for immediate use. +- assert(N != Root); +- return true; +- } +- +- // Traverse up the operand chain. ++ // Ignore chains (they are validated by HandleMergeInputChains) ++ if ((Op.getValueType() == MVT::Other && IgnoreChains) || N == Def) ++ continue; ++ if (!Visited.insert(N).second) ++ continue; + WorkList.push_back(N); + } + } +- return false; ++ ++ return SDNode::hasPredecessorHelper(Def, Visited, WorkList, 0, true); + } + + /// IsProfitableToFold - Returns true if it's profitable to fold the specific +@@ -2251,13 +2322,12 @@ bool SelectionDAGISel::IsLegalToFold(SDValue N, SDNode *U, SDNode *Root, + + // If our query node has a glue result with a use, we've walked up it. If + // the user (which has already been selected) has a chain or indirectly uses +- // the chain, our WalkChainUsers predicate will not consider it. Because of ++ // the chain, HandleMergeInputChains will not consider it. Because of + // this, we cannot ignore chains in this predicate. + IgnoreChains = false; + } + +- SmallPtrSet Visited; +- return !findNonImmUse(Root, N.getNode(), U, Root, Visited, IgnoreChains); ++ return !findNonImmUse(Root, N.getNode(), U, IgnoreChains); + } + + void SelectionDAGISel::Select_INLINEASM(SDNode *N) { +@@ -2360,7 +2430,8 @@ void SelectionDAGISel::UpdateChains( + std::replace(ChainNodesMatched.begin(), ChainNodesMatched.end(), N, + static_cast(nullptr)); + }); +- CurDAG->ReplaceAllUsesOfValueWith(ChainVal, InputChain); ++ if (ChainNode->getOpcode() != ISD::TokenFactor) ++ ReplaceUses(ChainVal, InputChain); + + // If the node became dead and we haven't already seen it, delete it. + if (ChainNode != NodeToMatch && ChainNode->use_empty() && +@@ -2375,143 +2446,6 @@ void SelectionDAGISel::UpdateChains( + DEBUG(dbgs() << "ISEL: Match complete!\n"); + } + +-enum ChainResult { +- CR_Simple, +- CR_InducesCycle, +- CR_LeadsToInteriorNode +-}; +- +-/// WalkChainUsers - Walk down the users of the specified chained node that is +-/// part of the pattern we're matching, looking at all of the users we find. +-/// This determines whether something is an interior node, whether we have a +-/// non-pattern node in between two pattern nodes (which prevent folding because +-/// it would induce a cycle) and whether we have a TokenFactor node sandwiched +-/// between pattern nodes (in which case the TF becomes part of the pattern). +-/// +-/// The walk we do here is guaranteed to be small because we quickly get down to +-/// already selected nodes "below" us. +-static ChainResult +-WalkChainUsers(const SDNode *ChainedNode, +- SmallVectorImpl &ChainedNodesInPattern, +- DenseMap &TokenFactorResult, +- SmallVectorImpl &InteriorChainedNodes) { +- ChainResult Result = CR_Simple; +- +- for (SDNode::use_iterator UI = ChainedNode->use_begin(), +- E = ChainedNode->use_end(); UI != E; ++UI) { +- // Make sure the use is of the chain, not some other value we produce. +- if (UI.getUse().getValueType() != MVT::Other) continue; +- +- SDNode *User = *UI; +- +- if (User->getOpcode() == ISD::HANDLENODE) // Root of the graph. +- continue; +- +- // If we see an already-selected machine node, then we've gone beyond the +- // pattern that we're selecting down into the already selected chunk of the +- // DAG. +- unsigned UserOpcode = User->getOpcode(); +- if (User->isMachineOpcode() || +- UserOpcode == ISD::CopyToReg || +- UserOpcode == ISD::CopyFromReg || +- UserOpcode == ISD::INLINEASM || +- UserOpcode == ISD::EH_LABEL || +- UserOpcode == ISD::LIFETIME_START || +- UserOpcode == ISD::LIFETIME_END) { +- // If their node ID got reset to -1 then they've already been selected. +- // Treat them like a MachineOpcode. +- if (User->getNodeId() == -1) +- continue; +- } +- +- // If we have a TokenFactor, we handle it specially. +- if (User->getOpcode() != ISD::TokenFactor) { +- // If the node isn't a token factor and isn't part of our pattern, then it +- // must be a random chained node in between two nodes we're selecting. +- // This happens when we have something like: +- // x = load ptr +- // call +- // y = x+4 +- // store y -> ptr +- // Because we structurally match the load/store as a read/modify/write, +- // but the call is chained between them. We cannot fold in this case +- // because it would induce a cycle in the graph. +- if (!std::count(ChainedNodesInPattern.begin(), +- ChainedNodesInPattern.end(), User)) +- return CR_InducesCycle; +- +- // Otherwise we found a node that is part of our pattern. For example in: +- // x = load ptr +- // y = x+4 +- // store y -> ptr +- // This would happen when we're scanning down from the load and see the +- // store as a user. Record that there is a use of ChainedNode that is +- // part of the pattern and keep scanning uses. +- Result = CR_LeadsToInteriorNode; +- InteriorChainedNodes.push_back(User); +- continue; +- } +- +- // If we found a TokenFactor, there are two cases to consider: first if the +- // TokenFactor is just hanging "below" the pattern we're matching (i.e. no +- // uses of the TF are in our pattern) we just want to ignore it. Second, +- // the TokenFactor can be sandwiched in between two chained nodes, like so: +- // [Load chain] +- // ^ +- // | +- // [Load] +- // ^ ^ +- // | \ DAG's like cheese +- // / \ do you? +- // / | +- // [TokenFactor] [Op] +- // ^ ^ +- // | | +- // \ / +- // \ / +- // [Store] +- // +- // In this case, the TokenFactor becomes part of our match and we rewrite it +- // as a new TokenFactor. +- // +- // To distinguish these two cases, do a recursive walk down the uses. +- auto MemoizeResult = TokenFactorResult.find(User); +- bool Visited = MemoizeResult != TokenFactorResult.end(); +- // Recursively walk chain users only if the result is not memoized. +- if (!Visited) { +- auto Res = WalkChainUsers(User, ChainedNodesInPattern, TokenFactorResult, +- InteriorChainedNodes); +- MemoizeResult = TokenFactorResult.insert(std::make_pair(User, Res)).first; +- } +- switch (MemoizeResult->second) { +- case CR_Simple: +- // If the uses of the TokenFactor are just already-selected nodes, ignore +- // it, it is "below" our pattern. +- continue; +- case CR_InducesCycle: +- // If the uses of the TokenFactor lead to nodes that are not part of our +- // pattern that are not selected, folding would turn this into a cycle, +- // bail out now. +- return CR_InducesCycle; +- case CR_LeadsToInteriorNode: +- break; // Otherwise, keep processing. +- } +- +- // Okay, we know we're in the interesting interior case. The TokenFactor +- // is now going to be considered part of the pattern so that we rewrite its +- // uses (it may have uses that are not part of the pattern) with the +- // ultimate chain result of the generated code. We will also add its chain +- // inputs as inputs to the ultimate TokenFactor we create. +- Result = CR_LeadsToInteriorNode; +- if (!Visited) { +- ChainedNodesInPattern.push_back(User); +- InteriorChainedNodes.push_back(User); +- } +- } +- +- return Result; +-} +- + /// HandleMergeInputChains - This implements the OPC_EmitMergeInputChains + /// operation for when the pattern matched at least one node with a chains. The + /// input vector contains a list of all of the chained nodes that we match. We +@@ -2521,47 +2455,56 @@ WalkChainUsers(const SDNode *ChainedNode, + static SDValue + HandleMergeInputChains(SmallVectorImpl &ChainNodesMatched, + SelectionDAG *CurDAG) { +- // Used for memoization. Without it WalkChainUsers could take exponential +- // time to run. +- DenseMap TokenFactorResult; +- // Walk all of the chained nodes we've matched, recursively scanning down the +- // users of the chain result. This adds any TokenFactor nodes that are caught +- // in between chained nodes to the chained and interior nodes list. +- SmallVector InteriorChainedNodes; +- for (unsigned i = 0, e = ChainNodesMatched.size(); i != e; ++i) { +- if (WalkChainUsers(ChainNodesMatched[i], ChainNodesMatched, +- TokenFactorResult, +- InteriorChainedNodes) == CR_InducesCycle) +- return SDValue(); // Would induce a cycle. +- } + +- // Okay, we have walked all the matched nodes and collected TokenFactor nodes +- // that we are interested in. Form our input TokenFactor node. ++ SmallPtrSet Visited; ++ SmallVector Worklist; + SmallVector InputChains; +- for (unsigned i = 0, e = ChainNodesMatched.size(); i != e; ++i) { +- // Add the input chain of this node to the InputChains list (which will be +- // the operands of the generated TokenFactor) if it's not an interior node. +- SDNode *N = ChainNodesMatched[i]; +- if (N->getOpcode() != ISD::TokenFactor) { +- if (std::count(InteriorChainedNodes.begin(),InteriorChainedNodes.end(),N)) +- continue; ++ unsigned int Max = 8192; + +- // Otherwise, add the input chain. +- SDValue InChain = ChainNodesMatched[i]->getOperand(0); +- assert(InChain.getValueType() == MVT::Other && "Not a chain"); +- InputChains.push_back(InChain); +- continue; +- } ++ // Quick exit on trivial merge. ++ if (ChainNodesMatched.size() == 1) ++ return ChainNodesMatched[0]->getOperand(0); + +- // If we have a token factor, we want to add all inputs of the token factor +- // that are not part of the pattern we're matching. +- for (const SDValue &Op : N->op_values()) { +- if (!std::count(ChainNodesMatched.begin(), ChainNodesMatched.end(), +- Op.getNode())) +- InputChains.push_back(Op); +- } ++ // Add chains that aren't already added (internal). Peek through ++ // token factors. ++ std::function AddChains = [&](const SDValue V) { ++ if (V.getValueType() != MVT::Other) ++ return; ++ if (V->getOpcode() == ISD::EntryToken) ++ return; ++ if (!Visited.insert(V.getNode()).second) ++ return; ++ if (V->getOpcode() == ISD::TokenFactor) { ++ for (const SDValue &Op : V->op_values()) ++ AddChains(Op); ++ } else ++ InputChains.push_back(V); ++ }; ++ ++ for (auto *N : ChainNodesMatched) { ++ Worklist.push_back(N); ++ Visited.insert(N); + } + ++ while (!Worklist.empty()) ++ AddChains(Worklist.pop_back_val()->getOperand(0)); ++ ++ // Skip the search if there are no chain dependencies. ++ if (InputChains.size() == 0) ++ return CurDAG->getEntryNode(); ++ ++ // If one of these chains is a successor of input, we must have a ++ // node that is both the predecessor and successor of the ++ // to-be-merged nodes. Fail. ++ Visited.clear(); ++ for (SDValue V : InputChains) ++ Worklist.push_back(V.getNode()); ++ ++ for (auto *N : ChainNodesMatched) ++ if (SDNode::hasPredecessorHelper(N, Visited, Worklist, Max, true)) ++ return SDValue(); ++ ++ // Return merged chain. + if (InputChains.size() == 1) + return InputChains[0]; + return CurDAG->getNode(ISD::TokenFactor, SDLoc(ChainNodesMatched[0]), +@@ -2606,8 +2549,8 @@ MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTList, + // Move the glue if needed. + if ((EmitNodeInfo & OPFL_GlueOutput) && OldGlueResultNo != -1 && + (unsigned)OldGlueResultNo != ResNumResults-1) +- CurDAG->ReplaceAllUsesOfValueWith(SDValue(Node, OldGlueResultNo), +- SDValue(Res, ResNumResults-1)); ++ ReplaceUses(SDValue(Node, OldGlueResultNo), ++ SDValue(Res, ResNumResults - 1)); + + if ((EmitNodeInfo & OPFL_GlueOutput) != 0) + --ResNumResults; +@@ -2615,14 +2558,15 @@ MorphNode(SDNode *Node, unsigned TargetOpc, SDVTList VTList, + // Move the chain reference if needed. + if ((EmitNodeInfo & OPFL_Chain) && OldChainResultNo != -1 && + (unsigned)OldChainResultNo != ResNumResults-1) +- CurDAG->ReplaceAllUsesOfValueWith(SDValue(Node, OldChainResultNo), +- SDValue(Res, ResNumResults-1)); ++ ReplaceUses(SDValue(Node, OldChainResultNo), ++ SDValue(Res, ResNumResults - 1)); + + // Otherwise, no replacement happened because the node already exists. Replace + // Uses of the old node with the new one. + if (Res != Node) { +- CurDAG->ReplaceAllUsesWith(Node, Res); +- CurDAG->RemoveDeadNode(Node); ++ ReplaceNode(Node, Res); ++ } else { ++ EnforceNodeIdInvariant(Res); + } + + return Res; +@@ -2939,8 +2883,7 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch, + return; + case ISD::AssertSext: + case ISD::AssertZext: +- CurDAG->ReplaceAllUsesOfValueWith(SDValue(NodeToMatch, 0), +- NodeToMatch->getOperand(0)); ++ ReplaceUses(SDValue(NodeToMatch, 0), NodeToMatch->getOperand(0)); + CurDAG->RemoveDeadNode(NodeToMatch); + return; + case ISD::INLINEASM: +@@ -3702,7 +3645,7 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch, + NodeToMatch->getValueType(i).getSizeInBits() == + Res.getValueSizeInBits()) && + "invalid replacement"); +- CurDAG->ReplaceAllUsesOfValueWith(SDValue(NodeToMatch, i), Res); ++ ReplaceUses(SDValue(NodeToMatch, i), Res); + } + + // Update chain uses. +@@ -3715,8 +3658,8 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch, + if (NodeToMatch->getValueType(NodeToMatch->getNumValues() - 1) == + MVT::Glue && + InputGlue.getNode()) +- CurDAG->ReplaceAllUsesOfValueWith( +- SDValue(NodeToMatch, NodeToMatch->getNumValues() - 1), InputGlue); ++ ReplaceUses(SDValue(NodeToMatch, NodeToMatch->getNumValues() - 1), ++ InputGlue); + + assert(NodeToMatch->use_empty() && + "Didn't replace all uses of the node?"); +diff --git a/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +index f4776adb069..be5345e422d 100644 +--- a/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp ++++ b/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +@@ -759,12 +759,11 @@ void AMDGPUDAGToDAGISel::SelectADD_SUB_I64(SDNode *N) { + + if (ProduceCarry) { + // Replace the carry-use +- CurDAG->ReplaceAllUsesOfValueWith(SDValue(N, 1), SDValue(AddHi, 1)); ++ ReplaceUses(SDValue(N, 1), SDValue(AddHi, 1)); + } + + // Replace the remaining uses. +- CurDAG->ReplaceAllUsesWith(N, RegSequence); +- CurDAG->RemoveDeadNode(N); ++ ReplaceNode(N, RegSequence); + } + + void AMDGPUDAGToDAGISel::SelectUADDO_USUBO(SDNode *N) { +diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp +index 8d32510e200..0f504718f28 100644 +--- a/lib/Target/ARM/ARMISelDAGToDAG.cpp ++++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp +@@ -498,7 +498,7 @@ bool ARMDAGToDAGISel::canExtractShiftFromMul(const SDValue &N, + + void ARMDAGToDAGISel::replaceDAGValue(const SDValue &N, SDValue M) { + CurDAG->RepositionNode(N.getNode()->getIterator(), M.getNode()); +- CurDAG->ReplaceAllUsesWith(N, M); ++ ReplaceUses(N, M); + } + + bool ARMDAGToDAGISel::SelectImmShifterOperand(SDValue N, +diff --git a/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp +index a6ac4e3df74..3721856ff45 100644 +--- a/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp ++++ b/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp +@@ -777,7 +777,7 @@ void HexagonDAGToDAGISel::SelectBitcast(SDNode *N) { + return; + } + +- CurDAG->ReplaceAllUsesOfValueWith(SDValue(N,0), N->getOperand(0)); ++ ReplaceUses(SDValue(N, 0), N->getOperand(0)); + CurDAG->RemoveDeadNode(N); + } + +@@ -2182,4 +2182,3 @@ void HexagonDAGToDAGISel::rebalanceAddressTrees() { + RootHeights.clear(); + RootWeights.clear(); + } +- +diff --git a/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp b/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp +index f08c5054065..0608f06ef7e 100644 +--- a/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp ++++ b/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp +@@ -1914,7 +1914,6 @@ void HvxSelector::selectShuffle(SDNode *N) { + // If the mask is all -1's, generate "undef". + if (!UseLeft && !UseRight) { + ISel.ReplaceNode(N, ISel.selectUndef(SDLoc(SN), ResTy).getNode()); +- DAG.RemoveDeadNode(N); + return; + } + +@@ -1970,7 +1969,6 @@ void HvxSelector::selectRor(SDNode *N) { + NewN = DAG.getMachineNode(Hexagon::V6_vror, dl, Ty, {VecV, RotV}); + + ISel.ReplaceNode(N, NewN); +- DAG.RemoveDeadNode(N); + } + + void HexagonDAGToDAGISel::SelectHvxShuffle(SDNode *N) { +@@ -2017,8 +2015,7 @@ void HexagonDAGToDAGISel::SelectV65GatherPred(SDNode *N) { + MemOp[0] = cast(N)->getMemOperand(); + cast(Result)->setMemRefs(MemOp, MemOp + 1); + +- ReplaceUses(N, Result); +- CurDAG->RemoveDeadNode(N); ++ ReplaceNode(N, Result); + } + + void HexagonDAGToDAGISel::SelectV65Gather(SDNode *N) { +@@ -2056,8 +2053,7 @@ void HexagonDAGToDAGISel::SelectV65Gather(SDNode *N) { + MemOp[0] = cast(N)->getMemOperand(); + cast(Result)->setMemRefs(MemOp, MemOp + 1); + +- ReplaceUses(N, Result); +- CurDAG->RemoveDeadNode(N); ++ ReplaceNode(N, Result); + } + + void HexagonDAGToDAGISel::SelectHVXDualOutput(SDNode *N) { +@@ -2100,5 +2096,3 @@ void HexagonDAGToDAGISel::SelectHVXDualOutput(SDNode *N) { + ReplaceUses(SDValue(N, 1), SDValue(Result, 1)); + CurDAG->RemoveDeadNode(N); + } +- +- +diff --git a/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp b/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp +index ce6f3d37f5c..fe59d820c88 100644 +--- a/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp ++++ b/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp +@@ -589,10 +589,16 @@ bool SystemZDAGToDAGISel::selectAddress(SDValue Addr, + // The selection DAG must no longer depend on their uniqueness when this + // function is used. + static void insertDAGNode(SelectionDAG *DAG, SDNode *Pos, SDValue N) { +- if (N.getNode()->getNodeId() == -1 || +- N.getNode()->getNodeId() > Pos->getNodeId()) { ++ if (N->getNodeId() == -1 || ++ (SelectionDAGISel::getUninvalidatedNodeId(N.getNode()) > ++ SelectionDAGISel::getUninvalidatedNodeId(Pos))) { + DAG->RepositionNode(Pos->getIterator(), N.getNode()); +- N.getNode()->setNodeId(Pos->getNodeId()); ++ // Mark Node as invalid for pruning as after this it may be a successor to a ++ // selected node but otherwise be in the same position of Pos. ++ // Conservatively mark it with the same -abs(Id) to assure node id ++ // invariant is preserved. ++ N->setNodeId(Pos->getNodeId()); ++ SelectionDAGISel::InvalidateNodeId(N.getNode()); + } + } + +@@ -1022,8 +1028,7 @@ bool SystemZDAGToDAGISel::tryRISBGZero(SDNode *N) { + }; + SDValue New = convertTo( + DL, VT, SDValue(CurDAG->getMachineNode(Opcode, DL, OpcodeVT, Ops), 0)); +- ReplaceUses(N, New.getNode()); +- CurDAG->RemoveDeadNode(N); ++ ReplaceNode(N, New.getNode()); + return true; + } + +@@ -1114,8 +1119,7 @@ void SystemZDAGToDAGISel::splitLargeImmediate(unsigned Opcode, SDNode *Node, + SDValue Lower = CurDAG->getConstant(LowerVal, DL, VT); + SDValue Or = CurDAG->getNode(Opcode, DL, VT, Upper, Lower); + +- ReplaceUses(Node, Or.getNode()); +- CurDAG->RemoveDeadNode(Node); ++ ReplaceNode(Node, Or.getNode()); + + SelectCode(Or.getNode()); + } +diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp +index d79fd0ca4da..ee2d221e31c 100644 +--- a/lib/Target/X86/X86ISelDAGToDAG.cpp ++++ b/lib/Target/X86/X86ISelDAGToDAG.cpp +@@ -988,10 +988,16 @@ bool X86DAGToDAGISel::matchAdd(SDValue N, X86ISelAddressMode &AM, + // IDs! The selection DAG must no longer depend on their uniqueness when this + // is used. + static void insertDAGNode(SelectionDAG &DAG, SDValue Pos, SDValue N) { +- if (N.getNode()->getNodeId() == -1 || +- N.getNode()->getNodeId() > Pos.getNode()->getNodeId()) { +- DAG.RepositionNode(Pos.getNode()->getIterator(), N.getNode()); +- N.getNode()->setNodeId(Pos.getNode()->getNodeId()); ++ if (N->getNodeId() == -1 || ++ (SelectionDAGISel::getUninvalidatedNodeId(N.getNode()) > ++ SelectionDAGISel::getUninvalidatedNodeId(Pos.getNode()))) { ++ DAG.RepositionNode(Pos->getIterator(), N.getNode()); ++ // Mark Node as invalid for pruning as after this it may be a successor to a ++ // selected node but otherwise be in the same position of Pos. ++ // Conservatively mark it with the same -abs(Id) to assure node id ++ // invariant is preserved. ++ N->setNodeId(Pos->getNodeId()); ++ SelectionDAGISel::InvalidateNodeId(N.getNode()); + } + } + +@@ -2092,50 +2098,84 @@ static bool isFusableLoadOpStorePattern(StoreSDNode *StoreNode, + LoadNode->getOffset() != StoreNode->getOffset()) + return false; + +- // Check if the chain is produced by the load or is a TokenFactor with +- // the load output chain as an operand. Return InputChain by reference. ++ bool FoundLoad = false; ++ SmallVector ChainOps; ++ SmallVector LoopWorklist; ++ SmallPtrSet Visited; ++ const unsigned int Max = 1024; ++ ++ // Visualization of Load-Op-Store fusion: ++ // ------------------------- ++ // Legend: ++ // *-lines = Chain operand dependencies. ++ // |-lines = Normal operand dependencies. ++ // Dependencies flow down and right. n-suffix references multiple nodes. ++ // ++ // C Xn C ++ // * * * ++ // * * * ++ // Xn A-LD Yn TF Yn ++ // * * \ | * | ++ // * * \ | * | ++ // * * \ | => A--LD_OP_ST ++ // * * \| \ ++ // TF OP \ ++ // * | \ Zn ++ // * | \ ++ // A-ST Zn ++ // ++ ++ // This merge induced dependences from: #1: Xn -> LD, OP, Zn ++ // #2: Yn -> LD ++ // #3: ST -> Zn ++ ++ // Ensure the transform is safe by checking for the dual ++ // dependencies to make sure we do not induce a loop. ++ ++ // As LD is a predecessor to both OP and ST we can do this by checking: ++ // a). if LD is a predecessor to a member of Xn or Yn. ++ // b). if a Zn is a predecessor to ST. ++ ++ // However, (b) can only occur through being a chain predecessor to ++ // ST, which is the same as Zn being a member or predecessor of Xn, ++ // which is a subset of LD being a predecessor of Xn. So it's ++ // subsumed by check (a). ++ + SDValue Chain = StoreNode->getChain(); + +- bool ChainCheck = false; ++ // Gather X elements in ChainOps. + if (Chain == Load.getValue(1)) { +- ChainCheck = true; +- InputChain = LoadNode->getChain(); ++ FoundLoad = true; ++ ChainOps.push_back(Load.getOperand(0)); + } else if (Chain.getOpcode() == ISD::TokenFactor) { +- SmallVector ChainOps; + for (unsigned i = 0, e = Chain.getNumOperands(); i != e; ++i) { + SDValue Op = Chain.getOperand(i); + if (Op == Load.getValue(1)) { +- ChainCheck = true; ++ FoundLoad = true; + // Drop Load, but keep its chain. No cycle check necessary. + ChainOps.push_back(Load.getOperand(0)); + continue; + } +- +- // Make sure using Op as part of the chain would not cause a cycle here. +- // In theory, we could check whether the chain node is a predecessor of +- // the load. But that can be very expensive. Instead visit the uses and +- // make sure they all have smaller node id than the load. +- int LoadId = LoadNode->getNodeId(); +- for (SDNode::use_iterator UI = Op.getNode()->use_begin(), +- UE = UI->use_end(); UI != UE; ++UI) { +- if (UI.getUse().getResNo() != 0) +- continue; +- if (UI->getNodeId() > LoadId) +- return false; +- } +- ++ LoopWorklist.push_back(Op.getNode()); + ChainOps.push_back(Op); + } +- +- if (ChainCheck) +- // Make a new TokenFactor with all the other input chains except +- // for the load. +- InputChain = CurDAG->getNode(ISD::TokenFactor, SDLoc(Chain), +- MVT::Other, ChainOps); + } +- if (!ChainCheck) ++ ++ if (!FoundLoad) ++ return false; ++ ++ // Worklist is currently Xn. Add Yn to worklist. ++ for (SDValue Op : StoredVal->ops()) ++ if (Op.getNode() != LoadNode) ++ LoopWorklist.push_back(Op.getNode()); ++ ++ // Check (a) if Load is a predecessor to Xn + Yn ++ if (SDNode::hasPredecessorHelper(Load.getNode(), Visited, LoopWorklist, Max, ++ true)) + return false; + ++ InputChain = ++ CurDAG->getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ChainOps); + return true; + } + +@@ -2335,6 +2375,8 @@ bool X86DAGToDAGISel::foldLoadStoreIntoMemOperand(SDNode *Node) { + MemOp[1] = LoadNode->getMemOperand(); + Result->setMemRefs(MemOp, MemOp + 2); + ++ // Update Load Chain uses as well. ++ ReplaceUses(SDValue(LoadNode, 1), SDValue(Result, 1)); + ReplaceUses(SDValue(StoreNode, 0), SDValue(Result, 1)); + ReplaceUses(SDValue(StoredVal.getNode(), 1), SDValue(Result, 0)); + CurDAG->RemoveDeadNode(Node); +@@ -2946,12 +2988,7 @@ void X86DAGToDAGISel::Select(SDNode *Node) { + return; + } + +- case X86ISD::CMP: +- case X86ISD::SUB: { +- // Sometimes a SUB is used to perform comparison. +- if (Opcode == X86ISD::SUB && Node->hasAnyUseOfValue(0)) +- // This node is not a CMP. +- break; ++ case X86ISD::CMP: { + SDValue N0 = Node->getOperand(0); + SDValue N1 = Node->getOperand(1); + +@@ -2971,95 +3008,52 @@ void X86DAGToDAGISel::Select(SDNode *Node) { + if (!C) break; + uint64_t Mask = C->getZExtValue(); + +- // For example, convert "testl %eax, $8" to "testb %al, $8" ++ MVT VT; ++ int SubRegOp; ++ unsigned Op; ++ + if (isUInt<8>(Mask) && + (!(Mask & 0x80) || hasNoSignedComparisonUses(Node))) { +- SDValue Imm = CurDAG->getTargetConstant(Mask, dl, MVT::i8); +- SDValue Reg = N0.getOperand(0); +- +- // Extract the l-register. +- SDValue Subreg = CurDAG->getTargetExtractSubreg(X86::sub_8bit, dl, +- MVT::i8, Reg); +- +- // Emit a testb. +- SDNode *NewNode = CurDAG->getMachineNode(X86::TEST8ri, dl, MVT::i32, +- Subreg, Imm); +- // Replace SUB|CMP with TEST, since SUB has two outputs while TEST has +- // one, do not call ReplaceAllUsesWith. +- ReplaceUses(SDValue(Node, (Opcode == X86ISD::SUB ? 1 : 0)), +- SDValue(NewNode, 0)); +- CurDAG->RemoveDeadNode(Node); +- return; ++ // For example, convert "testl %eax, $8" to "testb %al, $8" ++ VT = MVT::i8; ++ SubRegOp = X86::sub_8bit; ++ Op = X86::TEST8ri; ++ } else if (OptForMinSize && isUInt<16>(Mask) && ++ (!(Mask & 0x8000) || hasNoSignedComparisonUses(Node))) { ++ // For example, "testl %eax, $32776" to "testw %ax, $32776". ++ // NOTE: We only want to form TESTW instructions if optimizing for ++ // min size. Otherwise we only save one byte and possibly get a length ++ // changing prefix penalty in the decoders. ++ VT = MVT::i16; ++ SubRegOp = X86::sub_16bit; ++ Op = X86::TEST16ri; ++ } else if (isUInt<32>(Mask) && N0.getValueType() != MVT::i16 && ++ (!(Mask & 0x80000000) || hasNoSignedComparisonUses(Node))) { ++ // For example, "testq %rax, $268468232" to "testl %eax, $268468232". ++ // NOTE: We only want to run that transform if N0 is 32 or 64 bits. ++ // Otherwize, we find ourselves in a position where we have to do ++ // promotion. If previous passes did not promote the and, we assume ++ // they had a good reason not to and do not promote here. ++ VT = MVT::i32; ++ SubRegOp = X86::sub_32bit; ++ Op = X86::TEST32ri; ++ } else { ++ // No eligible transformation was found. ++ break; + } + +- // For example, "testl %eax, $2048" to "testb %ah, $8". +- if (isShiftedUInt<8, 8>(Mask) && +- (!(Mask & 0x8000) || hasNoSignedComparisonUses(Node))) { +- // Shift the immediate right by 8 bits. +- SDValue ShiftedImm = CurDAG->getTargetConstant(Mask >> 8, dl, MVT::i8); +- SDValue Reg = N0.getOperand(0); +- +- // Extract the h-register. +- SDValue Subreg = CurDAG->getTargetExtractSubreg(X86::sub_8bit_hi, dl, +- MVT::i8, Reg); +- +- // Emit a testb. The EXTRACT_SUBREG becomes a COPY that can only +- // target GR8_NOREX registers, so make sure the register class is +- // forced. +- SDNode *NewNode = CurDAG->getMachineNode(X86::TEST8ri_NOREX, dl, +- MVT::i32, Subreg, ShiftedImm); +- // Replace SUB|CMP with TEST, since SUB has two outputs while TEST has +- // one, do not call ReplaceAllUsesWith. +- ReplaceUses(SDValue(Node, (Opcode == X86ISD::SUB ? 1 : 0)), +- SDValue(NewNode, 0)); +- CurDAG->RemoveDeadNode(Node); +- return; +- } ++ SDValue Imm = CurDAG->getTargetConstant(Mask, dl, VT); ++ SDValue Reg = N0.getOperand(0); + +- // For example, "testl %eax, $32776" to "testw %ax, $32776". +- // NOTE: We only want to form TESTW instructions if optimizing for +- // min size. Otherwise we only save one byte and possibly get a length +- // changing prefix penalty in the decoders. +- if (OptForMinSize && isUInt<16>(Mask) && N0.getValueType() != MVT::i16 && +- (!(Mask & 0x8000) || hasNoSignedComparisonUses(Node))) { +- SDValue Imm = CurDAG->getTargetConstant(Mask, dl, MVT::i16); +- SDValue Reg = N0.getOperand(0); +- +- // Extract the 16-bit subregister. +- SDValue Subreg = CurDAG->getTargetExtractSubreg(X86::sub_16bit, dl, +- MVT::i16, Reg); +- +- // Emit a testw. +- SDNode *NewNode = CurDAG->getMachineNode(X86::TEST16ri, dl, MVT::i32, +- Subreg, Imm); +- // Replace SUB|CMP with TEST, since SUB has two outputs while TEST has +- // one, do not call ReplaceAllUsesWith. +- ReplaceUses(SDValue(Node, (Opcode == X86ISD::SUB ? 1 : 0)), +- SDValue(NewNode, 0)); +- CurDAG->RemoveDeadNode(Node); +- return; +- } ++ // Extract the subregister if necessary. ++ if (N0.getValueType() != VT) ++ Reg = CurDAG->getTargetExtractSubreg(SubRegOp, dl, VT, Reg); + +- // For example, "testq %rax, $268468232" to "testl %eax, $268468232". +- if (isUInt<32>(Mask) && N0.getValueType() == MVT::i64 && +- (!(Mask & 0x80000000) || hasNoSignedComparisonUses(Node))) { +- SDValue Imm = CurDAG->getTargetConstant(Mask, dl, MVT::i32); +- SDValue Reg = N0.getOperand(0); +- +- // Extract the 32-bit subregister. +- SDValue Subreg = CurDAG->getTargetExtractSubreg(X86::sub_32bit, dl, +- MVT::i32, Reg); +- +- // Emit a testl. +- SDNode *NewNode = CurDAG->getMachineNode(X86::TEST32ri, dl, MVT::i32, +- Subreg, Imm); +- // Replace SUB|CMP with TEST, since SUB has two outputs while TEST has +- // one, do not call ReplaceAllUsesWith. +- ReplaceUses(SDValue(Node, (Opcode == X86ISD::SUB ? 1 : 0)), +- SDValue(NewNode, 0)); +- CurDAG->RemoveDeadNode(Node); +- return; +- } ++ // Emit a testl or testw. ++ SDNode *NewNode = CurDAG->getMachineNode(Op, dl, MVT::i32, Reg, Imm); ++ // Replace CMP with TEST. ++ ReplaceNode(Node, NewNode); ++ return; + } + break; + } +diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp +index c1ddb771e2f..86e71cba87b 100644 +--- a/lib/Target/X86/X86ISelLowering.cpp ++++ b/lib/Target/X86/X86ISelLowering.cpp +@@ -8131,6 +8131,32 @@ X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const { + return LD; + } + ++ // If this is a splat of pairs of 32-bit elements, we can use a narrower ++ // build_vector and broadcast it. ++ // TODO: We could probably generalize this more. ++ if (Subtarget.hasAVX2() && EVTBits == 32 && Values.size() == 2) { ++ SDValue Ops[4] = { Op.getOperand(0), Op.getOperand(1), ++ DAG.getUNDEF(ExtVT), DAG.getUNDEF(ExtVT) }; ++ auto CanSplat = [](SDValue Op, unsigned NumElems, ArrayRef Ops) { ++ // Make sure all the even/odd operands match. ++ for (unsigned i = 2; i != NumElems; ++i) ++ if (Ops[i % 2] != Op.getOperand(i)) ++ return false; ++ return true; ++ }; ++ if (CanSplat(Op, NumElems, Ops)) { ++ MVT WideEltVT = VT.isFloatingPoint() ? MVT::f64 : MVT::i64; ++ MVT NarrowVT = MVT::getVectorVT(ExtVT, 4); ++ // Create a new build vector and cast to v2i64/v2f64. ++ SDValue NewBV = DAG.getBitcast(MVT::getVectorVT(WideEltVT, 2), ++ DAG.getBuildVector(NarrowVT, dl, Ops)); ++ // Broadcast from v2i64/v2f64 and cast to final VT. ++ MVT BcastVT = MVT::getVectorVT(WideEltVT, NumElems/2); ++ return DAG.getBitcast(VT, DAG.getNode(X86ISD::VBROADCAST, dl, BcastVT, ++ NewBV)); ++ } ++ } ++ + // For AVX-length vectors, build the individual 128-bit pieces and use + // shuffles to put them in place. + if (VT.is256BitVector() || VT.is512BitVector()) { +diff --git a/lib/Target/X86/X86InstrArithmetic.td b/lib/Target/X86/X86InstrArithmetic.td +index 98cc8fb7439..3d5de637da2 100644 +--- a/lib/Target/X86/X86InstrArithmetic.td ++++ b/lib/Target/X86/X86InstrArithmetic.td +@@ -1257,14 +1257,6 @@ let isCompare = 1 in { + def TEST32mi : BinOpMI_F<0xF6, "test", Xi32, X86testpat, MRM0m>; + let Predicates = [In64BitMode] in + def TEST64mi32 : BinOpMI_F<0xF6, "test", Xi64, X86testpat, MRM0m>; +- +- // When testing the result of EXTRACT_SUBREG sub_8bit_hi, make sure the +- // register class is constrained to GR8_NOREX. This pseudo is explicitly +- // marked side-effect free, since it doesn't have an isel pattern like +- // other test instructions. +- let isPseudo = 1, hasSideEffects = 0 in +- def TEST8ri_NOREX : I<0, Pseudo, (outs), (ins GR8_NOREX:$src, i8imm:$mask), +- "", [], IIC_BIN_NONMEM>, Sched<[WriteALU]>; + } // Defs = [EFLAGS] + + def TEST8i8 : BinOpAI_F<0xA8, "test", Xi8 , AL, +diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp +index 11ada51a870..84a9200a0ef 100644 +--- a/lib/Target/X86/X86InstrInfo.cpp ++++ b/lib/Target/X86/X86InstrInfo.cpp +@@ -7854,9 +7854,6 @@ bool X86InstrInfo::expandPostRAPseudo(MachineInstr &MI) const { + case X86::VMOVUPSZ256mr_NOVLX: + return expandNOVLXStore(MIB, &getRegisterInfo(), get(X86::VMOVUPSYmr), + get(X86::VEXTRACTF64x4Zmr), X86::sub_ymm); +- case X86::TEST8ri_NOREX: +- MI.setDesc(get(X86::TEST8ri)); +- return true; + case X86::MOV32ri64: + MI.setDesc(get(X86::MOV32ri)); + return true; +diff --git a/lib/Target/X86/X86MacroFusion.cpp b/lib/Target/X86/X86MacroFusion.cpp +index 67d95c2233d..4e11397dec4 100644 +--- a/lib/Target/X86/X86MacroFusion.cpp ++++ b/lib/Target/X86/X86MacroFusion.cpp +@@ -86,7 +86,6 @@ static bool shouldScheduleAdjacent(const TargetInstrInfo &TII, + case X86::TEST16mr: + case X86::TEST32mr: + case X86::TEST64mr: +- case X86::TEST8ri_NOREX: + case X86::AND16i16: + case X86::AND16ri: + case X86::AND16ri8: +diff --git a/test/CodeGen/SystemZ/pr36164.ll b/test/CodeGen/SystemZ/pr36164.ll +new file mode 100644 +index 00000000000..0c850091d31 +--- /dev/null ++++ b/test/CodeGen/SystemZ/pr36164.ll +@@ -0,0 +1,113 @@ ++; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ++; RUN: llc %s -o - -mtriple=s390x-linux-gnu -mcpu=z13 -disable-basicaa | FileCheck %s ++ ++; This test checks that we do not a reference to a deleted node. ++ ++%0 = type { i32 } ++ ++@g_11 = external dso_local unnamed_addr global i1, align 4 ++@g_69 = external dso_local global i32, align 4 ++@g_73 = external dso_local unnamed_addr global i32, align 4 ++@g_832 = external dso_local constant %0, align 4 ++@g_938 = external dso_local unnamed_addr global i64, align 8 ++ ++; Function Attrs: nounwind ++define void @main() local_unnamed_addr #0 { ++; CHECK-LABEL: main: ++; CHECK: # %bb.0: ++; CHECK-NEXT: stmg %r12, %r15, 96(%r15) ++; CHECK-NEXT: .cfi_offset %r12, -64 ++; CHECK-NEXT: .cfi_offset %r13, -56 ++; CHECK-NEXT: .cfi_offset %r14, -48 ++; CHECK-NEXT: .cfi_offset %r15, -40 ++; CHECK-NEXT: lhi %r0, 1 ++; CHECK-NEXT: larl %r1, g_938 ++; CHECK-NEXT: lhi %r2, 2 ++; CHECK-NEXT: lhi %r3, 3 ++; CHECK-NEXT: lhi %r4, 0 ++; CHECK-NEXT: lhi %r5, 4 ++; CHECK-NEXT: larl %r14, g_11 ++; CHECK-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 ++; CHECK-NEXT: strl %r0, g_73 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: strl %r0, g_69 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: lghi %r13, 24 ++; CHECK-NEXT: strl %r2, g_69 ++; CHECK-NEXT: ag %r13, 0(%r1) ++; CHECK-NEXT: lrl %r12, g_832 ++; CHECK-NEXT: strl %r3, g_69 ++; CHECK-NEXT: lrl %r12, g_832 ++; CHECK-NEXT: strl %r4, g_69 ++; CHECK-NEXT: lrl %r12, g_832 ++; CHECK-NEXT: strl %r0, g_69 ++; CHECK-NEXT: lrl %r12, g_832 ++; CHECK-NEXT: strl %r2, g_69 ++; CHECK-NEXT: lrl %r12, g_832 ++; CHECK-NEXT: strl %r3, g_69 ++; CHECK-NEXT: stgrl %r13, g_938 ++; CHECK-NEXT: lrl %r13, g_832 ++; CHECK-NEXT: strl %r5, g_69 ++; CHECK-NEXT: mvi 0(%r14), 1 ++; CHECK-NEXT: j .LBB0_1 ++ br label %1 ++ ++;