Import llvm-toolchain-6.0_6.0.1-9.debian.tar.xz
authorJohn Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Fri, 14 Sep 2018 07:24:02 +0000 (08:24 +0100)
committerJohn Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Fri, 14 Sep 2018 07:24:02 +0000 (08:24 +0100)
[dgit import tarball llvm-toolchain-6.0 1:6.0.1-9 llvm-toolchain-6.0_6.0.1-9.debian.tar.xz]

158 files changed:
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
README.source [new file with mode: 0644]
TODO [new file with mode: 0644]
changelog [new file with mode: 0644]
clang-X.Y-doc.docs.in [new file with mode: 0644]
clang-X.Y-examples.examples.in [new file with mode: 0644]
clang-X.Y.install.in [new file with mode: 0644]
clang-X.Y.links.in [new file with mode: 0644]
clang-X.Y.lintian-overrides.in [new file with mode: 0644]
clang-X.Y.manpages.in [new file with mode: 0644]
clang-format-X.Y.install.in [new file with mode: 0644]
clang-format-X.Y.lintian-overrides.in [new file with mode: 0644]
clang-format-X.Y.manpages.in [new file with mode: 0644]
clang-tidy-X.Y.install.in [new file with mode: 0644]
clang-tidy-X.Y.links.in [new file with mode: 0644]
clang-tidy-X.Y.lintian-overrides.in [new file with mode: 0644]
clang-tidy-X.Y.manpages.in [new file with mode: 0644]
clang-tools-X.Y.install.in [new file with mode: 0644]
clang-tools-X.Y.links.in [new file with mode: 0644]
clang-tools-X.Y.lintian-overrides.in [new file with mode: 0644]
clang-tools-X.Y.manpages.in [new file with mode: 0644]
compat [new file with mode: 0644]
control [new file with mode: 0644]
copyright [new file with mode: 0644]
debian_path.h [new file with mode: 0644]
libclang-X.Y-dev.install.in [new file with mode: 0644]
libclang-X.Y-dev.links.in [new file with mode: 0644]
libclang-common-X.Y-dev.install.in [new file with mode: 0644]
libclang-common-X.Y-dev.links.in [new file with mode: 0644]
libclang1-X.Y.install.in [new file with mode: 0644]
libclang1-X.Y.links.in [new file with mode: 0644]
libclang1-X.Y.lintian-overrides.in [new file with mode: 0644]
libclang1-X.Y.symbols.in [new file with mode: 0644]
liblld-X.Y-dev.install.in [new file with mode: 0644]
liblld-X.Y.install.in [new file with mode: 0644]
liblld-X.Y.links.in [new file with mode: 0644]
liblldb-X.Y-dev.install.in [new file with mode: 0644]
liblldb-X.Y-dev.links.in [new file with mode: 0644]
liblldb-X.Y.install.in [new file with mode: 0644]
liblldb-X.Y.links.in [new file with mode: 0644]
liblldb-X.Y.lintian-overrides.in [new file with mode: 0644]
libllvm-X.Y-ocaml-dev.META.in [new file with mode: 0644]
libllvm-X.Y-ocaml-dev.dirs.in [new file with mode: 0644]
libllvm-X.Y-ocaml-dev.install.in [new file with mode: 0644]
libllvm-X.Y-ocaml-dev.lintian-overrides.in [new file with mode: 0644]
libllvmX.Y.install.in [new file with mode: 0644]
libllvmX.Y.links.in [new file with mode: 0644]
libllvmX.Y.lintian-overrides.in [new file with mode: 0644]
lld-X.Y.install.in [new file with mode: 0644]
lld-X.Y.manpages.in [new file with mode: 0644]
lldb-X.Y.install.in [new file with mode: 0644]
lldb-X.Y.links.in [new file with mode: 0644]
lldb-X.Y.lintian-overrides.in [new file with mode: 0644]
lldb-X.Y.manpages.in [new file with mode: 0644]
lldb-X.Y.postinst.in [new file with mode: 0644]
llvm-X.Y-dev.dirs.in [new file with mode: 0644]
llvm-X.Y-dev.install.in [new file with mode: 0644]
llvm-X.Y-dev.links.in [new file with mode: 0644]
llvm-X.Y-doc.dirs.in [new file with mode: 0644]
llvm-X.Y-doc.install.in [new file with mode: 0644]
llvm-X.Y-examples.dirs.in [new file with mode: 0644]
llvm-X.Y-examples.examples.in [new file with mode: 0644]
llvm-X.Y-examples.links.in [new file with mode: 0644]
llvm-X.Y-runtime.binfmt.in [new file with mode: 0644]
llvm-X.Y-runtime.install.in [new file with mode: 0644]
llvm-X.Y-runtime.lintian-overrides.in [new file with mode: 0644]
llvm-X.Y-runtime.manpages.in [new file with mode: 0644]
llvm-X.Y-runtime.postinst.in [new file with mode: 0644]
llvm-X.Y-runtime.prerm.in [new file with mode: 0644]
llvm-X.Y-tools.dirs.in [new file with mode: 0644]
llvm-X.Y-tools.install.in [new file with mode: 0644]
llvm-X.Y.dirs.in [new file with mode: 0644]
llvm-X.Y.install.in [new file with mode: 0644]
llvm-X.Y.lintian-overrides.in [new file with mode: 0644]
llvm-X.Y.manpages.in [new file with mode: 0644]
llvm-priv-dev.dirs [new file with mode: 0644]
orig-tar.sh [new file with mode: 0755]
patches/0001-llvm-cmake-resolve-symlinks-in-LLVMConfig.cmake.patch [new file with mode: 0644]
patches/0001-tools-clang-cmake-resolve-symlinks-in-ClangConfig.cmake.patch [new file with mode: 0644]
patches/0003-Debian-version-info-and-bugreport.patch [new file with mode: 0644]
patches/0044-soname.diff [new file with mode: 0644]
patches/0048-Set-html_static_path-_static-everywhere.patch [new file with mode: 0644]
patches/0049-Use-Debian-provided-MathJax-everywhere.patch [new file with mode: 0644]
patches/19-clang_debian_version.patch [new file with mode: 0644]
patches/23-strlcpy_strlcat_warning_removed.diff [new file with mode: 0644]
patches/26-set-correct-float-abi.diff [new file with mode: 0644]
patches/27-fix_clang_stdint.diff [new file with mode: 0644]
patches/D40146-JumpThreading-backport-1.diff [new file with mode: 0644]
patches/D42717-JumpThreading-backport-2.diff [new file with mode: 0644]
patches/D51108-rust-powerpc.diff [new file with mode: 0644]
patches/D51335-alignment-issue.diff [new file with mode: 0644]
patches/D51639-optim-issue.diff [new file with mode: 0644]
patches/PowerPC-Make-AddrSpaceCast-noop.diff [new file with mode: 0644]
patches/atomic_library_1.diff [new file with mode: 0644]
patches/bug-30342.diff [new file with mode: 0644]
patches/clang-analyzer-force-version.diff [new file with mode: 0644]
patches/clang-fix-cmpxchg8-detection-on-i386.patch [new file with mode: 0644]
patches/clang-format-version.diff [new file with mode: 0644]
patches/clang-tidy-run-bin.diff [new file with mode: 0644]
patches/declare_clear_cache.diff [new file with mode: 0644]
patches/disable-display-PASS-UNSUPPORTED-XFAIL.diff [new file with mode: 0644]
patches/disable-error-xray.diff [new file with mode: 0644]
patches/disable-llvm-symbolizer-test.diff [new file with mode: 0644]
patches/disable-path-test-failing.diff [new file with mode: 0644]
patches/disable-source-interleave.diff [new file with mode: 0644]
patches/disable-sse2-old-x86.diff [new file with mode: 0644]
patches/do-not-fail-on-unexpected-pass.diff [new file with mode: 0644]
patches/fix-clang-path-and-build.diff [new file with mode: 0644]
patches/fix-lldb-server-build [new file with mode: 0644]
patches/fix-llvm-config-obj-src-root.patch [new file with mode: 0644]
patches/fix-scan-view-path.diff [new file with mode: 0644]
patches/force-gcc-header-obj.diff [new file with mode: 0644]
patches/hurd-EIEIO-undef.diff [new file with mode: 0644]
patches/hurd-pathmax.diff [new file with mode: 0644]
patches/install-lldb-sb-headers.patch [new file with mode: 0644]
patches/install-scan-build-py.diff [new file with mode: 0644]
patches/lldb-addversion-suffix-to-llvm-server-exec.patch [new file with mode: 0644]
patches/lldb-disable-swig-error.diff [new file with mode: 0644]
patches/lldb-libname.diff [new file with mode: 0644]
patches/lldb-link-atomic-cmake.patch [new file with mode: 0644]
patches/lldb-missing-install.diff [new file with mode: 0644]
patches/lldb-soname.diff [new file with mode: 0644]
patches/llvm-D49832-SCEVPred.patch [new file with mode: 0644]
patches/llvm-rL323946-LSRTy.patch [new file with mode: 0644]
patches/mips-fpxx-enable.diff [new file with mode: 0644]
patches/powerpcspe-add-missing-include-path.diff [new file with mode: 0644]
patches/pr38663-pgo-lto-crash.patch [new file with mode: 0644]
patches/python-clangpath.diff [new file with mode: 0644]
patches/rL338481-cherry-pick-really-subtle-miscompile.diff [new file with mode: 0644]
patches/remove-test-freezing.diff [new file with mode: 0644]
patches/scan-build-clang-path.diff [new file with mode: 0644]
patches/scan-view-fix-path.diff [new file with mode: 0644]
patches/series [new file with mode: 0644]
patches/silent-MCJIIT-tests.diff [new file with mode: 0644]
patches/silent-amd-tet.diff [new file with mode: 0644]
patches/silent-gold-test.diff [new file with mode: 0644]
patches/silent-gold-utils.diff [new file with mode: 0644]
patches/silent-llvm-isel-fuzzer.diff [new file with mode: 0644]
patches/silent-more-tests.diff [new file with mode: 0644]
patches/silent-test-failing-codeverage.diff [new file with mode: 0644]
patches/silent-test-macho.diff [new file with mode: 0644]
patches/sparc64-add-missing-tls-get-addr.diff [new file with mode: 0644]
patches/test-keep-alive.diff [new file with mode: 0644]
patches/ubuntu-cosmic-support.patch [new file with mode: 0644]
patches/unwind-chain-inclusion.diff [new file with mode: 0644]
pollycc.in [new file with mode: 0755]
prepare-new-release.sh [new file with mode: 0644]
python-clang-X.Y.install.in [new file with mode: 0644]
python-lldb-X.Y.install.in [new file with mode: 0644]
python-lldb-X.Y.links.in [new file with mode: 0644]
qualify-clang.sh [new file with mode: 0644]
rules [new file with mode: 0755]
source.lintian-overrides [new file with mode: 0644]
source/format [new file with mode: 0644]
tests.disabled/control [new file with mode: 0644]
tests.disabled/llvm [new file with mode: 0644]
watch [new file with mode: 0644]

diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..91160e6
--- /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 <sylvestre@debian.org>  Sat, 02 Aug 2014 12:57:41 +0200
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..3707a05
--- /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 (file)
index 0000000..deeb3f2
--- /dev/null
@@ -0,0 +1,5 @@
+
+Repack of the snapshot release are done with orig-tar.sh which will checkout the sources.
+
+ -- Sylvestre Ledru <sylvestre@debian.org>, Tue, 26 Feb 2013 14:57:56 +0100
+
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..0ce53db
--- /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 (file)
index 0000000..0e76b80
--- /dev/null
+++ b/changelog
@@ -0,0 +1,2008 @@
+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 <glaubitz@physik.fu-berlin.de>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <locutusofborg@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <locutusofborg@debian.org>  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 <locutusofborg@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <labath@google.com>.
+    (LP: #1761009) (Closes: #895051)
+
+ -- Sylvestre Ledru <sylvestre@debian.org>  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 <labath@google.com>.
+    (LP: #1761009) (Closes: #895051)
+
+ -- David Tenty <dtenty@ryerson.ca>  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 <sylvestre@debian.org>  Mon, 05 Mar 2018 09:58:10 +0100
+
+llvm-toolchain-6.0 (1:6.0-1) unstable; urgency=medium
+
+  * New upstream release
+
+ -- Sylvestre Ledru <sylvestre@debian.org>  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 <jrtc27@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <locutusofborg@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <prefix>/lib/cmake/llvm instead of
+    <prefix>/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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <locutusofborg@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <doko@ubuntu.com>  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 <doko@ubuntu.com>  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 <doko@ubuntu.com>  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 <doko@ubuntu.com>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 <sylvestre@debian.org>  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 (file)
index 0000000..b3cc6a0
--- /dev/null
@@ -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 (file)
index 0000000..49cbc5f
--- /dev/null
@@ -0,0 +1 @@
+clang/examples/*
diff --git a/clang-X.Y.install.in b/clang-X.Y.install.in
new file mode 100644 (file)
index 0000000..c92899f
--- /dev/null
@@ -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 (file)
index 0000000..4ba8a3b
--- /dev/null
@@ -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 (file)
index 0000000..a389e01
--- /dev/null
@@ -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 (file)
index 0000000..b19400a
--- /dev/null
@@ -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 (file)
index 0000000..d3a18a5
--- /dev/null
@@ -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 (file)
index 0000000..aa78679
--- /dev/null
@@ -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 (file)
index 0000000..db4dd8f
--- /dev/null
@@ -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 (file)
index 0000000..ef992c5
--- /dev/null
@@ -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 (file)
index 0000000..ad03ae1
--- /dev/null
@@ -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 (file)
index 0000000..c915da6
--- /dev/null
@@ -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 (file)
index 0000000..fa4a814
--- /dev/null
@@ -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 (file)
index 0000000..fed9263
--- /dev/null
@@ -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 (file)
index 0000000..985ab16
--- /dev/null
@@ -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 (file)
index 0000000..eb04eb7
--- /dev/null
@@ -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 (file)
index 0000000..5cb7dbd
--- /dev/null
@@ -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 (file)
index 0000000..ec63514
--- /dev/null
+++ b/compat
@@ -0,0 +1 @@
+9
diff --git a/control b/control
new file mode 100644 (file)
index 0000000..89350a7
--- /dev/null
+++ b/control
@@ -0,0 +1,475 @@
+Source: llvm-toolchain-6.0
+Section: devel
+Priority: optional
+Maintainer: LLVM Packaging Team <pkg-llvm-team@lists.alioth.debian.org>
+Uploaders: Sylvestre Ledru <sylvestre@debian.org>
+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}
+Multi-Arch: same
+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 (file)
index 0000000..ae2def3
--- /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 <solar at openwall.com>
+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 (file)
index 0000000..539636f
--- /dev/null
@@ -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 (file)
index 0000000..79d9db7
--- /dev/null
@@ -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 (file)
index 0000000..6f99d5b
--- /dev/null
@@ -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 (file)
index 0000000..17b2429
--- /dev/null
@@ -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 (file)
index 0000000..717c6b2
--- /dev/null
@@ -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 (file)
index 0000000..d44e84f
--- /dev/null
@@ -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 (file)
index 0000000..3ea44c8
--- /dev/null
@@ -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 (file)
index 0000000..9fc47a7
--- /dev/null
@@ -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 (file)
index 0000000..a50eb65
--- /dev/null
@@ -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 (file)
index 0000000..b1446f0
--- /dev/null
@@ -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 (file)
index 0000000..3d86306
--- /dev/null
@@ -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 (file)
index 0000000..5d16d10
--- /dev/null
@@ -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 (file)
index 0000000..d6dd2e1
--- /dev/null
@@ -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 (file)
index 0000000..3c6aef9
--- /dev/null
@@ -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 (file)
index 0000000..73f1b98
--- /dev/null
@@ -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 (file)
index 0000000..ae73a19
--- /dev/null
@@ -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 (file)
index 0000000..180aec3
--- /dev/null
@@ -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 (file)
index 0000000..366820d
--- /dev/null
@@ -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 (file)
index 0000000..6c9c736
--- /dev/null
@@ -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 (file)
index 0000000..4c68fb7
--- /dev/null
@@ -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 (file)
index 0000000..5d25d44
--- /dev/null
@@ -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 (file)
index 0000000..f8d968f
--- /dev/null
@@ -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 (file)
index 0000000..067b088
--- /dev/null
@@ -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 (file)
index 0000000..49f7ef2
--- /dev/null
@@ -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 (file)
index 0000000..4d392c9
--- /dev/null
@@ -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 (file)
index 0000000..51943dc
--- /dev/null
@@ -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 (file)
index 0000000..e6fe07e
--- /dev/null
@@ -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 (file)
index 0000000..d30a5f6
--- /dev/null
@@ -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 (file)
index 0000000..a456a34
--- /dev/null
@@ -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 (file)
index 0000000..36a62ae
--- /dev/null
@@ -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 (file)
index 0000000..a5a6071
--- /dev/null
@@ -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 (file)
index 0000000..3b3b586
--- /dev/null
@@ -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 (file)
index 0000000..13c9d4f
--- /dev/null
@@ -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 (file)
index 0000000..b3a2a2a
--- /dev/null
@@ -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 (file)
index 0000000..5379e8e
--- /dev/null
@@ -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 (file)
index 0000000..6ac115a
--- /dev/null
@@ -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 (file)
index 0000000..a8b75c6
--- /dev/null
@@ -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 (file)
index 0000000..e39721e
--- /dev/null
@@ -0,0 +1 @@
+examples/*
diff --git a/llvm-X.Y-examples.links.in b/llvm-X.Y-examples.links.in
new file mode 100644 (file)
index 0000000..a8d74aa
--- /dev/null
@@ -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 (file)
index 0000000..6bb1df7
--- /dev/null
@@ -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 (file)
index 0000000..d8e16a7
--- /dev/null
@@ -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 (file)
index 0000000..e94e713
--- /dev/null
@@ -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 (file)
index 0000000..839952d
--- /dev/null
@@ -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 (file)
index 0000000..987b3ea
--- /dev/null
@@ -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 (file)
index 0000000..3f16015
--- /dev/null
@@ -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 (file)
index 0000000..401df06
--- /dev/null
@@ -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 (file)
index 0000000..9fec1e2
--- /dev/null
@@ -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 (file)
index 0000000..56a9655
--- /dev/null
@@ -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 (file)
index 0000000..8893448
--- /dev/null
@@ -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 (file)
index 0000000..35c8694
--- /dev/null
@@ -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 (file)
index 0000000..98f095f
--- /dev/null
@@ -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 (file)
index 0000000..dab8663
--- /dev/null
@@ -0,0 +1 @@
+/usr/lib/llvm-3.1/build
diff --git a/orig-tar.sh b/orig-tar.sh
new file mode 100755 (executable)
index 0000000..f4717e1
--- /dev/null
@@ -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=http://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
+# http://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
+# http://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 (file)
index 0000000..1aa8791
--- /dev/null
@@ -0,0 +1,34 @@
+From d0d969074f6e0f975ad53d21e7ce6c7b40cf2957 Mon Sep 17 00:00:00 2001
+From: Peter Wu <peter@lekensteyn.nl>
+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 (file)
index 0000000..dca84e3
--- /dev/null
@@ -0,0 +1,34 @@
+From c830d84bc802ca1e9219415a5784c4ad97a34819 Mon Sep 17 00:00:00 2001
+From: Peter Wu <peter@lekensteyn.nl>
+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 (file)
index 0000000..6c8a1d5
--- /dev/null
@@ -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 (file)
index 0000000..89b2392
--- /dev/null
@@ -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 (file)
index 0000000..10663a8
--- /dev/null
@@ -0,0 +1,63 @@
+From: Nicholas D Steeves <nsteeves@gmail.com>
+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 (file)
index 0000000..dce925e
--- /dev/null
@@ -0,0 +1,122 @@
+From: Nicholas D Steeves <nsteeves@gmail.com>
+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 (file)
index 0000000..c530e14
--- /dev/null
@@ -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 <cstdlib>
+ #include <cstring>
+@@ -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 (file)
index 0000000..235ffd4
--- /dev/null
@@ -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 (file)
index 0000000..c7fe931
--- /dev/null
@@ -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 <plugwash@debian.org>
+
+---
+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: <vendor|upstream|other>, <url of original patch>
+Bug: <url in upstream bugtracker>
+Bug-Debian: http://bugs.debian.org/<bugnumber>
+Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
+Forwarded: <no|not-needed|url proving that it has been forwarded>
+Reviewed-By: <name and email of someone who approved the patch>
+Last-Update: <YYYY-MM-DD>
+
+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 (file)
index 0000000..f1c751f
--- /dev/null
@@ -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 (file)
index 0000000..25415a3
--- /dev/null
@@ -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<DominatorTree::UpdateType> 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<DominatorTree::UpdateType, 16> PendUpdates;
++  SmallPtrSet<BasicBlock *, 8> 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<BlockFrequencyInfo> BFI;
+   std::unique_ptr<BranchProbabilityInfo> 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<BlockFrequencyInfo> BFI_,
++               AliasAnalysis *AA_, DeferredDominance *DDT_,
++               bool HasProfileData_, std::unique_ptr<BlockFrequencyInfo> BFI_,
+                std::unique_ptr<BranchProbabilityInfo> 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<DominatorTree::UpdateType> Updates) {
++  SmallVector<DominatorTree::UpdateType, 8> 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<DominatorTreeWrapperPass>();
+       AU.addRequired<LazyValueInfoWrapperPass>();
+       AU.addPreserved<GlobalsAAWrapperPass>();
+     }
+@@ -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<DominatorTreeWrapperPass>();
++      AU.addRequired<DominatorTreeWrapperPass>();
++      AU.addPreserved<DominatorTreeWrapperPass>();
+       AU.addRequired<AAResultsWrapperPass>();
+       AU.addRequired<LazyValueInfoWrapperPass>();
++      AU.addPreserved<LazyValueInfoWrapperPass>();
+       AU.addPreserved<GlobalsAAWrapperPass>();
+       AU.addRequired<TargetLibraryInfoWrapperPass>();
+     }
+@@ -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<TargetLibraryInfoWrapperPass>().getTLI();
++  // Get DT analysis before LVI. When LVI is initialized it conditionally adds
++  // DT if it's available.
++  auto DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
+   auto LVI = &getAnalysis<LazyValueInfoWrapperPass>().getLVI();
+   auto AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
++  DeferredDominance DDT(*DT);
+   std::unique_ptr<BlockFrequencyInfo> BFI;
+   std::unique_ptr<BranchProbabilityInfo> 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<DominatorTreeWrapperPass>().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<TargetLibraryAnalysis>(F);
++  // Get DT analysis before LVI. When LVI is initialized it conditionally adds
++  // DT if it's available.
++  auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
+   auto &LVI = AM.getResult<LazyValueAnalysis>(F);
+   auto &AA = AM.getResult<AAManager>(F);
++  DeferredDominance DDT(DT);
+   std::unique_ptr<BlockFrequencyInfo> BFI;
+   std::unique_ptr<BranchProbabilityInfo> 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<GlobalsAA>();
++  PA.preserve<DominatorTreeAnalysis>();
++  PA.preserve<LazyValueAnalysis>();
+   return PA;
+ }
+ bool JumpThreadingPass::runImpl(Function &F, TargetLibraryInfo *TLI_,
+                                 LazyValueInfo *LVI_, AliasAnalysis *AA_,
+-                                bool HasProfileData_,
++                                DeferredDominance *DDT_, bool HasProfileData_,
+                                 std::unique_ptr<BlockFrequencyInfo> BFI_,
+                                 std::unique_ptr<BranchProbabilityInfo> 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<UndefValue>(Condition)) {
+     unsigned BestSucc = GetBestDestForJumpOnUndef(BB);
++    std::vector<DominatorTree::UpdateType> 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<bool> 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 <DominatorTree::UpdateType> 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<BasicBlock *> Preds,
+                                                const char *Suffix) {
++  SmallVector<BasicBlock *, 2> 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<BasicBlock *, BlockFrequency> 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<DominatorTree::UpdateType> 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<DominatorTree::UpdateType> 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<BranchInst>(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<BranchInst>(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<BasicBlock>(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<PHINode>(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<DominatorTree::UpdateType> 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<DominatorTree::UpdateType> 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 <DominatorTree::UpdateType> 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<BlockAddress>(IBI->getAddress()->stripPointerCasts())) {
+       BasicBlock *TheOnlyDest = BA->getBasicBlock();
++      std::vector <DominatorTree::UpdateType> 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<PHINode>(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<PHINode>(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 <DominatorTree::UpdateType> 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<DominatorTree::UpdateType> 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<PHINode>(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 <DominatorTree::UpdateType> 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<Value*, 8> Args(II->arg_begin(), II->arg_end());
+   SmallVector<OperandBundleDef, 1> 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<BasicBlock*> &Reachable) {
++                            SmallPtrSetImpl<BasicBlock*> &Reachable,
++                            DeferredDominance *DDT = nullptr) {
+   SmallVector<BasicBlock*, 128> 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<UnreachableInst>(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<CallInst>(&I)) {
+         Value *Callee = CI->getCalledValue();
+         if (isa<ConstantPointerNull>(Callee) || isa<UndefValue>(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<UnreachableInst>(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<UndefValue>(Ptr) ||
+             (isa<ConstantPointerNull>(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<ConstantPointerNull>(Callee) || isa<UndefValue>(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<CatchSwitchInst>(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<InvokeInst>(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<BasicBlock*, 16> 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 <DominatorTree::UpdateType> 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<Module> makeLLVMModule(LLVMContext &Context,
++                                              StringRef ModuleStr) {
++  SMDiagnostic Err;
++  std::unique_ptr<Module> 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<Module> 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<DominatorTree::UpdateType> 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<UnreachableInst>(BB3->getTerminator()));
++  EXPECT_FALSE(DDT.pendingDeletedBB(BB3));
++  DDT.deleteBB(BB3);
++  EXPECT_TRUE(DDT.pendingDeletedBB(BB3));
++  ASSERT_TRUE(isa<UnreachableInst>(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<Module> 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<Module> 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<UnreachableInst>(BB0->getTerminator()));
++  EXPECT_FALSE(DDT.pendingDeletedBB(BB0));
++  DDT.deleteBB(BB0);
++  EXPECT_TRUE(DDT.pendingDeletedBB(BB0));
++  ASSERT_TRUE(isa<UnreachableInst>(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<Module> 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<UnreachableInst>(BB2->getTerminator()));
++  EXPECT_FALSE(DDT.pendingDeletedBB(BB2));
++  DDT.deleteBB(BB2);
++  EXPECT_TRUE(DDT.pendingDeletedBB(BB2));
++  ASSERT_TRUE(isa<UnreachableInst>(BB2->getTerminator()));
++  EXPECT_EQ(BB2->getParent(), F);
++
++  // Queue up the DDT updates.
++  std::vector<DominatorTree::UpdateType> 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<UnreachableInst>(BB1->getTerminator()));
++  EXPECT_FALSE(DDT.pendingDeletedBB(BB1));
++  DDT.deleteBB(BB1);
++  EXPECT_TRUE(DDT.pendingDeletedBB(BB1));
++  ASSERT_TRUE(isa<UnreachableInst>(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 (file)
index 0000000..3b1f8a3
--- /dev/null
@@ -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<PHINode>(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<Instruction>(CmpLHS) ||
+           cast<Instruction>(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<Instruction>(AddLHS) ||
+               cast<Instruction>(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 (file)
index 0000000..aa7f719
--- /dev/null
@@ -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 (file)
index 0000000..6c8589c
--- /dev/null
@@ -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<Instruction *, 4> Visited;
++    SmallVector<Instruction *, 4> Uses;
++    Visited.insert(&Root);
++    Uses.push_back(&Root);
++    do {
++      Instruction *I = Uses.pop_back_val();
++
++      if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
++        unsigned LoadAlign = LI->getAlignment();
++        if (!LoadAlign)
++          LoadAlign = DL.getABITypeAlignment(LI->getType());
++        LI->setAlignment(std::min(LoadAlign, getSliceAlign()));
++        continue;
++      }
++      if (StoreInst *SI = dyn_cast<StoreInst>(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<BitCastInst>(I) || isa<PHINode>(I) ||
++             isa<SelectInst>(I) || isa<GetElementPtrInst>(I));
++      for (User *U : I->users())
++        if (Visited.insert(cast<Instruction>(U)).second)
++          Uses.push_back(cast<Instruction>(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 (file)
index 0000000..791ef59
--- /dev/null
@@ -0,0 +1,46 @@
+Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Vectorize/LoopVectorize.cpp
+===================================================================
+--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Vectorize/LoopVectorize.cpp
++++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Vectorize/LoopVectorize.cpp
+@@ -4529,6 +4529,11 @@
+       // isOutOfScope operands cannot be uniform instructions.
+       if (isOutOfScope(OV))
+         continue;
++      // First order recurrence Phi's should typically be considered
++      // non-uniform.
++      auto *OP = dyn_cast<PHINode>(OV);
++      if (OP && Legal->isFirstOrderRecurrence(OP))
++        continue;
+       // If all the users of the operand are uniform, then add the
+       // operand into the uniform worklist.
+       auto *OI = cast<Instruction>(OV);
+Index: llvm-toolchain-6.0-6.0.1/test/Transforms/LoopVectorize/X86/uniform-phi.ll
+===================================================================
+--- llvm-toolchain-6.0-6.0.1.orig/test/Transforms/LoopVectorize/X86/uniform-phi.ll
++++ llvm-toolchain-6.0-6.0.1/test/Transforms/LoopVectorize/X86/uniform-phi.ll
+@@ -75,3 +75,25 @@
+   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/PowerPC-Make-AddrSpaceCast-noop.diff b/patches/PowerPC-Make-AddrSpaceCast-noop.diff
new file mode 100644 (file)
index 0000000..bca07b5
--- /dev/null
@@ -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 (file)
index 0000000..fb253e7
--- /dev/null
@@ -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/bug-30342.diff b/patches/bug-30342.diff
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/patches/clang-analyzer-force-version.diff b/patches/clang-analyzer-force-version.diff
new file mode 100644 (file)
index 0000000..c4bee91
--- /dev/null
@@ -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-fix-cmpxchg8-detection-on-i386.patch b/patches/clang-fix-cmpxchg8-detection-on-i386.patch
new file mode 100644 (file)
index 0000000..eab2a4a
--- /dev/null
@@ -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 (file)
index 0000000..25ee3a1
--- /dev/null
@@ -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 (file)
index 0000000..0b9cb9a
--- /dev/null
@@ -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 (file)
index 0000000..9c559b0
--- /dev/null
@@ -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<const char *>(Addr);
+   const char *End = Start + Len;
+-  __clear_cache(const_cast<char *>(Start), const_cast<char *>(End));
++  __builtin___clear_cache(const_cast<char *>(Start), const_cast<char *>(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 (file)
index 0000000..cde5326
--- /dev/null
@@ -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 (file)
index 0000000..2b77cf8
--- /dev/null
@@ -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 (file)
index 0000000..988bb59
--- /dev/null
@@ -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
+          ^
+ <stdin>:1:1: note: scanning from here
+ _fini
+ ^
+ <stdin>:1:3: note: possible intended match here
+ _fini
+  ^
+Author: Sylvestre <sylvestre@debian.org>
+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 (file)
index 0000000..60a70d8
--- /dev/null
@@ -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 (file)
index 0000000..929098e
--- /dev/null
@@ -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 (file)
index 0000000..b84a4e2
--- /dev/null
@@ -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 (file)
index 0000000..f9b8fab
--- /dev/null
@@ -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 (file)
index 0000000..1b47f0e
--- /dev/null
@@ -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-lldb-server-build b/patches/fix-lldb-server-build
new file mode 100644 (file)
index 0000000..c9f92d4
--- /dev/null
@@ -0,0 +1,73 @@
+---
+ cmake/modules/AddLLVM.cmake |    2 -
+ polly/lib/CMakeLists.txt    |   47 +++++++++++++++++---------------------------
+ 2 files changed, 20 insertions(+), 29 deletions(-)
+
+--- a/cmake/modules/AddLLVM.cmake
++++ b/cmake/modules/AddLLVM.cmake
+@@ -501,7 +501,7 @@ function(llvm_add_library name)
+     # On DLL platforms symbols are imported from the tool by linking against it.
+     set(llvm_libs ${ARG_PLUGIN_TOOL})
+   elseif (DEFINED LLVM_LINK_COMPONENTS OR DEFINED ARG_LINK_COMPONENTS)
+-    if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
++    if (NOT ARG_STATIC AND LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
+       set(llvm_libs LLVM)
+     else()
+       llvm_map_components_to_libnames(llvm_libs
+--- a/polly/lib/CMakeLists.txt
++++ b/polly/lib/CMakeLists.txt
+@@ -66,35 +66,26 @@ endif (GPU_CODEGEN)
+ target_link_libraries(Polly PollyISL jsoncpp)
+-if (BUILD_SHARED_LIBS)
+-  target_link_libraries(Polly
+-    LLVMSupport
+-    LLVMCore
+-    LLVMScalarOpts
+-    LLVMInstCombine
+-    LLVMTransformUtils
+-    LLVMAnalysis
+-    LLVMipo
+-    LLVMMC
++target_link_libraries(Polly
++  LLVMSupport
++  LLVMCore
++  LLVMScalarOpts
++  LLVMInstCombine
++  LLVMTransformUtils
++  LLVMAnalysis
++  LLVMipo
++  LLVMMC
+ # The libraries below are required for darwin: http://PR26392
+-    LLVMBitReader
+-    LLVMMCParser
+-    LLVMObject
+-    LLVMProfileData
+-    LLVMTarget
+-    LLVMVectorize
+-  )
+-  link_directories(
+-    ${LLVM_LIBRARY_DIR}
+-  )
+-elseif (LLVM_LINK_LLVM_DYLIB)
+-  target_link_libraries(Polly
+-    LLVM
+-  )
+-  link_directories(
+-    ${LLVM_LIBRARY_DIR}
+-  )
+-endif()
++  LLVMBitReader
++  LLVMMCParser
++  LLVMObject
++  LLVMProfileData
++  LLVMTarget
++  LLVMVectorize
++)
++link_directories(
++  ${LLVM_LIBRARY_DIR}
++)
+ # Build a monolithic Polly.a and a thin module LLVMPolly.moduleext that links to
+ # that static library.
diff --git a/patches/fix-llvm-config-obj-src-root.patch b/patches/fix-llvm-config-obj-src-root.patch
new file mode 100644 (file)
index 0000000..bc1e679
--- /dev/null
@@ -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 (file)
index 0000000..22a5121
--- /dev/null
@@ -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 (file)
index 0000000..e47d28c
--- /dev/null
@@ -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 (file)
index 0000000..3b98ad9
--- /dev/null
@@ -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<const CodeGenInstruction*> 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-pathmax.diff b/patches/hurd-pathmax.diff
new file mode 100644 (file)
index 0000000..724e262
--- /dev/null
@@ -0,0 +1,77 @@
+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<const FileEntry *> &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 <sys/types.h>
+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 <utility>
+ #include <vector>
++// 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.
+  */
diff --git a/patches/install-lldb-sb-headers.patch b/patches/install-lldb-sb-headers.patch
new file mode 100644 (file)
index 0000000..a1ee436
--- /dev/null
@@ -0,0 +1,58 @@
+From 8f577000b2fe2f5bf5d08e352a2f15f9421f9c82 Mon Sep 17 00:00:00 2001
+From: Pavel Labath <labath@google.com>
+Date: Thu, 8 Mar 2018 15:52:46 +0000
+Subject: [PATCH] Install lldb's SB headers (pr36630)
+
+These were removed in r309021 in what looks like an accidentally
+committed change. This brings them back.
+
+I also rename the header component to lldb-headers (instead of
+lldb_headers) to match the llvm style and add a special
+install-lldb-headers target, which installs just the headers.
+
+git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@327016 91177308-0d34-0410-b5e6-96231b3b80d8
+Origin: upstream, https://github.com/llvm-mirror/lldb/commit/8f577000b2fe2f5bf5d08e352a2f15f9421f9c82.patch
+Bug-Ubuntu: https://launchpad.net/bugs/1761009
+Forwarded: will be done by Nishanth Aravamudan
+Last-Update: 2018-04-05
+
+--- llvm-toolchain-6.0-6.0.orig/lldb/cmake/modules/LLDBConfig.cmake
++++ llvm-toolchain-6.0-6.0/lldb/cmake/modules/LLDBConfig.cmake
+@@ -277,27 +277,31 @@ include_directories(BEFORE
+ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
+   install(DIRECTORY include/
+-    COMPONENT lldb_headers
++    COMPONENT lldb-headers
+     DESTINATION include
+     FILES_MATCHING
+     PATTERN "*.h"
+     PATTERN ".svn" EXCLUDE
+     PATTERN ".cmake" EXCLUDE
+     PATTERN "Config.h" EXCLUDE
+-    PATTERN "lldb-*.h" EXCLUDE
+-    PATTERN "API/*.h" EXCLUDE
+     )
+   install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
+-    COMPONENT lldb_headers
++    COMPONENT lldb-headers
+     DESTINATION include
+     FILES_MATCHING
+     PATTERN "*.h"
+     PATTERN ".svn" EXCLUDE
+     PATTERN ".cmake" EXCLUDE
+-    PATTERN "lldb-*.h" EXCLUDE
+-    PATTERN "API/*.h" EXCLUDE
+     )
++
++  add_custom_target(lldb-headers)
++  set_target_properties(lldb-headers PROPERTIES FOLDER "Misc")
++
++  if (NOT CMAKE_CONFIGURATION_TYPES)
++    add_llvm_install_targets(install-lldb-headers
++                             COMPONENT lldb-headers)
++  endif()
+ endif()
+ if (NOT LIBXML2_FOUND AND NOT (CMAKE_SYSTEM_NAME MATCHES "Windows"))
diff --git a/patches/install-scan-build-py.diff b/patches/install-scan-build-py.diff
new file mode 100644 (file)
index 0000000..4f118f3
--- /dev/null
@@ -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/lldb-addversion-suffix-to-llvm-server-exec.patch b/patches/lldb-addversion-suffix-to-llvm-server-exec.patch
new file mode 100644 (file)
index 0000000..41e7c90
--- /dev/null
@@ -0,0 +1,35 @@
+lldb-server exec users always /usr/bin/lldb-server. Server is required
+for any debugging with lldb which makes it unusable unless default version
+package has been installed. Small changes to code and debian/rules allows
+a workaround for lldb-server start up.
+
+To use this one needs to add cmake defination during configure. eg
+-DDEBIAN_VERSION_SUFFIX=-$(LLVM_VERSION)
+
+Better implementation would be to use /usr/share/llvm-$(VERSION)/bin but 
+that change seems to require a big change to the path handling code
+which could then break something else.
+
+This probably should have upstream bug but I couldn't find any existing report.
+
+Index: llvm-toolchain-snapshot_6.0~svn293997/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn293997.orig/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
++++ llvm-toolchain-snapshot_6.0~svn293997/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp
+@@ -32,6 +32,7 @@
+ #include "lldb/Utility/StreamString.h"
+ #include "llvm/ADT/SmallString.h"
+ #include "llvm/Support/ScopedPrinter.h"
++#include "llvm/Config/llvm-config.h"
+ // Project includes
+ #include "ProcessGDBRemoteLog.h"
+@@ -39,7 +40,7 @@
+ #if defined(__APPLE__)
+ #define DEBUGSERVER_BASENAME "debugserver"
+ #else
+-#define DEBUGSERVER_BASENAME "lldb-server"
++# define DEBUGSERVER_BASENAME    "lldb-server-"LLVM_VERSION_STRING
+ #endif
+ #if defined(HAVE_LIBCOMPRESSION)
diff --git a/patches/lldb-disable-swig-error.diff b/patches/lldb-disable-swig-error.diff
new file mode 100644 (file)
index 0000000..a715805
--- /dev/null
@@ -0,0 +1,13 @@
+Index: llvm-toolchain-snapshot_5.0~svn306792/lldb/scripts/lldb.swig
+===================================================================
+--- llvm-toolchain-snapshot_5.0~svn306792.orig/lldb/scripts/lldb.swig
++++ llvm-toolchain-snapshot_5.0~svn306792/lldb/scripts/lldb.swig
+@@ -50,7 +50,7 @@ except ImportError:
+ %enddef
+ // These versions will not generate working python modules, so error out early.
+ #if SWIG_VERSION >= 0x030009 && SWIG_VERSION < 0x030011
+-#error Swig versions 3.0.9 and 3.0.10 are incompatible with lldb.
++#warning Swig versions 3.0.9 and 3.0.10 are incompatible with lldb.
+ #endif
+ // The name of the module to be created.
diff --git a/patches/lldb-libname.diff b/patches/lldb-libname.diff
new file mode 100644 (file)
index 0000000..a96f66f
--- /dev/null
@@ -0,0 +1,15 @@
+---
+ lldb/scripts/Python/finishSwigPythonLLDB.py |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/lldb/scripts/Python/finishSwigPythonLLDB.py
++++ b/lldb/scripts/Python/finishSwigPythonLLDB.py
+@@ -443,7 +443,7 @@ def make_symlink_liblldb(
+             if eOSType == utilsOsType.EnumOsType.Darwin:
+                 strLibFileExtn = ".dylib"
+             else:
+-                strLibFileExtn = ".so"
++                strLibFileExtn = "-6.0.so"
+             strSrc = os.path.join(vstrLldbLibDir, "liblldb" + strLibFileExtn)
+     bOk, strErrMsg = make_symlink(
diff --git a/patches/lldb-link-atomic-cmake.patch b/patches/lldb-link-atomic-cmake.patch
new file mode 100644 (file)
index 0000000..1460694
--- /dev/null
@@ -0,0 +1,27 @@
+Description: Link with -latomic when mips* processor is detected
+Author: Gianfranco Costamagna <locutusofborg@debian.org>
+Last-Update: 2016-07-27
+
+---
+ lldb/cmake/LLDBDependencies.cmake |    6 ++++++
+ 1 file changed, 6 insertions(+)
+
+Index: llvm-toolchain-snapshot_6.0~svn317000/lldb/source/Utility/CMakeLists.txt
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317000.orig/lldb/source/Utility/CMakeLists.txt
++++ llvm-toolchain-snapshot_6.0~svn317000/lldb/source/Utility/CMakeLists.txt
+@@ -30,6 +30,14 @@ endif()
+ list(APPEND LLDB_SYSTEM_LIBS ${system_libs})
++if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "mips" OR
++   CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "mipsel" OR
++   CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "mips64el" OR
++   CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "powerpcspe")
++  list(APPEND LLDB_SYSTEM_LIBS atomic)
++endif()
++
++
+ if (LLVM_BUILD_STATIC)
+   if (NOT LLDB_DISABLE_PYTHON)
+     list(APPEND LLDB_SYSTEM_LIBS python2.7 util)
diff --git a/patches/lldb-missing-install.diff b/patches/lldb-missing-install.diff
new file mode 100644 (file)
index 0000000..a802c1c
--- /dev/null
@@ -0,0 +1,24 @@
+Index: llvm-toolchain-snapshot_6.0~svn319966/lldb/tools/argdumper/CMakeLists.txt
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn319966.orig/lldb/tools/argdumper/CMakeLists.txt
++++ llvm-toolchain-snapshot_6.0~svn319966/lldb/tools/argdumper/CMakeLists.txt
+@@ -4,3 +4,7 @@ add_lldb_tool(lldb-argdumper INCLUDE_IN_
+   LINK_LIBS
+     lldbUtility
+   )
++
++install(TARGETS lldb-argdumper
++  RUNTIME DESTINATION bin)
++
+Index: llvm-toolchain-snapshot_6.0~svn319966/lldb/tools/lldb-server/CMakeLists.txt
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn319966.orig/lldb/tools/lldb-server/CMakeLists.txt
++++ llvm-toolchain-snapshot_6.0~svn319966/lldb/tools/lldb-server/CMakeLists.txt
+@@ -55,3 +55,7 @@ add_lldb_tool(lldb-server INCLUDE_IN_FRA
+ )
+ target_link_libraries(lldb-server PRIVATE ${LLDB_SYSTEM_LIBS})
++
++install(TARGETS lldb-server
++  RUNTIME DESTINATION bin)
++
diff --git a/patches/lldb-soname.diff b/patches/lldb-soname.diff
new file mode 100644 (file)
index 0000000..e2267c1
--- /dev/null
@@ -0,0 +1,43 @@
+---
+ lldb/source/API/CMakeLists.txt |   14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+Index: llvm-toolchain-snapshot_5.0~svn294583/lldb/source/API/CMakeLists.txt
+===================================================================
+--- llvm-toolchain-snapshot_5.0~svn294583.orig/lldb/source/API/CMakeLists.txt
++++ llvm-toolchain-snapshot_5.0~svn294583/lldb/source/API/CMakeLists.txt
+@@ -18,7 +18,12 @@ endif()
+ get_property(LLDB_ALL_PLUGINS GLOBAL PROPERTY LLDB_PLUGINS)
+-add_lldb_library(liblldb SHARED
++set(output_name lldb)
++if (CMAKE_SYSTEM_NAME MATCHES "Windows")
++  set(output_name liblldb)
++endif()
++
++add_lldb_library(liblldb SHARED OUTPUT_NAME ${output_name} SONAME
+   SBAddress.cpp
+   SBAttachInfo.cpp
+   SBBlock.cpp
+@@ -116,7 +121,7 @@ target_link_libraries(liblldb PRIVATE
+ set_target_properties(liblldb
+   PROPERTIES
+-  VERSION ${LLDB_VERSION}
++  VERSION 1
+   )
+ if (NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
+@@ -140,11 +145,6 @@ if ( CMAKE_SYSTEM_NAME MATCHES "Windows"
+   if (MSVC AND NOT LLDB_DISABLE_PYTHON)
+     target_link_libraries(liblldb PRIVATE ${PYTHON_LIBRARY})
+   endif()
+-else()
+-  set_target_properties(liblldb
+-    PROPERTIES
+-    OUTPUT_NAME lldb
+-    )
+ endif()
+ if (LLDB_WRAP_PYTHON)
diff --git a/patches/llvm-D49832-SCEVPred.patch b/patches/llvm-D49832-SCEVPred.patch
new file mode 100644 (file)
index 0000000..332b07e
--- /dev/null
@@ -0,0 +1,187 @@
+commit 98592fcc61307968f7df1362771534595a1e1c21
+Author: Keno Fischer <keno@juliacomputing.com>
+Date:   Wed Jul 25 19:29:02 2018 -0400
+
+    [SCEV] Don't expand Wrap predicate using inttoptr in ni addrspaces
+    
+    Summary:
+    In non-integral address spaces, we're not allowed to introduce inttoptr/ptrtoint
+    intrinsics. Instead, we need to expand any pointer arithmetic as geps on the
+    base pointer. Luckily this is a common task for SCEV, so all we have to do here
+    is hook up the corresponding helper function and add test case.
+    
+    Fixes PR38290
+    
+    Reviewers: reames, sanjoy
+    
+    Subscribers: javed.absar, llvm-commits
+    
+    Differential Revision: https://reviews.llvm.org/D49832
+
+diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp
+index 7f76f057216..f441a3647fb 100644
+--- a/lib/Analysis/ScalarEvolutionExpander.cpp
++++ b/lib/Analysis/ScalarEvolutionExpander.cpp
+@@ -2154,8 +2154,9 @@ Value *SCEVExpander::generateOverflowCheck(const SCEVAddRecExpr *AR,
+   const SCEV *Step = AR->getStepRecurrence(SE);
+   const SCEV *Start = AR->getStart();
++  Type *ARTy = AR->getType();
+   unsigned SrcBits = SE.getTypeSizeInBits(ExitCount->getType());
+-  unsigned DstBits = SE.getTypeSizeInBits(AR->getType());
++  unsigned DstBits = SE.getTypeSizeInBits(ARTy);
+   // The expression {Start,+,Step} has nusw/nssw if
+   //   Step < 0, Start - |Step| * Backedge <= Start
+@@ -2167,11 +2168,12 @@ Value *SCEVExpander::generateOverflowCheck(const SCEVAddRecExpr *AR,
+   Value *TripCountVal = expandCodeFor(ExitCount, CountTy, Loc);
+   IntegerType *Ty =
+-      IntegerType::get(Loc->getContext(), SE.getTypeSizeInBits(AR->getType()));
++      IntegerType::get(Loc->getContext(), SE.getTypeSizeInBits(ARTy));
++  Type *ARExpandTy = DL.isNonIntegralPointerType(ARTy) ? ARTy : Ty;
+   Value *StepValue = expandCodeFor(Step, Ty, Loc);
+   Value *NegStepValue = expandCodeFor(SE.getNegativeSCEV(Step), Ty, Loc);
+-  Value *StartValue = expandCodeFor(Start, Ty, Loc);
++  Value *StartValue = expandCodeFor(Start, ARExpandTy, Loc);
+   ConstantInt *Zero =
+       ConstantInt::get(Loc->getContext(), APInt::getNullValue(DstBits));
+@@ -2194,8 +2196,21 @@ Value *SCEVExpander::generateOverflowCheck(const SCEVAddRecExpr *AR,
+   // Compute:
+   //   Start + |Step| * Backedge < Start
+   //   Start - |Step| * Backedge > Start
+-  Value *Add = Builder.CreateAdd(StartValue, MulV);
+-  Value *Sub = Builder.CreateSub(StartValue, MulV);
++  Value *Add = nullptr, *Sub = nullptr;
++  if (ARExpandTy->isPointerTy()) {
++    PointerType *ARPtrTy = cast<PointerType>(ARExpandTy);
++    const SCEV *MulS = SE.getSCEV(MulV);
++    const SCEV *const StepArray[2] = {MulS, SE.getNegativeSCEV(MulS)};
++    Add = Builder.CreateBitCast(
++        expandAddToGEP(&StepArray[0], &StepArray[1], ARPtrTy, Ty, StartValue),
++        ARPtrTy);
++    Sub = Builder.CreateBitCast(
++        expandAddToGEP(&StepArray[1], &StepArray[2], ARPtrTy, Ty, StartValue),
++        ARPtrTy);
++  } else {
++    Add = Builder.CreateAdd(StartValue, MulV);
++    Sub = Builder.CreateSub(StartValue, MulV);
++  }
+   Value *EndCompareGT = Builder.CreateICmp(
+       Signed ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT, Sub, StartValue);
+diff --git a/test/Analysis/LoopAccessAnalysis/wrapping-pointer-ni.ll b/test/Analysis/LoopAccessAnalysis/wrapping-pointer-ni.ll
+new file mode 100644
+index 00000000000..ddcf5e1a195
+--- /dev/null
++++ b/test/Analysis/LoopAccessAnalysis/wrapping-pointer-ni.ll
+@@ -0,0 +1,73 @@
++; RUN: opt -loop-versioning -S < %s | FileCheck %s -check-prefix=LV
++
++; 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"
++
++; This matches the test case from PR38290
++; Check that we expand the SCEV predicate check using GEP, rather
++; than ptrtoint.
++
++%jl_value_t = type opaque
++%jl_array_t = type { i8 addrspace(13)*, i64, i16, i16, i32 }
++
++declare i64 @julia_steprange_last_4949()
++
++define void @"japi1_align!_9477"(%jl_value_t addrspace(10)**) #0 {
++; LV-LAVEL: L26.lver.check
++; LV: [[OFMul:%[^ ]*]]  = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 4, i64 [[Step:%[^ ]*]])
++; LV-NEXT: [[OFMulResult:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul]], 0
++; LV-NEXT: [[OFMulOverflow:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul]], 1
++; LV-NEXT: [[PosGEP:%[^ ]*]] = getelementptr i32, i32 addrspace(13)* [[Base:%[^ ]*]], i64 [[Step]]
++; LV-NEXT: [[NegGEP:%[^ ]*]] = getelementptr i32, i32 addrspace(13)* [[Base]], i64 [[NegStep:%[^ ]*]]
++; LV-NEXT: icmp ugt i32 addrspace(13)* [[NegGEP]], [[Base]]
++; LV-NEXT: icmp ult i32 addrspace(13)* [[PosGEP]], [[Base]]
++; LV-NOT: inttoptr
++; LV-NOT: ptrtoint
++top:
++  %1 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %0, align 8, !nonnull !1, !dereferenceable !2, !align !3
++  %2 = load i32, i32* inttoptr (i64 12 to i32*), align 4, !tbaa !4
++  %3 = sub i32 0, %2
++  %4 = call i64 @julia_steprange_last_4949()
++  %5 = addrspacecast %jl_value_t addrspace(10)* %1 to %jl_value_t addrspace(11)*
++  %6 = bitcast %jl_value_t addrspace(11)* %5 to %jl_value_t addrspace(10)* addrspace(11)*
++  %7 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)* addrspace(11)* %6, align 8, !tbaa !4, !nonnull !1, !dereferenceable !9, !align !2
++  %8 = addrspacecast %jl_value_t addrspace(10)* %7 to %jl_value_t addrspace(11)*
++  %9 = bitcast %jl_value_t addrspace(11)* %8 to i32 addrspace(13)* addrspace(11)*
++  %10 = load i32 addrspace(13)*, i32 addrspace(13)* addrspace(11)* %9, align 8, !tbaa !10, !nonnull !1
++  %11 = sext i32 %3 to i64
++  br label %L26
++
++L26:                                              ; preds = %L26, %top
++  %value_phi3 = phi i64 [ 0, %top ], [ %12, %L26 ]
++  %12 = add i64 %value_phi3, -1
++  %13 = getelementptr inbounds i32, i32 addrspace(13)* %10, i64 %12
++  %14 = load i32, i32 addrspace(13)* %13, align 4, !tbaa !13
++  %15 = add i64 %12, %11
++  %16 = getelementptr inbounds i32, i32 addrspace(13)* %10, i64 %15
++  store i32 %14, i32 addrspace(13)* %16, align 4, !tbaa !13
++  %17 = icmp eq i64 %value_phi3, %4
++  br i1 %17, label %L45, label %L26
++
++L45:                                              ; preds = %L26
++  ret void
++}
++
++attributes #0 = { "thunk" }
++
++!llvm.module.flags = !{!0}
++
++!0 = !{i32 1, !"Debug Info Version", i32 3}
++!1 = !{}
++!2 = !{i64 16}
++!3 = !{i64 8}
++!4 = !{!5, !5, i64 0}
++!5 = !{!"jtbaa_mutab", !6, i64 0}
++!6 = !{!"jtbaa_value", !7, i64 0}
++!7 = !{!"jtbaa_data", !8, i64 0}
++!8 = !{!"jtbaa"}
++!9 = !{i64 40}
++!10 = !{!11, !11, i64 0}
++!11 = !{!"jtbaa_arrayptr", !12, i64 0}
++!12 = !{!"jtbaa_array", !8, i64 0}
++!13 = !{!14, !14, i64 0}
++!14 = !{!"jtbaa_arraybuf", !7, i64 0}
+diff --git a/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll b/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll
+index a7e5bce7445..fa6fccecbf1 100644
+--- a/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll
++++ b/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll
+@@ -58,10 +58,10 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+ ; LV-NEXT: [[OFMul1:%[^ ]*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 4, i64 [[BE]])
+ ; LV-NEXT: [[OFMulResult1:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul1]], 0
+ ; LV-NEXT: [[OFMulOverflow1:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul1]], 1
+-; LV-NEXT: [[AddEnd1:%[^ ]*]] = add i64 %a2, [[OFMulResult1]]
+-; LV-NEXT: [[SubEnd1:%[^ ]*]] = sub i64 %a2, [[OFMulResult1]]
+-; LV-NEXT: [[CmpNeg1:%[^ ]*]] = icmp ugt i64 [[SubEnd1]], %a2
+-; LV-NEXT: [[CmpPos1:%[^ ]*]] = icmp ult i64 [[AddEnd1]], %a2
++; LV-NEXT: [[AddEnd1:%[^ ]*]] = add i64 [[A0:%[^ ]*]], [[OFMulResult1]]
++; LV-NEXT: [[SubEnd1:%[^ ]*]] = sub i64 [[A0]], [[OFMulResult1]]
++; LV-NEXT: [[CmpNeg1:%[^ ]*]] = icmp ugt i64 [[SubEnd1]], [[A0]]
++; LV-NEXT: [[CmpPos1:%[^ ]*]] = icmp ult i64 [[AddEnd1]], [[A0]]
+ ; LV-NEXT: [[Cmp:%[^ ]*]] = select i1 false, i1 [[CmpNeg1]], i1 [[CmpPos1]]
+ ; LV-NEXT: [[PredCheck1:%[^ ]*]] = or i1 [[Cmp]], [[OFMulOverflow1]]
+@@ -233,10 +233,10 @@ for.end:                                          ; preds = %for.body
+ ; LV: [[OFMul1:%[^ ]*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 4, i64 [[BE:%[^ ]*]])
+ ; LV-NEXT: [[OFMulResult1:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul1]], 0
+ ; LV-NEXT: [[OFMulOverflow1:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul1]], 1
+-; LV-NEXT: [[AddEnd1:%[^ ]*]] = add i64 %a2, [[OFMulResult1]]
+-; LV-NEXT: [[SubEnd1:%[^ ]*]] = sub i64 %a2, [[OFMulResult1]]
+-; LV-NEXT: [[CmpNeg1:%[^ ]*]] = icmp ugt i64 [[SubEnd1]], %a2
+-; LV-NEXT: [[CmpPos1:%[^ ]*]] = icmp ult i64 [[AddEnd1]], %a2
++; LV-NEXT: [[AddEnd1:%[^ ]*]] = add i64 [[A0:%[^ ]*]], [[OFMulResult1]]
++; LV-NEXT: [[SubEnd1:%[^ ]*]] = sub i64 [[A0]], [[OFMulResult1]]
++; LV-NEXT: [[CmpNeg1:%[^ ]*]] = icmp ugt i64 [[SubEnd1]], [[A0]]
++; LV-NEXT: [[CmpPos1:%[^ ]*]] = icmp ult i64 [[AddEnd1]], [[A0]]
+ ; LV-NEXT: [[Cmp:%[^ ]*]] = select i1 false, i1 [[CmpNeg1]], i1 [[CmpPos1]]
+ ; LV-NEXT: [[PredCheck1:%[^ ]*]] = or i1 [[Cmp]], [[OFMulOverflow1]]
diff --git a/patches/llvm-rL323946-LSRTy.patch b/patches/llvm-rL323946-LSRTy.patch
new file mode 100644 (file)
index 0000000..ae1a7ac
--- /dev/null
@@ -0,0 +1,45 @@
+commit ab60b05a472e8651cbe53c19513b7e62b9ff32df
+Author: Mikael Holmen <mikael.holmen@ericsson.com>
+Date:   Thu Feb 1 06:38:34 2018 +0000
+
+    [LSR] Don't force bases of foldable formulae to the final type.
+    
+    Summary:
+    Before emitting code for scaled registers, we prevent
+    SCEVExpander from hoisting any scaled addressing mode
+    by emitting all the bases first. However, these bases
+    are being forced to the final type, resulting in some
+    odd code.
+    
+    For example, if the type of the base is an integer and
+    the final type is a pointer, we will emit an inttoptr
+    for the base, a ptrtoint for the scale, and then a
+    'reverse' GEP where the GEP pointer is actually the base
+    integer and the index is the pointer. It's more intuitive
+    to use the pointer as a pointer and the integer as index.
+    
+    Patch by: Bevin Hansson
+    
+    Reviewers: atrick, qcolombet, sanjoy
+    
+    Reviewed By: qcolombet
+    
+    Subscribers: llvm-commits
+    
+    Differential Revision: https://reviews.llvm.org/D42103
+    
+    git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323946 91177308-0d34-0410-b5e6-96231b3b80d8
+
+diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+index 332c074a1df..4b8e2286ed9 100644
+--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
++++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+@@ -4993,7 +4993,7 @@ Value *LSRInstance::Expand(const LSRUse &LU, const LSRFixup &LF,
+       // Unless the addressing mode will not be folded.
+       if (!Ops.empty() && LU.Kind == LSRUse::Address &&
+           isAMCompletelyFolded(TTI, LU, F)) {
+-        Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty);
++        Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), nullptr);
+         Ops.clear();
+         Ops.push_back(SE.getUnknown(FullV));
+       }
diff --git a/patches/mips-fpxx-enable.diff b/patches/mips-fpxx-enable.diff
new file mode 100644 (file)
index 0000000..7a07a20
--- /dev/null
@@ -0,0 +1,17 @@
+Index: llvm-toolchain-snapshot_5.0~svn297449/clang/lib/Driver/ToolChains/Arch/Mips.cpp
+===================================================================
+--- llvm-toolchain-snapshot_5.0~svn297449.orig/clang/lib/Driver/ToolChains/Arch/Mips.cpp
++++ llvm-toolchain-snapshot_5.0~svn297449/clang/lib/Driver/ToolChains/Arch/Mips.cpp
+@@ -368,10 +368,10 @@ bool mips::isFP64ADefault(const llvm::Tr
+ bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
+                          StringRef ABIName, mips::FloatABI FloatABI) {
+-  if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
++/*  if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
+       Triple.getVendor() != llvm::Triple::MipsTechnologies &&
+       !Triple.isAndroid())
+-    return false;
++    return false;*/
+   if (ABIName != "32")
+     return false;
diff --git a/patches/powerpcspe-add-missing-include-path.diff b/patches/powerpcspe-add-missing-include-path.diff
new file mode 100644 (file)
index 0000000..8ae5dbd
--- /dev/null
@@ -0,0 +1,18 @@
+Description: Fix missing include paths on powerpcspe
+Author: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=908791
+Forwarded: https://reviews.llvm.org/D52066
+Last-Update: 2018-09-13
+
+--- llvm-toolchain-6.0-6.0.1.orig/clang/lib/Driver/ToolChains/Linux.cpp
++++ llvm-toolchain-6.0-6.0.1/clang/lib/Driver/ToolChains/Linux.cpp
+@@ -629,7 +629,8 @@ void Linux::AddClangSystemIncludeArgs(co
+       "/usr/include/mips64el-linux-gnu",
+       "/usr/include/mips64el-linux-gnuabi64"};
+   const StringRef PPCMultiarchIncludeDirs[] = {
+-      "/usr/include/powerpc-linux-gnu"};
++      "/usr/include/powerpc-linux-gnu",
++      "/usr/include/powerpc-linux-gnuspe"};
+   const StringRef PPC64MultiarchIncludeDirs[] = {
+       "/usr/include/powerpc64-linux-gnu"};
+   const StringRef PPC64LEMultiarchIncludeDirs[] = {
diff --git a/patches/pr38663-pgo-lto-crash.patch b/patches/pr38663-pgo-lto-crash.patch
new file mode 100644 (file)
index 0000000..16db408
--- /dev/null
@@ -0,0 +1,1573 @@
+Index: llvm-toolchain-6.0-6.0.1/lib/CodeGen/PeepholeOptimizer.cpp
+===================================================================
+--- llvm-toolchain-6.0-6.0.1.orig/lib/CodeGen/PeepholeOptimizer.cpp
++++ llvm-toolchain-6.0-6.0.1/lib/CodeGen/PeepholeOptimizer.cpp
+@@ -98,6 +98,8 @@
+ #include <utility>
+ using namespace llvm;
++using RegSubRegPair = TargetInstrInfo::RegSubRegPair;
++using RegSubRegPairAndIdx = TargetInstrInfo::RegSubRegPairAndIdx;
+ #define DEBUG_TYPE "peephole-opt"
+@@ -110,6 +112,9 @@ static cl::opt<bool>
+ DisablePeephole("disable-peephole", cl::Hidden, cl::init(false),
+                 cl::desc("Disable the peephole optimizer"));
++/// Specifiy whether or not the value tracking looks through
++/// complex instructions. When this is true, the value tracker
++/// bails on everything that is not a copy or a bitcast.
+ static cl::opt<bool>
+ DisableAdvCopyOpt("disable-adv-copy-opt", cl::Hidden, cl::init(false),
+                   cl::desc("Disable advanced copy optimization"));
+@@ -132,11 +137,11 @@ static cl::opt<unsigned> MaxRecurrenceCh
+              "of commuting operands"));
+-STATISTIC(NumReuse,      "Number of extension results reused");
+-STATISTIC(NumCmps,       "Number of compares eliminated");
+-STATISTIC(NumImmFold,    "Number of move immediate folded");
+-STATISTIC(NumLoadFold,   "Number of loads folded");
+-STATISTIC(NumSelects,    "Number of selects optimized");
++STATISTIC(NumReuse, "Number of extension results reused");
++STATISTIC(NumCmps, "Number of compares eliminated");
++STATISTIC(NumImmFold, "Number of move immediate folded");
++STATISTIC(NumLoadFold, "Number of loads folded");
++STATISTIC(NumSelects, "Number of selects optimized");
+ STATISTIC(NumUncoalescableCopies, "Number of uncoalescable copies optimized");
+ STATISTIC(NumRewrittenCopies, "Number of copies rewritten");
+ STATISTIC(NumNAPhysCopies, "Number of non-allocatable physical copies removed");
+@@ -149,9 +154,9 @@ namespace {
+   class PeepholeOptimizer : public MachineFunctionPass {
+     const TargetInstrInfo *TII;
+     const TargetRegisterInfo *TRI;
+-    MachineRegisterInfo   *MRI;
+-    MachineDominatorTree  *DT;  // Machine dominator tree
+-    MachineLoopInfo       *MLI;
++    MachineRegisterInfo *MRI;
++    MachineDominatorTree *DT;  // Machine dominator tree
++    MachineLoopInfo *MLI;
+   public:
+     static char ID; // Pass identification
+@@ -173,31 +178,28 @@ namespace {
+       }
+     }
+-    /// \brief Track Def -> Use info used for rewriting copies.
+-    using RewriteMapTy =
+-        SmallDenseMap<TargetInstrInfo::RegSubRegPair, ValueTrackerResult>;
++    /// Track Def -> Use info used for rewriting copies.
++    using RewriteMapTy = SmallDenseMap<RegSubRegPair, ValueTrackerResult>;
+-    /// \brief Sequence of instructions that formulate recurrence cycle.
++    /// Sequence of instructions that formulate recurrence cycle.
+     using RecurrenceCycle = SmallVector<RecurrenceInstr, 4>;
+   private:
+-    bool optimizeCmpInstr(MachineInstr *MI, MachineBasicBlock *MBB);
+-    bool optimizeExtInstr(MachineInstr *MI, MachineBasicBlock *MBB,
++    bool optimizeCmpInstr(MachineInstr &MI);
++    bool optimizeExtInstr(MachineInstr &MI, MachineBasicBlock &MBB,
+                           SmallPtrSetImpl<MachineInstr*> &LocalMIs);
+-    bool optimizeSelect(MachineInstr *MI,
++    bool optimizeSelect(MachineInstr &MI,
+                         SmallPtrSetImpl<MachineInstr *> &LocalMIs);
+-    bool optimizeCondBranch(MachineInstr *MI);
+-    bool optimizeCoalescableCopy(MachineInstr *MI);
+-    bool optimizeUncoalescableCopy(MachineInstr *MI,
++    bool optimizeCondBranch(MachineInstr &MI);
++    bool optimizeCoalescableCopy(MachineInstr &MI);
++    bool optimizeUncoalescableCopy(MachineInstr &MI,
+                                    SmallPtrSetImpl<MachineInstr *> &LocalMIs);
+     bool optimizeRecurrence(MachineInstr &PHI);
+-    bool findNextSource(unsigned Reg, unsigned SubReg,
+-                        RewriteMapTy &RewriteMap);
+-    bool isMoveImmediate(MachineInstr *MI,
++    bool findNextSource(RegSubRegPair RegSubReg, RewriteMapTy &RewriteMap);
++    bool isMoveImmediate(MachineInstr &MI,
+                          SmallSet<unsigned, 4> &ImmDefRegs,
+                          DenseMap<unsigned, MachineInstr*> &ImmDefMIs);
+-    bool foldImmediate(MachineInstr *MI, MachineBasicBlock *MBB,
+-                       SmallSet<unsigned, 4> &ImmDefRegs,
++    bool foldImmediate(MachineInstr &MI, SmallSet<unsigned, 4> &ImmDefRegs,
+                        DenseMap<unsigned, MachineInstr*> &ImmDefMIs);
+     /// \brief Finds recurrence cycles, but only ones that formulated around
+@@ -212,11 +214,11 @@ namespace {
+     /// the set \p CopySrcRegs and \p CopyMIs. If this virtual register was
+     /// previously seen as a copy, replace the uses of this copy with the
+     /// previously seen copy's destination register.
+-    bool foldRedundantCopy(MachineInstr *MI,
++    bool foldRedundantCopy(MachineInstr &MI,
+                            SmallSet<unsigned, 4> &CopySrcRegs,
+                            DenseMap<unsigned, MachineInstr *> &CopyMIs);
+-    /// \brief Is the register \p Reg a non-allocatable physical register?
++    /// Is the register \p Reg a non-allocatable physical register?
+     bool isNAPhysCopy(unsigned Reg);
+     /// \brief If copy instruction \p MI is a non-allocatable virtual<->physical
+@@ -224,11 +226,10 @@ namespace {
+     /// non-allocatable physical register was previously copied to a virtual
+     /// registered and hasn't been clobbered, the virt->phys copy can be
+     /// deleted.
+-    bool foldRedundantNAPhysCopy(
+-        MachineInstr *MI,
++    bool foldRedundantNAPhysCopy(MachineInstr &MI,
+         DenseMap<unsigned, MachineInstr *> &NAPhysToVirtMIs);
+-    bool isLoadFoldable(MachineInstr *MI,
++    bool isLoadFoldable(MachineInstr &MI,
+                         SmallSet<unsigned, 16> &FoldAsLoadDefCandidates);
+     /// \brief Check whether \p MI is understood by the register coalescer
+@@ -249,10 +250,13 @@ namespace {
+               (MI.isRegSequenceLike() || MI.isInsertSubregLike() ||
+                MI.isExtractSubregLike()));
+     }
++
++    MachineInstr &rewriteSource(MachineInstr &CopyLike,
++                                RegSubRegPair Def, RewriteMapTy &RewriteMap);
+   };
+-  /// \brief Helper class to hold instructions that are inside recurrence
+-  /// cycles. The recurrence cycle is formulated around 1) a def operand and its
++  /// Helper class to hold instructions that are inside recurrence cycles.
++  /// The recurrence cycle is formulated around 1) a def operand and its
+   /// tied use operand, or 2) a def operand and a use operand that is commutable
+   /// with another use operand which is tied to the def operand. In the latter
+   /// case, index of the tied use operand and the commutable use operand are
+@@ -273,13 +277,13 @@ namespace {
+     Optional<IndexPair> CommutePair;
+   };
+-  /// \brief Helper class to hold a reply for ValueTracker queries. Contains the
+-  /// returned sources for a given search and the instructions where the sources
+-  /// were tracked from.
++  /// Helper class to hold a reply for ValueTracker queries.
++  /// Contains the returned sources for a given search and the instructions
++  /// where the sources were tracked from.
+   class ValueTrackerResult {
+   private:
+     /// Track all sources found by one ValueTracker query.
+-    SmallVector<TargetInstrInfo::RegSubRegPair, 2> RegSrcs;
++    SmallVector<RegSubRegPair, 2> RegSrcs;
+     /// Instruction using the sources in 'RegSrcs'.
+     const MachineInstr *Inst = nullptr;
+@@ -302,16 +306,20 @@ namespace {
+     }
+     void addSource(unsigned SrcReg, unsigned SrcSubReg) {
+-      RegSrcs.push_back(TargetInstrInfo::RegSubRegPair(SrcReg, SrcSubReg));
++      RegSrcs.push_back(RegSubRegPair(SrcReg, SrcSubReg));
+     }
+     void setSource(int Idx, unsigned SrcReg, unsigned SrcSubReg) {
+       assert(Idx < getNumSources() && "Reg pair source out of index");
+-      RegSrcs[Idx] = TargetInstrInfo::RegSubRegPair(SrcReg, SrcSubReg);
++      RegSrcs[Idx] = RegSubRegPair(SrcReg, SrcSubReg);
+     }
+     int getNumSources() const { return RegSrcs.size(); }
++    RegSubRegPair getSrc(int Idx) const {
++      return RegSrcs[Idx];
++    }
++
+     unsigned getSrcReg(int Idx) const {
+       assert(Idx < getNumSources() && "Reg source out of index");
+       return RegSrcs[Idx].Reg;
+@@ -367,59 +375,41 @@ namespace {
+     /// The register where the value can be found.
+     unsigned Reg;
+-    /// Specifiy whether or not the value tracking looks through
+-    /// complex instructions. When this is false, the value tracker
+-    /// bails on everything that is not a copy or a bitcast.
+-    ///
+-    /// Note: This could have been implemented as a specialized version of
+-    /// the ValueTracker class but that would have complicated the code of
+-    /// the users of this class.
+-    bool UseAdvancedTracking;
+-
+     /// MachineRegisterInfo used to perform tracking.
+     const MachineRegisterInfo &MRI;
+-    /// Optional TargetInstrInfo used to perform some complex
+-    /// tracking.
++    /// Optional TargetInstrInfo used to perform some complex tracking.
+     const TargetInstrInfo *TII;
+-    /// \brief Dispatcher to the right underlying implementation of
+-    /// getNextSource.
++    /// Dispatcher to the right underlying implementation of getNextSource.
+     ValueTrackerResult getNextSourceImpl();
+-    /// \brief Specialized version of getNextSource for Copy instructions.
++    /// Specialized version of getNextSource for Copy instructions.
+     ValueTrackerResult getNextSourceFromCopy();
+-    /// \brief Specialized version of getNextSource for Bitcast instructions.
++    /// Specialized version of getNextSource for Bitcast instructions.
+     ValueTrackerResult getNextSourceFromBitcast();
+-    /// \brief Specialized version of getNextSource for RegSequence
+-    /// instructions.
++    /// Specialized version of getNextSource for RegSequence instructions.
+     ValueTrackerResult getNextSourceFromRegSequence();
+-    /// \brief Specialized version of getNextSource for InsertSubreg
+-    /// instructions.
++    /// Specialized version of getNextSource for InsertSubreg instructions.
+     ValueTrackerResult getNextSourceFromInsertSubreg();
+-    /// \brief Specialized version of getNextSource for ExtractSubreg
+-    /// instructions.
++    /// Specialized version of getNextSource for ExtractSubreg instructions.
+     ValueTrackerResult getNextSourceFromExtractSubreg();
+-    /// \brief Specialized version of getNextSource for SubregToReg
+-    /// instructions.
++    /// Specialized version of getNextSource for SubregToReg instructions.
+     ValueTrackerResult getNextSourceFromSubregToReg();
+-    /// \brief Specialized version of getNextSource for PHI instructions.
++    /// Specialized version of getNextSource for PHI instructions.
+     ValueTrackerResult getNextSourceFromPHI();
+   public:
+-    /// \brief Create a ValueTracker instance for the value defined by \p Reg.
++    /// Create a ValueTracker instance for the value defined by \p Reg.
+     /// \p DefSubReg represents the sub register index the value tracker will
+     /// track. It does not need to match the sub register index used in the
+     /// definition of \p Reg.
+-    /// \p UseAdvancedTracking specifies whether or not the value tracker looks
+-    /// through complex instructions. By default (false), it handles only copy
+-    /// and bitcast instructions.
+     /// If \p Reg is a physical register, a value tracker constructed with
+     /// this constructor will not find any alternative source.
+     /// Indeed, when \p Reg is a physical register that constructor does not
+@@ -427,46 +417,20 @@ namespace {
+     /// Use the next constructor to track a physical register.
+     ValueTracker(unsigned Reg, unsigned DefSubReg,
+                  const MachineRegisterInfo &MRI,
+-                 bool UseAdvancedTracking = false,
+                  const TargetInstrInfo *TII = nullptr)
+-        : DefSubReg(DefSubReg), Reg(Reg),
+-          UseAdvancedTracking(UseAdvancedTracking), MRI(MRI), TII(TII) {
++        : DefSubReg(DefSubReg), Reg(Reg), MRI(MRI), TII(TII) {
+       if (!TargetRegisterInfo::isPhysicalRegister(Reg)) {
+         Def = MRI.getVRegDef(Reg);
+         DefIdx = MRI.def_begin(Reg).getOperandNo();
+       }
+     }
+-    /// \brief Create a ValueTracker instance for the value defined by
+-    /// the pair \p MI, \p DefIdx.
+-    /// Unlike the other constructor, the value tracker produced by this one
+-    /// may be able to find a new source when the definition is a physical
+-    /// register.
+-    /// This could be useful to rewrite target specific instructions into
+-    /// generic copy instructions.
+-    ValueTracker(const MachineInstr &MI, unsigned DefIdx, unsigned DefSubReg,
+-                 const MachineRegisterInfo &MRI,
+-                 bool UseAdvancedTracking = false,
+-                 const TargetInstrInfo *TII = nullptr)
+-        : Def(&MI), DefIdx(DefIdx), DefSubReg(DefSubReg),
+-          UseAdvancedTracking(UseAdvancedTracking), MRI(MRI), TII(TII) {
+-      assert(DefIdx < Def->getDesc().getNumDefs() &&
+-             Def->getOperand(DefIdx).isReg() && "Invalid definition");
+-      Reg = Def->getOperand(DefIdx).getReg();
+-    }
+-
+     /// \brief Following the use-def chain, get the next available source
+     /// for the tracked value.
+     /// \return A ValueTrackerResult containing a set of registers
+     /// and sub registers with tracked values. A ValueTrackerResult with
+     /// an empty set of registers means no source was found.
+     ValueTrackerResult getNextSource();
+-
+-    /// \brief Get the last register where the initial value can be found.
+-    /// Initially this is the register of the definition.
+-    /// Then, after each successful call to getNextSource, this is the
+-    /// register of the last source.
+-    unsigned getReg() const { return Reg; }
+   };
+ } // end anonymous namespace
+@@ -476,11 +440,11 @@ char PeepholeOptimizer::ID = 0;
+ char &llvm::PeepholeOptimizerID = PeepholeOptimizer::ID;
+ INITIALIZE_PASS_BEGIN(PeepholeOptimizer, DEBUG_TYPE,
+-                "Peephole Optimizations", false, false)
++                      "Peephole Optimizations", false, false)
+ INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
+ INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
+ INITIALIZE_PASS_END(PeepholeOptimizer, DEBUG_TYPE,
+-                "Peephole Optimizations", false, false)
++                    "Peephole Optimizations", false, false)
+ /// If instruction is a copy-like instruction, i.e. it reads a single register
+ /// and writes a single register and it does not modify the source, and if the
+@@ -491,10 +455,10 @@ INITIALIZE_PASS_END(PeepholeOptimizer, D
+ /// the code. Since this code does not currently share EXTRACTs, just ignore all
+ /// debug uses.
+ bool PeepholeOptimizer::
+-optimizeExtInstr(MachineInstr *MI, MachineBasicBlock *MBB,
++optimizeExtInstr(MachineInstr &MI, MachineBasicBlock &MBB,
+                  SmallPtrSetImpl<MachineInstr*> &LocalMIs) {
+   unsigned SrcReg, DstReg, SubIdx;
+-  if (!TII->isCoalescableExtInstr(*MI, SrcReg, DstReg, SubIdx))
++  if (!TII->isCoalescableExtInstr(MI, SrcReg, DstReg, SubIdx))
+     return false;
+   if (TargetRegisterInfo::isPhysicalRegister(DstReg) ||
+@@ -535,7 +499,7 @@ optimizeExtInstr(MachineInstr *MI, Machi
+   bool ExtendLife = true;
+   for (MachineOperand &UseMO : MRI->use_nodbg_operands(SrcReg)) {
+     MachineInstr *UseMI = UseMO.getParent();
+-    if (UseMI == MI)
++    if (UseMI == &MI)
+       continue;
+     if (UseMI->isPHI()) {
+@@ -568,7 +532,7 @@ optimizeExtInstr(MachineInstr *MI, Machi
+       continue;
+     MachineBasicBlock *UseMBB = UseMI->getParent();
+-    if (UseMBB == MBB) {
++    if (UseMBB == &MBB) {
+       // Local uses that come after the extension.
+       if (!LocalMIs.count(UseMI))
+         Uses.push_back(&UseMO);
+@@ -576,7 +540,7 @@ optimizeExtInstr(MachineInstr *MI, Machi
+       // Non-local uses where the result of the extension is used. Always
+       // replace these unless it's a PHI.
+       Uses.push_back(&UseMO);
+-    } else if (Aggressive && DT->dominates(MBB, UseMBB)) {
++    } else if (Aggressive && DT->dominates(&MBB, UseMBB)) {
+       // We may want to extend the live range of the extension result in order
+       // to replace these uses.
+       ExtendedUses.push_back(&UseMO);
+@@ -640,19 +604,18 @@ optimizeExtInstr(MachineInstr *MI, Machi
+ /// against already sets (or could be modified to set) the same flag as the
+ /// compare, then we can remove the comparison and use the flag from the
+ /// previous instruction.
+-bool PeepholeOptimizer::optimizeCmpInstr(MachineInstr *MI,
+-                                         MachineBasicBlock *MBB) {
++bool PeepholeOptimizer::optimizeCmpInstr(MachineInstr &MI) {
+   // If this instruction is a comparison against zero and isn't comparing a
+   // physical register, we can try to optimize it.
+   unsigned SrcReg, SrcReg2;
+   int CmpMask, CmpValue;
+-  if (!TII->analyzeCompare(*MI, SrcReg, SrcReg2, CmpMask, CmpValue) ||
++  if (!TII->analyzeCompare(MI, SrcReg, SrcReg2, CmpMask, CmpValue) ||
+       TargetRegisterInfo::isPhysicalRegister(SrcReg) ||
+       (SrcReg2 != 0 && TargetRegisterInfo::isPhysicalRegister(SrcReg2)))
+     return false;
+   // Attempt to optimize the comparison instruction.
+-  if (TII->optimizeCompareInstr(*MI, SrcReg, SrcReg2, CmpMask, CmpValue, MRI)) {
++  if (TII->optimizeCompareInstr(MI, SrcReg, SrcReg2, CmpMask, CmpValue, MRI)) {
+     ++NumCmps;
+     return true;
+   }
+@@ -661,27 +624,26 @@ bool PeepholeOptimizer::optimizeCmpInstr
+ }
+ /// Optimize a select instruction.
+-bool PeepholeOptimizer::optimizeSelect(MachineInstr *MI,
++bool PeepholeOptimizer::optimizeSelect(MachineInstr &MI,
+                             SmallPtrSetImpl<MachineInstr *> &LocalMIs) {
+   unsigned TrueOp = 0;
+   unsigned FalseOp = 0;
+   bool Optimizable = false;
+   SmallVector<MachineOperand, 4> Cond;
+-  if (TII->analyzeSelect(*MI, Cond, TrueOp, FalseOp, Optimizable))
++  if (TII->analyzeSelect(MI, Cond, TrueOp, FalseOp, Optimizable))
+     return false;
+   if (!Optimizable)
+     return false;
+-  if (!TII->optimizeSelect(*MI, LocalMIs))
++  if (!TII->optimizeSelect(MI, LocalMIs))
+     return false;
+-  MI->eraseFromParent();
++  MI.eraseFromParent();
+   ++NumSelects;
+   return true;
+ }
+-/// \brief Check if a simpler conditional branch can be
+-/// generated
+-bool PeepholeOptimizer::optimizeCondBranch(MachineInstr *MI) {
+-  return TII->optimizeCondBranch(*MI);
++/// Check if a simpler conditional branch can be generated.
++bool PeepholeOptimizer::optimizeCondBranch(MachineInstr &MI) {
++  return TII->optimizeCondBranch(MI);
+ }
+ /// \brief Try to find the next source that share the same register file
+@@ -695,30 +657,29 @@ bool PeepholeOptimizer::optimizeCondBran
+ /// share the same register file as \p Reg and \p SubReg. The client should
+ /// then be capable to rewrite all intermediate PHIs to get the next source.
+ /// \return False if no alternative sources are available. True otherwise.
+-bool PeepholeOptimizer::findNextSource(unsigned Reg, unsigned SubReg,
++bool PeepholeOptimizer::findNextSource(RegSubRegPair RegSubReg,
+                                        RewriteMapTy &RewriteMap) {
+   // Do not try to find a new source for a physical register.
+   // So far we do not have any motivating example for doing that.
+   // Thus, instead of maintaining untested code, we will revisit that if
+   // that changes at some point.
++  unsigned Reg = RegSubReg.Reg;
+   if (TargetRegisterInfo::isPhysicalRegister(Reg))
+     return false;
+   const TargetRegisterClass *DefRC = MRI->getRegClass(Reg);
+-  SmallVector<TargetInstrInfo::RegSubRegPair, 4> SrcToLook;
+-  TargetInstrInfo::RegSubRegPair CurSrcPair(Reg, SubReg);
++  SmallVector<RegSubRegPair, 4> SrcToLook;
++  RegSubRegPair CurSrcPair = RegSubReg;
+   SrcToLook.push_back(CurSrcPair);
+   unsigned PHICount = 0;
+-  while (!SrcToLook.empty() && PHICount < RewritePHILimit) {
+-    TargetInstrInfo::RegSubRegPair Pair = SrcToLook.pop_back_val();
++  do {
++    CurSrcPair = SrcToLook.pop_back_val();
+     // As explained above, do not handle physical registers
+-    if (TargetRegisterInfo::isPhysicalRegister(Pair.Reg))
++    if (TargetRegisterInfo::isPhysicalRegister(CurSrcPair.Reg))
+       return false;
+-    CurSrcPair = Pair;
+-    ValueTracker ValTracker(CurSrcPair.Reg, CurSrcPair.SubReg, *MRI,
+-                            !DisableAdvCopyOpt, TII);
++    ValueTracker ValTracker(CurSrcPair.Reg, CurSrcPair.SubReg, *MRI, TII);
+     // Follow the chain of copies until we find a more suitable source, a phi
+     // or have to abort.
+@@ -747,14 +708,17 @@ bool PeepholeOptimizer::findNextSource(u
+       unsigned NumSrcs = Res.getNumSources();
+       if (NumSrcs > 1) {
+         PHICount++;
++        if (PHICount >= RewritePHILimit) {
++          DEBUG(dbgs() << "findNextSource: PHI limit reached\n");
++          return false;
++        }
++
+         for (unsigned i = 0; i < NumSrcs; ++i)
+-          SrcToLook.push_back(TargetInstrInfo::RegSubRegPair(
+-              Res.getSrcReg(i), Res.getSrcSubReg(i)));
++          SrcToLook.push_back(Res.getSrc(i));
+         break;
+       }
+-      CurSrcPair.Reg = Res.getSrcReg(0);
+-      CurSrcPair.SubReg = Res.getSrcSubReg(0);
++      CurSrcPair = Res.getSrc(0);
+       // Do not extend the live-ranges of physical registers as they add
+       // constraints to the register allocator. Moreover, if we want to extend
+       // the live-range of a physical register, unlike SSA virtual register,
+@@ -764,7 +728,8 @@ bool PeepholeOptimizer::findNextSource(u
+       // Keep following the chain if the value isn't any better yet.
+       const TargetRegisterClass *SrcRC = MRI->getRegClass(CurSrcPair.Reg);
+-      if (!TRI->shouldRewriteCopySrc(DefRC, SubReg, SrcRC, CurSrcPair.SubReg))
++      if (!TRI->shouldRewriteCopySrc(DefRC, RegSubReg.SubReg, SrcRC,
++                                     CurSrcPair.SubReg))
+         continue;
+       // We currently cannot deal with subreg operands on PHI instructions
+@@ -775,7 +740,7 @@ bool PeepholeOptimizer::findNextSource(u
+       // We found a suitable source, and are done with this chain.
+       break;
+     }
+-  }
++  } while (!SrcToLook.empty());
+   // If we did not find a more suitable source, there is nothing to optimize.
+   return CurSrcPair.Reg != Reg;
+@@ -786,54 +751,50 @@ bool PeepholeOptimizer::findNextSource(u
+ /// successfully traverse a PHI instruction and find suitable sources coming
+ /// from its edges. By inserting a new PHI, we provide a rewritten PHI def
+ /// suitable to be used in a new COPY instruction.
+-static MachineInstr *
+-insertPHI(MachineRegisterInfo *MRI, const TargetInstrInfo *TII,
+-          const SmallVectorImpl<TargetInstrInfo::RegSubRegPair> &SrcRegs,
+-          MachineInstr *OrigPHI) {
++static MachineInstr &
++insertPHI(MachineRegisterInfo &MRI, const TargetInstrInfo &TII,
++          const SmallVectorImpl<RegSubRegPair> &SrcRegs,
++          MachineInstr &OrigPHI) {
+   assert(!SrcRegs.empty() && "No sources to create a PHI instruction?");
+-  const TargetRegisterClass *NewRC = MRI->getRegClass(SrcRegs[0].Reg);
++  const TargetRegisterClass *NewRC = MRI.getRegClass(SrcRegs[0].Reg);
+   // NewRC is only correct if no subregisters are involved. findNextSource()
+   // should have rejected those cases already.
+   assert(SrcRegs[0].SubReg == 0 && "should not have subreg operand");
+-  unsigned NewVR = MRI->createVirtualRegister(NewRC);
+-  MachineBasicBlock *MBB = OrigPHI->getParent();
+-  MachineInstrBuilder MIB = BuildMI(*MBB, OrigPHI, OrigPHI->getDebugLoc(),
+-                                    TII->get(TargetOpcode::PHI), NewVR);
++  unsigned NewVR = MRI.createVirtualRegister(NewRC);
++  MachineBasicBlock *MBB = OrigPHI.getParent();
++  MachineInstrBuilder MIB = BuildMI(*MBB, &OrigPHI, OrigPHI.getDebugLoc(),
++                                    TII.get(TargetOpcode::PHI), NewVR);
+   unsigned MBBOpIdx = 2;
+-  for (auto RegPair : SrcRegs) {
++  for (const RegSubRegPair &RegPair : SrcRegs) {
+     MIB.addReg(RegPair.Reg, 0, RegPair.SubReg);
+-    MIB.addMBB(OrigPHI->getOperand(MBBOpIdx).getMBB());
++    MIB.addMBB(OrigPHI.getOperand(MBBOpIdx).getMBB());
+     // Since we're extended the lifetime of RegPair.Reg, clear the
+     // kill flags to account for that and make RegPair.Reg reaches
+     // the new PHI.
+-    MRI->clearKillFlags(RegPair.Reg);
++    MRI.clearKillFlags(RegPair.Reg);
+     MBBOpIdx += 2;
+   }
+-  return MIB;
++  return *MIB;
+ }
+ namespace {
+-/// \brief Helper class to rewrite the arguments of a copy-like instruction.
+-class CopyRewriter {
++/// Interface to query instructions amenable to copy rewriting.
++class Rewriter {
+ protected:
+-  /// The copy-like instruction.
+   MachineInstr &CopyLike;
+-
+-  /// The index of the source being rewritten.
+-  unsigned CurrentSrcIdx = 0;
+-
++  unsigned CurrentSrcIdx = 0;   ///< The index of the source being rewritten.
+ public:
+-  CopyRewriter(MachineInstr &MI) : CopyLike(MI) {}
+-  virtual ~CopyRewriter() = default;
++  Rewriter(MachineInstr &CopyLike) : CopyLike(CopyLike) {}
++  virtual ~Rewriter() {}
+   /// \brief Get the next rewritable source (SrcReg, SrcSubReg) and
+-  /// the related value that it affects (TrackReg, TrackSubReg).
++  /// the related value that it affects (DstReg, DstSubReg).
+   /// A source is considered rewritable if its register class and the
+-  /// register class of the related TrackReg may not be register
++  /// register class of the related DstReg may not be register
+   /// coalescer friendly. In other words, given a copy-like instruction
+   /// not all the arguments may be returned at rewritable source, since
+   /// some arguments are none to be register coalescer friendly.
+@@ -848,137 +809,72 @@ public:
+   /// the only source this instruction has:
+   /// (SrcReg, SrcSubReg) = (src, srcSubIdx).
+   /// This source defines the whole definition, i.e.,
+-  /// (TrackReg, TrackSubReg) = (dst, dstSubIdx).
++  /// (DstReg, DstSubReg) = (dst, dstSubIdx).
+   ///
+   /// The second and subsequent calls will return false, as there is only one
+   /// rewritable source.
+   ///
+   /// \return True if a rewritable source has been found, false otherwise.
+   /// The output arguments are valid if and only if true is returned.
+-  virtual bool getNextRewritableSource(unsigned &SrcReg, unsigned &SrcSubReg,
+-                                       unsigned &TrackReg,
+-                                       unsigned &TrackSubReg) {
+-    // If CurrentSrcIdx == 1, this means this function has already been called
+-    // once. CopyLike has one definition and one argument, thus, there is
+-    // nothing else to rewrite.
+-    if (!CopyLike.isCopy() || CurrentSrcIdx == 1)
++  virtual bool getNextRewritableSource(RegSubRegPair &Src,
++                                       RegSubRegPair &Dst) = 0;
++
++  /// Rewrite the current source with \p NewReg and \p NewSubReg if possible.
++  /// \return True if the rewriting was possible, false otherwise.
++  virtual bool RewriteCurrentSource(unsigned NewReg, unsigned NewSubReg) = 0;
++};
++
++/// Rewriter for COPY instructions.
++class CopyRewriter : public Rewriter {
++public:
++  CopyRewriter(MachineInstr &MI) : Rewriter(MI) {
++    assert(MI.isCopy() && "Expected copy instruction");
++  }
++  virtual ~CopyRewriter() = default;
++
++  bool getNextRewritableSource(RegSubRegPair &Src,
++                               RegSubRegPair &Dst) override {
++    // CurrentSrcIdx > 0 means this function has already been called.
++    if (CurrentSrcIdx > 0)
+       return false;
+     // This is the first call to getNextRewritableSource.
+     // Move the CurrentSrcIdx to remember that we made that call.
+     CurrentSrcIdx = 1;
+     // The rewritable source is the argument.
+     const MachineOperand &MOSrc = CopyLike.getOperand(1);
+-    SrcReg = MOSrc.getReg();
+-    SrcSubReg = MOSrc.getSubReg();
++    Src = RegSubRegPair(MOSrc.getReg(), MOSrc.getSubReg());
+     // What we track are the alternative sources of the definition.
+     const MachineOperand &MODef = CopyLike.getOperand(0);
+-    TrackReg = MODef.getReg();
+-    TrackSubReg = MODef.getSubReg();
++    Dst = RegSubRegPair(MODef.getReg(), MODef.getSubReg());
+     return true;
+   }
+-  /// \brief Rewrite the current source with \p NewReg and \p NewSubReg
+-  /// if possible.
+-  /// \return True if the rewriting was possible, false otherwise.
+-  virtual bool RewriteCurrentSource(unsigned NewReg, unsigned NewSubReg) {
+-    if (!CopyLike.isCopy() || CurrentSrcIdx != 1)
++  bool RewriteCurrentSource(unsigned NewReg, unsigned NewSubReg) override {
++    if (CurrentSrcIdx != 1)
+       return false;
+     MachineOperand &MOSrc = CopyLike.getOperand(CurrentSrcIdx);
+     MOSrc.setReg(NewReg);
+     MOSrc.setSubReg(NewSubReg);
+     return true;
+   }
+-
+-  /// \brief Given a \p Def.Reg and Def.SubReg  pair, use \p RewriteMap to find
+-  /// the new source to use for rewrite. If \p HandleMultipleSources is true and
+-  /// multiple sources for a given \p Def are found along the way, we found a
+-  /// PHI instructions that needs to be rewritten.
+-  /// TODO: HandleMultipleSources should be removed once we test PHI handling
+-  /// with coalescable copies.
+-  TargetInstrInfo::RegSubRegPair
+-  getNewSource(MachineRegisterInfo *MRI, const TargetInstrInfo *TII,
+-               TargetInstrInfo::RegSubRegPair Def,
+-               PeepholeOptimizer::RewriteMapTy &RewriteMap,
+-               bool HandleMultipleSources = true) {
+-    TargetInstrInfo::RegSubRegPair LookupSrc(Def.Reg, Def.SubReg);
+-    do {
+-      ValueTrackerResult Res = RewriteMap.lookup(LookupSrc);
+-      // If there are no entries on the map, LookupSrc is the new source.
+-      if (!Res.isValid())
+-        return LookupSrc;
+-
+-      // There's only one source for this definition, keep searching...
+-      unsigned NumSrcs = Res.getNumSources();
+-      if (NumSrcs == 1) {
+-        LookupSrc.Reg = Res.getSrcReg(0);
+-        LookupSrc.SubReg = Res.getSrcSubReg(0);
+-        continue;
+-      }
+-
+-      // TODO: Remove once multiple srcs w/ coalescable copies are supported.
+-      if (!HandleMultipleSources)
+-        break;
+-
+-      // Multiple sources, recurse into each source to find a new source
+-      // for it. Then, rewrite the PHI accordingly to its new edges.
+-      SmallVector<TargetInstrInfo::RegSubRegPair, 4> NewPHISrcs;
+-      for (unsigned i = 0; i < NumSrcs; ++i) {
+-        TargetInstrInfo::RegSubRegPair PHISrc(Res.getSrcReg(i),
+-                                              Res.getSrcSubReg(i));
+-        NewPHISrcs.push_back(
+-            getNewSource(MRI, TII, PHISrc, RewriteMap, HandleMultipleSources));
+-      }
+-
+-      // Build the new PHI node and return its def register as the new source.
+-      MachineInstr *OrigPHI = const_cast<MachineInstr *>(Res.getInst());
+-      MachineInstr *NewPHI = insertPHI(MRI, TII, NewPHISrcs, OrigPHI);
+-      DEBUG(dbgs() << "-- getNewSource\n");
+-      DEBUG(dbgs() << "   Replacing: " << *OrigPHI);
+-      DEBUG(dbgs() << "        With: " << *NewPHI);
+-      const MachineOperand &MODef = NewPHI->getOperand(0);
+-      return TargetInstrInfo::RegSubRegPair(MODef.getReg(), MODef.getSubReg());
+-
+-    } while (true);
+-
+-    return TargetInstrInfo::RegSubRegPair(0, 0);
+-  }
+-
+-  /// \brief Rewrite the source found through \p Def, by using the \p RewriteMap
+-  /// and create a new COPY instruction. More info about RewriteMap in
+-  /// PeepholeOptimizer::findNextSource. Right now this is only used to handle
+-  /// Uncoalescable copies, since they are copy like instructions that aren't
+-  /// recognized by the register allocator.
+-  virtual MachineInstr *
+-  RewriteSource(TargetInstrInfo::RegSubRegPair Def,
+-                PeepholeOptimizer::RewriteMapTy &RewriteMap) {
+-    return nullptr;
+-  }
+ };
+ /// \brief Helper class to rewrite uncoalescable copy like instructions
+ /// into new COPY (coalescable friendly) instructions.
+-class UncoalescableRewriter : public CopyRewriter {
+-protected:
+-  const TargetInstrInfo &TII;
+-  MachineRegisterInfo   &MRI;
+-
+-  /// The number of defs in the bitcast
+-  unsigned NumDefs;
++class UncoalescableRewriter : public Rewriter {
++  unsigned NumDefs;  ///< Number of defs in the bitcast.
+ public:
+-  UncoalescableRewriter(MachineInstr &MI, const TargetInstrInfo &TII,
+-                         MachineRegisterInfo &MRI)
+-      : CopyRewriter(MI), TII(TII), MRI(MRI) {
++  UncoalescableRewriter(MachineInstr &MI) : Rewriter(MI) {
+     NumDefs = MI.getDesc().getNumDefs();
+   }
+-  /// \brief Get the next rewritable def source (TrackReg, TrackSubReg)
++  /// \see See Rewriter::getNextRewritableSource()
+   /// All such sources need to be considered rewritable in order to
+   /// rewrite a uncoalescable copy-like instruction. This method return
+   /// each definition that must be checked if rewritable.
+-  bool getNextRewritableSource(unsigned &SrcReg, unsigned &SrcSubReg,
+-                               unsigned &TrackReg,
+-                               unsigned &TrackSubReg) override {
++  bool getNextRewritableSource(RegSubRegPair &Src,
++                               RegSubRegPair &Dst) override {
+     // Find the next non-dead definition and continue from there.
+     if (CurrentSrcIdx == NumDefs)
+       return false;
+@@ -990,64 +886,27 @@ public:
+     }
+     // What we track are the alternative sources of the definition.
++    Src = RegSubRegPair(0, 0);
+     const MachineOperand &MODef = CopyLike.getOperand(CurrentSrcIdx);
+-    TrackReg = MODef.getReg();
+-    TrackSubReg = MODef.getSubReg();
++    Dst = RegSubRegPair(MODef.getReg(), MODef.getSubReg());
+     CurrentSrcIdx++;
+     return true;
+   }
+-  /// \brief Rewrite the source found through \p Def, by using the \p RewriteMap
+-  /// and create a new COPY instruction. More info about RewriteMap in
+-  /// PeepholeOptimizer::findNextSource. Right now this is only used to handle
+-  /// Uncoalescable copies, since they are copy like instructions that aren't
+-  /// recognized by the register allocator.
+-  MachineInstr *
+-  RewriteSource(TargetInstrInfo::RegSubRegPair Def,
+-                PeepholeOptimizer::RewriteMapTy &RewriteMap) override {
+-    assert(!TargetRegisterInfo::isPhysicalRegister(Def.Reg) &&
+-           "We do not rewrite physical registers");
+-
+-    // Find the new source to use in the COPY rewrite.
+-    TargetInstrInfo::RegSubRegPair NewSrc =
+-        getNewSource(&MRI, &TII, Def, RewriteMap);
+-
+-    // Insert the COPY.
+-    const TargetRegisterClass *DefRC = MRI.getRegClass(Def.Reg);
+-    unsigned NewVR = MRI.createVirtualRegister(DefRC);
+-
+-    MachineInstr *NewCopy =
+-        BuildMI(*CopyLike.getParent(), &CopyLike, CopyLike.getDebugLoc(),
+-                TII.get(TargetOpcode::COPY), NewVR)
+-            .addReg(NewSrc.Reg, 0, NewSrc.SubReg);
+-
+-    NewCopy->getOperand(0).setSubReg(Def.SubReg);
+-    if (Def.SubReg)
+-      NewCopy->getOperand(0).setIsUndef();
+-
+-    DEBUG(dbgs() << "-- RewriteSource\n");
+-    DEBUG(dbgs() << "   Replacing: " << CopyLike);
+-    DEBUG(dbgs() << "        With: " << *NewCopy);
+-    MRI.replaceRegWith(Def.Reg, NewVR);
+-    MRI.clearKillFlags(NewVR);
+-
+-    // We extended the lifetime of NewSrc.Reg, clear the kill flags to
+-    // account for that.
+-    MRI.clearKillFlags(NewSrc.Reg);
+-
+-    return NewCopy;
++  bool RewriteCurrentSource(unsigned NewReg, unsigned NewSubReg) override {
++    return false;
+   }
+ };
+-/// \brief Specialized rewriter for INSERT_SUBREG instruction.
+-class InsertSubregRewriter : public CopyRewriter {
++/// Specialized rewriter for INSERT_SUBREG instruction.
++class InsertSubregRewriter : public Rewriter {
+ public:
+-  InsertSubregRewriter(MachineInstr &MI) : CopyRewriter(MI) {
++  InsertSubregRewriter(MachineInstr &MI) : Rewriter(MI) {
+     assert(MI.isInsertSubreg() && "Invalid instruction");
+   }
+-  /// \brief See CopyRewriter::getNextRewritableSource.
++  /// \see See Rewriter::getNextRewritableSource()
+   /// Here CopyLike has the following form:
+   /// dst = INSERT_SUBREG Src1, Src2.src2SubIdx, subIdx.
+   /// Src1 has the same register class has dst, hence, there is
+@@ -1055,29 +914,27 @@ public:
+   /// Src2.src2SubIdx, may not be register coalescer friendly.
+   /// Therefore, the first call to this method returns:
+   /// (SrcReg, SrcSubReg) = (Src2, src2SubIdx).
+-  /// (TrackReg, TrackSubReg) = (dst, subIdx).
++  /// (DstReg, DstSubReg) = (dst, subIdx).
+   ///
+   /// Subsequence calls will return false.
+-  bool getNextRewritableSource(unsigned &SrcReg, unsigned &SrcSubReg,
+-                               unsigned &TrackReg,
+-                               unsigned &TrackSubReg) override {
++  bool getNextRewritableSource(RegSubRegPair &Src,
++                               RegSubRegPair &Dst) override {
+     // If we already get the only source we can rewrite, return false.
+     if (CurrentSrcIdx == 2)
+       return false;
+     // We are looking at v2 = INSERT_SUBREG v0, v1, sub0.
+     CurrentSrcIdx = 2;
+     const MachineOperand &MOInsertedReg = CopyLike.getOperand(2);
+-    SrcReg = MOInsertedReg.getReg();
+-    SrcSubReg = MOInsertedReg.getSubReg();
++    Src = RegSubRegPair(MOInsertedReg.getReg(), MOInsertedReg.getSubReg());
+     const MachineOperand &MODef = CopyLike.getOperand(0);
+     // We want to track something that is compatible with the
+     // partial definition.
+-    TrackReg = MODef.getReg();
+     if (MODef.getSubReg())
+       // Bail if we have to compose sub-register indices.
+       return false;
+-    TrackSubReg = (unsigned)CopyLike.getOperand(3).getImm();
++    Dst = RegSubRegPair(MODef.getReg(),
++                        (unsigned)CopyLike.getOperand(3).getImm());
+     return true;
+   }
+@@ -1092,41 +949,39 @@ public:
+   }
+ };
+-/// \brief Specialized rewriter for EXTRACT_SUBREG instruction.
+-class ExtractSubregRewriter : public CopyRewriter {
++/// Specialized rewriter for EXTRACT_SUBREG instruction.
++class ExtractSubregRewriter : public Rewriter {
+   const TargetInstrInfo &TII;
+ public:
+   ExtractSubregRewriter(MachineInstr &MI, const TargetInstrInfo &TII)
+-      : CopyRewriter(MI), TII(TII) {
++      : Rewriter(MI), TII(TII) {
+     assert(MI.isExtractSubreg() && "Invalid instruction");
+   }
+-  /// \brief See CopyRewriter::getNextRewritableSource.
++  /// \see Rewriter::getNextRewritableSource()
+   /// Here CopyLike has the following form:
+   /// dst.dstSubIdx = EXTRACT_SUBREG Src, subIdx.
+   /// There is only one rewritable source: Src.subIdx,
+   /// which defines dst.dstSubIdx.
+-  bool getNextRewritableSource(unsigned &SrcReg, unsigned &SrcSubReg,
+-                               unsigned &TrackReg,
+-                               unsigned &TrackSubReg) override {
++  bool getNextRewritableSource(RegSubRegPair &Src,
++                               RegSubRegPair &Dst) override {
+     // If we already get the only source we can rewrite, return false.
+     if (CurrentSrcIdx == 1)
+       return false;
+     // We are looking at v1 = EXTRACT_SUBREG v0, sub0.
+     CurrentSrcIdx = 1;
+     const MachineOperand &MOExtractedReg = CopyLike.getOperand(1);
+-    SrcReg = MOExtractedReg.getReg();
+     // If we have to compose sub-register indices, bail out.
+     if (MOExtractedReg.getSubReg())
+       return false;
+-    SrcSubReg = CopyLike.getOperand(2).getImm();
++    Src = RegSubRegPair(MOExtractedReg.getReg(),
++                        CopyLike.getOperand(2).getImm());
+     // We want to track something that is compatible with the definition.
+     const MachineOperand &MODef = CopyLike.getOperand(0);
+-    TrackReg = MODef.getReg();
+-    TrackSubReg = MODef.getSubReg();
++    Dst = RegSubRegPair(MODef.getReg(), MODef.getSubReg());
+     return true;
+   }
+@@ -1156,14 +1011,14 @@ public:
+   }
+ };
+-/// \brief Specialized rewriter for REG_SEQUENCE instruction.
+-class RegSequenceRewriter : public CopyRewriter {
++/// Specialized rewriter for REG_SEQUENCE instruction.
++class RegSequenceRewriter : public Rewriter {
+ public:
+-  RegSequenceRewriter(MachineInstr &MI) : CopyRewriter(MI) {
++  RegSequenceRewriter(MachineInstr &MI) : Rewriter(MI) {
+     assert(MI.isRegSequence() && "Invalid instruction");
+   }
+-  /// \brief See CopyRewriter::getNextRewritableSource.
++  /// \see Rewriter::getNextRewritableSource()
+   /// Here CopyLike has the following form:
+   /// dst = REG_SEQUENCE Src1.src1SubIdx, subIdx1, Src2.src2SubIdx, subIdx2.
+   /// Each call will return a different source, walking all the available
+@@ -1171,17 +1026,16 @@ public:
+   ///
+   /// The first call returns:
+   /// (SrcReg, SrcSubReg) = (Src1, src1SubIdx).
+-  /// (TrackReg, TrackSubReg) = (dst, subIdx1).
++  /// (DstReg, DstSubReg) = (dst, subIdx1).
+   ///
+   /// The second call returns:
+   /// (SrcReg, SrcSubReg) = (Src2, src2SubIdx).
+-  /// (TrackReg, TrackSubReg) = (dst, subIdx2).
++  /// (DstReg, DstSubReg) = (dst, subIdx2).
+   ///
+   /// And so on, until all the sources have been traversed, then
+   /// it returns false.
+-  bool getNextRewritableSource(unsigned &SrcReg, unsigned &SrcSubReg,
+-                               unsigned &TrackReg,
+-                               unsigned &TrackSubReg) override {
++  bool getNextRewritableSource(RegSubRegPair &Src,
++                               RegSubRegPair &Dst) override {
+     // We are looking at v0 = REG_SEQUENCE v1, sub1, v2, sub2, etc.
+     // If this is the first call, move to the first argument.
+@@ -1194,17 +1048,17 @@ public:
+         return false;
+     }
+     const MachineOperand &MOInsertedReg = CopyLike.getOperand(CurrentSrcIdx);
+-    SrcReg = MOInsertedReg.getReg();
++    Src.Reg = MOInsertedReg.getReg();
+     // If we have to compose sub-register indices, bail out.
+-    if ((SrcSubReg = MOInsertedReg.getSubReg()))
++    if ((Src.SubReg = MOInsertedReg.getSubReg()))
+       return false;
+     // We want to track something that is compatible with the related
+     // partial definition.
+-    TrackSubReg = CopyLike.getOperand(CurrentSrcIdx + 1).getImm();
++    Dst.SubReg = CopyLike.getOperand(CurrentSrcIdx + 1).getImm();
+     const MachineOperand &MODef = CopyLike.getOperand(0);
+-    TrackReg = MODef.getReg();
++    Dst.Reg = MODef.getReg();
+     // If we have to compose sub-registers, bail.
+     return MODef.getSubReg() == 0;
+   }
+@@ -1224,16 +1078,14 @@ public:
+ } // end anonymous namespace
+-/// \brief Get the appropriated CopyRewriter for \p MI.
+-/// \return A pointer to a dynamically allocated CopyRewriter or nullptr
+-/// if no rewriter works for \p MI.
+-static CopyRewriter *getCopyRewriter(MachineInstr &MI,
+-                                     const TargetInstrInfo &TII,
+-                                     MachineRegisterInfo &MRI) {
++/// Get the appropriated Rewriter for \p MI.
++/// \return A pointer to a dynamically allocated Rewriter or nullptr if no
++/// rewriter works for \p MI.
++static Rewriter *getCopyRewriter(MachineInstr &MI, const TargetInstrInfo &TII) {
+   // Handle uncoalescable copy-like instructions.
+-  if (MI.isBitcast() || (MI.isRegSequenceLike() || MI.isInsertSubregLike() ||
+-                         MI.isExtractSubregLike()))
+-    return new UncoalescableRewriter(MI, TII, MRI);
++  if (MI.isBitcast() || MI.isRegSequenceLike() || MI.isInsertSubregLike() ||
++      MI.isExtractSubregLike())
++    return new UncoalescableRewriter(MI);
+   switch (MI.getOpcode()) {
+   default:
+@@ -1247,53 +1099,102 @@ static CopyRewriter *getCopyRewriter(Mac
+   case TargetOpcode::REG_SEQUENCE:
+     return new RegSequenceRewriter(MI);
+   }
+-  llvm_unreachable(nullptr);
+ }
+-/// \brief Optimize generic copy instructions to avoid cross
+-/// register bank copy. The optimization looks through a chain of
+-/// copies and tries to find a source that has a compatible register
+-/// class.
+-/// Two register classes are considered to be compatible if they share
+-/// the same register bank.
++/// \brief Given a \p Def.Reg and Def.SubReg  pair, use \p RewriteMap to find
++/// the new source to use for rewrite. If \p HandleMultipleSources is true and
++/// multiple sources for a given \p Def are found along the way, we found a
++/// PHI instructions that needs to be rewritten.
++/// TODO: HandleMultipleSources should be removed once we test PHI handling
++/// with coalescable copies.
++static RegSubRegPair
++getNewSource(MachineRegisterInfo *MRI, const TargetInstrInfo *TII,
++             RegSubRegPair Def,
++             const PeepholeOptimizer::RewriteMapTy &RewriteMap,
++             bool HandleMultipleSources = true) {
++  RegSubRegPair LookupSrc(Def.Reg, Def.SubReg);
++  while (true) {
++    ValueTrackerResult Res = RewriteMap.lookup(LookupSrc);
++    // If there are no entries on the map, LookupSrc is the new source.
++    if (!Res.isValid())
++      return LookupSrc;
++
++    // There's only one source for this definition, keep searching...
++    unsigned NumSrcs = Res.getNumSources();
++    if (NumSrcs == 1) {
++      LookupSrc.Reg = Res.getSrcReg(0);
++      LookupSrc.SubReg = Res.getSrcSubReg(0);
++      continue;
++    }
++
++    // TODO: Remove once multiple srcs w/ coalescable copies are supported.
++    if (!HandleMultipleSources)
++      break;
++
++    // Multiple sources, recurse into each source to find a new source
++    // for it. Then, rewrite the PHI accordingly to its new edges.
++    SmallVector<RegSubRegPair, 4> NewPHISrcs;
++    for (unsigned i = 0; i < NumSrcs; ++i) {
++      RegSubRegPair PHISrc(Res.getSrcReg(i), Res.getSrcSubReg(i));
++      NewPHISrcs.push_back(
++          getNewSource(MRI, TII, PHISrc, RewriteMap, HandleMultipleSources));
++    }
++
++    // Build the new PHI node and return its def register as the new source.
++    MachineInstr &OrigPHI = const_cast<MachineInstr &>(*Res.getInst());
++    MachineInstr &NewPHI = insertPHI(*MRI, *TII, NewPHISrcs, OrigPHI);
++    DEBUG(dbgs() << "-- getNewSource\n");
++    DEBUG(dbgs() << "   Replacing: " << OrigPHI);
++    DEBUG(dbgs() << "        With: " << NewPHI);
++    const MachineOperand &MODef = NewPHI.getOperand(0);
++    return RegSubRegPair(MODef.getReg(), MODef.getSubReg());
++  }
++
++  return RegSubRegPair(0, 0);
++}
++
++/// Optimize generic copy instructions to avoid cross register bank copy.
++/// The optimization looks through a chain of copies and tries to find a source
++/// that has a compatible register class.
++/// Two register classes are considered to be compatible if they share the same
++/// register bank.
+ /// New copies issued by this optimization are register allocator
+ /// friendly. This optimization does not remove any copy as it may
+ /// overconstrain the register allocator, but replaces some operands
+ /// when possible.
+ /// \pre isCoalescableCopy(*MI) is true.
+ /// \return True, when \p MI has been rewritten. False otherwise.
+-bool PeepholeOptimizer::optimizeCoalescableCopy(MachineInstr *MI) {
+-  assert(MI && isCoalescableCopy(*MI) && "Invalid argument");
+-  assert(MI->getDesc().getNumDefs() == 1 &&
++bool PeepholeOptimizer::optimizeCoalescableCopy(MachineInstr &MI) {
++  assert(isCoalescableCopy(MI) && "Invalid argument");
++  assert(MI.getDesc().getNumDefs() == 1 &&
+          "Coalescer can understand multiple defs?!");
+-  const MachineOperand &MODef = MI->getOperand(0);
++  const MachineOperand &MODef = MI.getOperand(0);
+   // Do not rewrite physical definitions.
+   if (TargetRegisterInfo::isPhysicalRegister(MODef.getReg()))
+     return false;
+   bool Changed = false;
+   // Get the right rewriter for the current copy.
+-  std::unique_ptr<CopyRewriter> CpyRewriter(getCopyRewriter(*MI, *TII, *MRI));
++  std::unique_ptr<Rewriter> CpyRewriter(getCopyRewriter(MI, *TII));
+   // If none exists, bail out.
+   if (!CpyRewriter)
+     return false;
+   // Rewrite each rewritable source.
+-  unsigned SrcReg, SrcSubReg, TrackReg, TrackSubReg;
+-  while (CpyRewriter->getNextRewritableSource(SrcReg, SrcSubReg, TrackReg,
+-                                              TrackSubReg)) {
++  RegSubRegPair Src;
++  RegSubRegPair TrackPair;
++  while (CpyRewriter->getNextRewritableSource(Src, TrackPair)) {
+     // Keep track of PHI nodes and its incoming edges when looking for sources.
+     RewriteMapTy RewriteMap;
+     // Try to find a more suitable source. If we failed to do so, or get the
+     // actual source, move to the next source.
+-    if (!findNextSource(TrackReg, TrackSubReg, RewriteMap))
++    if (!findNextSource(TrackPair, RewriteMap))
+       continue;
+     // Get the new source to rewrite. TODO: Only enable handling of multiple
+     // sources (PHIs) once we have a motivating example and testcases for it.
+-    TargetInstrInfo::RegSubRegPair TrackPair(TrackReg, TrackSubReg);
+-    TargetInstrInfo::RegSubRegPair NewSrc = CpyRewriter->getNewSource(
+-        MRI, TII, TrackPair, RewriteMap, false /* multiple sources */);
+-    if (SrcReg == NewSrc.Reg || NewSrc.Reg == 0)
++    RegSubRegPair NewSrc = getNewSource(MRI, TII, TrackPair, RewriteMap,
++                                        /*HandleMultipleSources=*/false);
++    if (Src.Reg == NewSrc.Reg || NewSrc.Reg == 0)
+       continue;
+     // Rewrite source.
+@@ -1312,6 +1213,47 @@ bool PeepholeOptimizer::optimizeCoalesca
+   return Changed;
+ }
++/// \brief Rewrite the source found through \p Def, by using the \p RewriteMap
++/// and create a new COPY instruction. More info about RewriteMap in
++/// PeepholeOptimizer::findNextSource. Right now this is only used to handle
++/// Uncoalescable copies, since they are copy like instructions that aren't
++/// recognized by the register allocator.
++MachineInstr &
++PeepholeOptimizer::rewriteSource(MachineInstr &CopyLike,
++                                 RegSubRegPair Def, RewriteMapTy &RewriteMap) {
++  assert(!TargetRegisterInfo::isPhysicalRegister(Def.Reg) &&
++         "We do not rewrite physical registers");
++
++  // Find the new source to use in the COPY rewrite.
++  RegSubRegPair NewSrc = getNewSource(MRI, TII, Def, RewriteMap);
++
++  // Insert the COPY.
++  const TargetRegisterClass *DefRC = MRI->getRegClass(Def.Reg);
++  unsigned NewVReg = MRI->createVirtualRegister(DefRC);
++
++  MachineInstr *NewCopy =
++      BuildMI(*CopyLike.getParent(), &CopyLike, CopyLike.getDebugLoc(),
++              TII->get(TargetOpcode::COPY), NewVReg)
++          .addReg(NewSrc.Reg, 0, NewSrc.SubReg);
++
++  if (Def.SubReg) {
++    NewCopy->getOperand(0).setSubReg(Def.SubReg);
++    NewCopy->getOperand(0).setIsUndef();
++  }
++
++  DEBUG(dbgs() << "-- RewriteSource\n");
++  DEBUG(dbgs() << "   Replacing: " << CopyLike);
++  DEBUG(dbgs() << "        With: " << *NewCopy);
++  MRI->replaceRegWith(Def.Reg, NewVReg);
++  MRI->clearKillFlags(NewVReg);
++
++  // We extended the lifetime of NewSrc.Reg, clear the kill flags to
++  // account for that.
++  MRI->clearKillFlags(NewSrc.Reg);
++
++  return *NewCopy;
++}
++
+ /// \brief Optimize copy-like instructions to create
+ /// register coalescer friendly instruction.
+ /// The optimization tries to kill-off the \p MI by looking
+@@ -1324,48 +1266,40 @@ bool PeepholeOptimizer::optimizeCoalesca
+ /// been removed from its parent.
+ /// All COPY instructions created, are inserted in \p LocalMIs.
+ bool PeepholeOptimizer::optimizeUncoalescableCopy(
+-    MachineInstr *MI, SmallPtrSetImpl<MachineInstr *> &LocalMIs) {
+-  assert(MI && isUncoalescableCopy(*MI) && "Invalid argument");
+-
+-  // Check if we can rewrite all the values defined by this instruction.
+-  SmallVector<TargetInstrInfo::RegSubRegPair, 4> RewritePairs;
+-  // Get the right rewriter for the current copy.
+-  std::unique_ptr<CopyRewriter> CpyRewriter(getCopyRewriter(*MI, *TII, *MRI));
+-  // If none exists, bail out.
+-  if (!CpyRewriter)
+-    return false;
++    MachineInstr &MI, SmallPtrSetImpl<MachineInstr *> &LocalMIs) {
++  assert(isUncoalescableCopy(MI) && "Invalid argument");
++  UncoalescableRewriter CpyRewriter(MI);
+   // Rewrite each rewritable source by generating new COPYs. This works
+   // differently from optimizeCoalescableCopy since it first makes sure that all
+   // definitions can be rewritten.
+   RewriteMapTy RewriteMap;
+-  unsigned Reg, SubReg, CopyDefReg, CopyDefSubReg;
+-  while (CpyRewriter->getNextRewritableSource(Reg, SubReg, CopyDefReg,
+-                                              CopyDefSubReg)) {
++  RegSubRegPair Src;
++  RegSubRegPair Def;
++  SmallVector<RegSubRegPair, 4> RewritePairs;
++  while (CpyRewriter.getNextRewritableSource(Src, Def)) {
+     // If a physical register is here, this is probably for a good reason.
+     // Do not rewrite that.
+-    if (TargetRegisterInfo::isPhysicalRegister(CopyDefReg))
++    if (TargetRegisterInfo::isPhysicalRegister(Def.Reg))
+       return false;
+     // If we do not know how to rewrite this definition, there is no point
+     // in trying to kill this instruction.
+-    TargetInstrInfo::RegSubRegPair Def(CopyDefReg, CopyDefSubReg);
+-    if (!findNextSource(Def.Reg, Def.SubReg, RewriteMap))
++    if (!findNextSource(Def, RewriteMap))
+       return false;
+     RewritePairs.push_back(Def);
+   }
+   // The change is possible for all defs, do it.
+-  for (const auto &Def : RewritePairs) {
++  for (const RegSubRegPair &Def : RewritePairs) {
+     // Rewrite the "copy" in a way the register coalescer understands.
+-    MachineInstr *NewCopy = CpyRewriter->RewriteSource(Def, RewriteMap);
+-    assert(NewCopy && "Should be able to always generate a new copy");
+-    LocalMIs.insert(NewCopy);
++    MachineInstr &NewCopy = rewriteSource(MI, Def, RewriteMap);
++    LocalMIs.insert(&NewCopy);
+   }
+   // MI is now dead.
+-  MI->eraseFromParent();
++  MI.eraseFromParent();
+   ++NumUncoalescableCopies;
+   return true;
+ }
+@@ -1374,18 +1308,18 @@ bool PeepholeOptimizer::optimizeUncoales
+ /// We only fold loads to virtual registers and the virtual register defined
+ /// has a single use.
+ bool PeepholeOptimizer::isLoadFoldable(
+-    MachineInstr *MI, SmallSet<unsigned, 16> &FoldAsLoadDefCandidates) {
+-  if (!MI->canFoldAsLoad() || !MI->mayLoad())
++    MachineInstr &MI, SmallSet<unsigned, 16> &FoldAsLoadDefCandidates) {
++  if (!MI.canFoldAsLoad() || !MI.mayLoad())
+     return false;
+-  const MCInstrDesc &MCID = MI->getDesc();
++  const MCInstrDesc &MCID = MI.getDesc();
+   if (MCID.getNumDefs() != 1)
+     return false;
+-  unsigned Reg = MI->getOperand(0).getReg();
++  unsigned Reg = MI.getOperand(0).getReg();
+   // To reduce compilation time, we check MRI->hasOneNonDBGUse when inserting
+   // loads. It should be checked when processing uses of the load, since
+   // uses can be removed during peephole.
+-  if (!MI->getOperand(0).getSubReg() &&
++  if (!MI.getOperand(0).getSubReg() &&
+       TargetRegisterInfo::isVirtualRegister(Reg) &&
+       MRI->hasOneNonDBGUse(Reg)) {
+     FoldAsLoadDefCandidates.insert(Reg);
+@@ -1395,16 +1329,16 @@ bool PeepholeOptimizer::isLoadFoldable(
+ }
+ bool PeepholeOptimizer::isMoveImmediate(
+-    MachineInstr *MI, SmallSet<unsigned, 4> &ImmDefRegs,
++    MachineInstr &MI, SmallSet<unsigned, 4> &ImmDefRegs,
+     DenseMap<unsigned, MachineInstr *> &ImmDefMIs) {
+-  const MCInstrDesc &MCID = MI->getDesc();
+-  if (!MI->isMoveImmediate())
++  const MCInstrDesc &MCID = MI.getDesc();
++  if (!MI.isMoveImmediate())
+     return false;
+   if (MCID.getNumDefs() != 1)
+     return false;
+-  unsigned Reg = MI->getOperand(0).getReg();
++  unsigned Reg = MI.getOperand(0).getReg();
+   if (TargetRegisterInfo::isVirtualRegister(Reg)) {
+-    ImmDefMIs.insert(std::make_pair(Reg, MI));
++    ImmDefMIs.insert(std::make_pair(Reg, &MI));
+     ImmDefRegs.insert(Reg);
+     return true;
+   }
+@@ -1415,11 +1349,11 @@ bool PeepholeOptimizer::isMoveImmediate(
+ /// Try folding register operands that are defined by move immediate
+ /// instructions, i.e. a trivial constant folding optimization, if
+ /// and only if the def and use are in the same BB.
+-bool PeepholeOptimizer::foldImmediate(
+-    MachineInstr *MI, MachineBasicBlock *MBB, SmallSet<unsigned, 4> &ImmDefRegs,
++bool PeepholeOptimizer::foldImmediate(MachineInstr &MI,
++    SmallSet<unsigned, 4> &ImmDefRegs,
+     DenseMap<unsigned, MachineInstr *> &ImmDefMIs) {
+-  for (unsigned i = 0, e = MI->getDesc().getNumOperands(); i != e; ++i) {
+-    MachineOperand &MO = MI->getOperand(i);
++  for (unsigned i = 0, e = MI.getDesc().getNumOperands(); i != e; ++i) {
++    MachineOperand &MO = MI.getOperand(i);
+     if (!MO.isReg() || MO.isDef())
+       continue;
+     // Ignore dead implicit defs.
+@@ -1432,7 +1366,7 @@ bool PeepholeOptimizer::foldImmediate(
+       continue;
+     DenseMap<unsigned, MachineInstr*>::iterator II = ImmDefMIs.find(Reg);
+     assert(II != ImmDefMIs.end() && "couldn't find immediate definition");
+-    if (TII->FoldImmediate(*MI, *II->second, Reg, MRI)) {
++    if (TII->FoldImmediate(MI, *II->second, Reg, MRI)) {
+       ++NumImmFold;
+       return true;
+     }
+@@ -1454,28 +1388,28 @@ bool PeepholeOptimizer::foldImmediate(
+ // %2 = COPY %0:sub1
+ //
+ // Should replace %2 uses with %1:sub1
+-bool PeepholeOptimizer::foldRedundantCopy(
+-    MachineInstr *MI, SmallSet<unsigned, 4> &CopySrcRegs,
++bool PeepholeOptimizer::foldRedundantCopy(MachineInstr &MI,
++    SmallSet<unsigned, 4> &CopySrcRegs,
+     DenseMap<unsigned, MachineInstr *> &CopyMIs) {
+-  assert(MI->isCopy() && "expected a COPY machine instruction");
++  assert(MI.isCopy() && "expected a COPY machine instruction");
+-  unsigned SrcReg = MI->getOperand(1).getReg();
++  unsigned SrcReg = MI.getOperand(1).getReg();
+   if (!TargetRegisterInfo::isVirtualRegister(SrcReg))
+     return false;
+-  unsigned DstReg = MI->getOperand(0).getReg();
++  unsigned DstReg = MI.getOperand(0).getReg();
+   if (!TargetRegisterInfo::isVirtualRegister(DstReg))
+     return false;
+   if (CopySrcRegs.insert(SrcReg).second) {
+     // First copy of this reg seen.
+-    CopyMIs.insert(std::make_pair(SrcReg, MI));
++    CopyMIs.insert(std::make_pair(SrcReg, &MI));
+     return false;
+   }
+   MachineInstr *PrevCopy = CopyMIs.find(SrcReg)->second;
+-  unsigned SrcSubReg = MI->getOperand(1).getSubReg();
++  unsigned SrcSubReg = MI.getOperand(1).getSubReg();
+   unsigned PrevSrcSubReg = PrevCopy->getOperand(1).getSubReg();
+   // Can't replace different subregister extracts.
+@@ -1504,19 +1438,19 @@ bool PeepholeOptimizer::isNAPhysCopy(uns
+ }
+ bool PeepholeOptimizer::foldRedundantNAPhysCopy(
+-    MachineInstr *MI, DenseMap<unsigned, MachineInstr *> &NAPhysToVirtMIs) {
+-  assert(MI->isCopy() && "expected a COPY machine instruction");
++    MachineInstr &MI, DenseMap<unsigned, MachineInstr *> &NAPhysToVirtMIs) {
++  assert(MI.isCopy() && "expected a COPY machine instruction");
+   if (DisableNAPhysCopyOpt)
+     return false;
+-  unsigned DstReg = MI->getOperand(0).getReg();
+-  unsigned SrcReg = MI->getOperand(1).getReg();
++  unsigned DstReg = MI.getOperand(0).getReg();
++  unsigned SrcReg = MI.getOperand(1).getReg();
+   if (isNAPhysCopy(SrcReg) && TargetRegisterInfo::isVirtualRegister(DstReg)) {
+     // %vreg = COPY %physreg
+     // Avoid using a datastructure which can track multiple live non-allocatable
+     // phys->virt copies since LLVM doesn't seem to do this.
+-    NAPhysToVirtMIs.insert({SrcReg, MI});
++    NAPhysToVirtMIs.insert({SrcReg, &MI});
+     return false;
+   }
+@@ -1528,8 +1462,7 @@ bool PeepholeOptimizer::foldRedundantNAP
+   if (PrevCopy == NAPhysToVirtMIs.end()) {
+     // We can't remove the copy: there was an intervening clobber of the
+     // non-allocatable physical register after the copy to virtual.
+-    DEBUG(dbgs() << "NAPhysCopy: intervening clobber forbids erasing " << *MI
+-                 << '\n');
++    DEBUG(dbgs() << "NAPhysCopy: intervening clobber forbids erasing " << MI);
+     return false;
+   }
+@@ -1537,7 +1470,7 @@ bool PeepholeOptimizer::foldRedundantNAP
+   if (PrevDstReg == SrcReg) {
+     // Remove the virt->phys copy: we saw the virtual register definition, and
+     // the non-allocatable physical register's state hasn't changed since then.
+-    DEBUG(dbgs() << "NAPhysCopy: erasing " << *MI << '\n');
++    DEBUG(dbgs() << "NAPhysCopy: erasing " << MI);
+     ++NumNAPhysCopies;
+     return true;
+   }
+@@ -1546,7 +1479,7 @@ bool PeepholeOptimizer::foldRedundantNAP
+   // register get a copy of the non-allocatable physical register, and we only
+   // track one such copy. Avoid getting confused by this new non-allocatable
+   // physical register definition, and remove it from the tracked copies.
+-  DEBUG(dbgs() << "NAPhysCopy: missed opportunity " << *MI << '\n');
++  DEBUG(dbgs() << "NAPhysCopy: missed opportunity " << MI);
+   NAPhysToVirtMIs.erase(PrevCopy);
+   return false;
+ }
+@@ -1611,11 +1544,11 @@ bool PeepholeOptimizer::findTargetRecurr
+   return false;
+ }
+-/// \brief Phi instructions will eventually be lowered to copy instructions. If
+-/// phi is in a loop header, a recurrence may formulated around the source and
+-/// destination of the phi. For such case commuting operands of the instructions
+-/// in the recurrence may enable coalescing of the copy instruction generated
+-/// from the phi. For example, if there is a recurrence of
++/// Phi instructions will eventually be lowered to copy instructions.
++/// If phi is in a loop header, a recurrence may formulated around the source
++/// and destination of the phi. For such case commuting operands of the
++/// instructions in the recurrence may enable coalescing of the copy instruction
++/// generated from the phi. For example, if there is a recurrence of
+ ///
+ /// LoopHeader:
+ ///   %1 = phi(%0, %100)
+@@ -1725,27 +1658,25 @@ bool PeepholeOptimizer::runOnMachineFunc
+       }
+       if (!MI->isCopy()) {
+-        for (const auto &Op : MI->operands()) {
++        for (const MachineOperand &MO : MI->operands()) {
+           // Visit all operands: definitions can be implicit or explicit.
+-          if (Op.isReg()) {
+-            unsigned Reg = Op.getReg();
+-            if (Op.isDef() && isNAPhysCopy(Reg)) {
++          if (MO.isReg()) {
++            unsigned Reg = MO.getReg();
++            if (MO.isDef() && isNAPhysCopy(Reg)) {
+               const auto &Def = NAPhysToVirtMIs.find(Reg);
+               if (Def != NAPhysToVirtMIs.end()) {
+                 // A new definition of the non-allocatable physical register
+                 // invalidates previous copies.
+-                DEBUG(dbgs() << "NAPhysCopy: invalidating because of " << *MI
+-                             << '\n');
++                DEBUG(dbgs() << "NAPhysCopy: invalidating because of " << *MI);
+                 NAPhysToVirtMIs.erase(Def);
+               }
+             }
+-          } else if (Op.isRegMask()) {
+-            const uint32_t *RegMask = Op.getRegMask();
++          } else if (MO.isRegMask()) {
++            const uint32_t *RegMask = MO.getRegMask();
+             for (auto &RegMI : NAPhysToVirtMIs) {
+               unsigned Def = RegMI.first;
+               if (MachineOperand::clobbersPhysReg(RegMask, Def)) {
+-                DEBUG(dbgs() << "NAPhysCopy: invalidating because of " << *MI
+-                             << '\n');
++                DEBUG(dbgs() << "NAPhysCopy: invalidating because of " << *MI);
+                 NAPhysToVirtMIs.erase(Def);
+               }
+             }
+@@ -1761,58 +1692,57 @@ bool PeepholeOptimizer::runOnMachineFunc
+         // don't know what's correct anymore.
+         //
+         // FIXME: handle explicit asm clobbers.
+-        DEBUG(dbgs() << "NAPhysCopy: blowing away all info due to " << *MI
+-                     << '\n');
++        DEBUG(dbgs() << "NAPhysCopy: blowing away all info due to " << *MI);
+         NAPhysToVirtMIs.clear();
+       }
+       if ((isUncoalescableCopy(*MI) &&
+-           optimizeUncoalescableCopy(MI, LocalMIs)) ||
+-          (MI->isCompare() && optimizeCmpInstr(MI, &MBB)) ||
+-          (MI->isSelect() && optimizeSelect(MI, LocalMIs))) {
++           optimizeUncoalescableCopy(*MI, LocalMIs)) ||
++          (MI->isCompare() && optimizeCmpInstr(*MI)) ||
++          (MI->isSelect() && optimizeSelect(*MI, LocalMIs))) {
+         // MI is deleted.
+         LocalMIs.erase(MI);
+         Changed = true;
+         continue;
+       }
+-      if (MI->isConditionalBranch() && optimizeCondBranch(MI)) {
++      if (MI->isConditionalBranch() && optimizeCondBranch(*MI)) {
+         Changed = true;
+         continue;
+       }
+-      if (isCoalescableCopy(*MI) && optimizeCoalescableCopy(MI)) {
++      if (isCoalescableCopy(*MI) && optimizeCoalescableCopy(*MI)) {
+         // MI is just rewritten.
+         Changed = true;
+         continue;
+       }
+       if (MI->isCopy() &&
+-          (foldRedundantCopy(MI, CopySrcRegs, CopySrcMIs) ||
+-           foldRedundantNAPhysCopy(MI, NAPhysToVirtMIs))) {
++          (foldRedundantCopy(*MI, CopySrcRegs, CopySrcMIs) ||
++           foldRedundantNAPhysCopy(*MI, NAPhysToVirtMIs))) {
+         LocalMIs.erase(MI);
+         MI->eraseFromParent();
+         Changed = true;
+         continue;
+       }
+-      if (isMoveImmediate(MI, ImmDefRegs, ImmDefMIs)) {
++      if (isMoveImmediate(*MI, ImmDefRegs, ImmDefMIs)) {
+         SeenMoveImm = true;
+       } else {
+-        Changed |= optimizeExtInstr(MI, &MBB, LocalMIs);
++        Changed |= optimizeExtInstr(*MI, MBB, LocalMIs);
+         // optimizeExtInstr might have created new instructions after MI
+         // and before the already incremented MII. Adjust MII so that the
+         // next iteration sees the new instructions.
+         MII = MI;
+         ++MII;
+         if (SeenMoveImm)
+-          Changed |= foldImmediate(MI, &MBB, ImmDefRegs, ImmDefMIs);
++          Changed |= foldImmediate(*MI, ImmDefRegs, ImmDefMIs);
+       }
+       // Check whether MI is a load candidate for folding into a later
+       // instruction. If MI is not a candidate, check whether we can fold an
+       // earlier load into MI.
+-      if (!isLoadFoldable(MI, FoldAsLoadDefCandidates) &&
++      if (!isLoadFoldable(*MI, FoldAsLoadDefCandidates) &&
+           !FoldAsLoadDefCandidates.empty()) {
+         // We visit each operand even after successfully folding a previous
+@@ -1861,7 +1791,7 @@ bool PeepholeOptimizer::runOnMachineFunc
+       // the load candidates.  Note: We might be able to fold *into* this
+       // instruction, so this needs to be after the folding logic.
+       if (MI->isLoadFoldBarrier()) {
+-        DEBUG(dbgs() << "Encountered load fold barrier on " << *MI << "\n");
++        DEBUG(dbgs() << "Encountered load fold barrier on " << *MI);
+         FoldAsLoadDefCandidates.clear();
+       }
+     }
+@@ -1958,14 +1888,14 @@ ValueTrackerResult ValueTracker::getNext
+     // duplicate the code from the generic TII.
+     return ValueTrackerResult();
+-  SmallVector<TargetInstrInfo::RegSubRegPairAndIdx, 8> RegSeqInputRegs;
++  SmallVector<RegSubRegPairAndIdx, 8> RegSeqInputRegs;
+   if (!TII->getRegSequenceInputs(*Def, DefIdx, RegSeqInputRegs))
+     return ValueTrackerResult();
+   // We are looking at:
+   // Def = REG_SEQUENCE v0, sub0, v1, sub1, ...
+   // Check if one of the operand defines the subreg we are interested in.
+-  for (auto &RegSeqInput : RegSeqInputRegs) {
++  for (const RegSubRegPairAndIdx &RegSeqInput : RegSeqInputRegs) {
+     if (RegSeqInput.SubIdx == DefSubReg) {
+       if (RegSeqInput.SubReg)
+         // Bail if we have to compose sub registers.
+@@ -1996,8 +1926,8 @@ ValueTrackerResult ValueTracker::getNext
+     // duplicate the code from the generic TII.
+     return ValueTrackerResult();
+-  TargetInstrInfo::RegSubRegPair BaseReg;
+-  TargetInstrInfo::RegSubRegPairAndIdx InsertedReg;
++  RegSubRegPair BaseReg;
++  RegSubRegPairAndIdx InsertedReg;
+   if (!TII->getInsertSubregInputs(*Def, DefIdx, BaseReg, InsertedReg))
+     return ValueTrackerResult();
+@@ -2050,7 +1980,7 @@ ValueTrackerResult ValueTracker::getNext
+     // duplicate the code from the generic TII.
+     return ValueTrackerResult();
+-  TargetInstrInfo::RegSubRegPairAndIdx ExtractSubregInputReg;
++  RegSubRegPairAndIdx ExtractSubregInputReg;
+   if (!TII->getExtractSubregInputs(*Def, DefIdx, ExtractSubregInputReg))
+     return ValueTrackerResult();
+@@ -2083,7 +2013,7 @@ ValueTrackerResult ValueTracker::getNext
+                             Def->getOperand(3).getImm());
+ }
+-/// \brief Explore each PHI incoming operand and return its sources
++/// Explore each PHI incoming operand and return its sources.
+ ValueTrackerResult ValueTracker::getNextSourceFromPHI() {
+   assert(Def->isPHI() && "Invalid definition");
+   ValueTrackerResult Res;
+@@ -2095,7 +2025,7 @@ ValueTrackerResult ValueTracker::getNext
+   // Return all register sources for PHI instructions.
+   for (unsigned i = 1, e = Def->getNumOperands(); i < e; i += 2) {
+-    auto &MO = Def->getOperand(i);
++    const MachineOperand &MO = Def->getOperand(i);
+     assert(MO.isReg() && "Invalid PHI instruction");
+     // We have no code to deal with undef operands. They shouldn't happen in
+     // normal programs anyway.
+@@ -2121,7 +2051,7 @@ ValueTrackerResult ValueTracker::getNext
+     return getNextSourceFromBitcast();
+   // All the remaining cases involve "complex" instructions.
+   // Bail if we did not ask for the advanced tracking.
+-  if (!UseAdvancedTracking)
++  if (DisableAdvCopyOpt)
+     return ValueTrackerResult();
+   if (Def->isRegSequence() || Def->isRegSequenceLike())
+     return getNextSourceFromRegSequence();
diff --git a/patches/python-clangpath.diff b/patches/python-clangpath.diff
new file mode 100644 (file)
index 0000000..2d6380f
--- /dev/null
@@ -0,0 +1,15 @@
+---
+ clang/bindings/python/clang/cindex.py |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/clang/bindings/python/clang/cindex.py
++++ b/clang/bindings/python/clang/cindex.py
+@@ -3851,7 +3851,7 @@ class Config:
+         elif name == 'Windows':
+             file = 'libclang.dll'
+         else:
+-            file = 'libclang.so'
++            file = 'libclang-6.0.so'
+         if Config.library_path:
+             file = Config.library_path + '/' + file
diff --git a/patches/rL338481-cherry-pick-really-subtle-miscompile.diff b/patches/rL338481-cherry-pick-really-subtle-miscompile.diff
new file mode 100644 (file)
index 0000000..07653e5
--- /dev/null
@@ -0,0 +1,153 @@
+Index: llvm-toolchain-6.0-6.0.1/test/CodeGen/X86/flags-copy-lowering.mir
+===================================================================
+--- llvm-toolchain-6.0-6.0.1.orig/test/CodeGen/X86/flags-copy-lowering.mir
++++ llvm-toolchain-6.0-6.0.1/test/CodeGen/X86/flags-copy-lowering.mir
+@@ -72,6 +72,18 @@
+     call void @foo()
+     ret void
+   }
++
++  define i32 @test_existing_setcc(i64 %a, i64 %b) {
++  entry:
++    call void @foo()
++    ret i32 0
++  }
++
++  define i32 @test_existing_setcc_memory(i64 %a, i64 %b) {
++  entry:
++    call void @foo()
++    ret i32 0
++  }
+ ...
+ ---
+ name:            test_branch
+@@ -553,3 +565,110 @@ body:             |
+     RET 0
+ ...
++---
++name:            test_existing_setcc
++# CHECK-LABEL: name: test_existing_setcc
++liveins:
++  - { reg: '$rdi', virtual-reg: '%0' }
++  - { reg: '$rsi', virtual-reg: '%1' }
++body:             |
++  bb.0:
++    successors: %bb.1, %bb.2, %bb.3
++    liveins: $rdi, $rsi
++
++    %0:gr64 = COPY $rdi
++    %1:gr64 = COPY $rsi
++    CMP64rr %0, %1, implicit-def $eflags
++    %2:gr8 = SETAr implicit $eflags
++    %3:gr8 = SETAEr implicit $eflags
++    %4:gr64 = COPY $eflags
++  ; CHECK:      CMP64rr %0, %1, implicit-def $eflags
++  ; CHECK-NEXT: %[[A_REG:[^:]*]]:gr8 = SETAr implicit $eflags
++  ; CHECK-NEXT: %[[AE_REG:[^:]*]]:gr8 = SETAEr implicit $eflags
++  ; CHECK-NOT:  COPY{{( killed)?}} $eflags
++
++    ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
++    CALL64pcrel32 @foo, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $eax
++    ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
++
++    $eflags = COPY %4
++    JA_1 %bb.1, implicit $eflags
++    JB_1 %bb.2, implicit $eflags
++    JMP_1 %bb.3
++  ; CHECK-NOT: $eflags =
++  ;
++  ; CHECK:        TEST8rr %[[A_REG]], %[[A_REG]], implicit-def $eflags
++  ; CHECK-NEXT:   JNE_1 %bb.1, implicit killed $eflags
++  ; CHECK-SAME: {{$[[:space:]]}}
++  ; CHECK-NEXT: bb.4:
++  ; CHECK-NEXT:   successors: {{.*$}}
++  ; CHECK-SAME: {{$[[:space:]]}}
++  ; CHECK-NEXT:   TEST8rr %[[AE_REG]], %[[AE_REG]], implicit-def $eflags
++  ; CHECK-NEXT:   JE_1 %bb.2, implicit killed $eflags
++  ; CHECK-NEXT:   JMP_1 %bb.3
++
++  bb.1:
++    %5:gr32 = MOV32ri64 42
++    $eax = COPY %5
++    RET 0, $eax
++
++  bb.2:
++    %6:gr32 = MOV32ri64 43
++    $eax = COPY %6
++    RET 0, $eax
++
++  bb.3:
++    %7:gr32 = MOV32r0 implicit-def dead $eflags
++    $eax = COPY %7
++    RET 0, $eax
++
++...
++---
++name:            test_existing_setcc_memory
++# CHECK-LABEL: name: test_existing_setcc_memory
++liveins:
++  - { reg: '$rdi', virtual-reg: '%0' }
++  - { reg: '$rsi', virtual-reg: '%1' }
++body:             |
++  bb.0:
++    successors: %bb.1, %bb.2
++    liveins: $rdi, $rsi
++
++    %0:gr64 = COPY $rdi
++    %1:gr64 = COPY $rsi
++    CMP64rr %0, %1, implicit-def $eflags
++    SETEm %0, 1, $noreg, -16, $noreg, implicit $eflags
++    %2:gr64 = COPY $eflags
++  ; CHECK:      CMP64rr %0, %1, implicit-def $eflags
++  ; We cannot reuse this SETE because it stores the flag directly to memory,
++  ; so we have two SETEs here. FIXME: It'd be great if something could fold
++  ; these automatically. If not, maybe we want to unfold SETcc instructions
++  ; writing to memory so we can reuse them.
++  ; CHECK-NEXT: SETEm {{.*}} implicit $eflags
++  ; CHECK-NEXT: %[[E_REG:[^:]*]]:gr8 = SETEr implicit $eflags
++  ; CHECK-NOT:  COPY{{( killed)?}} $eflags
++
++    ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
++    CALL64pcrel32 @foo, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $eax
++    ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
++
++    $eflags = COPY %2
++    JE_1 %bb.1, implicit $eflags
++    JMP_1 %bb.2
++  ; CHECK-NOT: $eflags =
++  ;
++  ; CHECK:        TEST8rr %[[E_REG]], %[[E_REG]], implicit-def $eflags
++  ; CHECK-NEXT:   JNE_1 %bb.1, implicit killed $eflags
++  ; CHECK-NEXT:   JMP_1 %bb.2
++
++  bb.1:
++    %3:gr32 = MOV32ri64 42
++    $eax = COPY %3
++    RET 0, $eax
++
++  bb.2:
++    %4:gr32 = MOV32ri64 43
++    $eax = COPY %4
++    RET 0, $eax
++
++...
+Index: llvm-toolchain-6.0-6.0.1/lib/Target/X86/X86FlagsCopyLowering.cpp
+===================================================================
+--- llvm-toolchain-6.0-6.0.1.orig/lib/Target/X86/X86FlagsCopyLowering.cpp
++++ llvm-toolchain-6.0-6.0.1/lib/Target/X86/X86FlagsCopyLowering.cpp
+@@ -608,9 +608,12 @@ X86FlagsCopyLoweringPass::collectCondsIn
+   for (MachineInstr &MI : llvm::reverse(
+            llvm::make_range(MBB.instr_begin(), CopyDefI.getIterator()))) {
+     X86::CondCode Cond = X86::getCondFromSETOpc(MI.getOpcode());
+-    if (Cond != X86::COND_INVALID && MI.getOperand(0).isReg() &&
+-        TRI->isVirtualRegister(MI.getOperand(0).getReg()))
++    if (Cond != X86::COND_INVALID && !MI.mayStore() && MI.getOperand(0).isReg() &&
++        TRI->isVirtualRegister(MI.getOperand(0).getReg())) {
++      assert(MI.getOperand(0).isDef() &&
++             "A non-storing SETcc should always define a register!");
+       CondRegs[Cond] = MI.getOperand(0).getReg();
++    }
+     // Stop scanning when we see the first definition of the EFLAGS as prior to
+     // this we would potentially capture the wrong flag state.
diff --git a/patches/remove-test-freezing.diff b/patches/remove-test-freezing.diff
new file mode 100644 (file)
index 0000000..e19d0a9
--- /dev/null
@@ -0,0 +1,32 @@
+Index: llvm-toolchain-snapshot_7~svn323616/compiler-rt/test/sanitizer_common/TestCases/Linux/sysconf_interceptor_bypass_test.cc
+===================================================================
+--- llvm-toolchain-snapshot_7~svn323616.orig/compiler-rt/test/sanitizer_common/TestCases/Linux/sysconf_interceptor_bypass_test.cc
++++ llvm-toolchain-snapshot_7~svn323616/compiler-rt/test/sanitizer_common/TestCases/Linux/sysconf_interceptor_bypass_test.cc
+@@ -1,27 +0,0 @@
+-// RUN: %clangxx -O2 %s -o %t && %run %t 2>&1 | FileCheck %s
+-
+-// XFAIL: android
+-
+-#include <stdio.h>
+-
+-// getauxval() used instead of sysconf() in GetPageSize() is defined starting
+-// glbc version 2.16.
+-#if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 16)
+-extern "C" long sysconf(int name) {
+-  fprintf(stderr, "sysconf wrapper called\n");
+-  return 0;
+-}
+-#endif  // defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 16)
+-
+-int main() {
+-  // All we need to check is that the sysconf() interceptor defined above was
+-  // not called. Should it get called, it will crash right there, any
+-  // instrumented code executed before sanitizer init is finished will crash
+-  // accessing non-initialized sanitizer internals. Even if it will not crash
+-  // in some configuration, it should never be called anyway.
+-  fprintf(stderr, "Passed\n");
+-  // CHECK-NOT: sysconf wrapper called
+-  // CHECK: Passed
+-  // CHECK-NOT: sysconf wrapper called
+-  return 0;
+-}
diff --git a/patches/scan-build-clang-path.diff b/patches/scan-build-clang-path.diff
new file mode 100644 (file)
index 0000000..fe7b310
--- /dev/null
@@ -0,0 +1,15 @@
+---
+ clang/tools/scan-build/bin/scan-build |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/clang/tools/scan-build/bin/scan-build
++++ b/clang/tools/scan-build/bin/scan-build
+@@ -1432,7 +1432,7 @@ sub FindClang {
+   if (!defined $Options{AnalyzerDiscoveryMethod}) {
+     $Clang = Cwd::realpath("$RealBin/bin/clang") if (-f "$RealBin/bin/clang");
+     if (!defined $Clang || ! -x $Clang) {
+-      $Clang = Cwd::realpath("$RealBin/clang") if (-f "$RealBin/clang");
++      $Clang = Cwd::realpath("/usr/lib/llvm-6.0/bin/clang");
+     }
+     if (!defined $Clang || ! -x $Clang) {
+       return "error: Cannot find an executable 'clang' relative to" .
diff --git a/patches/scan-view-fix-path.diff b/patches/scan-view-fix-path.diff
new file mode 100644 (file)
index 0000000..a37e688
--- /dev/null
@@ -0,0 +1,13 @@
+Index: llvm-toolchain-snapshot_5.0~svn297449/clang/tools/scan-view/bin/scan-view
+===================================================================
+--- llvm-toolchain-snapshot_5.0~svn297449.orig/clang/tools/scan-view/bin/scan-view
++++ llvm-toolchain-snapshot_5.0~svn297449/clang/tools/scan-view/bin/scan-view
+@@ -61,7 +61,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/scan-view"
++    share = os.path.dirname(__file__) + "/../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/series b/patches/series
new file mode 100644 (file)
index 0000000..ef52159
--- /dev/null
@@ -0,0 +1,70 @@
+19-clang_debian_version.patch
+23-strlcpy_strlcat_warning_removed.diff
+27-fix_clang_stdint.diff
+26-set-correct-float-abi.diff
+0003-Debian-version-info-and-bugreport.patch
+scan-build-clang-path.diff
+declare_clear_cache.diff
+clang-format-version.diff
+unwind-chain-inclusion.diff
+hurd-pathmax.diff
+silent-gold-test.diff
+atomic_library_1.diff
+python-clangpath.diff
+fix-clang-path-and-build.diff
+# commented because of bug 903709
+#force-gcc-header-obj.diff
+do-not-fail-on-unexpected-pass.diff
+silent-more-tests.diff
+disable-display-PASS-UNSUPPORTED-XFAIL.diff
+fix-llvm-config-obj-src-root.patch
+0044-soname.diff
+lldb-soname.diff
+lldb-libname.diff
+hurd-EIEIO-undef.diff
+silent-MCJIIT-tests.diff
+clang-analyzer-force-version.diff
+install-scan-build-py.diff
+scan-view-fix-path.diff
+mips-fpxx-enable.diff
+0001-llvm-cmake-resolve-symlinks-in-LLVMConfig.cmake.patch
+0001-tools-clang-cmake-resolve-symlinks-in-ClangConfig.cmake.patch
+lldb-link-atomic-cmake.patch
+disable-source-interleave.diff
+silent-gold-utils.diff
+disable-llvm-symbolizer-test.diff
+#fix-lldb-server-build
+clang-tidy-run-bin.diff
+#bug-30342.diff
+fix-scan-view-path.diff
+#clang-fix-cmpxchg8-detection-on-i386.patch
+lldb-addversion-suffix-to-llvm-server-exec.patch
+lldb-missing-install.diff
+silent-test-failing-codeverage.diff
+disable-path-test-failing.diff
+silent-amd-tet.diff
+disable-error-xray.diff
+lldb-disable-swig-error.diff
+silent-test-macho.diff
+silent-llvm-isel-fuzzer.diff
+test-keep-alive.diff
+sparc64-add-missing-tls-get-addr.diff
+remove-test-freezing.diff
+# Disable as it was merged upstream
+#install-lldb-sb-headers.patch
+0048-Set-html_static_path-_static-everywhere.patch
+0049-Use-Debian-provided-MathJax-everywhere.patch
+ubuntu-cosmic-support.patch
+D40146-JumpThreading-backport-1.diff
+D42717-JumpThreading-backport-2.diff
+llvm-D49832-SCEVPred.patch
+llvm-rL323946-LSRTy.patch
+PowerPC-Make-AddrSpaceCast-noop.diff
+D51108-rust-powerpc.diff
+pr38663-pgo-lto-crash.patch
+D51335-alignment-issue.diff
+# Doesn't fully apply
+# D51639-optim-issue.diff
+rL338481-cherry-pick-really-subtle-miscompile.diff
+disable-sse2-old-x86.diff
+powerpcspe-add-missing-include-path.diff
diff --git a/patches/silent-MCJIIT-tests.diff b/patches/silent-MCJIIT-tests.diff
new file mode 100644 (file)
index 0000000..6ed20d4
--- /dev/null
@@ -0,0 +1,178 @@
+---
+ test/BugPoint/crash-narrowfunctiontest.ll                               |    1 -
+ test/BugPoint/remove_arguments_test.ll                                  |    1 -
+ test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll                     |    2 +-
+ test/ExecutionEngine/MCJIT/eh-lg-pic.ll                                 |    2 +-
+ test/ExecutionEngine/MCJIT/multi-module-sm-pic-a.ll                     |    2 +-
+ test/ExecutionEngine/MCJIT/stubs-sm-pic.ll                              |    2 +-
+ test/ExecutionEngine/MCJIT/test-global-init-nonzero-sm-pic.ll           |    2 +-
+ test/ExecutionEngine/MCJIT/test-ptr-reloc-sm-pic.ll                     |    2 +-
+ test/ExecutionEngine/OrcMCJIT/cross-module-sm-pic-a.ll                  |    2 +-
+ test/ExecutionEngine/OrcMCJIT/eh-lg-pic.ll                              |    2 +-
+ test/ExecutionEngine/OrcMCJIT/multi-module-sm-pic-a.ll                  |    2 +-
+ test/ExecutionEngine/OrcMCJIT/remote/test-global-init-nonzero-sm-pic.ll |    2 +-
+ test/ExecutionEngine/OrcMCJIT/remote/test-ptr-reloc-sm-pic.ll           |    2 +-
+ test/ExecutionEngine/OrcMCJIT/stubs-sm-pic.ll                           |    2 +-
+ test/ExecutionEngine/OrcMCJIT/test-global-init-nonzero-sm-pic.ll        |    2 +-
+ test/ExecutionEngine/OrcMCJIT/test-ptr-reloc-sm-pic.ll                  |    2 +-
+ test/Feature/load_module.ll                                             |    1 -
+ 17 files changed, 14 insertions(+), 17 deletions(-)
+
+--- a/test/BugPoint/crash-narrowfunctiontest.ll
++++ b/test/BugPoint/crash-narrowfunctiontest.ll
+@@ -2,7 +2,6 @@
+ ;
+ ; RUN: bugpoint -load %llvmshlibdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes > /dev/null
+ ; REQUIRES: loadable_module
+-; XFAIL: *
+ define i32 @foo() { ret i32 1 }
+--- a/test/BugPoint/remove_arguments_test.ll
++++ b/test/BugPoint/remove_arguments_test.ll
+@@ -1,7 +1,6 @@
+ ; RUN: bugpoint -load %llvmshlibdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes
+ ; RUN: llvm-dis %t-reduced-simplified.bc -o - | FileCheck %s
+ ; REQUIRES: loadable_module
+-; XFAIL: *
+ ; Test to make sure that arguments are removed from the function if they are
+ ; unnecessary. And clean up any types that frees up too.
+--- a/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll
++++ b/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -extra-module=%p/Inputs/cross-module-b.ll -relocation-model=pic -code-model=small %s > /dev/null
+-; XFAIL: mips-, mipsel-, i686, i386
++; XFAIL: *
+ declare i32 @FB()
+--- a/test/ExecutionEngine/MCJIT/eh-lg-pic.ll
++++ b/test/ExecutionEngine/MCJIT/eh-lg-pic.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -relocation-model=pic -code-model=large %s
+-; XFAIL: cygwin, win32, mingw, mips-, mipsel-, i686, i386, aarch64, arm
++; XFAIL: *
+ declare i8* @__cxa_allocate_exception(i64)
+ declare void @__cxa_throw(i8*, i8*, i8*)
+ declare i32 @__gxx_personality_v0(...)
+--- a/test/ExecutionEngine/MCJIT/multi-module-sm-pic-a.ll
++++ b/test/ExecutionEngine/MCJIT/multi-module-sm-pic-a.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll -relocation-model=pic -code-model=small %s > /dev/null
+-; XFAIL: mips-, mipsel-, i686, i386
++; XFAIL: *
+ declare i32 @FB()
+--- a/test/ExecutionEngine/MCJIT/stubs-sm-pic.ll
++++ b/test/ExecutionEngine/MCJIT/stubs-sm-pic.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -disable-lazy-compilation=false -relocation-model=pic -code-model=small %s
+-; XFAIL: mips-, mipsel-, i686, i386, aarch64, arm
++; XFAIL: mips-, mipsel-, i686, i386, aarch64, arm, x86_64
+ define i32 @main() nounwind {
+ entry:
+--- a/test/ExecutionEngine/MCJIT/test-global-init-nonzero-sm-pic.ll
++++ b/test/ExecutionEngine/MCJIT/test-global-init-nonzero-sm-pic.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -relocation-model=pic -code-model=small %s > /dev/null
+-; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386
++; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386, x86_64
+ @count = global i32 1, align 4
+--- a/test/ExecutionEngine/MCJIT/test-ptr-reloc-sm-pic.ll
++++ b/test/ExecutionEngine/MCJIT/test-ptr-reloc-sm-pic.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -O0 -relocation-model=pic -code-model=small %s
+-; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386
++; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386, x86_64
+ @.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1
+ @ptr = global i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), align 4
+--- a/test/ExecutionEngine/OrcMCJIT/cross-module-sm-pic-a.ll
++++ b/test/ExecutionEngine/OrcMCJIT/cross-module-sm-pic-a.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -jit-kind=orc-mcjit -extra-module=%p/Inputs/cross-module-b.ll -relocation-model=pic -code-model=small %s > /dev/null
+-; XFAIL: mips-, mipsel-, i686, i386
++; XFAIL: *
+ declare i32 @FB()
+--- a/test/ExecutionEngine/OrcMCJIT/eh-lg-pic.ll
++++ b/test/ExecutionEngine/OrcMCJIT/eh-lg-pic.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -jit-kind=orc-mcjit -relocation-model=pic -code-model=large %s
+-; XFAIL: cygwin, win32, mingw, mips-, mipsel-, i686, i386, aarch64, arm
++; XFAIL: *
+ declare i8* @__cxa_allocate_exception(i64)
+ declare void @__cxa_throw(i8*, i8*, i8*)
+ declare i32 @__gxx_personality_v0(...)
+--- a/test/ExecutionEngine/OrcMCJIT/multi-module-sm-pic-a.ll
++++ b/test/ExecutionEngine/OrcMCJIT/multi-module-sm-pic-a.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -jit-kind=orc-mcjit -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll -relocation-model=pic -code-model=small %s > /dev/null
+-; XFAIL: mips-, mipsel-, i686, i386
++; XFAIL: *
+ declare i32 @FB()
+--- a/test/ExecutionEngine/OrcMCJIT/remote/test-global-init-nonzero-sm-pic.ll
++++ b/test/ExecutionEngine/OrcMCJIT/remote/test-global-init-nonzero-sm-pic.ll
+@@ -1,6 +1,6 @@
+ ; RUN: %lli -jit-kind=orc-mcjit -remote-mcjit -mcjit-remote-process=lli-child-target%exeext \
+ ; RUN:   -relocation-model=pic -code-model=small %s > /dev/null
+-; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386, mingw32, win32
++; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386, mingw32, win32, x86_64
+ ; UNSUPPORTED: powerpc64-unknown-linux-gnu
+ ; Remove UNSUPPORTED for powerpc64-unknown-linux-gnu if problem caused by r266663 is fixed
+--- a/test/ExecutionEngine/OrcMCJIT/remote/test-ptr-reloc-sm-pic.ll
++++ b/test/ExecutionEngine/OrcMCJIT/remote/test-ptr-reloc-sm-pic.ll
+@@ -1,6 +1,6 @@
+ ; RUN: %lli -jit-kind=orc-mcjit -remote-mcjit -mcjit-remote-process=lli-child-target%exeext \
+ ; RUN:   -O0 -relocation-model=pic -code-model=small %s
+-; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386, mingw32, win32
++; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386, mingw32, win32, x86_64
+ ; UNSUPPORTED: powerpc64-unknown-linux-gnu
+ ; Remove UNSUPPORTED for powerpc64-unknown-linux-gnu if problem caused by r266663 is fixed
+--- a/test/ExecutionEngine/OrcMCJIT/stubs-sm-pic.ll
++++ b/test/ExecutionEngine/OrcMCJIT/stubs-sm-pic.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -jit-kind=orc-mcjit -disable-lazy-compilation=false -relocation-model=pic -code-model=small %s
+-; XFAIL: mips-, mipsel-, i686, i386, aarch64, arm
++; XFAIL: mips-, mipsel-, i686, i386, aarch64, arm, x86_64
+ define i32 @main() nounwind {
+ entry:
+--- a/test/ExecutionEngine/OrcMCJIT/test-global-init-nonzero-sm-pic.ll
++++ b/test/ExecutionEngine/OrcMCJIT/test-global-init-nonzero-sm-pic.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -jit-kind=orc-mcjit -relocation-model=pic -code-model=small %s > /dev/null
+-; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386
++; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386, x86_64
+ @count = global i32 1, align 4
+--- a/test/ExecutionEngine/OrcMCJIT/test-ptr-reloc-sm-pic.ll
++++ b/test/ExecutionEngine/OrcMCJIT/test-ptr-reloc-sm-pic.ll
+@@ -1,5 +1,5 @@
+ ; RUN: %lli -jit-kind=orc-mcjit -O0 -relocation-model=pic -code-model=small %s
+-; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386
++; XFAIL: mips-, mipsel-, aarch64, arm, i686, i386, x86_64
+ @.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1
+ @ptr = global i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), align 4
+--- a/test/Feature/load_module.ll
++++ b/test/Feature/load_module.ll
+@@ -3,7 +3,6 @@
+ ; RUN:   -disable-output 2>&1 | grep Hello
+ ; REQUIRES: loadable_module
+ ; FIXME: On Cygming, it might fail without building LLVMHello manually.
+-; XFAIL: *
+ @junk = global i32 0
diff --git a/patches/silent-amd-tet.diff b/patches/silent-amd-tet.diff
new file mode 100644 (file)
index 0000000..5cd8acc
--- /dev/null
@@ -0,0 +1,11 @@
+Index: llvm-toolchain-snapshot_6.0~svn315566/test/MC/AMDGPU/hsa.s
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn315566.orig/test/MC/AMDGPU/hsa.s
++++ llvm-toolchain-snapshot_6.0~svn315566/test/MC/AMDGPU/hsa.s
+@@ -1,5 +1,6 @@
+ // RUN: llvm-mc -triple amdgcn--amdhsa -mcpu=kaveri -show-encoding %s | FileCheck %s --check-prefix=ASM
+ // RUN: llvm-mc -filetype=obj -triple amdgcn--amdhsa -mcpu=kaveri -show-encoding %s | llvm-readobj -symbols -s -sd | FileCheck %s --check-prefix=ELF
++// XFAIL: *
+ // ELF: Section {
+ // ELF: Name: .text
diff --git a/patches/silent-gold-test.diff b/patches/silent-gold-test.diff
new file mode 100644 (file)
index 0000000..5cf60a2
--- /dev/null
@@ -0,0 +1,38 @@
+Description: fails on debian unstable amd64
+ Command Output (stderr):
+ --
+ /build/llvm-toolchain-snapshot-4.0~svn279916/test/tools/gold/X86/start-lib-common.ll:22:10: error: expected string not found in input
+ ; CHECK: @x = common global i32 0, align 8
+          ^
+ <stdin>:1:1: note: scanning from here
+ ; ModuleID = '/build/llvm-toolchain-snapshot-4.0~svn279916/build-llvm/test/tools/gold/X86/Output/start-lib-common.ll.tmp3.o'
+ ^
+ <stdin>:4:1: note: possible intended match here
+ @x = common global i32 0, align 4
+ ^
+
+
+Index: llvm-toolchain-snapshot_7~svn323434/test/tools/gold/X86/start-lib-common.ll
+===================================================================
+--- llvm-toolchain-snapshot_7~svn323434.orig/test/tools/gold/X86/start-lib-common.ll
++++ llvm-toolchain-snapshot_7~svn323434/test/tools/gold/X86/start-lib-common.ll
+@@ -9,6 +9,7 @@
+ ; RUN:    -shared %t1.o --start-lib %t2.o --end-lib -o %t3.o
+ ; RUN: llvm-dis %t3.o -o - | FileCheck %s
++; XFAIL: *
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ @x = common global i32 0, align 4
+Index: llvm-toolchain-snapshot_7~svn323434/test/tools/gold/X86/comdat.ll
+===================================================================
+--- llvm-toolchain-snapshot_7~svn323434.orig/test/tools/gold/X86/comdat.ll
++++ llvm-toolchain-snapshot_7~svn323434/test/tools/gold/X86/comdat.ll
+@@ -5,6 +5,7 @@
+ ; RUN:  -plugin-opt=save-temps
+ ; RUN: FileCheck --check-prefix=RES %s < %t3.o.resolution.txt
+ ; RUN: llvm-readobj -t %t3.o | FileCheck --check-prefix=OBJ %s
++; XFAIL: *
+ 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/silent-gold-utils.diff b/patches/silent-gold-utils.diff
new file mode 100644 (file)
index 0000000..859781b
--- /dev/null
@@ -0,0 +1,190 @@
+---
+ test/tools/gold/X86/common_thinlto.ll             |    1 +
+ test/tools/gold/X86/emit-llvm.ll                  |    2 ++
+ test/tools/gold/X86/parallel.ll                   |    1 +
+ test/tools/gold/X86/pr19901_thinlto.ll            |    1 +
+ test/tools/gold/X86/slp-vectorize.ll              |    1 +
+ test/tools/gold/X86/strip_names.ll                |    1 +
+ test/tools/gold/X86/thinlto.ll                    |    2 ++
+ test/tools/gold/X86/thinlto_archive.ll            |    1 +
+ test/tools/gold/X86/thinlto_internalize.ll        |    2 ++
+ test/tools/gold/X86/thinlto_linkonceresolution.ll |    2 ++
+ test/tools/gold/X86/thinlto_weak_resolution.ll    |    3 ++-
+ test/tools/gold/X86/type-merge2.ll                |    2 +-
+ test/tools/gold/X86/vectorize.ll                  |    1 +
+ test/tools/gold/X86/visibility.ll                 |    1 +
+ 14 files changed, 19 insertions(+), 2 deletions(-)
+
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/common_thinlto.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/common_thinlto.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/common_thinlto.ll
+@@ -17,6 +17,7 @@
+ ; RUN: llvm-nm %t3 | FileCheck %s --check-prefix=NM
+ ; NM: bar
++; XFAIL: *
+ source_filename = "common1.c"
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/emit-llvm.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/emit-llvm.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/emit-llvm.ll
+@@ -21,6 +21,8 @@
+ ; RUN: not test -a %t4.o
+ ; NM: T f3
++; XFAIL: *
++
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/parallel.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/parallel.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/parallel.ll
+@@ -5,6 +5,7 @@
+ ; RUN: llvm-dis %t.1.5.precodegen.bc -o - | FileCheck --check-prefix=CHECK-BC1 %s
+ ; RUN: llvm-nm %t.o | FileCheck --check-prefix=CHECK0 %s
+ ; RUN: llvm-nm %t.o1 | FileCheck --check-prefix=CHECK1 %s
++; XFAIL: *
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/pr19901_thinlto.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/pr19901_thinlto.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/pr19901_thinlto.ll
+@@ -4,6 +4,7 @@
+ ; RUN:     --plugin-opt=thinlto \
+ ; RUN:     -shared -m elf_x86_64 -o %t.so %t2.o %t.o
+ ; RUN: llvm-readobj -t %t.so | FileCheck %s
++; XFAIL: i686, i386
+ ; CHECK:       Symbol {
+ ; CHECK:         Name: f
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/slp-vectorize.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/slp-vectorize.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/slp-vectorize.ll
+@@ -7,6 +7,7 @@
+ ; test that the vectorizer is run.
+ ; CHECK: fadd <4 x float>
++; XFAIL: *
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/strip_names.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/strip_names.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/strip_names.ll
+@@ -25,6 +25,7 @@
+ ; NONAME:  %2 = load i32, i32* @GlobalValueName
+ ; NONAME:  %3 = add i32 %0, %2
+ ; NONAME:  ret i32 %3
++; XFAIL: *
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/thinlto.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto.ll
+@@ -114,6 +114,8 @@
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
++; XFAIL: i686, i386
++
+ declare void @g(...)
+ define void @f() {
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto_archive.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/thinlto_archive.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto_archive.ll
+@@ -15,6 +15,7 @@
+ ; RUN:    --plugin-opt=jobs=1 \
+ ; RUN:    -shared %t.o %t.a -o %t4 2>&1 | FileCheck %s
+ ; RUN: llvm-nm %t4 | FileCheck %s --check-prefix=NM
++; XFAIL: i686, i386
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto_internalize.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/thinlto_internalize.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto_internalize.ll
+@@ -14,6 +14,8 @@
+ ; h() should be internalized after promotion, and eliminated after inlining
+ ; CHECK-NOT: @h.llvm.
++; XFAIL: i686, i386
++
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+ define i32 @g() {
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto_linkonceresolution.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/thinlto_linkonceresolution.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto_linkonceresolution.ll
+@@ -23,6 +23,8 @@
+ ; OPT-NOT: @f()
+ ; OPT2: define weak_odr dso_local hidden void @f()
++; XFAIL: i686, i386
++
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+ define i32 @g() {
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto_weak_resolution.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/thinlto_weak_resolution.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/thinlto_weak_resolution.ll
+@@ -9,6 +9,7 @@
+ ; RUN:     --plugin-opt=save-temps \
+ ; RUN:     -shared \
+ ; RUN:     -o %t3.o %t.o %t2.o
++; XFAIL: i686, i386
+ ; RUN: llvm-nm %t3.o | FileCheck %s
+ ; CHECK: weakfunc
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/type-merge2.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/type-merge2.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/type-merge2.ll
+@@ -6,6 +6,8 @@
+ ; RUN:    -shared %t.o %t2.o -o %t3.o
+ ; RUN: llvm-dis %t3.o.0.2.internalize.bc -o - | FileCheck %s
++; XFAIL: *
++
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/vectorize.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/vectorize.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/vectorize.ll
+@@ -7,6 +7,7 @@
+ ; test that the vectorizer is run.
+ ; CHECK: fadd <4 x float>
++; XFAIL: *
+ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+Index: llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/visibility.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn317433.orig/test/tools/gold/X86/visibility.ll
++++ llvm-toolchain-snapshot_6.0~svn317433/test/tools/gold/X86/visibility.ll
+@@ -16,6 +16,7 @@
+ ; CHECK-NEXT: Other [
+ ; CHECK-NEXT:   STV_PROTECTED
+ ; CHECK-NEXT: ]
++; XFAIL: *
+ ; IR: define dso_local void @foo
diff --git a/patches/silent-llvm-isel-fuzzer.diff b/patches/silent-llvm-isel-fuzzer.diff
new file mode 100644 (file)
index 0000000..538f67b
--- /dev/null
@@ -0,0 +1,24 @@
+Index: llvm-toolchain-snapshot_6.0~svn315736/test/tools/llvm-isel-fuzzer/aarch64-execname-options.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn315736.orig/test/tools/llvm-isel-fuzzer/aarch64-execname-options.ll
++++ llvm-toolchain-snapshot_6.0~svn315736/test/tools/llvm-isel-fuzzer/aarch64-execname-options.ll
+@@ -2,6 +2,7 @@
+ ; without copying the whole lib dir or polluting the build dir.
+ ; REQUIRES: static-libs
+ ; REQUIRES: aarch64-registered-target
++: XFAIL: *
+ ; RUN: echo > %t.input
+Index: llvm-toolchain-snapshot_6.0~svn315736/test/tools/llvm-isel-fuzzer/execname-options.ll
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn315736.orig/test/tools/llvm-isel-fuzzer/execname-options.ll
++++ llvm-toolchain-snapshot_6.0~svn315736/test/tools/llvm-isel-fuzzer/execname-options.ll
+@@ -1,6 +1,7 @@
+ ; If the binary looks up libraries using an rpath, we can't test this
+ ; without copying the whole lib dir or polluting the build dir.
+ ; REQUIRES: static-libs
++: XFAIL: *
+ ; RUN: echo > %t.input
diff --git a/patches/silent-more-tests.diff b/patches/silent-more-tests.diff
new file mode 100644 (file)
index 0000000..56724b7
--- /dev/null
@@ -0,0 +1,52 @@
+# Comment the tests for the code coverage (fails otherwise)
+
+
+---
+ test/BugPoint/crash-narrowfunctiontest.ll |    1 +
+ test/BugPoint/metadata.ll                 |    3 ++-
+ test/BugPoint/remove_arguments_test.ll    |    1 +
+ test/Feature/load_module.ll               |    1 +
+ 4 files changed, 5 insertions(+), 1 deletion(-)
+
+--- a/test/BugPoint/crash-narrowfunctiontest.ll
++++ b/test/BugPoint/crash-narrowfunctiontest.ll
+@@ -2,6 +2,7 @@
+ ;
+ ; RUN: bugpoint -load %llvmshlibdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes > /dev/null
+ ; REQUIRES: loadable_module
++; XFAIL: *
+ define i32 @foo() { ret i32 1 }
+--- a/test/BugPoint/metadata.ll
++++ b/test/BugPoint/metadata.ll
+@@ -7,7 +7,8 @@
+ ;
+ ; RUN: bugpoint -load %llvmshlibdir/BugpointPasses%shlibext %s -output-prefix %t-notype -bugpoint-crashcalls -silence-passes -disable-namedmd-remove -disable-strip-debuginfo > /dev/null
+ ; RUN: llvm-dis %t-notype-reduced-simplified.bc -o - | FileCheck %s --check-prefix=NOTYPE
+-;
++; XFAIL: *
++
+ ; Bugpoint should keep the call's metadata attached to the call.
+ ; CHECK: call void @foo(), !dbg ![[LOC:[0-9]+]], !attach ![[CALL:[0-9]+]]
+--- a/test/BugPoint/remove_arguments_test.ll
++++ b/test/BugPoint/remove_arguments_test.ll
+@@ -1,6 +1,7 @@
+ ; RUN: bugpoint -load %llvmshlibdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes
+ ; RUN: llvm-dis %t-reduced-simplified.bc -o - | FileCheck %s
+ ; REQUIRES: loadable_module
++; XFAIL: *
+ ; Test to make sure that arguments are removed from the function if they are
+ ; unnecessary. And clean up any types that frees up too.
+--- a/test/Feature/load_module.ll
++++ b/test/Feature/load_module.ll
+@@ -3,6 +3,7 @@
+ ; RUN:   -disable-output 2>&1 | grep Hello
+ ; REQUIRES: loadable_module
+ ; FIXME: On Cygming, it might fail without building LLVMHello manually.
++; XFAIL: *
+ @junk = global i32 0
diff --git a/patches/silent-test-failing-codeverage.diff b/patches/silent-test-failing-codeverage.diff
new file mode 100644 (file)
index 0000000..76e8701
--- /dev/null
@@ -0,0 +1,13 @@
+Index: llvm-toolchain-snapshot_5.0~svn306792/test/ThinLTO/X86/autoupgrade.ll
+===================================================================
+--- llvm-toolchain-snapshot_5.0~svn306792.orig/test/ThinLTO/X86/autoupgrade.ll
++++ llvm-toolchain-snapshot_5.0~svn306792/test/ThinLTO/X86/autoupgrade.ll
+@@ -12,6 +12,8 @@
+ ; CHECK: <STRTAB_BLOCK
+ ; CHECK-NEXT: blob data = 'mainglobalfunc1llvm.invariant.start.p0i8{{.*}}'
++; XFAIL: *
++
+ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-apple-macosx10.11.0"
diff --git a/patches/silent-test-macho.diff b/patches/silent-test-macho.diff
new file mode 100644 (file)
index 0000000..569aea0
--- /dev/null
@@ -0,0 +1,14 @@
+Index: llvm-toolchain-snapshot_6.0~svn314668/test/Object/macho-invalid.test
+===================================================================
+--- llvm-toolchain-snapshot_6.0~svn314668.orig/test/Object/macho-invalid.test
++++ llvm-toolchain-snapshot_6.0~svn314668/test/Object/macho-invalid.test
+@@ -284,9 +284,6 @@ INVALID-DYLIB-WRONG-FILETYPE: macho-inva
+ RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho-invalid-dylib-no-id  2>&1 | FileCheck -check-prefix INVALID-DYLIB-NO-ID %s
+ INVALID-DYLIB-NO-ID: macho-invalid-dylib-no-id': truncated or malformed object (no LC_ID_DYLIB load command in dynamic library filetype)
+-RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho-invalid-dylib-cmdsize-past-eof 2>&1 | FileCheck -check-prefix INVALID-DYLIB-CMDSIZE %s
+-INVALID-DYLIB-CMDSIZE: macho-invalid-dylib-cmdsize-past-eof': truncated or malformed object (load command 0 extends past end of file)
+-
+ RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho-invalid-uuid-more-than-one  2>&1 | FileCheck -check-prefix INVALID-UUID-MORE-THAN-ONE %s
+ INVALID-UUID-MORE-THAN-ONE: macho-invalid-uuid-more-than-one': truncated or malformed object (more than one LC_UUID command)
diff --git a/patches/sparc64-add-missing-tls-get-addr.diff b/patches/sparc64-add-missing-tls-get-addr.diff
new file mode 100644 (file)
index 0000000..3f4413d
--- /dev/null
@@ -0,0 +1,43 @@
+Description: [Sparc] Include __tls_get_addr in symbol table for TLS calls to it
+ Global Dynamic and Local Dynamic call relocations only implicitly
+ reference __tls_get_addr, but it still needs to be in the symbol table
+ to be bound at link time otherwise it fails to link. For details, see
+ https://sourceware.org/bugzilla/show_bug.cgi?id=22832.
+Author: James Clarke <jrtc27@jrtc27.com>
+Last-Update: 2018-02-14
+
+--- llvm-toolchain-4.0-4.0.1.orig/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
++++ llvm-toolchain-4.0-4.0.1/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
+@@ -194,14 +194,30 @@ static void fixELFSymbolsInTLSFixupsImpl
+ void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
+   switch(getKind()) {
+   default: return;
++  case VK_Sparc_TLS_GD_CALL:
++  case VK_Sparc_TLS_LDM_CALL: {
++    // The corresponding relocations reference __tls_get_addr, as they call it,
++    // but this is only implicit; there is no connection in the ELF file
++    // between the relocation and the symbol, other than the specification for
++    // the semantics of the relocations. However, the symbol must be included
++    // in our symbol table despite the lack of references to it, since it needs
++    // to be bound during linking for these relocations. For details see
++    // https://sourceware.org/bugzilla/show_bug.cgi?id=22832.
++    MCSymbol *Symbol = Asm.getContext().getOrCreateSymbol("__tls_get_addr");
++    Asm.registerSymbol(*Symbol);
++    auto ELFSymbol = cast<MCSymbolELF>(Symbol);
++    if (!ELFSymbol->isBindingSet()) {
++      ELFSymbol->setBinding(ELF::STB_GLOBAL);
++      ELFSymbol->setExternal(true);
++    }
++    LLVM_FALLTHROUGH;
++  }
+   case VK_Sparc_TLS_GD_HI22:
+   case VK_Sparc_TLS_GD_LO10:
+   case VK_Sparc_TLS_GD_ADD:
+-  case VK_Sparc_TLS_GD_CALL:
+   case VK_Sparc_TLS_LDM_HI22:
+   case VK_Sparc_TLS_LDM_LO10:
+   case VK_Sparc_TLS_LDM_ADD:
+-  case VK_Sparc_TLS_LDM_CALL:
+   case VK_Sparc_TLS_LDO_HIX22:
+   case VK_Sparc_TLS_LDO_LOX10:
+   case VK_Sparc_TLS_LDO_ADD:
diff --git a/patches/test-keep-alive.diff b/patches/test-keep-alive.diff
new file mode 100644 (file)
index 0000000..f22c66f
--- /dev/null
@@ -0,0 +1,21 @@
+Index: llvm-toolchain-5.0-5.0.1~+rc1/utils/lit/lit/ProgressBar.py
+===================================================================
+--- llvm-toolchain-5.0-5.0.1~+rc1.orig/utils/lit/lit/ProgressBar.py
++++ llvm-toolchain-5.0-5.0.1~+rc1/utils/lit/lit/ProgressBar.py
+@@ -189,15 +189,7 @@ class SimpleProgressBar:
+             return
+         for i in range(self.atIndex, next):
+-            idx = i % 5
+-            if idx == 0:
+-                sys.stdout.write('%-2d' % (i*2))
+-            elif idx == 1:
+-                pass # Skip second char
+-            elif idx < 4:
+-                sys.stdout.write('.')
+-            else:
+-                sys.stdout.write(' ')
++            sys.stdout.write('%-2d ' % (i*2))
+         sys.stdout.flush()
+         self.atIndex = next
diff --git a/patches/ubuntu-cosmic-support.patch b/patches/ubuntu-cosmic-support.patch
new file mode 100644 (file)
index 0000000..50f1bf2
--- /dev/null
@@ -0,0 +1,33 @@
+Description: Add Ubuntu Cosmic to the distro release list.
+Author: Adam Conrad <adconrad@ubuntu.com>
+Last-Update: 2018-05-03
+
+--- llvm-toolchain-6.0-6.0.orig/clang/include/clang/Driver/Distro.h
++++ llvm-toolchain-6.0-6.0/clang/include/clang/Driver/Distro.h
+@@ -61,6 +61,7 @@ public:
+     UbuntuZesty,
+     UbuntuArtful,
+     UbuntuBionic,
++    UbuntuCosmic,
+     UnknownDistro
+   };
+@@ -114,7 +115,7 @@ public:
+   }
+   bool IsUbuntu() const {
+-    return DistroVal >= UbuntuHardy && DistroVal <= UbuntuBionic;
++    return DistroVal >= UbuntuHardy && DistroVal <= UbuntuCosmic;
+   }
+   bool IsAlpineLinux() const {
+--- llvm-toolchain-6.0-6.0.orig/clang/lib/Driver/Distro.cpp
++++ llvm-toolchain-6.0-6.0/clang/lib/Driver/Distro.cpp
+@@ -49,6 +49,7 @@ static Distro::DistroType DetectDistro(v
+                       .Case("zesty", Distro::UbuntuZesty)
+                       .Case("artful", Distro::UbuntuArtful)
+                       .Case("bionic", Distro::UbuntuBionic)
++                      .Case("cosmic", Distro::UbuntuCosmic)
+                       .Default(Distro::UnknownDistro);
+     if (Version != Distro::UnknownDistro)
+       return Version;
diff --git a/patches/unwind-chain-inclusion.diff b/patches/unwind-chain-inclusion.diff
new file mode 100644 (file)
index 0000000..0a7468e
--- /dev/null
@@ -0,0 +1,41 @@
+# Without this patch, the first local include of unwind.h might, with the 
+# __has_include_next, try to include the one from the system.
+# It might be /usr/include/clang/3.4/include/unwind.h
+# Because of the #ifndef __CLANG_UNWIND_H, it might never include any declaration
+# from the system. 
+
+---
+ clang/lib/Headers/unwind.h |    9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+--- a/clang/lib/Headers/unwind.h
++++ b/clang/lib/Headers/unwind.h
+@@ -23,9 +23,6 @@
+ /* See "Data Definitions for libgcc_s" in the Linux Standard Base.*/
+-#ifndef __CLANG_UNWIND_H
+-#define __CLANG_UNWIND_H
+-
+ #if defined(__APPLE__) && __has_include_next(<unwind.h>)
+ /* Darwin (from 11.x on) provide an unwind.h. If that's available,
+  * use it. libunwind wraps some of its definitions in #ifdef _GNU_SOURCE,
+@@ -53,6 +50,9 @@
+ # endif
+ #else
++#ifndef __CLANG_UNWIND_H
++#define __CLANG_UNWIND_H
++
+ #include <stdint.h>
+ #ifdef __cplusplus
+@@ -294,6 +294,7 @@ _Unwind_Ptr _Unwind_GetTextRelBase(struc
+ }
+ #endif
++#endif /* __CLANG_UNWIND_H */
++
+ #endif
+-#endif /* __CLANG_UNWIND_H */
diff --git a/pollycc.in b/pollycc.in
new file mode 100755 (executable)
index 0000000..f063818
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+clang -Xclang -load -Xclang /usr/lib/llvm-@LLVM_VERSION@/lib/LLVMPolly.so $@
diff --git a/prepare-new-release.sh b/prepare-new-release.sh
new file mode 100644 (file)
index 0000000..d1a7a6f
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh
+ORIG_VERSION=5.0
+TARGET_VERSION=6.0
+ORIG_VERSION_2=6_0
+TARGET_VERSION_2=6_0
+
+LIST=`ls debian/control debian/orig-tar.sh debian/rules debian/patches/clang-analyzer-force-version.diff debian/patches/clang-format-version.diff debian/patches/python-clangpath.diff debian/patches/scan-build-clang-path.diff debian/patches/lldb-libname.diff debian/patches/fix-scan-view-path.diff debian/patches/lldb-addversion-suffix-to-llvm-server-exec.patch debian/patches/clang-tidy-run-bin.diff debian/patches/clang-apply-replacements.diff debian/patches/fix-scan-view-path.diff`
+for F in $LIST; do
+    sed -i -e "s|$ORIG_VERSION_2|$TARGET_VERSION_2|g" $F
+    sed -i -e "s|$ORIG_VERSION|$TARGET_VERSION|g" $F
+done
+
+echo "once you copy the old version into a new branch"
+echo "edit debian/control, update the VCS links"
+echo "edit debian/control, update the source pkg name"
+echo "edit debian/changelog, update the source pkg name"
diff --git a/python-clang-X.Y.install.in b/python-clang-X.Y.install.in
new file mode 100644 (file)
index 0000000..b549421
--- /dev/null
@@ -0,0 +1 @@
+tools/clang/bindings/python/clang/ /usr/lib/python2.7/dist-packages/
diff --git a/python-lldb-X.Y.install.in b/python-lldb-X.Y.install.in
new file mode 100644 (file)
index 0000000..3e2c69e
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/llvm-@LLVM_VERSION@/lib/python2.7/site-packages/lldb/
diff --git a/python-lldb-X.Y.links.in b/python-lldb-X.Y.links.in
new file mode 100644 (file)
index 0000000..bce077f
--- /dev/null
@@ -0,0 +1,6 @@
+usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION_FULL@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/python2.7/site-packages/lldb/libLLVM-@LLVM_VERSION_FULL@.so.1
+usr/lib/@DEB_HOST_MULTIARCH@/libLLVM-@LLVM_VERSION_FULL@.so.1 usr/lib/llvm-@LLVM_VERSION@/lib/python2.7/site-packages/lldb/libLLVM-@LLVM_VERSION@.so.1
+usr/lib/@DEB_HOST_MULTIARCH@/liblldb-@LLVM_VERSION@.so.1      usr/lib/llvm-@LLVM_VERSION@/lib/python2.7/site-packages/lldb/_lldb.so
+usr/lib/llvm-@LLVM_VERSION@/lib/python2.7/site-packages/lldb/ usr/lib/python2.7/dist-packages/lldb
+
+
diff --git a/qualify-clang.sh b/qualify-clang.sh
new file mode 100644 (file)
index 0000000..cc96184
--- /dev/null
@@ -0,0 +1,308 @@
+#!/bin/sh
+# Stop at the first error
+set -e
+
+VERSION=6.0
+
+if test ! -f /usr/bin/llvm-config-$VERSION; then
+    echo "Install llvm-$VERSION & llvm-$VERSION-dev"
+    exit 1
+fi
+llvm-config-$VERSION --link-shared --libs &> /dev/null
+
+echo '#include <stdlib.h>
+int main() {
+  char *x = (char*)malloc(10 * sizeof(char*));
+  free(x);
+  return x[5];
+}
+' > foo.c
+clang-$VERSION -o foo -fsanitize=address -O1 -fno-omit-frame-pointer -g  foo.c
+if ! ./foo 2>&1 | grep -q heap-use-after-free ; then
+    echo "sanitize=address is failing"
+    exit 42
+fi
+
+echo 'int main() {return 0;}' > foo.c
+clang-$VERSION foo.c
+
+echo '#include <stddef.h>' > foo.c
+clang-$VERSION -c foo.c
+
+echo "#include <fenv.h>" > foo.cc
+NBLINES=$(clang++-$VERSION -P -E foo.cc|wc -l)
+if test $NBLINES -lt 100; then
+    echo "Error: more than 100 lines should be returned"
+    exit 42
+fi
+
+echo '#include <emmintrin.h>' > foo.cc
+clang++-$VERSION -c foo.cc
+
+echo '
+#include <string.h>
+int
+main ()
+{
+  (void) strcat;
+  return 0;
+}' > foo.c
+clang-$VERSION -c foo.c
+
+echo '#include <errno.h>
+int main() {} ' > foo.c
+clang-$VERSION foo.c
+
+echo '#include <chrono>
+int main() { }' > foo.cpp
+clang++-$VERSION -std=c++11 foo.cpp
+
+echo '#include <stdio.h>
+int main() {
+if (1==1) {
+       printf("true");
+}else{
+       printf("false");
+       return 42;
+}
+return 0;}' > foo.c
+clang-$VERSION --coverage foo.c -o foo
+./foo > /dev/null
+if test ! -f foo.gcno; then
+    echo "Coverage failed";
+fi
+
+echo "#include <iterator>" > foo.cpp
+clang++-$VERSION -c foo.cpp
+
+
+echo '#include <stdio.h>
+int main() {
+if (1==1) {
+  printf("true");
+}else{
+  printf("false");
+  return 42;
+}
+return 0;}' > foo.c
+rm foo
+
+if test ! -f /usr/lib/llvm-$VERSION/bin/../lib/LLVMgold.so; then
+    echo "Install llvm-$VERSION-dev"
+    exit 1
+fi
+
+clang-$VERSION -flto foo.c -o foo
+./foo > /dev/null
+
+clang-$VERSION -fuse-ld=gold foo.c -o foo
+./foo > /dev/null
+
+# test thinlto
+echo "int foo(void) {  return 0; }"> foo.c
+echo "int foo(void); int main() {foo();        return 0;}">main.c
+clang-$VERSION -flto=thin -O2 foo.c main.c -o foo
+./foo > /dev/null
+
+if test ! -f /usr/bin/lld-$VERSION; then
+    echo "Install lld-$VERSION"
+    exit 1
+fi
+clang-$VERSION -fuse-ld=lld -O2 foo.c main.c -o foo
+./foo > /dev/null
+
+clang-$VERSION -fuse-ld=lld-$VERSION -O2 foo.c main.c -o foo
+./foo > /dev/null
+
+cat << EOF > test_fuzzer.cc
+#include <stdint.h>
+#include <stddef.h>
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  if (size > 0 && data[0] == 'H')
+    if (size > 1 && data[1] == 'I')
+       if (size > 2 && data[2] == '!')
+       __builtin_trap();
+  return 0;
+}
+EOF
+
+if test ! -f /usr/lib/llvm-$VERSION/lib/libFuzzer.a; then
+    echo "Install libfuzzer-$VERSION-dev";
+    exit -1;
+fi
+
+clang++-$VERSION -fsanitize=address -fsanitize-coverage=edge test_fuzzer.cc /usr/lib/llvm-$VERSION/lib/libFuzzer.a
+if ! ./a.out 2>&1 | grep -q -E "(Test unit written|PreferSmall)"; then
+    echo "fuzzer"
+    exit 42
+fi
+clang-$VERSION -fsanitize=fuzzer test_fuzzer.cc
+if ! ./a.out 2>&1 | grep -q -E "(Test unit written|PreferSmall)"; then
+    echo "fuzzer"
+    exit 42
+fi
+
+echo 'int main() {
+       int a=0;
+       return a;
+}
+' > foo.c
+clang++-$VERSION -g -o bar foo.c
+echo "b main
+run
+bt
+quit" > lldb-cmd.txt
+
+if test ! -f /usr/bin/lldb-$VERSION; then
+    echo "Install lldb-$VERSION";
+    exit -1;
+fi
+
+
+lldb-$VERSION -s lldb-cmd.txt bar
+echo '
+#include <vector>
+int main (void)
+{  std::vector<int> a;
+  a.push_back (0);
+}
+' > foo.cpp
+clang++-$VERSION -g -o foo foo.cpp
+echo 'target create "./foo"
+b main
+r
+n
+p a
+quit' > lldb-cmd.txt
+lldb-$VERSION -s lldb-cmd.txt ./foo
+
+echo "int main() { return 1; }" > foo.c
+clang-$VERSION -fsanitize=efficiency-working-set -o foo foo.c
+./foo > /dev/null || true
+
+
+rm -rf cmaketest && mkdir cmaketest
+cat > cmaketest/CMakeLists.txt <<EOF
+cmake_minimum_required(VERSION 2.8.12)
+project(SanityCheck)
+find_package(LLVM $VERSION REQUIRED CONFIG)
+message(STATUS "LLVM_CMAKE_DIR: \${LLVM_CMAKE_DIR}")
+if(NOT EXISTS "\${LLVM_TOOLS_BINARY_DIR}/clang")
+message(FATAL_ERROR "Invalid LLVM_TOOLS_BINARY_DIR: \${LLVM_TOOLS_BINARY_DIR}")
+endif()
+# TODO add version to ClangConfig.cmake and use $VERSION below
+find_package(Clang REQUIRED CONFIG)
+find_file(H clang/AST/ASTConsumer.h PATHS \${CLANG_INCLUDE_DIRS} NO_DEFAULT_PATH)
+message(STATUS "CLANG_INCLUDE_DIRS: \${CLANG_INCLUDE_DIRS}")
+if(NOT H)
+message(FATAL_ERROR "Invalid Clang header path: \${CLANG_INCLUDE_DIRS}")
+endif()
+EOF
+mkdir cmaketest/standard cmaketest/explicit
+echo "Test: CMake find LLVM and Clang in default path"
+(cd cmaketest/standard && CC=clang-$VERSION CXX=clang++-$VERSION cmake ..)
+echo "Test: CMake find LLVM and Clang in explicit prefix path"
+(cd cmaketest/explicit && CC=clang-$VERSION CXX=clang++-$VERSION CMAKE_PREFIX_PATH=/usr/lib/llvm-$VERSION cmake ..)
+rm -rf cmaketest
+
+# Test case for bug #900440
+rm -rf cmaketest && mkdir cmaketest
+cat > cmaketest/CMakeLists.txt <<EOF
+cmake_minimum_required(VERSION 2.8.12)
+project(testllvm)
+
+find_package(LLVM CONFIG REQUIRED)
+find_package(Clang CONFIG REQUIRED)
+
+if(NOT LLVM_VERSION STREQUAL Clang_VERSION)
+    #message(FATAL_ERROR "LLVM ${LLVM_VERSION} not matching to Clang ${Clang_VERSION}")
+endif()
+EOF
+mkdir cmaketest/foo/
+(cd cmaketest/foo && cmake ..)
+rm -rf cmaketest
+
+
+CLANG=clang-$VERSION
+#command -v "$CLANG" 1>/dev/null 2>/dev/null || { printf "Usage:\n%s CLANGEXE [ARGS]\n" "$0" 1>&2; exit 1; }
+#shift
+
+TEMPDIR=$(mktemp -d); trap "rm -rf \"$TEMPDIR\"" 0
+
+cat > "$TEMPDIR/test.c" <<EOF
+#include <stdlib.h>
+#include <stdio.h>
+int main ()
+{
+#if __has_feature(address_sanitizer)
+  puts("address_sanitizer");
+#endif
+#if __has_feature(thread_sanitizer)
+  puts("thread_sanitizer");
+#endif
+#if __has_feature(memory_sanitizer)
+  puts("memory_sanitizer");
+#endif
+#if __has_feature(undefined_sanitizer)
+  puts("undefined_sanitizer");
+#endif
+#if __has_feature(dataflow_sanitizer)
+  puts("dataflow_sanitizer");
+#endif
+#if __has_feature(efficiency_sanitizer)
+  puts("efficiency_sanitizer");
+#endif
+  printf("Ok\n");
+  return EXIT_SUCCESS;
+}
+EOF
+
+#clean up
+rm a.out bar crash-* foo foo.* lldb-cmd.txt main.c test_fuzzer.cc
+
+# only for AMD64 for now
+# many sanitizers only work on AMD64
+# x32 programs need to be enabled in the kernel bootparams for debian
+# (https://wiki.debian.org/X32Port)
+#
+# SYSTEM should iterate multiple targets (eg. x86_64-unknown-none-gnu for embedded)
+# MARCH should iterate the library architectures via flags
+# LIB should iterate the different libraries
+echo "if it fails, please run"
+echo "apt-get install libc6-dev:i386 libgcc-5-dev:i386 libc6-dev-x32 libx32gcc-5-dev libx32gcc-8-dev"
+for SYSTEM in ""; do
+    for MARCH in -m64 -m32 -mx32 "-m32 -march=i686"; do
+        for LIB in --rtlib=compiler-rt -fsanitize=address -fsanitize=thread -fsanitize=memory -fsanitize=undefined -fsanitize=dataflow; do # -fsanitize=efficiency-working-set; do
+            if test "$MARCH" == "-m32" -o "$MARCH" == "-mx32"; then
+                if test $LIB == "-fsanitize=thread" -o $LIB == "-fsanitize=memory" -o $LIB == "-fsanitize=dataflow" -o $LIB == "-fsanitize=address" -o $LIB == "-fsanitize=undefined"; then
+                    echo "Skip $MARCH / $LIB";
+                    continue
+                fi
+            fi
+            if test "$MARCH" == "-m32 -march=i686"; then
+                if test $LIB == "-fsanitize=memory" -o $LIB == "-fsanitize=thread" -o $LIB == "-fsanitize=dataflow"; then
+                     echo "Skip $MARCH / $LIB";
+                     continue
+                fi
+            fi
+            XARGS="$SYSTEM $MARCH $LIB"
+            printf "\nTest: clang %s\n" "$XARGS"
+            rm -f "$TEMPDIR/test"
+            "$CLANG" $XARGS -o "$TEMPDIR/test" "$@" "$TEMPDIR/test.c"
+            [ ! -e "$TEMPDIR/test" ] || { "$TEMPDIR/test" || printf 'Error\n'; }
+        done
+    done
+done
+
+echo "If the following fails, try setting an environment variable such as:"
+echo "OBJC_INCLUDE_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/include"
+echo "libobjc-7-dev should be also installed"
+echo "#include <objc/objc.h>" > foo.m
+clang-$VERSION -c foo.m
+
+if test ! -f /usr/lib/llvm-$VERSION/lib/libclangBasic.a; then
+    echo "Install libclang-$VERSION-dev"
+    exit 1
+fi
+
+echo "Completed"
diff --git a/rules b/rules
new file mode 100755 (executable)
index 0000000..a20bfc8
--- /dev/null
+++ b/rules
@@ -0,0 +1,629 @@
+#!/usr/bin/make -f
+
+TARGET_BUILD   := build-llvm
+DEB_INST               := $(CURDIR)/debian/tmp/
+
+GXX_VERSIONED_PACKAGE    := $(shell dpkg-query -W -f '$${Depends}' g++ | grep -o 'g++-[0-9][0-9.]*' | tail -n1 )
+GXX_VERSIONED_EXECUTABLE := $(shell dpkg -L $(GXX_VERSIONED_PACKAGE) | grep '/usr/bin/g++-[0-9][0-9.]*' | xargs ls -d | tail -n1 )
+GCC_VERSION              := $(subst /usr/bin/g++-,,$(GXX_VERSIONED_EXECUTABLE))
+
+LLVM_VERSION   := $(shell dpkg-parsechangelog | sed -rne "s,^Version: 1:([0-9]+).([0-9]+).*,\1.\2,p")
+LLVM_VERSION_FULL := $(shell dpkg-parsechangelog | sed -rne "s,^Version: 1:([0-9.]+)(~|-)(.*),\1,p")
+ifeq ($(LLVM_VERSION),$(LLVM_VERSION_FULL))
+       LLVM_VERSION_FULL := $(LLVM_VERSION).0
+endif
+
+SONAME_EXT      := 1
+# Manage the case when the version is 1:3.5~svn213052-1~exp1 or 1:3.4.2-1
+DEBIAN_REVISION := $(shell dpkg-parsechangelog |  sed -rne "s,^Version: 1:([0-9.]+)(~|-)(.*),\3,p")
+ifneq (,$(filter parallel=%,$(subst $(COMMA), ,$(DEB_BUILD_OPTIONS))))
+  NJOBS := -j $(subst parallel=,,$(filter parallel=%,$(subst $(COMMA), ,$(DEB_BUILD_OPTIONS))))
+endif
+
+VENDOR=$(shell lsb_release -is)
+DH_VERSION := $(shell dpkg -s debhelper | grep '^Version' | awk '{print $$2}')
+
+DEB_HOST_MULTIARCH  ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_HOST_ARCH_BITS  ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_BITS)
+DEB_HOST_ARCH       ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
+DEB_HOST_ARCH_OS    ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
+
+LDFLAGS_EXTRA =
+CXXFLAGS_EXTRA = -std=c++0x
+CONFIGURE_EXTRA =
+CMAKE_EXTRA =
+
+ifneq (,$(filter $(DEB_HOST_ARCH),powerpc powerpcspe))
+LDFLAGS_EXTRA += -latomic
+endif
+
+# Only enable gsplit dwarf on archs which needs it (32 bits)
+ifeq ($(DEB_HOST_ARCH_BITS),32)
+ifeq ($(shell dpkg --compare-versions $(shell dpkg-query -W -f '$${Version}' binutils) ge 2.22.52.0.4 ; echo $$?),0)
+# when using -gsplit-dwarf, it will requires extract-dwo which doesn't exist on precise:
+# More: https://llvm.org/bugs/show_bug.cgi?id=28841
+ifeq ($(shell dpkg --compare-versions $(shell dpkg-query -W -f '$${Version}' g++-$(GCC_VERSION)) lt 7.1.0-7~ || \
+       dpkg --compare-versions $(shell dpkg-query -W -f '$${Version}' g++-$(GCC_VERSION)) ge 7.2.0-2; echo $$?),0)
+# Only pass -gsplit-dwarf with working version of gcc 7
+# More: https://bugs.llvm.org/show_bug.cgi?id=34140 & https://bugs.debian.org/873609
+CXXFLAGS_EXTRA += -gsplit-dwarf
+else
+$(error "Broken gcc version for -gsplit-dwarf support. Please use < gcc 7 or >= 7.2.0-2")
+endif # < gcc 7 or >= 7.2.0-2
+endif # binutils
+endif # archs
+
+ifeq ($(shell dpkg --compare-versions $(shell dpkg-query -W -f '$${Version}' g++-$(GCC_VERSION)) lt 4.9-20140411-1~ ; echo $$?),0)
+# Too old version of gcc. Force 4.9
+       GCC_VERSION := 4.9
+endif
+
+export CC=gcc-$(GCC_VERSION)
+export CXX=g++-$(GCC_VERSION)
+
+opt_flags = -O2 -DNDEBUG
+
+ifneq (,$(findstring $(DEB_HOST_ARCH),armel))
+  opt_flags += -marm
+  # 3.8 fails to build, disable the compiler_rt builtins
+  # See http://lists.llvm.org/pipermail/llvm-dev/2016-May/099761.html
+  CMAKE_EXTRA += -DCOMPILER_RT_BUILD_BUILTINS=OFF
+  # Prevent clang from getting a > v4t default
+  # See bug #868779
+  CMAKE_EXTRA += -DLLVM_HOST_TRIPLE=arm-linux-gnueabi
+endif
+
+ifeq ($(shell dpkg --compare-versions $(shell dpkg-query -W -f '$${Version}' g++-$(GCC_VERSION)) ge 4.8-20121128-1~ ; echo $$?),0)
+       control_vars = '-Vdep:devlibs=libstdc++-$(GCC_VERSION)-dev, libgcc-$(GCC_VERSION)-dev' \
+               '-Vdep:devlibs-objc=libobjc-$(GCC_VERSION)-dev'
+else ifeq ($(shell dpkg --compare-versions $(shell dpkg-query -W -f '$${Version}' g++-$(GCC_VERSION)) ge 4.7.2-10~ ; echo $$?),0)
+       control_vars = '-Vdep:devlibs=libstdc++6-$(GCC_VERSION)-dev, libgcc-$(GCC_VERSION)-dev' \
+               '-Vdep:devlibs-objc=libobjc-$(GCC_VERSION)-dev'
+else
+       control_vars = '-Vdep:devlibs=libstdc++6-$(GCC_VERSION)-dev'
+endif
+
+BINUTILS_GOLD_ARCHS := amd64 arm64 armhf i386 ppc64 ppc64el sparc sparc64 x32 s390x
+ifeq ($(shell dpkg --compare-versions $(shell dpkg-query -W -f '$${Version}' binutils) ge 2.23.1-1~exp3 ; echo $$?),0)
+ifneq (,$(filter $(DEB_HOST_ARCH),$(BINUTILS_GOLD_ARCHS)))
+# -fused-ld=gold enables the gold linker (but is not supported by all archs / distro)
+       LDFLAGS_EXTRA += -fuse-ld=gold --no-keep-files-mapped --no-map-whole-files
+       CXXFLAGS_EXTRA += -fuse-ld=gold -Wl,--no-keep-files-mapped -Wl,--no-map-whole-files
+       CMAKE_EXTRA += -DLLVM_BINUTILS_INCDIR=/usr/include/
+endif
+endif
+
+# Enable polly (or not)
+POLLY_ENABLE=yes
+ifneq (,$(filter $(DEB_HOST_ARCH), powerpc powerpcspe))
+  POLLY_ENABLE=no
+endif
+
+RUN_TEST=yes
+ifneq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
+       RUN_TEST=no
+endif
+
+ifneq (,$(filter codecoverage,$(DEB_BUILD_OPTIONS)))
+# enable the code coverage
+       CODECOVERAGE=yes
+# for -fvisibility-inlines-hidden see http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20130729/183016.html
+       CXXFLAGS_EXTRA += -fprofile-arcs -ftest-coverage
+       LDFLAGS_EXTRA += -coverage -lgcov
+       RUN_TEST=yes
+endif
+
+ifneq (,$(filter scan-build,$(DEB_BUILD_OPTIONS)))
+# enable the build using scan-build
+# The package are installed through the variable declarations:
+# OTHERMIRROR="deb http://llvm.org/apt/unstable/ llvm-toolchain main"
+# EXTRAPACKAGES="clang-3.5"
+       PRE_PROCESS=scan-build-$(LLVM_VERSION) --show-description -analyzer-config stable-report-filename=true -enable-checker optin.performance.Padding
+       PRE_PROCESS_CONF=scan-build-$(LLVM_VERSION)
+# no need to run tests in this case
+       RUN_TEST=no
+       CONFIGURE_EXTRA += --enable-assertions
+       CMAKE_EXTRA += -DLLVM_ENABLE_ASSERTIONS=ON
+endif
+
+ifneq (,$(filter coverity,$(DEB_BUILD_OPTIONS)))
+# enable the build using coverity
+# pbuilder contains BINDMOUNTS="/opt/cov-analysis/"
+# And we have some pbuilder hooks to configure and pack the result
+# Where the binaries are installed on the jenkins instance
+       PRE_PROCESS=PATH=$$PATH:/opt/cov-analysis/bin/ cov-build --dir cov-int
+# We don't want to check the temporary files produced by the configure
+       PRE_PROCESS_CONF=
+       COVERITY_ENABLE=1
+       CONFIGURE_EXTRA += --enable-assertions
+       CMAKE_EXTRA += -DLLVM_ENABLE_ASSERTIONS=ON
+# no need to run tests in this case
+       RUN_TEST=no
+else
+       COVERITY_ENABLE=0
+endif
+
+LLDB_ENABLE=yes
+LLDB_DISABLE_ARCHS := hurd-i386 ia64 powerpc powerpcspe ppc64 s390x sparc64
+# hurd has threading issues
+ifeq (,$(filter-out $(LLDB_DISABLE_ARCHS), $(DEB_HOST_ARCH)))
+# Disable LLDB for this arch.
+               LLDB_ENABLE=no
+else
+# See https://llvm.org/bugs/show_bug.cgi?id=28898
+# Enable it again as it seems it is fixed upstream https://bugs.llvm.org/show_bug.cgi?id=35291
+#      CMAKE_EXTRA += -DLLDB_DISABLE_LIBEDIT=ON
+endif
+
+LLD_ENABLE=yes
+
+DH_OPTIONS=
+OCAML_ENABLE= no
+OCAML_ARCHS := amd64 arm64 armel armhf i386 ppc64el s390x
+ifneq (,$(filter $(DEB_HOST_ARCH),$(OCAML_ARCHS)))
+# Enable OCAML for this arch.
+       # OCAML_ENABLE=yes
+       # OCAML_STDLIB_DIR    ?= $(shell ocamlc -where)
+       # DH_OPTIONS=--with ocaml
+endif
+# Force the deactivation of ocaml until the transition is done
+OCAML_ENABLE=no
+
+LIBFUZZER_ENABLE=yes
+ifeq (,$(filter $(DEB_HOST_ARCH_OS),linux))
+       LIBFUZZER_ENABLE=no
+endif
+
+
+%:
+       dh $@ $(DH_OPTIONS)
+
+
+preconfigure:
+       for f in debian/*.in; do \
+               f2=$$(echo $$f | sed 's/\.in$$//;s/X\.Y/$(LLVM_VERSION)/'); \
+               echo "$$f => $$f2"; \
+               sed -e 's|@DEB_HOST_MULTIARCH@|$(DEB_HOST_MULTIARCH)|g' \
+                       -e "s|@OCAML_STDLIB_DIR@|$(OCAML_STDLIB_DIR)|g" \
+                       -e "s|@LLVM_VERSION_FULL@|$(LLVM_VERSION_FULL)|g" \
+                       -e "s|@LLVM_VERSION@|$(LLVM_VERSION)|g" $$f > $$f2; \
+       done
+
+# Override this two targets. They are trying to manage the .in conversion for me
+override_dh_ocamlinit:
+override_dh_ocamlclean:
+
+override_dh_auto_configure: preconfigure
+       echo "Using gcc: "
+       $(CC) -v
+       mkdir -p $(TARGET_BUILD)
+       mkdir -p clang/include/clang/Debian
+       sed -e "s|@DEB_PATCHSETVERSION@|$(DEBIAN_REVISION)|" \
+               debian/debian_path.h > clang/include/clang/Debian/debian_path.h
+
+# Remove some old symlinks
+       cd tools/ && \
+               if test -h clang; then \
+                       rm clang; \
+               fi; \
+               ln -s ../clang .; \
+       readlink clang
+
+       if test "$(POLLY_ENABLE)" = yes; then \
+               cd tools/ && \
+               if test -h polly; then \
+                       rm polly; \
+               fi; \
+               ln -s ../polly .; \
+       fi
+
+       if test "$(LLD_ENABLE)" = yes; then \
+       cd tools/ && \
+               if test -h lld; then \
+                       rm lld; \
+               fi; \
+               ln -s ../lld .; \
+       readlink lld; \
+       fi
+
+       if test "$(LLDB_ENABLE)" = yes; then \
+               cd tools/ && \
+               if test -h lldb; then \
+                  rm lldb; \
+               fi; \
+               ln -s ../lldb .; \
+       fi
+
+       cd projects/ && \
+       if test -h compiler-rt; then \
+               rm compiler-rt; \
+       fi; \
+       ln -s ../compiler-rt .; \
+       readlink compiler-rt
+
+       # Configure coverity (we need the compilers) + work around perf issues
+       -(if test $(COVERITY_ENABLE) -eq 1; then \
+               export PATH=$$PATH:/opt/cov-analysis/bin/; \
+               cov-configure --compiler clang --comptype clang; \
+               cov-configure --compiler gcc-$(GCC_VERSION) --comptype gcc; \
+               cov-configure --compiler g++-$(GCC_VERSION) --comptype gcc; \
+               cov-configure -co /usr/bin/g++-$(GCC_VERSION) --comptype gcc -- -std=c++0x -fPIC -std=c++11; \
+               cov-configure -co /usr/bin/gcc-$(GCC_VERSION) --comptype gcc -- -fPIC; \
+               cov-configure -co /usr/bin/g++-$(GCC_VERSION) --comptype gcc -- -std=c++0x -fPIC -std=c++11 -fno-exceptions; \
+               cov-configure -co /usr/bin/g++-$(GCC_VERSION) --comptype gcc --template \
+                       --xml-option append_arg:"--ppp_translator" \
+                       --xml-option append_arg:"replace/llvm::AlignOf<PrevTy>::Alignment/(llvm::AlignOf<PrevTy>::Alignment)" \
+                       --xml-option append_arg:"--ppp_translator" \
+                       --xml-option append_arg:"replace/llvm::AlignOf<NextTy>::Alignment/(llvm::AlignOf<NextTy>::Alignment)"; \
+               cov-configure --compiler c++ --comptype g++ --template \
+                       --xml-option append_arg:"--ppp_translator" \
+                       --xml-option append_arg:"replace/llvm::AlignOf<PrevTy>::Alignment/(llvm::AlignOf<PrevTy>::Alignment)" \
+                       --xml-option append_arg:"--ppp_translator" \
+                       --xml-option append_arg:"replace/llvm::AlignOf<NextTy>::Alignment/(llvm::AlignOf<NextTy>::Alignment)"; \
+       fi)
+
+       # Due to bug upstream, no symlink here
+       rm -fr tools/clang/tools/extra
+       cp -R -H clang-tools-extra tools/clang/tools/extra
+
+       echo "Running tests: $(RUN_TEST)"
+
+       # if cmake is installed in /tmp/cmake/ uses it
+       # Used to build llvm on old ubuntu (precise) on the llvm.org/apt/ ci
+       CMAKE_BIN=cmake; \
+       if test -f /tmp/cmake/bin/cmake; then \
+               CMAKE_BIN=/tmp/cmake/bin/cmake; \
+       fi; \
+       echo "Using cmake: $$CMAKE_BIN"; \
+       cd $(TARGET_BUILD) && \
+       $(PRE_PROCESS_CONF) $$CMAKE_BIN ../ \
+       -DCMAKE_INSTALL_PREFIX=/usr/lib/llvm-$(LLVM_VERSION) \
+       -DCMAKE_VERBOSE_MAKEFILE=ON \
+       -DCMAKE_BUILD_TYPE=RelWithDebInfo \
+       -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="$(opt_flags)" \
+       -DCMAKE_CXX_FLAGS='$(CXXFLAGS_EXTRA)' \
+       -DLLVM_LINK_LLVM_DYLIB=ON \
+       -DLLVM_INSTALL_UTILS=ON \
+       -DLLVM_VERSION_SUFFIX= \
+       -DLLVM_ENABLE_SPHINX=ON \
+       -DSPHINX_WARNINGS_AS_ERRORS=OFF \
+       -DLLVM_BUILD_LLVM_DYLIB=ON \
+       -DLLVM_ENABLE_RTTI=ON \
+       -DLLVM_ENABLE_FFI=ON \
+       $(CMAKE_EXTRA) \
+       -DLIBCLANG_LIBRARY_VERSION=$(SONAME_EXT) \
+       -DPOLLY_BUNDLED_JSONCPP=OFF \
+       -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="WebAssembly;AVR"
+
+override_dh_auto_build:
+       $(PRE_PROCESS) $(MAKE) $(NJOBS) -C $(TARGET_BUILD) VERBOSE=1 CLANG_VENDOR=$(VENDOR) CXXFLAGS="$(CXXFLAGS_EXTRA)"  LDFLAGS="$(LDFLAGS_EXTRA)" REQUIRES_RTTI=1 DEBUGMAKE=1
+ifeq (${LIBFUZZER_ENABLE},yes)
+       cd $(TARGET_BUILD) \
+       CFLAGS=`dpkg-buildflags --get CFLAGS`; \
+       CFLAGS="$$CFLAGS `dpkg-buildflags --get CPPFLAGS`"; \
+       echo $$CFLAGS; \
+       bin/clang++ -c $$CFLAGS -std=c++11 ../compiler-rt/lib/fuzzer/*.cpp -IFuzzer; \
+       ar ruv libFuzzer.a Fuzzer*.o
+endif
+
+override_dh_prep: build_doc
+       dh_prep
+
+build_doc:
+       cd $(CURDIR)/docs && make -f Makefile.sphinx && make -f Makefile.sphinx man
+       cd $(CURDIR)/clang/docs && make -f Makefile.sphinx && make -f Makefile.sphinx man
+       -(if test "$(OCAML_ENABLE)" = yes; then \
+       $(MAKE) $(NJOBS) -C "$(TARGET_BUILD)/docs" ocaml_doc; \
+       fi)
+
+# Continue if failing, Ubuntu precise cannot generate manpages as sphinx is too old
+       -(cd $(TARGET_BUILD) && make $(NJOBS) docs-llvm-html docs-clang-html docs-clang-tools-html docs-polly-html docs-polly-man docs-clang-tools-man docs-clang-man docs-llvm-man)
+
+# Rename manpages
+       d=$(CURDIR)/docs/_build/man/; \
+       if test -d $$d; then \
+               cd $$d; \
+               for f in *.1; do \
+                       echo "$$f"|grep $(LLVM_VERSION) || mv $$f `echo $$f|sed "s|\.1|-$(LLVM_VERSION).1|"`; \
+               done; \
+       else \
+               echo "could not find $$d"; \
+       fi
+# the clang doc generation only generates clang manpage
+# When it will do more, we should move that in the loop above
+       cd $(CURDIR)/clang/docs/_build/man/; mv clang.1 clang-$(LLVM_VERSION).1
+
+# Remove the copy of jquery. See bug #701087
+       for d in $(TARGET_BUILD)/docs/html/_static/ $(TARGET_BUILD)/tools/clang/docs/html/_static/ $(TARGET_BUILD)/tools/clang/tools/extra/docs/html/_static/; do \
+               cd $$d && rm -f jquery.js && ln -s /usr/share/javascript/jquery/jquery.js && cd -; \
+               cd $$d && rm -f underscore.js && ln -s /usr/share/javascript/underscore/underscore.js && cd -; \
+       done
+
+       mkdir -p debian/man/
+       help2man --no-info --version-string=$(LLVM_VERSION) clang/tools/scan-view/bin/scan-view > debian/man/scan-view-$(LLVM_VERSION).1
+       help2man --no-info --version-string=$(LLVM_VERSION) clang/tools/clang-format/clang-format-diff.py > debian/man/clang-format-diff-$(LLVM_VERSION).1
+
+       CMDS="llvm-dwarfdump llvm-mc llvm-mcmarkup llvm-objdump llvm-rtdyld llvm-size llvm-ranlib lldb lldb-mi clang-format clang clang++ clang-tblgen clang-check clang-cpp clang-import-test clang-tidy clang-apply-replacements clang-rename clang-query pp-trace sancov lli modularize clang-include-fixer find-all-symbols clang-reorder-fields ld.lld llvm-tblgen clang-change-namespace clang-offload-bundler"; \
+       for f in $$CMDS; do \
+               echo "Generating manpage of $$f"; \
+               LD_LIBRARY_PATH=$(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/:/usr/lib/*/libfakeroot help2man --no-info --version-string=$(LLVM_VERSION) $(TARGET_BUILD)/bin/$$f > debian/man/$$f-$(LLVM_VERSION).1; \
+       done
+
+override_dh_auto_install:
+       # Clean up temporary files to make sure the install works
+       rm -rf $(find $(TARGET_BUILD) -wholename '*CMakeFiles*' -not -name CMakeLists.txt -a -name "*.dir" -type d)
+       # install/fast enables a make install without recompiling temporary files
+       $(MAKE) -C $(TARGET_BUILD) VERBOSE=1 install/fast DESTDIR=$(DEB_INST)/
+       # Not used on Linux.
+       rm -f $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/bin/argdumper
+       rm -f $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/share/clang/clang-format-bbedit.applescript
+
+       cp $(TARGET_BUILD)/bin/clang-query $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/bin
+
+       # Only run on executable, not script
+       chrpath -d `find $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/bin/ -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'|cut -d: -f1`
+
+       cd debian/tmp/usr/lib/llvm-$(LLVM_VERSION)/lib/ && rm -f libclang.so.$(SONAME_EXT) libclang-$(LLVM_VERSION).so; \
+       ln -s libclang-$(LLVM_VERSION).so.$(SONAME_EXT) libclang.so.$(SONAME_EXT)
+
+# Remove artifact (where compiler-rt is built)
+#      if test -d $(TARGET_BUILD)/tools/clang/runtime/compiler-rt/clang_linux; then \
+#      cd $(TARGET_BUILD)/tools/clang/runtime/compiler-rt/clang_linux && rm -rf $$(find . -mindepth 2 -maxdepth 2 -type d) && rm -rf $$(find -empty) && rm -rf */.dir; \
+#      fi
+
+       mkdir -p $(CURDIR)/debian/clang-$(LLVM_VERSION)/usr/bin/
+       cp compiler-rt/lib/asan/scripts/asan_symbolize.py $(CURDIR)/debian/clang-$(LLVM_VERSION)/usr/bin/asan_symbolize-$(LLVM_VERSION)
+
+ifeq (${LIBFUZZER_ENABLE},yes)
+       mkdir -p $(CURDIR)/debian/libfuzzer-$(LLVM_VERSION)-dev/usr/lib/llvm-$(LLVM_VERSION)/lib/
+       cp -v $(TARGET_BUILD)/libFuzzer.a $(CURDIR)/debian/libfuzzer-$(LLVM_VERSION)-dev/usr/lib/llvm-$(LLVM_VERSION)/lib/
+endif
+
+# Create this fake directory to make the install libclang-common-dev happy
+# under the unsupported archs of compiler-rt
+       mkdir -p $(DEB_INST)/usr/lib/clang/$(LLVM_VERSION)/lib
+       mkdir -p $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/clang/$(LLVM_VERSION_FULL)/lib/
+       mkdir -p $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/clang/$(LLVM_VERSION)/lib/clang_linux/
+       mkdir -p $(TARGET_BUILD)/tools/clang/runtime/compiler-rt/clang_linux/
+       mkdir -p $(TARGET_BUILD)/tools/clang/runtime/compiler-rt/clang_linux/
+# On some archs, the sanatizers are not built. As we explicitly includes some txt files, create
+# a fake txt to make sure it doesn't fail
+       echo "The *.txt files, if available, contain helper to override some of the errors messages." > $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/clang/$(LLVM_VERSION_FULL)/README.txt
+       echo "Please visit https://github.com/google/sanitizers/wiki/AddressSanitizer for help" >> $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/clang/$(LLVM_VERSION_FULL)/README.txt
+
+# idem for the lldb python binding
+       mkdir -p $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/python2.7/site-packages/lldb/
+
+# Remove things that CMake  install but which aren't packaged yet,
+# or are packaged from the source or build tree.
+       mv $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/bin/clang-$(LLVM_VERSION) \
+          $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/bin/clang
+
+# Don't think it is used
+       rm -f $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/libPolly*a
+# Probably useless
+       rm -f $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/python2.7/site-packages/six.py
+
+# Rename binaries
+       mkdir -p $(DEB_INST)/usr/bin/
+       cd $(DEB_INST)/usr/bin/; \
+       rm -f *; \
+       for f in ../lib/llvm-$(LLVM_VERSION)/bin/*; do \
+               ln -s $$f `basename $$f`-$(LLVM_VERSION); \
+               echo "Link $$f to `basename $$f`-$(LLVM_VERSION)"; \
+       done
+
+# Rename some stuff with the version name
+       cp $(CURDIR)/clang/tools/scan-build/man/scan-build.1 $(CURDIR)/clang/tools/scan-build/man/scan-build-$(LLVM_VERSION).1
+
+       # copy the vim files (except that tablegen does not exist for indent
+       VIM_DIRS="ftdetect ftplugin syntax indent"; \
+       for dir in $$VIM_DIRS; do \
+               cp -f $(CURDIR)/utils/vim/$$dir/llvm.vim $(CURDIR)/utils/vim/$$dir/llvm-$(LLVM_VERSION).vim; \
+               if test -f $(CURDIR)/utils/vim/$$dir/tablegen.vim; then \
+                       cp -f $(CURDIR)/utils/vim/$$dir/tablegen.vim $(CURDIR)/utils/vim/$$dir/tablegen-$(LLVM_VERSION).vim; \
+               fi; \
+       done
+       cp -f $(CURDIR)/utils/vim/vimrc $(CURDIR)/utils/vim/llvm-$(LLVM_VERSION)-vimrc
+
+       cp -f $(CURDIR)/clang/tools/clang-format/clang-format-diff.py $(CURDIR)/clang/tools/clang-format/clang-format-diff-$(LLVM_VERSION)
+
+       cp -f $(CURDIR)/clang/tools/clang-format/clang-format.py clang/tools/clang-format/clang-format-$(LLVM_VERSION).py
+
+       rm -rf clang/tools/scan-build-$(LLVM_VERSION)
+       cp -fR $(CURDIR)/clang/tools/scan-build clang/tools/scan-build-$(LLVM_VERSION)
+
+       rm -rf clang/tools/scan-build-py-$(LLVM_VERSION)
+       cp -fR $(CURDIR)/clang/tools/scan-build-py clang/tools/scan-build-py-$(LLVM_VERSION)
+       chmod +x clang/tools/scan-build-py-$(LLVM_VERSION)/bin/*
+
+       rm -rf clang/tools/scan-view-$(LLVM_VERSION)
+       cp -fR $(CURDIR)/clang/tools/scan-view clang/tools/scan-view-$(LLVM_VERSION)
+
+# Remove some license files
+       rm -f $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/include/llvm/Support/LICENSE.TXT
+
+# Disable CMake's package validation checks for target files that we may remove.
+       sed -i '/_IMPORT_CHECK_TARGETS \(Polly\|sancov\)/ {s|^|#|}' $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/cmake/llvm/LLVMExports-*.cmake
+
+# Disable CMake's package validation checks for binaries that may not be installed
+       sed -i 's|.*_IMPORT_CHECK_FILES_FOR_.*/bin/.*)|#&|' $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/cmake/clang/ClangTargets-*.cmake
+
+# Managed in python-lldb-X.Y.links.in
+       rm -f $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/python*/site-packages/lldb/_lldb.so
+
+# Manage the polly files. Sometimes, we build them. Sometimes not.
+       if test "$(POLLY_ENABLE)" = yes; then \
+               mkdir -p $(CURDIR)/debian/libclang-$(LLVM_VERSION)-dev/usr/lib/llvm-$(LLVM_VERSION)/lib/ $(CURDIR)/debian/libclang-common-$(LLVM_VERSION)-dev/usr/lib/llvm-$(LLVM_VERSION)/include/polly/; \
+               mv -f $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/libpolly* \
+               $(CURDIR)/debian/libclang-$(LLVM_VERSION)-dev/usr/lib/llvm-$(LLVM_VERSION)/lib/; \
+               rm -rf $(CURDIR)/debian/libclang-common-$(LLVM_VERSION)-dev/usr/lib/llvm-$(LLVM_VERSION)/include/polly; \
+               mv -f $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/include/polly/ \
+               $(CURDIR)/debian/libclang-common-$(LLVM_VERSION)-dev/usr/lib/llvm-$(LLVM_VERSION)/include/; \
+       fi
+
+       mkdir -p $(CURDIR)/debian/usr/share/doc/llvm-$(LLVM_VERSION)-doc/ $(CURDIR)/debian/usr/share/doc/clang-$(LLVM_VERSION)-doc/
+       cp -R $(TARGET_BUILD)/docs/html $(CURDIR)/debian/usr/share/doc/llvm-$(LLVM_VERSION)-doc/
+       cp -R $(TARGET_BUILD)/tools/clang/docs/html $(CURDIR)/debian/usr/share/doc/clang-$(LLVM_VERSION)-doc/
+       cp -R $(TARGET_BUILD)/tools/clang/tools/extra/docs/html $(CURDIR)/debian/usr/share/doc/clang-$(LLVM_VERSION)-doc/clang-extra
+
+# Rename OCaml bindings
+       if test "$(OCAML_ENABLE)" = yes; then \
+               mkdir -p "$(DEB_INST)$(OCAML_STDLIB_DIR)"; \
+               mkdir -p "$(DEB_INST)usr/lib/llvm-$(LLVM_VERSION)/docs/ocaml/html/html"; \
+               mkdir -p "$(DEB_INST)usr/lib/llvm-$(LLVM_VERSION)/share/doc/llvm/ocaml-html/"; \
+               if test -d "$(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/ocaml"; then \
+                       mv -f "$(DEB_INST)usr/lib/llvm-$(LLVM_VERSION)/lib/ocaml" \
+                       "$(DEB_INST)$(OCAML_STDLIB_DIR)/llvm-$(LLVM_VERSION)"; \
+               fi; \
+       fi
+
+# Delete the target build directory to save some space on the build systems
+# All the files have been installed in $(CURDIR)/debian/tmp/ already
+       rm -rf $(TARGET_BUILD)
+
+
+override_dh_makeshlibs:
+       dh_makeshlibs -plibclang$(SONAME_EXT)-$(LLVM_VERSION) -V"libclang$(SONAME_EXT)-$(LLVM_VERSION) (>= 1:6.0~svn298832-1~)"
+       dh_makeshlibs -pliblldb-$(LLVM_VERSION) -V"liblldb-$(LLVM_VERSION) (>= 1:6.0~svn298832-1~)"
+       dh_makeshlibs -plibllvm$(LLVM_VERSION) -V"libllvm$(LLVM_VERSION) (>= 1:6.0~svn298832-1~)"
+       dh_makeshlibs --remaining-packages
+
+override_dh_shlibdeps:
+# Ignore asan libraries. They would trigger dependencies to multiarch libraries
+       dh_shlibdeps -l$(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/ -Xlibclang_rt.asan -Xlibclang_rt.asan -Xlibclang_rt.asan-*.so -Xlibclang_rt.asan-*.so
+
+override_dh_installman:
+       dh_installman
+# Make sure that lli manpage is only in llvm-3.2-runtime (See #697117)
+       rm -f $(CURDIR)/debian/llvm-$(LLVM_VERSION)/usr/share/man/man1/lli*
+
+
+override_dh_strip:
+       : # running out of diskspace on the buildds
+       find $(TARGET_BUILD) -name '*.o' -o -name '*.a' | xargs -r rm -f
+ifeq (0, $(strip $(shell dpkg --compare-versions $(DH_VERSION) ge 9.20160114; echo $$?)))
+       : # If we don't have the right version of debhelper, don't run the option
+       dh_strip -p libclang$(SONAME_EXT)-$(LLVM_VERSION) --dbgsym-migration='libclang$(SONAME_EXT)-$(LLVM_VERSION)-dbg (<< 1:6.0-2~)'
+       dh_strip -p libllvm$(LLVM_VERSION) --dbgsym-migration='libllvm$(LLVM_VERSION)-dbg (<< 1:6.0-2~)'
+       dh_strip -p liblldb-$(LLVM_VERSION) --dbgsym-migration='liblldb-$(LLVM_VERSION)-dbg (<< 1:6.0-2~)'
+endif
+# ifeq (${LLD_ENABLE},yes)
+#      dh_strip -p liblld-$(LLVM_VERSION) --dbg-package=liblld-$(LLVM_VERSION)-dbg
+# endif
+       dh_strip -a
+
+
+override_dh_install:
+#      cp $(TARGET_BUILD)/lib/libLLVM-$(LLVM_VERSION).so $(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/libLLVM-$(LLVM_VERSION).so.$(SONAME_EXT)
+ifeq (${POLLY_ENABLE},yes)
+# only for arch:any builds
+ifneq (,$(filter libclang-common-$(LLVM_VERSION)-dev, $(shell dh_listpackages)))
+       dh_install -p libclang-common-$(LLVM_VERSION)-dev usr/lib/llvm-$(LLVM_VERSION)/lib/cmake/polly/*.cmake usr/lib/llvm-$(LLVM_VERSION)/lib/cmake/polly
+else
+       rm -rf $(CURDIR)/debian/tmp/usr/lib/llvm-$(LLVM_VERSION)/lib/cmake/polly/*.cmake
+endif
+endif
+       dh_install --fail-missing
+
+override_dh_installdeb:
+# Managed by the package
+       dh_installdeb -a
+
+       rm -f $(CURDIR)/debian/tmp/usr/lib/llvm-$(LLVM_VERSION)/lib/python*/site-packages/lldb/__init__.pyc $(CURDIR)/debian/python-lldb-$(LLVM_VERSION)/usr/lib/llvm-$(LLVM_VERSION)/lib/python*/site-packages/lldb/__init__.pyc
+       rm -f $(CURDIR)/debian/clang-$(LLVM_VERSION)-examples/usr/share/doc/clang-$(LLVM_VERSION)-examples/examples/*Make*
+
+# Remove auto generated python pyc
+       find $(CURDIR)/debian/llvm-$(LLVM_VERSION)-tools/usr/lib/llvm-$(LLVM_VERSION)/ -name '*.pyc' | xargs -r rm -f
+
+ifeq (${RUN_TEST},yes)
+# List of the archs we know we have 100 % tests working
+ARCH_LLVM_TEST_OK := i386 amd64
+
+override_dh_auto_test:
+
+# LLVM tests
+ifneq (,$(findstring $(DEB_HOST_ARCH),$(ARCH_LLVM_TEST_OK)))
+# logs the output to check-llvm_build_log.txt for validation through autopkgtest
+       $(MAKE) $(NJOBS) -C $(TARGET_BUILD) check-llvm | tee check-llvm_build_log.txt
+else
+       $(MAKE) $(NJOBS) -C $(TARGET_BUILD) check-llvm || true
+endif
+
+# Clang tests
+       $(MAKE) $(NJOBS) -C $(TARGET_BUILD) check-clang || true
+
+# Clang extra tests (ex: clang-tidy)
+       $(MAKE) $(NJOBS) -C $(TARGET_BUILD) check-clang-tools || true
+
+# LLD tests
+ifeq (${LLD_ENABLE},yes)
+       $(MAKE) $(NJOBS) -C $(TARGET_BUILD) check-lld || true
+endif
+
+# Sanitizer
+       $(MAKE) $(NJOBS) -C $(TARGET_BUILD) check-sanitizer || true
+
+# LLDB tests
+ifeq (,$(filter $(DEB_HOST_ARCH), $(LLDB_DISABLE_ARCHS) armhf armel))
+ifneq (,$(filter codecoverage,$(DEB_BUILD_OPTIONS)))
+# Create a symlink to run the testsuite: see https://bugs.archlinux.org/task/50759
+       cd $(CURDIR)/$(TARGET_BUILD)/lib/python*/site-packages/; \
+               if test ! -e _lldb.so; then \
+                       ln -s lldb/_lldb.so; \
+               fi
+       LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(CURDIR)/$(TARGET_BUILD)/lib/ $(MAKE) $(NJOBS) -C $(TARGET_BUILD) check-lldb || true
+       # remove the workaround
+       rm $(CURDIR)/$(TARGET_BUILD)/lib/python*/site-packages/_lldb.so
+endif
+endif
+
+# Polly tests
+ifeq (${POLLY_ENABLE},yes)
+       $(MAKE) $(NJOBS) -C $(TARGET_BUILD) check-polly || true
+endif
+
+# Managed by debian build system
+       rm -f $(CURDIR)/$(TARGET_BUILD)/lib/python*/site-packages/lldb/_lldb.so
+
+# polly tests
+       if test "$(POLLY_ENABLE)" = yes; then \
+               cd $(TARGET_BUILD)/ && LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(DEB_INST)/usr/lib/llvm-$(LLVM_VERSION)/lib/ $(MAKE) -C tools/polly/test/ check-polly || true; \
+    fi
+
+# The compression of the code coverage report is done in the
+# hook B21GetCoverageResults on the server
+       if test "$(CODECOVERAGE)" = "yes"; then \
+               REPORT=reports/llvm-toolchain.info; \
+               mkdir -p reports/; \
+               lcov --directory $(TARGET_BUILD)/ --capture --ignore-errors source --output-file $$REPORT; \
+               lcov --remove $$REPORT "/usr*" -o $$REPORT; \
+               genhtml -o reports/coverage --show-details --highlight --legend $$REPORT; \
+       fi
+override_dh_auto_test:
+endif
+
+
+override_dh_gencontrol:
+       dh_gencontrol -- $(control_vars)
+
+
+override_dh_auto_clean:
+       rm -rf $(TARGET_BUILD) tools/clang/include/clang/Debian/debian_path.h docs/_build/ clang/docs/_build tools/clang/docs/_html/
+# QA tools
+       rm -rf cov-int/ reports/
+       rm -f `ls debian/*.in|sed -e "s|.in$$||g"`
+       find utils -name '*.pyc' | xargs -r rm -f
+       # Use -I because a test has a space in its name
+       find lldb/test -iname '*.pyc' | xargs -I{} -r rm -f {}
+       find test -name '*.pyc' -o -name '*.cm[ix]' | xargs -r rm -f
+       find test/Bindings -name '*.o' | xargs -r rm -f
+       rm -f tools/clang tools/polly tools/lld tools/lldb projects/compiler-rt
+       rm -rf tools/clang/tools/extra clang/tools/extra/
+       rm -f $(CURDIR)/utils/vim/llvm-$(LLVM_VERSION).vim $(CURDIR)/utils/vim/tablegen-$(LLVM_VERSION).vim
+       rm -f $(CURDIR)/clang/tools/clang-format/clang-format-diff-$(LLVM_VERSION)
+       rm -f $(CURDIR)/clang/tools/clang-format/clang-format-$(LLVM_VERSION).py
+
+
+.PHONY: override_dh_strip preconfigure
diff --git a/source.lintian-overrides b/source.lintian-overrides
new file mode 100644 (file)
index 0000000..1039d83
--- /dev/null
@@ -0,0 +1,9 @@
+# Removed by patch remove-dbtree.diff
+source: source-is-missing clang/www/analyzer/scripts/dbtree.js
+# No longer used (we are using cmake now)
+source: outdated-autotools-helper-file autoconf/config.guess 2011-08-20
+source: outdated-autotools-helper-file autoconf/config.sub 2011-11-02
+# Reported here https://bugs.llvm.org/show_bug.cgi?id=32962
+# No activity, silent it to avoid false positive in automation
+source: license-problem-convert-utf-code lib/Support/ConvertUTF.cpp
+
diff --git a/source/format b/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/tests.disabled/control b/tests.disabled/control
new file mode 100644 (file)
index 0000000..82582ae
--- /dev/null
@@ -0,0 +1,4 @@
+Tests: llvm
+Depends: @
+Restrictions: build-needed
+
diff --git a/tests.disabled/llvm b/tests.disabled/llvm
new file mode 100644 (file)
index 0000000..64b4573
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh
+# Checks llvm build passing on architectiures known to have 100% tests workings
+
+if grep -q "Unexpected Failure" check-llvm_build_log.txt; then
+       exit 1
+else
+       echo "build OK"
+fi
+rm check-llvm_build_log.txt
diff --git a/watch b/watch
new file mode 100644 (file)
index 0000000..fcd015d
--- /dev/null
+++ b/watch
@@ -0,0 +1,4 @@
+version=3
+opts=uversionmangle=s/\.(tar.*|tgz|zip|gz|bz2)$//i,dversionmangle=s/[-.+~]?(cvs|svn|git|snapshot|pre|hg)(.*)$//i,pasv \
+https://llvm.org/releases/download.html (?:.*/)?clang-?_?([\d+\.]+|\d+)\.(tar.*|tgz|zip|gz|bz2|) debian debian/orig-tar.sh
+