diff --git a/.clang.metadata b/.clang.metadata
new file mode 100644
index 0000000..0ea63d6
--- /dev/null
+++ b/.clang.metadata
@@ -0,0 +1,2 @@
+427e12762836d808583fb4149c033d02de0a8db2 SOURCES/cfe-7.0.1.src.tar.xz
+6f4048482c4cf1818133120565c2dcd1d3a62747 SOURCES/clang-tools-extra-7.0.1.src.tar.xz
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..061149c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+SOURCES/cfe-7.0.1.src.tar.xz
+SOURCES/clang-tools-extra-7.0.1.src.tar.xz
diff --git a/SOURCES/0001-Convert-clang-format-diff.py-to-python3-using-2to3.patch b/SOURCES/0001-Convert-clang-format-diff.py-to-python3-using-2to3.patch
new file mode 100644
index 0000000..2c15ece
--- /dev/null
+++ b/SOURCES/0001-Convert-clang-format-diff.py-to-python3-using-2to3.patch
@@ -0,0 +1,52 @@
+From a1bccf89a02accab69b359ef004faa95257333c0 Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Fri, 7 Sep 2018 18:27:16 +0000
+Subject: [PATCH] Convert clang-format-diff.py to python3 using 2to3
+
+---
+ tools/clang-format/clang-format-diff.py | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/tools/clang-format/clang-format-diff.py b/tools/clang-format/clang-format-diff.py
+index ffa30e70dd..1525a3815c 100755
+--- a/tools/clang-format/clang-format-diff.py
++++ b/tools/clang-format/clang-format-diff.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/python3
+ #
+ #===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===#
+ #
+@@ -27,7 +27,7 @@ import difflib
+ import re
+ import string
+ import subprocess
+-import StringIO
++import io
+ import sys
+ 
+ 
+@@ -89,9 +89,9 @@ def main():
+           ['-lines', str(start_line) + ':' + str(end_line)])
+ 
+   # Reformat files containing changes in place.
+-  for filename, lines in lines_by_file.iteritems():
++  for filename, lines in lines_by_file.items():
+     if args.i and args.verbose:
+-      print 'Formatting', filename
++      print('Formatting', filename)
+     command = [args.binary, filename]
+     if args.i:
+       command.append('-i')
+@@ -109,7 +109,7 @@ def main():
+     if not args.i:
+       with open(filename) as f:
+         code = f.readlines()
+-      formatted_code = StringIO.StringIO(stdout).readlines()
++      formatted_code = io.StringIO(stdout).readlines()
+       diff = difflib.unified_diff(code, formatted_code,
+                                   filename, filename,
+                                   '(before formatting)', '(after formatting)')
+-- 
+2.14.3
+
diff --git a/SOURCES/0001-Convert-run-find-all-symbols.py-to-python3-using-2to.patch b/SOURCES/0001-Convert-run-find-all-symbols.py-to-python3-using-2to.patch
new file mode 100644
index 0000000..620f80d
--- /dev/null
+++ b/SOURCES/0001-Convert-run-find-all-symbols.py-to-python3-using-2to.patch
@@ -0,0 +1,61 @@
+From 6430ef09aecb30bce588c2d7f35b2294d219c835 Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Mon, 26 Nov 2018 19:18:12 -0800
+Subject: [PATCH] Convert run-find-all-symbols.py to python3 using 2to3
+
+---
+ include-fixer/find-all-symbols/tool/run-find-all-symbols.py | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/include-fixer/find-all-symbols/tool/run-find-all-symbols.py b/include-fixer/find-all-symbols/tool/run-find-all-symbols.py
+index 461d959..89a6cf5 100755
+--- a/include-fixer/find-all-symbols/tool/run-find-all-symbols.py
++++ b/include-fixer/find-all-symbols/tool/run-find-all-symbols.py
+@@ -27,7 +27,7 @@ import argparse
+ import json
+ import multiprocessing
+ import os
+-import Queue
++import queue
+ import shutil
+ import subprocess
+ import sys
+@@ -40,7 +40,7 @@ def find_compilation_database(path):
+   result = './'
+   while not os.path.isfile(os.path.join(result, path)):
+     if os.path.realpath(result) == '/':
+-      print 'Error: could not find compilation database.'
++      print('Error: could not find compilation database.')
+       sys.exit(1)
+     result += '../'
+   return os.path.realpath(result)
+@@ -50,7 +50,7 @@ def MergeSymbols(directory, args):
+   """Merge all symbol files (yaml) in a given directaory into a single file."""
+   invocation = [args.binary, '-merge-dir='+directory, args.saving_path]
+   subprocess.call(invocation)
+-  print 'Merge is finished. Saving results in ' + args.saving_path
++  print('Merge is finished. Saving results in ' + args.saving_path)
+ 
+ 
+ def run_find_all_symbols(args, tmpdir, build_path, queue):
+@@ -96,7 +96,7 @@ def main():
+ 
+   try:
+     # Spin up a bunch of tidy-launching threads.
+-    queue = Queue.Queue(max_task)
++    queue = queue.Queue(max_task)
+     for _ in range(max_task):
+       t = threading.Thread(target=run_find_all_symbols,
+                            args=(args, tmpdir, build_path, queue))
+@@ -116,7 +116,7 @@ def main():
+   except KeyboardInterrupt:
+     # This is a sad hack. Unfortunately subprocess goes
+     # bonkers with ctrl-c and we start forking merrily.
+-    print '\nCtrl-C detected, goodbye.'
++    print('\nCtrl-C detected, goodbye.')
+     os.kill(0, 9)
+ 
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0001-Convert-scan-view-to-python3-using-2to3.patch b/SOURCES/0001-Convert-scan-view-to-python3-using-2to3.patch
new file mode 100644
index 0000000..2534c6e
--- /dev/null
+++ b/SOURCES/0001-Convert-scan-view-to-python3-using-2to3.patch
@@ -0,0 +1,93 @@
+From c760f8d703af0c67774681b5a259d5dd3a1e5a77 Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Wed, 19 Sep 2018 08:53:10 -0700
+Subject: [PATCH] Convert scan-view to python3 using 2to3
+
+---
+ tools/scan-view/bin/scan-view | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/tools/scan-view/bin/scan-view b/tools/scan-view/bin/scan-view
+index 1b6e8ba..ca3dac5 100755
+--- a/tools/scan-view/bin/scan-view
++++ b/tools/scan-view/bin/scan-view
+@@ -7,9 +7,9 @@ import sys
+ import imp
+ import os
+ import posixpath
+-import thread
++import _thread
+ import time
+-import urllib
++import urllib.request, urllib.parse, urllib.error
+ import webbrowser
+ 
+ # How long to wait for server to start.
+@@ -27,7 +27,7 @@ kMaxPortsToTry = 100
+ 
+ def url_is_up(url):
+     try:
+-        o = urllib.urlopen(url)
++        o = urllib.request.urlopen(url)
+     except IOError:
+         return False
+     o.close()
+@@ -35,7 +35,7 @@ def url_is_up(url):
+ 
+ 
+ def start_browser(port, options):
+-    import urllib
++    import urllib.request, urllib.parse, urllib.error
+     import webbrowser
+ 
+     url = 'http://%s:%d' % (options.host, port)
+@@ -52,10 +52,10 @@ def start_browser(port, options):
+             sys.stderr.flush()
+         time.sleep(kSleepTimeout)
+     else:
+-        print >> sys.stderr, 'WARNING: Unable to detect that server started.'
++        print('WARNING: Unable to detect that server started.', file=sys.stderr)
+ 
+     if options.debug:
+-        print >> sys.stderr, '%s: Starting webbrowser...' % sys.argv[0]
++        print('%s: Starting webbrowser...' % sys.argv[0], file=sys.stderr)
+     webbrowser.open(url)
+ 
+ 
+@@ -69,9 +69,9 @@ def run(port, options, root):
+ 
+     import ScanView
+     try:
+-        print 'Starting scan-view at: http://%s:%d' % (options.host,
+-                                                       port)
+-        print '  Use Ctrl-C to exit.'
++        print('Starting scan-view at: http://%s:%d' % (options.host,
++                                                       port))
++        print('  Use Ctrl-C to exit.')
+         httpd = ScanView.create_server((options.host, port),
+                                        options, root)
+         httpd.serve_forever()
+@@ -80,9 +80,9 @@ def run(port, options, root):
+ 
+ 
+ def port_is_open(port):
+-    import SocketServer
++    import socketserver
+     try:
+-        t = SocketServer.TCPServer((kDefaultHost, port), None)
++        t = socketserver.TCPServer((kDefaultHost, port), None)
+     except:
+         return False
+     t.server_close()
+@@ -135,7 +135,7 @@ def main():
+     # Kick off thread to wait for server and start web browser, if
+     # requested.
+     if args.startBrowser:
+-        t = thread.start_new_thread(start_browser, (port, args))
++        t = _thread.start_new_thread(start_browser, (port, args))
+ 
+     run(port, args, args.root)
+ 
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0001-Don-t-prefer-python2.7.patch b/SOURCES/0001-Don-t-prefer-python2.7.patch
new file mode 100644
index 0000000..fb9963d
--- /dev/null
+++ b/SOURCES/0001-Don-t-prefer-python2.7.patch
@@ -0,0 +1,24 @@
+From 3f9cebe235dac01f22c8edd84a2d5d075cb90a17 Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Wed, 5 Sep 2018 21:43:42 -0700
+Subject: [PATCH] Don't prefer python2.7
+
+---
+ CMakeLists.txt | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index d4f67f1..f82de1e 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -109,7 +109,6 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
+   set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
+ 
+   if(LLVM_INCLUDE_TESTS)
+-    set(Python_ADDITIONAL_VERSIONS 2.7)
+     include(FindPythonInterp)
+     if(NOT PYTHONINTERP_FOUND)
+       message(FATAL_ERROR
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0001-Driver-Prefer-vendor-supplied-gcc-toolchain.patch b/SOURCES/0001-Driver-Prefer-vendor-supplied-gcc-toolchain.patch
new file mode 100644
index 0000000..b9d0aee
--- /dev/null
+++ b/SOURCES/0001-Driver-Prefer-vendor-supplied-gcc-toolchain.patch
@@ -0,0 +1,120 @@
+From d84a971ba917569829b51fff6057e5fd0d85e402 Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Thu, 18 Jan 2018 02:57:51 +0000
+Subject: [PATCH] Driver: Prefer vendor supplied gcc toolchain
+
+Summary:
+This patch fixes an issue on Fedora where if you had the x86_64 cross
+compiler installed on your x86_64 system, then clang would use that compiler
+as the default toolchain.  This was happening because the cross compiler
+is installed to /usr/lib/gcc/x86_64-linux-gnu/ and this directory comes before
+the default compiler directory (/usr/lib/gcc/x86_64-redhat-linux/) in the search
+list.
+
+This patch re-orders the search list so that vendor supplied gcc toolchains
+are selected before toolchains with a generic target, which should prevent
+these kind of issues on other OSes too.
+
+Subscribers: srhines, cfe-commits
+
+Differential Revision: https://reviews.llvm.org/D42608
+---
+ lib/Driver/ToolChains/Gnu.cpp | 47 ++++++++++++++++++++++---------------------
+ 1 file changed, 24 insertions(+), 23 deletions(-)
+
+diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp
+index 3755673..5a49a6e 100644
+--- a/lib/Driver/ToolChains/Gnu.cpp
++++ b/lib/Driver/ToolChains/Gnu.cpp
+@@ -1811,18 +1811,19 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
+   // lifetime or initialization issues.
+   static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
+   static const char *const AArch64Triples[] = {
+-      "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux",
+-      "aarch64-suse-linux"};
++      "aarch64-redhat-linux", "aarch64-suse-linux",
++      "aarch64-none-linux-gnu", "aarch64-linux-gnu"};
+   static const char *const AArch64beLibDirs[] = {"/lib"};
+   static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
+                                                  "aarch64_be-linux-gnu"};
+ 
+   static const char *const ARMLibDirs[] = {"/lib"};
+   static const char *const ARMTriples[] = {"arm-linux-gnueabi"};
+-  static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
+-                                             "armv7hl-redhat-linux-gnueabi",
++  static const char *const ARMHFTriples[] = {"armv7hl-redhat-linux-gnueabi",
+                                              "armv6hl-suse-linux-gnueabi",
+-                                             "armv7hl-suse-linux-gnueabi"};
++                                             "armv7hl-suse-linux-gnueabi",
++                                             "arm-linux-gnueabihf",
++  };
+   static const char *const ARMebLibDirs[] = {"/lib"};
+   static const char *const ARMebTriples[] = {"armeb-linux-gnueabi"};
+   static const char *const ARMebHFTriples[] = {
+@@ -1830,19 +1831,19 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
+ 
+   static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
+   static const char *const X86_64Triples[] = {
+-      "x86_64-linux-gnu",       "x86_64-unknown-linux-gnu",
+-      "x86_64-pc-linux-gnu",    "x86_64-redhat-linux6E",
+-      "x86_64-redhat-linux",    "x86_64-suse-linux",
+-      "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
+-      "x86_64-slackware-linux", "x86_64-unknown-linux",
+-      "x86_64-amazon-linux"};
++      "x86_64-redhat-linux6E",    "x86_64-redhat-linux",
++      "x86_64-suse-linux",        "x86_64-slackware-linux",
++      "x86_64-manbo-linux-gnu",   "x86_64-amazon-linux",
++      "x86_64-linux-gnu",         "x86_64-unknown-linux-gnu",
++      "x86_64-pc-linux-gnu",      "x86_64-linux-gnu",         
++      "x86_64-unknown-linux"};
+   static const char *const X32LibDirs[] = {"/libx32"};
+   static const char *const X86LibDirs[] = {"/lib32", "/lib"};
+   static const char *const X86Triples[] = {
+-      "i686-linux-gnu",       "i686-pc-linux-gnu",     "i486-linux-gnu",
+-      "i386-linux-gnu",       "i386-redhat-linux6E",   "i686-redhat-linux",
+-      "i586-redhat-linux",    "i386-redhat-linux",     "i586-suse-linux",
+-      "i486-slackware-linux", "i686-montavista-linux", "i586-linux-gnu"};
++      "i386-redhat-linux6E",   "i686-redhat-linux", "i586-redhat-linux",
++      "i386-redhat-linux",     "i586-suse-linux",   "i486-slackware-linux",
++      "i686-montavista-linux", "i686-linux-gnu",    "i686-pc-linux-gnu",
++      "i486-linux-gnu",        "i386-linux-gnu",    "i586-linux-gnu"};
+ 
+   static const char *const MIPSLibDirs[] = {"/lib"};
+   static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
+@@ -1864,16 +1865,16 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
+ 
+   static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
+   static const char *const PPCTriples[] = {
+-      "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
+-      "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
++      "powerpc-suse-linux", "powerpc-montavista-linuxspe",
++      "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe"};
+   static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
+   static const char *const PPC64Triples[] = {
+-      "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
+-      "powerpc64-suse-linux", "ppc64-redhat-linux"};
++      "powerpc64-suse-linux", "ppc64-redhat-linux",
++      "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu"};
+   static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
+   static const char *const PPC64LETriples[] = {
+-      "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
+-      "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
++      "powerpc64le-suse-linux", "ppc64le-redhat-linux",
++      "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu"};
+ 
+   static const char *const RISCV32LibDirs[] = {"/lib", "/lib32"};
+   static const char *const RISCVTriples[] = {"riscv32-unknown-linux-gnu",
+@@ -1889,8 +1890,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
+ 
+   static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
+   static const char *const SystemZTriples[] = {
+-      "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
+-      "s390x-suse-linux", "s390x-redhat-linux"};
++      "s390x-ibm-linux-gnu", "s390x-suse-linux", "s390x-redhat-linux",
++      "s390x-linux-gnu", "s390x-unknown-linux-gnu"};
+ 
+ 
+   using std::begin;
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0001-GCC-compatibility-Ignore-fstack-clash-protection.patch b/SOURCES/0001-GCC-compatibility-Ignore-fstack-clash-protection.patch
new file mode 100644
index 0000000..5683b71
--- /dev/null
+++ b/SOURCES/0001-GCC-compatibility-Ignore-fstack-clash-protection.patch
@@ -0,0 +1,42 @@
+From 428ca4520a79ec5a6df9c6adc8b8069623868cdb Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Fri, 26 Jan 2018 11:38:04 -0800
+Subject: [PATCH] GCC compatibility: Ignore -fstack-clash-protection
+
+Reviewers: sylvestre.ledru
+
+Subscribers: cfe-commits
+
+Differential Revision: https://reviews.llvm.org/D42593
+---
+ include/clang/Driver/Options.td | 1 +
+ test/Driver/clang_f_opts.c      | 1 +
+ 2 files changed, 2 insertions(+)
+
+diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
+index 41f31cf..e9078a2 100644
+--- a/include/clang/Driver/Options.td
++++ b/include/clang/Driver/Options.td
+@@ -2705,6 +2705,7 @@ defm single_precision_constant : BooleanFFlag<"single-precision-constant">,
+     Group<clang_ignored_gcc_optimization_f_Group>;
+ defm spec_constr_count : BooleanFFlag<"spec-constr-count">, Group<clang_ignored_f_Group>;
+ defm stack_check : BooleanFFlag<"stack-check">, Group<clang_ignored_f_Group>;
++defm stack_clash_protection : BooleanFFlag<"stack-clash-protection">, Group<clang_ignored_f_Group>;
+ defm strength_reduce :
+     BooleanFFlag<"strength-reduce">, Group<clang_ignored_gcc_optimization_f_Group>;
+ defm tls_model : BooleanFFlag<"tls-model">, Group<clang_ignored_f_Group>;
+diff --git a/test/Driver/clang_f_opts.c b/test/Driver/clang_f_opts.c
+index 5755c5d..8710ff4 100644
+--- a/test/Driver/clang_f_opts.c
++++ b/test/Driver/clang_f_opts.c
+@@ -284,6 +284,7 @@
+ // RUN:     -ffriend-injection                                                \
+ // RUN:     -fno-implement-inlines -fimplement-inlines                        \
+ // RUN:     -fstack-check                                                     \
++// RUN:     -fstack-clash-protection                                          \
+ // RUN:     -fforce-addr                                                      \
+ // RUN:     -malign-functions=100                                             \
+ // RUN:     -malign-loops=100                                                 \
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0001-gtest-reorg.patch b/SOURCES/0001-gtest-reorg.patch
new file mode 100644
index 0000000..4d8693a
--- /dev/null
+++ b/SOURCES/0001-gtest-reorg.patch
@@ -0,0 +1,42 @@
+From 3b2afecc227d652f84f883d4018d43971de6a311 Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Wed, 21 Mar 2018 07:17:00 -0700
+Subject: [PATCH] gtest reorg
+
+---
+ CMakeLists.txt | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 2eee8e6..01d290f 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -142,12 +142,6 @@ Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")
+         set(LLVM_UTILS_PROVIDED ON)
+         set(CLANG_TEST_DEPS FileCheck count not)
+       endif()
+-      set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest)
+-      if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h
+-          AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
+-          AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt)
+-        add_subdirectory(${UNITTEST_DIR} utils/unittest)
+-      endif()
+     else()
+       # Seek installed Lit.
+       find_program(LLVM_LIT
+@@ -477,7 +471,11 @@ endif()
+ 
+ 
+ if( CLANG_INCLUDE_TESTS )
+-  if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include/gtest/gtest.h)
++  set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest)
++  if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h
++      AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
++      AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt)
++    add_subdirectory(${UNITTEST_DIR} utils/unittest)
+     add_subdirectory(unittests)
+     list(APPEND CLANG_TEST_DEPS ClangUnitTests)
+     list(APPEND CLANG_TEST_PARAMS
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0001-lit.cfg-Add-hack-so-lit-can-find-not-and-FileCheck.patch b/SOURCES/0001-lit.cfg-Add-hack-so-lit-can-find-not-and-FileCheck.patch
new file mode 100644
index 0000000..508434d
--- /dev/null
+++ b/SOURCES/0001-lit.cfg-Add-hack-so-lit-can-find-not-and-FileCheck.patch
@@ -0,0 +1,27 @@
+From 06cde370a44393d65bae7f61279900b5838b4a2c Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Tue, 23 Jan 2018 18:59:20 -0800
+Subject: [PATCH] lit.cfg: Add hack so lit can find not and FileCheck
+
+---
+ test/lit.cfg.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/test/lit.cfg.py b/test/lit.cfg.py
+index 5323cfe..5b4184e 100644
+--- a/test/lit.cfg.py
++++ b/test/lit.cfg.py
+@@ -39,7 +39,10 @@ config.test_source_root = os.path.dirname(__file__)
+ # test_exec_root: The root path where tests should be run.
+ config.test_exec_root = os.path.join(config.clang_obj_root, 'test')
+ 
++old_llvm_tools_dir = llvm_config.config.llvm_tools_dir
++llvm_config.config.llvm_tools_dir = '/usr/lib@FEDORA_LLVM_LIB_SUFFIX@/llvm'
+ llvm_config.use_default_substitutions()
++llvm_config.config.llvm_tools_dir = old_llvm_tools_dir
+ 
+ llvm_config.use_clang()
+ 
+-- 
+1.8.3.1
+
diff --git a/SPECS/clang.spec b/SPECS/clang.spec
new file mode 100644
index 0000000..9757973
--- /dev/null
+++ b/SPECS/clang.spec
@@ -0,0 +1,470 @@
+%global maj_ver 7
+%global min_ver 0
+%global patch_ver 1
+
+%global clang_tools_binaries \
+	%{_bindir}/clangd \
+	%{_bindir}/clang-apply-replacements \
+	%{_bindir}/clang-change-namespace \
+	%{_bindir}/clang-include-fixer \
+	%{_bindir}/clang-query \
+	%{_bindir}/clang-refactor \
+	%{_bindir}/clang-reorder-fields \
+	%{_bindir}/clang-rename \
+	%{_bindir}/clang-tidy
+
+%global clang_binaries \
+	%{_bindir}/clang \
+	%{_bindir}/clang++ \
+	%{_bindir}/clang-%{maj_ver} \
+	%{_bindir}/clang-check \
+	%{_bindir}/clang-cl \
+	%{_bindir}/clang-cpp \
+	%{_bindir}/clang-format \
+	%{_bindir}/clang-func-mapping \
+	%{_bindir}/clang-import-test \
+	%{_bindir}/clang-offload-bundler \
+	%{_bindir}/diagtool \
+	%{_bindir}/hmaptool
+
+%if 0%{?fedora} || 0%{?rhel} > 7
+%bcond_without python3
+%else
+%bcond_with python3
+%endif
+
+%ifarch ppc64le
+# Too many threads on 32 core ppc64 systems causes OOM errors.
+%global _smp_mflags -j8
+%endif
+
+Name:		clang
+Version:	%{maj_ver}.%{min_ver}.%{patch_ver}
+Release:	1%{?dist}
+Summary:	A C language family front-end for LLVM
+
+License:	NCSA
+URL:		http://llvm.org
+Source0:	http://llvm.org/releases/%{version}/cfe-%{version}%{?rc_ver:rc%{rc_ver}}.src.tar.xz
+Source1:	http://llvm.org/releases/%{version}/clang-tools-extra-%{version}%{?rc_ver:rc%{rc_ver}}.src.tar.xz
+
+Patch0:		0001-lit.cfg-Add-hack-so-lit-can-find-not-and-FileCheck.patch
+Patch1:		0001-GCC-compatibility-Ignore-fstack-clash-protection.patch
+Patch2:		0001-Driver-Prefer-vendor-supplied-gcc-toolchain.patch
+Patch4:		0001-gtest-reorg.patch
+Patch5:		0001-Don-t-prefer-python2.7.patch
+Patch6:		0001-Convert-clang-format-diff.py-to-python3-using-2to3.patch
+Patch7:		0001-Convert-scan-view-to-python3-using-2to3.patch
+
+# clang-tools-extra patches
+Patch100: 0001-Convert-run-find-all-symbols.py-to-python3-using-2to.patch
+
+BuildRequires:  gcc
+BuildRequires:  gcc-c++
+BuildRequires:	cmake
+BuildRequires:	llvm-devel = %{version}
+BuildRequires:	libxml2-devel
+# llvm-static is required, because clang-tablegen needs libLLVMTableGen, which
+# is not included in libLLVM.so.
+BuildRequires:  llvm-static = %{version}
+# Required for make check
+BuildRequires:	llvm-googletest = %{version}
+BuildRequires:	libxml2-devel
+BuildRequires:  ncurses-devel
+BuildRequires:	python3-lit
+BuildRequires:	python3-sphinx
+BuildRequires:	libatomic
+BuildRequires:	%{_bindir}/pathfix.py
+BuildRequires:  /usr/bin/python3
+
+# Needed for %%multilib_fix_c_header
+BuildRequires:  multilib-rpm-config
+
+Requires:	%{name}-libs%{?_isa} = %{version}-%{release}
+
+%description
+clang: noun
+    1. A loud, resonant, metallic sound.
+    2. The strident call of a crane or goose.
+    3. C-language family front-end toolkit.
+
+The goal of the Clang project is to create a new C, C++, Objective C
+and Objective C++ front-end for the LLVM compiler. Its tools are built
+as libraries and designed to be loosely-coupled and extensible.
+
+%package libs
+Summary: Runtime library for clang
+Recommends: compiler-rt%{?_isa} >= %{version}
+
+# libomp does not support s390x.
+%ifnarch s390x
+Recommends: libomp%{?_isa} >= %{version}
+%endif
+
+# clang requires gcc, clang++ requires libstdc++-devel
+# - https://bugzilla.redhat.com/show_bug.cgi?id=1021645
+# - https://bugzilla.redhat.com/show_bug.cgi?id=1158594
+
+# Making these BuildRequires because they are needed by tests
+BuildRequires:	libstdc++-devel
+BuildRequires:	gcc-c++
+Requires:	libstdc++-devel
+Requires:	gcc-c++
+
+
+%description libs
+Runtime library for clang.
+
+%package devel
+Summary: Development header files for clang.
+Requires: %{name}%{?_isa} = %{version}-%{release}
+# The clang CMake files reference tools from clang-tools-extra.
+Requires: %{name}-tools-extra%{?_isa} = %{version}-%{release}
+Requires: llvm-libs%{?_isa} = %{version}
+
+
+%description devel
+Development header files for clang.
+
+%package analyzer
+Summary:	A source code analysis framework
+License:	NCSA and MIT
+BuildArch:	noarch
+Requires:	%{name} = %{version}-%{release}
+# not picked up automatically since files are currently not installed in
+# standard Python hierarchies yet
+Requires:	platform-python
+
+%description analyzer
+The Clang Static Analyzer consists of both a source code analysis
+framework and a standalone tool that finds bugs in C and Objective-C
+programs. The standalone tool is invoked from the command-line, and is
+intended to run in tandem with a build of a project or code base.
+
+%package tools-extra
+Summary: Extra tools for clang
+Requires: llvm-libs%{?_isa} = %{version}
+Requires: clang-libs%{?_isa} = %{version}-%{release}
+
+%description tools-extra
+A set of extra tools built using Clang's tooling API.
+
+# Put git-clang-format in its own package, because it Requires git and python2
+# and we don't want to force users to install all those dependenices if they
+# just want clang.
+%package -n git-clang-format
+Summary: clang-format integration for git
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: git
+
+%description -n git-clang-format
+clang-format integration for git.
+
+%prep
+
+%setup -T -q -b 1 -n clang-tools-extra-%{version}%{?rc_ver:rc%{rc_ver}}.src
+
+%patch100 -p1 -b .find-all-symbols-py3
+
+pathfix.py -i %{__python3} -pn \
+	clang-tidy/tool/*.py \
+	include-fixer/find-all-symbols/tool/run-find-all-symbols.py
+
+%setup -q -n cfe-%{version}%{?rc_ver:rc%{rc_ver}}.src
+%patch0 -p1 -b .lit-search-path
+%patch1 -p1 -b .fstack-clash-protection
+%patch2 -p1 -b .vendor-gcc
+%patch4 -p1 -b .gtest
+%patch5 -p1 -b .no-python2
+%patch6 -p1 -b .clang-format-diff-py3
+%patch7 -p1 -b .scan-view-py3
+
+mv ../clang-tools-extra-%{version}%{?rc_ver:rc%{rc_ver}}.src tools/extra
+
+%if 0%{?__isa_bits} == 64
+sed -i 's/\@FEDORA_LLVM_LIB_SUFFIX\@/64/g' test/lit.cfg.py
+%else
+sed -i 's/\@FEDORA_LLVM_LIB_SUFFIX\@//g' test/lit.cfg.py
+%endif
+
+pathfix.py -i %{__python3} -pn \
+	tools/clang-format/*.py \
+	tools/clang-format/git-clang-format \
+	utils/hmaptool/hmaptool \
+	tools/scan-view/bin/scan-view
+
+
+
+%build
+
+mkdir -p _build
+cd _build
+
+%cmake .. \
+	-DLLVM_LINK_LLVM_DYLIB:BOOL=ON \
+	-DCMAKE_BUILD_TYPE=RelWithDebInfo \
+	-DLLVM_CONFIG:FILEPATH=%{_bindir}/llvm-config-%{__isa_bits} \
+	-DCLANG_INCLUDE_TESTS:BOOL=ON \
+	-DLLVM_EXTERNAL_LIT=%{_bindir}/lit \
+	-DLLVM_MAIN_SRC_DIR=%{_datadir}/llvm/src \
+	\
+	-DCLANG_ENABLE_ARCMT:BOOL=ON \
+	-DCLANG_ENABLE_STATIC_ANALYZER:BOOL=ON \
+	-DCLANG_INCLUDE_DOCS:BOOL=ON \
+	-DCLANG_PLUGIN_SUPPORT:BOOL=ON \
+	-DENABLE_LINKER_BUILD_ID:BOOL=ON \
+	-DLLVM_ENABLE_EH=ON \
+	-DLLVM_ENABLE_RTTI=ON \
+	-DLLVM_BUILD_DOCS=ON \
+	-DLLVM_ENABLE_SPHINX=ON \
+	-DSPHINX_WARNINGS_AS_ERRORS=OFF \
+	\
+	-DCLANG_BUILD_EXAMPLES:BOOL=OFF \
+	-DLLVM_EXTERNAL_LIT=%{_bindir}/lit \
+%if 0%{?__isa_bits} == 64
+        -DLLVM_LIBDIR_SUFFIX=64 \
+%else
+        -DLLVM_LIBDIR_SUFFIX= \
+%endif
+	-DLIB_SUFFIX=
+
+make %{?_smp_mflags}
+
+%install
+make install DESTDIR=%{buildroot} -C _build
+
+# multilib fix
+%multilib_fix_c_header --file %{_includedir}/clang/Config/config.h
+
+# remove editor integrations (bbedit, sublime, emacs, vim)
+rm -vf %{buildroot}%{_datadir}/clang/clang-format-bbedit.applescript
+rm -vf %{buildroot}%{_datadir}/clang/clang-format-sublime.py*
+rm -vf %{buildroot}%{_datadir}/clang/clang-format.el
+rm -vf %{buildroot}%{_datadir}/clang/clang-format.py*
+rm -vf %{buildroot}%{_datadir}/clang/bash-autocomplete.sh
+# clang-tools-extra
+rm -vf %{buildroot}%{_datadir}/clang/clang-include-fixer.py
+rm -vf %{buildroot}%{_datadir}/clang/clang-tidy-diff.py
+rm -vf %{buildroot}%{_datadir}/clang/run-clang-tidy.py
+rm -vf %{buildroot}%{_datadir}/clang/run-find-all-symbols.py
+rm -vf %{buildroot}%{_datadir}/clang/clang-include-fixer.el
+rm -vf %{buildroot}%{_datadir}/clang/clang-rename.el
+rm -vf %{buildroot}%{_datadir}/clang/clang-rename.py
+# remove diff reformatter
+rm -vf %{buildroot}%{_datadir}/clang/clang-format-diff.py*
+
+# Remove html docs
+rm -vRf %{buildroot}%{_docdir}/clang/html
+
+%check
+cd _build
+PATH=%{_libdir}/llvm:$PATH make %{?_smp_mflags} check-all
+
+%files libs
+%{_libdir}/*.so.*
+%{_libdir}/*.so
+
+%files
+%{_libdir}/clang/
+%{clang_binaries}
+%{_bindir}/c-index-test
+%{_mandir}/man1/clang.1.gz
+%{_mandir}/man1/diagtool.1.gz
+
+
+%files devel
+%{_includedir}/clang/
+%{_includedir}/clang-c/
+%{_libdir}/cmake/
+%dir %{_datadir}/clang/
+
+%files analyzer
+%{_bindir}/scan-view
+%{_bindir}/scan-build
+%{_libexecdir}/ccc-analyzer
+%{_libexecdir}/c++-analyzer
+%{_datadir}/scan-view/
+%{_datadir}/scan-build/
+%{_mandir}/man1/scan-build.1.*
+
+%files tools-extra
+%{clang_tools_binaries}
+%{_bindir}/find-all-symbols
+%{_bindir}/modularize
+
+%files -n git-clang-format
+%{_bindir}/git-clang-format
+
+%changelog
+* Fri Dec 14 2018 Tom Stellard <tstellar@redhat.com> - 7.0.1-1
+- 7.0.1-1 Release
+
+* Mon Dec 10 2018 Tom Stellard <tstellar@redhat.com> - 7.0.1-0.1.rc3
+- 7.0.1-rc3 Release
+
+* Mon Nov 05 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-12
+- User helper macro to fixup config.h for multilib
+
+* Sat Oct 27 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-11
+- Enable make check
+
+* Mon Oct 15 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-10
+- Remove Provides: llvm-toolset-6.0-clang-libs
+
+* Fri Oct 12 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-9
+- Add Provides: llvm-toolset-6.0-clang-libs
+
+* Tue Oct 02 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-8
+- Don't use python2 for the build
+
+* Mon Oct 01 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-7
+- Drop scl macros
+
+* Tue Sep 25 2018 Tomas Orsava <torsava@redhat.com> - 6.0.1-6
+- Change Requires from python3 to platform-python
+- The python3 package was renamed to platform-python
+- Related: rhbz#1619153
+
+* Fri Sep 14 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-5
+- Use python3 for git-clang-format
+
+* Thu Sep 13 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-4
+- Fix python dependencies
+
+* Tue Aug 07 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-3
+- Install ld.so.conf file in the root filesystem
+
+* Thu Aug 02 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-2
+- Remove annobin work-around
+
+* Wed Jul 11 2018 Tom Stellard <tstellar@redhat.com> - 6.0.1-1
+- 6.0.1 Release
+
+* Wed Apr 11 2018 Tom Stellard <tstellar@redhat.com> - 5.0.1-7
+- Add conditionals to enable building only the clang-libs package
+
+* Fri Apr 06 2018 Tom Stellard <tstellar@redhat.com> - 5.0.1-6
+- Use cmake from base RHEL
+
+* Mon Mar 19 2018 Tom Stellard <tstellar@redhat.com> - 5.0.1-5
+- Backport r310435 from clang trunk. rhbz#1558223
+
+* Mon Mar 19 2018 Tom Stellard <tstellar@redhat.com> - 5.0.1-4
+- Use system gcc instead of dts.
+
+* Tue Feb 06 2018 Tom Stellard <tstellar@redhat.com> - 5.0.1-3
+- Backport retpoline support
+
+* Sat Jan 20 2018 Tom Stellard <tstellar@redhat.com> - 5.0.1-2
+- Limit number of build threads on ppc64le to avoid OOM errors
+
+* Tue Jan 09 2018 Tom Stellard <tstellar@redhat.com> - 5.0.1-1
+- 5.0.1 Release
+
+* Wed Jun 21 2017 Tom Stellard <tstellar@redhat.com> - 4.0.1-1
+- 4.0.1 Release.
+
+* Wed Jun 21 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-15
+- Fix Requires for clang-tools-extra
+
+* Wed Jun 21 2017 Tom Stellard <tstellar@redhat.com - 4.0.0-14
+- Fix Requires for clang-tools-extra
+
+* Tue Jun 20 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-13
+- Drop libomp dependency on s390x
+
+* Thu Jun 15 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-12
+- Use libstdc++ from devtoolset-7
+
+* Wed Jun 07 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-11
+- Fix libomp requires
+
+* Wed Jun 07 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-10
+- Build for llvm-toolset-7 rename
+
+* Tue May 30 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-9
+- Use ld from devtoolset in clang toolchain
+
+* Mon May 29 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-8
+- Add dependency on libopenmp
+
+* Thu May 25 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-7
+- Fix check for gcc install
+
+* Wed May 24 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-6
+- Add devtoolset-6 dependency for newer libstdc++
+
+* Fri May 12 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-5
+- Add dependency on compiler-rt
+
+* Tue May 02 2017 Tom Stellard <tstellar@redhat.com>
+- Fix dependencies with scl
+
+* Mon May 01 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-4
+- Build with llvm-toolset-4
+
+* Mon Mar 27 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-3
+- Enable eh/rtti, which are required by lldb.
+
+* Fri Mar 24 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-2
+- Fix clang-tools-extra build
+- Fix install
+
+* Thu Mar 23 2017 Tom Stellard <tstellar@redhat.com> - 4.0.0-1
+- clang 4.0.0 final release
+
+* Mon Mar 20 2017 David Goerger <david.goerger@yale.edu> - 3.9.1-3
+- add clang-tools-extra rhbz#1328091
+
+* Thu Mar 16 2017 Tom Stellard <tstellar@redhat.com> - 3.9.1-2
+- Enable build-id by default rhbz#1432403
+
+* Thu Mar 02 2017 Dave Airlie <airlied@redhat.com> - 3.9.1-1
+- clang 3.9.1 final release
+
+* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 3.9.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Mon Nov 14 2016 Nathaniel McCallum <npmccallum@redhat.com> - 3.9.0-3
+- Add Requires: compiler-rt to clang-libs.
+- Without this, compiling with certain CFLAGS breaks.
+
+* Tue Nov  1 2016 Peter Robinson <pbrobinson@fedoraproject.org> 3.9.0-2
+- Rebuild for new arches
+
+* Fri Oct 14 2016 Dave Airlie <airlied@redhat.com> - 3.9.0-1
+- clang 3.9.0 final release
+
+* Fri Jul 01 2016 Stephan Bergmann <sbergman@redhat.com> - 3.8.0-2
+- Resolves: rhbz#1282645 add GCC abi_tag support
+
+* Thu Mar 10 2016 Dave Airlie <airlied@redhat.com> 3.8.0-1
+- clang 3.8.0 final release
+
+* Thu Mar 03 2016 Dave Airlie <airlied@redhat.com> 3.8.0-0.4
+- clang 3.8.0rc3
+
+* Wed Feb 24 2016 Dave Airlie <airlied@redhat.com> - 3.8.0-0.3
+- package all libs into clang-libs.
+
+* Wed Feb 24 2016 Dave Airlie <airlied@redhat.com> 3.8.0-0.2
+- enable dynamic linking of clang against llvm
+
+* Thu Feb 18 2016 Dave Airlie <airlied@redhat.com> - 3.8.0-0.1
+- clang 3.8.0rc2
+
+* Fri Feb 12 2016 Dave Airlie <airlied@redhat.com> 3.7.1-4
+- rebuild against latest llvm packages
+- add BuildRequires llvm-static
+
+* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 3.7.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Thu Jan 28 2016 Dave Airlie <airlied@redhat.com> 3.7.1-2
+- just accept clang includes moving to /usr/lib64, upstream don't let much else happen
+
+* Thu Jan 28 2016 Dave Airlie <airlied@redhat.com> 3.7.1-1
+- initial build in Fedora.
+
+* Tue Oct 06 2015 Jan Vcelak <jvcelak@fedoraproject.org> 3.7.0-100
+- initial version using cmake build system