summaryrefslogtreecommitdiffstats
path: root/external/meta-clang
diff options
context:
space:
mode:
Diffstat (limited to 'external/meta-clang')
-rw-r--r--external/meta-clang/COPYING.MIT17
-rw-r--r--external/meta-clang/README.md113
-rw-r--r--external/meta-clang/_config.yml1
-rw-r--r--external/meta-clang/classes/clang.bbclass52
-rw-r--r--external/meta-clang/classes/cmake-native.bbclass47
-rw-r--r--external/meta-clang/classes/scan-build.bbclass58
-rw-r--r--external/meta-clang/conf/layer.conf23
-rw-r--r--external/meta-clang/conf/nonclangable.conf160
-rw-r--r--external/meta-clang/dynamic-layers/openembedded-layer/recipes-kernel/kernel-selftest/kernel-selftest.bbappend1
-rw-r--r--external/meta-clang/recipes-bsp/systemd-boot/systemd-boot_%.bbappend4
-rw-r--r--external/meta-clang/recipes-connectivity/openssh/openssh_%.bbappend3
-rw-r--r--external/meta-clang/recipes-core/busybox/busybox_%.bbappend1
-rw-r--r--external/meta-clang/recipes-core/glib-2.0/glib-2.0_%.bbappend1
-rw-r--r--external/meta-clang/recipes-core/meta/meta-environment.bbappend16
-rw-r--r--external/meta-clang/recipes-core/musl/musl_%.bbappend1
-rw-r--r--external/meta-clang/recipes-core/ncurses/ncurses_%.bbappend1
-rw-r--r--external/meta-clang/recipes-core/packagegroups/nativesdk-packagegroup-sdk-host.bbappend3
-rw-r--r--external/meta-clang/recipes-core/packagegroups/packagegroup-core-standalone-sdk-target.bbappend6
-rw-r--r--external/meta-clang/recipes-core/packagegroups/packagegroup-cross-canadian.bbappend5
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang-cross-canadian_git.bb33
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang-cross_git.bb32
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang-crosssdk_git.bb30
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang.inc21
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0001-clang-driver-Use-lib-for-ldso-on-OE.patch56
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0001-compiler-rt-support-a-new-embedded-linux-target.patch326
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0001-libcxxabi-Find-libunwind-headers-when-LIBCXXABI_LIBU.patch68
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0001-lldb-Include-limits.h-for-PATH_MAX-definition.patch28
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0001-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch91
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0002-clang-Driver-tools.cpp-Add-lssp_nonshared-on-musl.patch34
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0002-compiler-rt-Simplify-cross-compilation.-Don-t-use-na.patch46
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0002-lldb-Add-lxml2-to-linker-cmdline-of-xml-is-found.patch40
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0002-llvm-allow-env-override-of-exe-path.patch37
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0003-clang-musl-ppc-does-not-support-128-bit-long-double.patch27
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0003-compiler-rt-Disable-tsan-on-OE-glibc.patch42
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0003-llvm-Disable-calls-to-_finite-and-other-glibc-only-f.patch65
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0004-clang-Prepend-trailing-to-sysroot.patch41
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0004-compiler-rt-cmake-mips-Do-not-specify-target-with-OE.patch44
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0005-clang-Look-inside-the-target-sysroot-for-compiler-ru.patch44
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0006-clang-Define-releative-gcc-installation-dir.patch32
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0007-clang-Fix-ldso-for-musl-on-x86-and-x32-architectures.patch44
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0008-clang-scan-view-needs-python-2.x.patch27
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0009-clang-Enable-SSP-and-PIE-by-default.patch284
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang/0020-clang-link-libgcc_eh-when-using-compiler-rt.patch24
-rw-r--r--external/meta-clang/recipes-devtools/clang/clang_git.bb150
-rw-r--r--external/meta-clang/recipes-devtools/clang/common-source.inc11
-rw-r--r--external/meta-clang/recipes-devtools/clang/common.inc71
-rw-r--r--external/meta-clang/recipes-devtools/clang/compiler-rt_git.bb96
-rw-r--r--external/meta-clang/recipes-devtools/clang/libcxx_git.bb81
-rw-r--r--external/meta-clang/recipes-devtools/clang/lldb_git.bb57
-rw-r--r--external/meta-clang/recipes-devtools/clang/llvm-common.bb22
-rw-r--r--external/meta-clang/recipes-devtools/clang/llvm-common/llvm-config39
-rw-r--r--external/meta-clang/recipes-devtools/clang/llvm-project-source.bb10
-rw-r--r--external/meta-clang/recipes-devtools/clang/llvm-project-source.inc20
-rw-r--r--external/meta-clang/recipes-devtools/clang/nativesdk-clang-glue.bb27
-rw-r--r--external/meta-clang/recipes-devtools/clang/openmp_git.bb40
-rw-r--r--external/meta-clang/recipes-extended/mdadm/mdadm_%.bbappend6
-rw-r--r--external/meta-clang/recipes-gnome/gcr/gcr_%.bbappend4
-rw-r--r--external/meta-clang/recipes-graphics/mesa/mesa_%.bbappend5
-rw-r--r--external/meta-clang/recipes-kernel/perf/perf.bbappend1
-rw-r--r--external/meta-clang/recipes-multimedia/libvorbis/libvorbis_%.bbappend4
60 files changed, 2673 insertions, 0 deletions
diff --git a/external/meta-clang/COPYING.MIT b/external/meta-clang/COPYING.MIT
new file mode 100644
index 00000000..fb950dc6
--- /dev/null
+++ b/external/meta-clang/COPYING.MIT
@@ -0,0 +1,17 @@
+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/external/meta-clang/README.md b/external/meta-clang/README.md
new file mode 100644
index 00000000..986f77c3
--- /dev/null
+++ b/external/meta-clang/README.md
@@ -0,0 +1,113 @@
+# meta-clang (a C language family frontend and LLVM compiler backend)
+
+This layer provides [clang/llvm](http://clang.llvm.org/) as alternative to your system
+C/C++ compiler for OpenEmbedded based distributions along with gcc
+
+# Getting Started
+
+```shell
+git clone git://github.com/openembedded/openembedded-core.git
+cd openembeeded-core
+git clone git://github.com/openembedded/bitbake.git
+git clone git://github.com/kraj/meta-clang.git
+
+$ . ./oe-init-build-env
+```
+
+Edit conf/bblayers.conf to add meta-clang to layer mix e.g.
+
+```python
+BBLAYERS ?= " \
+ /home/kraj/openembedded-core/meta-clang \
+ /home/kraj/openembedded-core/meta \
+ "
+```
+
+# Default Compiler Switch
+
+Note that by default gcc will remain the system compiler, however if you wish
+clang to be the default compiler then set
+
+```python
+TOOLCHAIN ?= "clang"
+```
+
+in local.conf, this would now switch to using clang as default compiler systemwide
+you can select clang per package too by writing bbappends for them containing
+
+```python
+TOOLCHAIN = "clang"
+```
+
+# Default C++ Standard Library Switch
+
+Note that by default libstdc++ will remain the default C++ standard library, however if you wish
+libc++ to be the default one then set
+
+```python
+TARGET_CXXFLAGS_append_toolchain-clang ?= " -stdlib=libc++ "
+```
+
+in local.conf.
+You can select libc++ per package too by writing bbappends for them containing
+
+```python
+TARGET_CXXFLAGS_append_toolchain-clang = " -stdlib=libc++ "
+```
+
+# Building
+
+Below we build for qemuarm machine as an example
+
+```shell
+$ MACHINE=qemux86 bitbake core-image-minimal
+```
+# Running
+
+```shell
+$ runqemu qemux86
+```
+
+# Limitations
+
+Few components do not build with clang, if you have a component to add to that list
+simply add it to conf/nonclangable.inc e.g.
+
+```shell
+TOOLCHAIN_pn-<recipe> = "gcc"
+```
+
+and OE will start using gcc to cross compile that recipe.
+
+And if a component does not build with libc++, you can add it to conf/nonclangable.inc e.g.
+
+```shell
+TARGET_CXXFLAGS_remove_pn-<recipe>_toolchain-clang = " -stdlib=libc++ "
+```
+
+# Dependencies
+
+```
+URI: git://github.com/openembedded/openembedded-core.git
+branch: master
+revision: HEAD
+
+URI: git://github.com/openembedded/bitbake.git
+branch: master
+revision: HEAD
+```
+
+Send pull requests to openembedded-devel@lists.openembedded.org with '[meta-clang]' in the subject'
+
+When sending single patches, please use something like:
+
+'git send-email -M -1 --to openembedded-devel@lists.openembedded.org --subject-prefix=meta-clang][PATCH'
+
+You are encouraged to fork the mirror on [github](https://github.com/kraj/meta-clang/)
+to share your patches, this is preferred for patch sets consisting of more than
+one patch. Other services like gitorious, repo.or.cz or self hosted setups are
+of course accepted as well, 'git fetch <remote>' works the same on all of them.
+We recommend github because it is free, easy to use, has been proven to be reliable
+and has a really good web GUI.
+
+Layer Maintainer: [Khem Raj](<mailto:raj.khem@gmail.com>)
diff --git a/external/meta-clang/_config.yml b/external/meta-clang/_config.yml
new file mode 100644
index 00000000..c4192631
--- /dev/null
+++ b/external/meta-clang/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-cayman \ No newline at end of file
diff --git a/external/meta-clang/classes/clang.bbclass b/external/meta-clang/classes/clang.bbclass
new file mode 100644
index 00000000..4d20ff07
--- /dev/null
+++ b/external/meta-clang/classes/clang.bbclass
@@ -0,0 +1,52 @@
+# Add the necessary override
+CC_toolchain-clang = "${CCACHE}${HOST_PREFIX}clang ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
+CXX_toolchain-clang = "${CCACHE}${HOST_PREFIX}clang++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
+CPP_toolchain-clang = "${CCACHE}${HOST_PREFIX}clang ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS} -E"
+CCLD_toolchain-clang = "${CCACHE}${HOST_PREFIX}clang ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
+RANLIB_toolchain-clang = "${HOST_PREFIX}ranlib"
+AR_toolchain-clang = "${HOST_PREFIX}ar"
+NM_toolchain-clang = "${HOST_PREFIX}nm"
+
+THUMB_TUNE_CCARGS_remove_toolchain-clang = "-mthumb-interwork"
+TUNE_CCARGS_remove_toolchain-clang = "-meb"
+TUNE_CCARGS_remove_toolchain-clang = "-mel"
+TUNE_CCARGS_append_toolchain-clang = "${@bb.utils.contains("TUNE_FEATURES", "bigendian", " -mbig-endian", " -mlittle-endian", d)}"
+
+TUNE_CCARGS_remove_toolchain-clang_powerpc = "-mhard-float"
+TUNE_CCARGS_remove_toolchain-clang_powerpc = "-mno-spe"
+
+TUNE_CCARGS_append_toolchain-clang = " --rtlib=compiler-rt -Wno-error=unused-command-line-argument -Qunused-arguments"
+
+TOOLCHAIN_OPTIONS_append_toolchain-clang_class-nativesdk_x86-64 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux-x86-64.so.2"
+TOOLCHAIN_OPTIONS_append_toolchain-clang_class-nativesdk_x86 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux.so.2"
+
+# choose between 'gcc' 'clang' an empty '' can be used as well
+TOOLCHAIN ??= "gcc"
+
+TOOLCHAIN_class-native = "gcc"
+TOOLCHAIN_class-nativesdk = "gcc"
+TOOLCHAIN_class-cross-canadian = "gcc"
+TOOLCHAIN_class-crosssdk = "gcc"
+TOOLCHAIN_class-cross = "gcc"
+
+# -fmacro-prefix-map does not exist in clang 7.x
+DEBUG_PREFIX_MAP_toolchain-clang = " "
+
+OVERRIDES =. "${@['', 'toolchain-${TOOLCHAIN}:']['${TOOLCHAIN}' != '']}"
+OVERRIDES[vardepsexclude] += "TOOLCHAIN"
+
+#DEPENDS_append_toolchain-clang_class-target = " clang-cross-${TARGET_ARCH} "
+#DEPENDS_remove_toolchain-clang_allarch = "clang-cross-${TARGET_ARCH}"
+
+def clang_dep_prepend(d):
+ if not d.getVar('INHIBIT_DEFAULT_DEPS', False):
+ if not oe.utils.inherits(d, 'allarch') :
+ return " clang-cross-${TARGET_ARCH} compiler-rt libcxx"
+ return ""
+
+BASEDEPENDS_remove_toolchain-clang_class-target = "virtual/${TARGET_PREFIX}gcc"
+BASEDEPENDS_append_toolchain-clang_class-target = "${@clang_dep_prepend(d)}"
+
+PREFERRED_PROVIDER_libunwind = "libunwind"
+PREFERRED_PROVIDER_libunwind_mipsarch = "libunwind"
+PREFERRED_PROVIDER_libunwind_toolchain-clang = "libcxx"
diff --git a/external/meta-clang/classes/cmake-native.bbclass b/external/meta-clang/classes/cmake-native.bbclass
new file mode 100644
index 00000000..911476e1
--- /dev/null
+++ b/external/meta-clang/classes/cmake-native.bbclass
@@ -0,0 +1,47 @@
+# We need to unset CCACHE otherwise cmake gets too confused
+CCACHE = ""
+
+# Native C/C++ compiler (without cpu arch/tune arguments)
+OECMAKE_NATIVE_C_COMPILER ?= "`echo ${BUILD_CC} | sed 's/^\([^ ]*\).*/\1/'`"
+OECMAKE_NATIVE_CXX_COMPILER ?= "`echo ${BUILD_CXX} | sed 's/^\([^ ]*\).*/\1/'`"
+OECMAKE_NATIVE_AR ?= "${BUILD_AR}"
+
+# Native compiler flags
+OECMAKE_NATIVE_C_FLAGS ?= "${BUILD_CC_ARCH} ${BUILD_CFLAGS}"
+OECMAKE_NATIVE_CXX_FLAGS ?= "${BUILD_CC_ARCH} ${BUILD_CXXFLAGS}"
+OECMAKE_NATIVE_C_FLAGS_RELEASE ?= "-DNDEBUG"
+OECMAKE_NATIVE_CXX_FLAGS_RELEASE ?= "-DNDEBUG"
+OECMAKE_NATIVE_C_LINK_FLAGS ?= "${BUILD_CC_ARCH} ${BUILD_CPPFLAGS} ${BUILD_LDFLAGS}"
+OECMAKE_NATIVE_CXX_LINK_FLAGS ?= "${BUILD_CC_ARCH} ${BUILD_CXXFLAGS} ${BUILD_LDFLAGS}"
+BUILD_CXXFLAGS += "${BUILD_CC_ARCH}"
+BUILD_CFLAGS += "${BUILD_CC_ARCH}"
+
+do_generate_native_toolchain_file() {
+ cat > ${WORKDIR}/toolchain-native.cmake <<EOF
+set( CMAKE_SYSTEM_NAME `echo ${BUILD_OS} | sed -e 's/^./\u&/' -e 's/^\(Linux\).*/\1/'` )
+set( CMAKE_SYSTEM_PROCESSOR ${BUILD_ARCH} )
+set( CMAKE_C_COMPILER ${OECMAKE_NATIVE_C_COMPILER} )
+set( CMAKE_CXX_COMPILER ${OECMAKE_NATIVE_CXX_COMPILER} )
+set( CMAKE_ASM_COMPILER ${OECMAKE_NATIVE_C_COMPILER} )
+set( CMAKE_AR ${OECMAKE_NATIVE_AR} CACHE FILEPATH "Archiver" )
+set( CMAKE_C_FLAGS "${OECMAKE_NATIVE_C_FLAGS}" CACHE STRING "CFLAGS" )
+set( CMAKE_CXX_FLAGS "${OECMAKE_NATIVE_CXX_FLAGS}" CACHE STRING "CXXFLAGS" )
+set( CMAKE_ASM_FLAGS "${OECMAKE_NATIVE_C_FLAGS}" CACHE STRING "ASM FLAGS" )
+set( CMAKE_C_FLAGS_RELEASE "${OECMAKE_NATIVE_C_FLAGS_RELEASE}" CACHE STRING "Additional CFLAGS for release" )
+set( CMAKE_CXX_FLAGS_RELEASE "${OECMAKE_NATIVE_CXX_FLAGS_RELEASE}" CACHE STRING "Additional CXXFLAGS for release" )
+set( CMAKE_ASM_FLAGS_RELEASE "${OECMAKE_NATIVE_C_FLAGS_RELEASE}" CACHE STRING "Additional ASM FLAGS for release" )
+set( CMAKE_C_LINK_FLAGS "${OECMAKE_NATIVE_C_LINK_FLAGS}" CACHE STRING "LDFLAGS" )
+set( CMAKE_CXX_LINK_FLAGS "${OECMAKE_NATIVE_CXX_LINK_FLAGS}" CACHE STRING "LDFLAGS" )
+
+set( CMAKE_FIND_ROOT_PATH ${STAGING_DIR_NATIVE} )
+set( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )
+set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH )
+set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
+set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
+
+# Use native cmake modules
+list(APPEND CMAKE_MODULE_PATH "${STAGING_DATADIR_NATIVE}/cmake/Modules/")
+EOF
+}
+
+addtask generate_native_toolchain_file after do_patch before do_configure
diff --git a/external/meta-clang/classes/scan-build.bbclass b/external/meta-clang/classes/scan-build.bbclass
new file mode 100644
index 00000000..e0de56bb
--- /dev/null
+++ b/external/meta-clang/classes/scan-build.bbclass
@@ -0,0 +1,58 @@
+# Copyright (C) 2018 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+CFLAGS =+ "${TARGET_CC_ARCH} ${TOOLCHAIN_OPTIONS}"
+CXXFLAGS =+ "${TARGET_CC_ARCH} ${TOOLCHAIN_OPTIONS}"
+
+#EXTRA_ANALYZER_OPTIONS ?= "-analyze-headers"
+CLANG_SCAN_ENABLED ??= "1"
+#CLANG_SCAN_SERVER_IP ??= "127.0.0.1"
+CLANG_SCAN_SERVER_IP ??= "10.0.0.10"
+CLANG_SCAN_PORT ??= "8181"
+SCAN_RESULTS_DIR ?= "${TMPDIR}/static-scan/${PN}"
+
+scanbuild_munge_cc_cxx() {
+ cc="`echo ${CC} | cut -f1 -d " "`"
+ cxx="`echo ${CXX} | cut -f1 -d " "`"
+ export CC="${cc}"
+ export CXX="${cxx}"
+}
+
+do_configure[prefuncs] += "scanbuild_munge_cc_cxx"
+
+do_scanbuild() {
+ cc="`echo ${CC} | cut -f1 -d " "`"
+ cxx="`echo ${CXX} | cut -f1 -d " "`"
+ #mk="scan-build --use-cc=${cc} --use-c++=${cxx} --analyzer-target=${HOST_SYS} --html-title="${BP}" -o ${SCAN_RESULTS_DIR} ${EXTRA_ANALYZER_OPTIONS} make"
+ #export MAKE="${mk}"
+ export CC="${cc}"
+ export CXX="${cxx}"
+ scan-build --use-cc=${cc} --use-c++=${cxx} --analyzer-target=${HOST_SYS} --html-title="${BP}" -o ${SCAN_RESULTS_DIR} ${EXTRA_ANALYZER_OPTIONS} ${MAKE} ${EXTRA_OEMAKE}
+}
+
+do_scanview() {
+ bbplain "================================================================"
+ bbplain "Stating scan-view server at: http://${CLANG_SCAN_SERVER_IP}:${CLANG_SCAN_PORT}"
+ bbplain "Use Ctrl-C to exit"
+ bbplain "================================================================"
+ scan-view --host ${CLANG_SCAN_SERVER_IP} --port ${CLANG_SCAN_PORT} --allow-all-hosts ${SCAN_RESULTS_DIR}/*/
+}
+
+do_scanview[depends] += "${PN}:do_scanbuild"
+do_scanbuild[cleandirs] += "${SCAN_RESULTS_DIR}"
+do_scanbuild[dirs] += "${B}"
+do_scanview[dirs] += "${SCAN_RESULTS_DIR}"
+#do_build[recrdeptask] += "do_scanbuild"
+
+do_scanbuild[doc] = "Build and scan static analysis data using clang"
+do_scanview[doc] = "Start a webserver to visualize static analysis data"
+
+addtask scanbuild after do_configure before do_compile
+addtask scanview
+
+python () {
+ # Remove scanbuild task when scanning is not enabled
+ if not(d.getVar('CLANG_SCAN_ENABLED') == "1"):
+ for i in ['do_scanbuild', 'do_scanview']:
+ bb.build.deltask(i, d)
+}
diff --git a/external/meta-clang/conf/layer.conf b/external/meta-clang/conf/layer.conf
new file mode 100644
index 00000000..a5c666fc
--- /dev/null
+++ b/external/meta-clang/conf/layer.conf
@@ -0,0 +1,23 @@
+# We have a conf and classes directory, append to BBPATH
+BBPATH .= ":${LAYERDIR}"
+
+# We have a recipes directory, add to BBFILES
+BBFILES += "${LAYERDIR}/recipes*/*/*.bb ${LAYERDIR}/recipes*/*/*.bbappend"
+
+BBFILE_COLLECTIONS += "clang-layer"
+BBFILE_PATTERN_clang-layer := "^${LAYERDIR}/"
+BBFILE_PRIORITY_clang-layer = "7"
+LAYERSERIES_COMPAT_clang-layer = "sumo thud"
+
+BBFILES_DYNAMIC += " \
+ openembedded-layer:${LAYERDIR}/dynamic-layers/openembedded-layer/*/*/*.bb \
+ openembedded-layer:${LAYERDIR}/dynamic-layers/openembedded-layer/*/*/*.bbappend \
+"
+
+#PREFERRED_PROVIDER_gcc-cross-initial-${TARGET_ARCH}_forcevariable = "clang-cross"
+#PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-initial_forcevariable = "clang-cross"
+PREFERRED_PROVIDER_libgcc-initial = "libgcc-initial"
+
+INHERIT += "clang"
+
+require conf/nonclangable.conf
diff --git a/external/meta-clang/conf/nonclangable.conf b/external/meta-clang/conf/nonclangable.conf
new file mode 100644
index 00000000..54aa4114
--- /dev/null
+++ b/external/meta-clang/conf/nonclangable.conf
@@ -0,0 +1,160 @@
+TOOLCHAIN_pn-aspell = "gcc"
+TOOLCHAIN_pn-cpufrequtils = "gcc"
+# crash embeds version of gdb which is not buildable with clang
+TOOLCHAIN_pn-crash = "gcc"
+TOOLCHAIN_pn-elfutils = "gcc"
+# /mnt/a/yoe/build/tmp/work/cortexa7t2hf-neon-vfpv4-yoe-linux-gnueabi/firefox/60.1.0esr-r0/recipe-sysroot-native/usr/lib/clang/7.0.1/include/arm_neon.h:433:1: error: unknown type name 'inline'
+# __ai uint8x16_t vabdq_u8(uint8x16_t __p0, uint8x16_t __p1) {
+TOOLCHAIN_pn-firefox = "gcc"
+TOOLCHAIN_pn-gcc = "gcc"
+TOOLCHAIN_pn-gcc-runtime = "gcc"
+TOOLCHAIN_pn-gcc-sanitizers = "gcc"
+TOOLCHAIN_pn-glibc = "gcc"
+TOOLCHAIN_pn-glibc-initial = "gcc"
+TOOLCHAIN_pn-glibc-locale = "gcc"
+TOOLCHAIN_pn-glibc-mtrace = "gcc"
+TOOLCHAIN_pn-glibc-scripts = "gcc"
+TOOLCHAIN_pn-grub = "gcc"
+TOOLCHAIN_pn-grub-efi = "gcc"
+# VLAs
+#| control.c:286:19: error: fields must have a constant size: 'variable length array in structure' extension will never be supported
+#| __u32 buffer[cam->max_response_quads];
+#| ^
+#| 1 error generated.
+TOOLCHAIN_pn-libdc1394 = "gcc"
+TOOLCHAIN_pn-libgcc = "gcc"
+TOOLCHAIN_pn-libgcc-initial = "gcc"
+TOOLCHAIN_pn-libgfortran = "gcc"
+TOOLCHAIN_pn-libssp-nonshared = "gcc"
+#| cargo:warning=/mnt/a/yoe/build/tmp/work/cortexa7t2hf-neon-vfpv4-yoe-linux-gnueabi/libstd-rs/1.27.1-r0/re
+#cipe-sysroot/usr/include/bits/stdlib.h:90:3: error: "Assumed value of MB_LEN_MAX wrong"
+#| cargo:warning=# error "Assumed value of MB_LEN_MAX wrong"
+#| cargo:warning= ^
+TOOLCHAIN_pn-libstd-rs = "gcc"
+# clang does not have 64bit atomics on mips32
+TOOLCHAIN_pn-mesa_mips = "gcc"
+TOOLCHAIN_pn-mesa_mipsel = "gcc"
+TOOLCHAIN_pn-openjdk-8 = "gcc"
+TOOLCHAIN_pn-openjre-8 = "gcc"
+TOOLCHAIN_pn-piglit = "gcc"
+TOOLCHAIN_pn-prelink = "gcc"
+TOOLCHAIN_pn-polkit = "gcc"
+# has dpkg source which does not compile
+TOOLCHAIN_pn-start-stop-daemon = "gcc"
+TOOLCHAIN_pn-syslinux = "gcc"
+TOOLCHAIN_pn-systemtap = "gcc"
+# v4l-utils uses nested functions
+TOOLCHAIN_pn-v4l-utils = "gcc"
+TOOLCHAIN_pn-valgrind = "gcc"
+# uses C++ which clang does not like
+TOOLCHAIN_pn-wvstreams = "gcc"
+TOOLCHAIN_pn-wvdial = "gcc"
+#| ../../mpfr-3.1.4/src/mul.c:324:11: error: invalid output constraint '=h' in asm
+#| umul_ppmm (tmp[1], tmp[0], MPFR_MANT (b)[0], MPFR_MANT (c)[0]);
+TOOLCHAIN_pn-mpfr_mips = "gcc"
+TOOLCHAIN_pn-mpfr_mips64 = "gcc"
+#
+#../../lib/libicui18n.so: undefined reference to `__atomic_fetch_sub_4'
+#../../lib/libicui18n.so: undefined reference to `__atomic_load_4'
+#../../lib/libicui18n.so: undefined reference to `__atomic_store_4'
+#../../lib/libicui18n.so: undefined reference to `__atomic_fetch_add_4'
+#
+TOOLCHAIN_pn-icu_armv4 = "gcc"
+TOOLCHAIN_pn-icu_armv5 = "gcc"
+
+#../../libgcrypt-1.6.5/mpi/mpih-div.c:98:3: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
+TOOLCHAIN_pn-libgcrypt_mips64 = "gcc"
+
+#| ../../pixman-0.34.0/test/utils-prng.c:131:29: error: cannot convert between vector type '__attribute__((__vector_size__(16 * sizeof(char)))) char' (vector of 16 'char' values) and vector type 'uint8x16' (vector of 16 'uint8_t' values) as implicit conversion would cause truncation
+#| randdata.vb |= (t.vb >= const_C0#);
+#| ^
+# also see http://lists.llvm.org/pipermail/llvm-dev/2016-October/105997.html
+TOOLCHAIN_pn-pixman = "gcc"
+
+#| ./ports/linux/pseudo_wrappers.c:80:14: error: use of unknown builtin '__builtin_apply' [-Wimplicit-function-declaration]
+#| void *res = __builtin_apply((void (*)()) real_syscall, __builtin_apply_args(), sizeof(long) * 7);
+#| ^
+#| ./ports/linux/pseudo_wrappers.c:80:57: error: use of unknown builtin '__builtin_apply_args' [-Wimplicit-function-declaration]
+#| void *res = __builtin_apply((void (*)()) real_syscall, __builtin_apply_args(), sizeof(long) * 7);
+
+TOOLCHAIN_pn-pseudo = "gcc"
+#| ../../pulseaudio-10.0/src/pulsecore/mix_neon.c../../pulseaudio-10.0/src/pulsecore/sconv_neon.c:49::27: error: unknown register name 'q0' in asm
+#| : "memory", "cc", "q0" /* clobber list */
+#| ^
+TOOLCHAIN_pn-pulseaudio_aarch64 = "gcc"
+# mix_neon.c:179:9: error: invalid operand in inline asm: 'vld1.s32 ${0:h}, [$2]
+# vld1.s32 ${1:h}, [$3] '
+TOOLCHAIN_pn-pulseaudio_armv7ve = "gcc"
+TOOLCHAIN_pn-pulseaudio_armv7a = "gcc"
+
+# clang++ 6.0 crashes during link phase of a shared library
+TOOLCHAIN_pn-wpewebkit = "gcc"
+
+# x264 causes a infinite loop when compiling 1 source file
+#
+TOOLCHAIN_pn-x264_x86 = "gcc"
+
+#| /usr/src/debug/qemu/2.6.0-r1/qemu-2.6.0/util/bitmap.c:191: undefined reference to `__atomic_fetch_or_4'
+#| /usr/src/debug/qemu/2.6.0-r1/qemu-2.6.0/util/bitmap.c:210: undefined reference to `__atomic_fetch_or_4'
+#| libqemuutil.a(bitmap.o): In function `bitmap_test_and_clear_atomic':
+#| /usr/src/debug/qemu/2.6.0-r1/qemu-2.6.0/util/bitmap.c:250: undefined reference to `__atomic_fetch_and_4'
+#| /usr/src/debug/qemu/2.6.0-r1/qemu-2.6.0/util/bitmap.c:262: undefined reference to `__atomic_exchange_4'
+#| /usr/src/debug/qemu/2.6.0-r1/qemu-2.6.0/util/bitmap.c:273: undefined reference to `__atomic_fetch_and_4'
+# We need to link in with -latomic which comes from gcc-runtime anyway so just keep using gcc
+# to compile qemu for target
+TOOLCHAIN_pn-qemu_arm = "gcc"
+
+# llvm-profdata fails see
+# | error: Could not read profile code.profd: No such file or directory
+TOOLCHAIN_pn-python3 = "gcc"
+
+#| ./dsp/v4f_IIR2.h:554:12: error: no matching function for call to 'v4f_map'
+#| a[5] = v4f_map<__builtin_cosf> (f);
+#| ^~~~~~~~~~~~~~~~~~~~~~~
+TOOLCHAIN_pn-caps = "gcc"
+
+CFLAGS_append_pn-liboil_toolchain-clang_x86-64 = " -fheinous-gnu-extensions "
+
+#io_getevents.c:25:141: error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast or build with -fheinous-gnu-extensions
+#io_syscall5(int, __io_getevents_0_4, io_getevents, io_context_t, ctx, long, min_nr, long, nr, struct io_event *, events, struct timespec *, timeout)
+CFLAGS_append_pn-libaio_toolchain-clang_mips = " -fheinous-gnu-extensions"
+
+#| error: unknown warning option '-Wimplicit-fallthrough=0'; did you mean '-Wimplicit-fallthrough'? [-Werror,-Wunknown-warning-option]
+CFLAGS_append_pn-mdadm_toolchain-clang = " -Wno-error=unknown-warning-option"
+
+#../libffi-3.2.1/src/arm/sysv.S:363:2: error: invalid instruction, did you mean: fldmiax?
+# fldmiadgt ip, {d0-d7}
+CFLAGS_append_pn-libffi_toolchain-clang = " -no-integrated-as"
+# ../db-5.3.28/src/mutex/mut_tas.c:150:34: error: unknown directive
+#<inline asm>:9:2: note: instantiated into assembly here
+# .force_thumb
+# ^
+CFLAGS_append_pn-db_toolchain-clang = " -no-integrated-as"
+
+# Disable internal assembler for armv7 since it uses gnu assmebly syntax
+# which should be preprocessed via gcc/compiler
+#
+CFLAGS_append_pn-openssl_toolchain-clang_armv7ve = " -no-integrated-as"
+CFLAGS_append_pn-openssl_toolchain-clang_armv7a = " -no-integrated-as"
+CFLAGS_append_pn-userland_toolchain-clang = " -no-integrated-as"
+
+# regtest.cc:374:39: error: invalid suffix on literal; C++11 requires a
+# space between literal and identifier [-Wreserved-user-defined-literal]
+#| snprintf_func (buf, sizeof(buf), "%"Q"u", x);
+#| ^
+CXXFLAGS_append_pn-xdelta3_toolchain-clang = " -Wno-error=reserved-user-defined-literal"
+
+#memcached.c:6280:2: error: embedding a directive within macro arguments has undefined behavior [-Werror,-Wembedded-directive]
+CPPFLAGS_append_pn-memcached_toolchain-clang = " -Wno-error=embedded-directive"
+
+#| /tmp/mcp2515-578c41.s: Assembler messages:
+#| /tmp/mcp2515-578c41.s:1525: Error: r13 not allowed here -- `sub.w sp,r1,#8'
+#| /tmp/mcp2515-578c41.s:1821: Error: r13 not allowed here -- `sub.w sp,r6,#8'
+#| clang-7: error: assembler command failed with exit code 1 (use -v to see invocation)
+TUNE_CCARGS_remove_pn-upm_toolchain-clang = "-no-integrated-as"
+TUNE_CCARGS_remove_pn-omxplayer_toolchain-clang = "-no-integrated-as"
+
+#| /usr/src/debug/ruby/2.5.1-r0/build/../ruby-2.5.1/process.c:7073: undefined reference to `__mulodi4'
+#| clang-7: error: linker command failed with exit code 1 (use -v to see invocation)
+LDFLAGS_append_pn-ruby_toolchain-clang = " -rtlib=compiler-rt"
+LDFLAGS_append_pn-m4_toolchain-clang = " -rtlib=compiler-rt"
diff --git a/external/meta-clang/dynamic-layers/openembedded-layer/recipes-kernel/kernel-selftest/kernel-selftest.bbappend b/external/meta-clang/dynamic-layers/openembedded-layer/recipes-kernel/kernel-selftest/kernel-selftest.bbappend
new file mode 100644
index 00000000..53409624
--- /dev/null
+++ b/external/meta-clang/dynamic-layers/openembedded-layer/recipes-kernel/kernel-selftest/kernel-selftest.bbappend
@@ -0,0 +1 @@
+DEPENDS_append = " clang-native"
diff --git a/external/meta-clang/recipes-bsp/systemd-boot/systemd-boot_%.bbappend b/external/meta-clang/recipes-bsp/systemd-boot/systemd-boot_%.bbappend
new file mode 100644
index 00000000..d5e4bcc5
--- /dev/null
+++ b/external/meta-clang/recipes-bsp/systemd-boot/systemd-boot_%.bbappend
@@ -0,0 +1,4 @@
+do_configure_append_toolchain-clang() {
+ export EFI_CC="${CC}"
+ sed -i -e "s#O0#O#g" ${S}/src/boot/efi/meson.build
+}
diff --git a/external/meta-clang/recipes-connectivity/openssh/openssh_%.bbappend b/external/meta-clang/recipes-connectivity/openssh/openssh_%.bbappend
new file mode 100644
index 00000000..88966e5d
--- /dev/null
+++ b/external/meta-clang/recipes-connectivity/openssh/openssh_%.bbappend
@@ -0,0 +1,3 @@
+do_configure_prepend() {
+ sed -i -e '/-ftrapv/d' ${S}/configure.ac
+}
diff --git a/external/meta-clang/recipes-core/busybox/busybox_%.bbappend b/external/meta-clang/recipes-core/busybox/busybox_%.bbappend
new file mode 100644
index 00000000..d7b9ca1d
--- /dev/null
+++ b/external/meta-clang/recipes-core/busybox/busybox_%.bbappend
@@ -0,0 +1 @@
+ARM_INSTRUCTION_SET_toolchain-clang = "arm"
diff --git a/external/meta-clang/recipes-core/glib-2.0/glib-2.0_%.bbappend b/external/meta-clang/recipes-core/glib-2.0/glib-2.0_%.bbappend
new file mode 100644
index 00000000..4a0f94af
--- /dev/null
+++ b/external/meta-clang/recipes-core/glib-2.0/glib-2.0_%.bbappend
@@ -0,0 +1 @@
+CFLAGS_append_libc-musl = " -Wno-format-nonliteral"
diff --git a/external/meta-clang/recipes-core/meta/meta-environment.bbappend b/external/meta-clang/recipes-core/meta/meta-environment.bbappend
new file mode 100644
index 00000000..734a9e65
--- /dev/null
+++ b/external/meta-clang/recipes-core/meta/meta-environment.bbappend
@@ -0,0 +1,16 @@
+export TARGET_CLANGCC_ARCH = "${TARGET_CC_ARCH}"
+TARGET_CLANGCC_ARCH_remove = "-mthumb-interwork"
+TARGET_CLANGCC_ARCH_remove = "-mmusl"
+TARGET_CLANGCC_ARCH_remove = "-muclibc"
+TARGET_CLANGCC_ARCH_remove = "-meb"
+TARGET_CLANGCC_ARCH_remove = "-mel"
+TARGET_CLANGCC_ARCH_append = "${@bb.utils.contains("TUNE_FEATURES", "bigendian", " -mbig-endian", " -mlittle-endian", d)}"
+TARGET_CLANGCC_ARCH_remove_powerpc = "-mhard-float"
+TARGET_CLANGCC_ARCH_remove_powerpc = "-mno-spe"
+
+create_sdk_files_append() {
+ script=${SDK_OUTPUT}/${SDKPATH}/environment-setup-${REAL_MULTIMACH_TARGET_SYS}
+ echo 'export CLANGCC="${TARGET_PREFIX}clang ${TARGET_CLANGCC_ARCH} --sysroot=$SDKTARGETSYSROOT"' >> $script
+ echo 'export CLANGCXX="${TARGET_PREFIX}clang++ ${TARGET_CLANGCC_ARCH} --sysroot=$SDKTARGETSYSROOT"' >> $script
+ echo 'export CLANGCPP="${TARGET_PREFIX}clang -E ${TARGET_CLANGCC_ARCH} --sysroot=$SDKTARGETSYSROOT"' >> $script
+}
diff --git a/external/meta-clang/recipes-core/musl/musl_%.bbappend b/external/meta-clang/recipes-core/musl/musl_%.bbappend
new file mode 100644
index 00000000..c8b9878e
--- /dev/null
+++ b/external/meta-clang/recipes-core/musl/musl_%.bbappend
@@ -0,0 +1 @@
+DEPENDS_append_toolchain-clang = " clang-cross-${TARGET_ARCH}"
diff --git a/external/meta-clang/recipes-core/ncurses/ncurses_%.bbappend b/external/meta-clang/recipes-core/ncurses/ncurses_%.bbappend
new file mode 100644
index 00000000..096d5bcb
--- /dev/null
+++ b/external/meta-clang/recipes-core/ncurses/ncurses_%.bbappend
@@ -0,0 +1 @@
+CACHED_CONFIGUREVARS_append_toolchain-clang = " cf_cv_prog_CC_c_o=yes cf_cv_prog_CXX_c_o=yes"
diff --git a/external/meta-clang/recipes-core/packagegroups/nativesdk-packagegroup-sdk-host.bbappend b/external/meta-clang/recipes-core/packagegroups/nativesdk-packagegroup-sdk-host.bbappend
new file mode 100644
index 00000000..a8e81aa5
--- /dev/null
+++ b/external/meta-clang/recipes-core/packagegroups/nativesdk-packagegroup-sdk-host.bbappend
@@ -0,0 +1,3 @@
+NATIVESDKCLANG ?= "nativesdk-clang"
+
+RDEPENDS_${PN} += "${NATIVESDKCLANG}"
diff --git a/external/meta-clang/recipes-core/packagegroups/packagegroup-core-standalone-sdk-target.bbappend b/external/meta-clang/recipes-core/packagegroups/packagegroup-core-standalone-sdk-target.bbappend
new file mode 100644
index 00000000..dd0f83c6
--- /dev/null
+++ b/external/meta-clang/recipes-core/packagegroups/packagegroup-core-standalone-sdk-target.bbappend
@@ -0,0 +1,6 @@
+RRECOMMENDS_${PN} += "\
+ libcxx-dev \
+ libcxx-staticdev \
+ compiler-rt-dev \
+ compiler-rt-staticdev \
+"
diff --git a/external/meta-clang/recipes-core/packagegroups/packagegroup-cross-canadian.bbappend b/external/meta-clang/recipes-core/packagegroups/packagegroup-cross-canadian.bbappend
new file mode 100644
index 00000000..2618d20d
--- /dev/null
+++ b/external/meta-clang/recipes-core/packagegroups/packagegroup-cross-canadian.bbappend
@@ -0,0 +1,5 @@
+CLANGCROSSCANADIAN ?= "clang-cross-canadian-${TRANSLATED_TARGET_ARCH}"
+CLANGCROSSCANADIAN_riscv64 = ""
+RDEPENDS_${PN} += "\
+ ${@all_multilib_tune_values(d, 'CLANGCROSSCANADIAN')} \
+"
diff --git a/external/meta-clang/recipes-devtools/clang/clang-cross-canadian_git.bb b/external/meta-clang/recipes-devtools/clang/clang-cross-canadian_git.bb
new file mode 100644
index 00000000..69a7e1fa
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang-cross-canadian_git.bb
@@ -0,0 +1,33 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "Clang/LLVM based C/C++ compiler (cross-canadian for ${TARGET_ARCH} target)"
+HOMEPAGE = "http://clang.llvm.org/"
+LICENSE = "NCSA"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/NCSA;md5=1b5fdec70ee13ad8a91667f16c1959d7"
+SECTION = "devel"
+
+PN = "clang-cross-canadian-${TRANSLATED_TARGET_ARCH}"
+
+require clang.inc
+require common-source.inc
+inherit cross-canadian
+
+DEPENDS += "nativesdk-clang binutils-cross-canadian-${TRANSLATED_TARGET_ARCH} virtual/${HOST_PREFIX}binutils-crosssdk virtual/nativesdk-libc"
+# We have to point gcc at a sysroot but we don't need to rebuild if this changes
+# e.g. we switch between different machines with different tunes.
+EXTRA_OECONF_PATHS[vardepsexclude] = "TUNE_PKGARCH"
+TARGET_ARCH[vardepsexclude] = "TUNE_ARCH"
+
+do_install() {
+ install -d ${D}${bindir}
+ for tool in clang clang++ llvm-profdata llvm-ar llvm-ranlib llvm-nm
+ do
+ ln -sf ../$tool ${D}${bindir}/${TARGET_PREFIX}$tool
+ done
+}
+SSTATE_SCAN_FILES += "*-clang *-clang++ *-llvm-profdata *-llvm-ar \
+ *-llvm-ranlib *-llvm-nm"
+do_install_append() {
+ cross_canadian_bindirlinks
+}
diff --git a/external/meta-clang/recipes-devtools/clang/clang-cross_git.bb b/external/meta-clang/recipes-devtools/clang/clang-cross_git.bb
new file mode 100644
index 00000000..22f177f3
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang-cross_git.bb
@@ -0,0 +1,32 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "Cross compiler wrappers for LLVM based C/C++ compiler"
+HOMEPAGE = "http://clang.llvm.org/"
+LICENSE = "NCSA"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/NCSA;md5=1b5fdec70ee13ad8a91667f16c1959d7"
+SECTION = "devel"
+
+PN = "clang-cross-${TARGET_ARCH}"
+
+require clang.inc
+require common-source.inc
+inherit cross
+DEPENDS += "clang-native binutils-cross-${TARGET_ARCH}"
+
+do_install() {
+ install -d ${D}${bindir}
+ for tool in clang clang++ llvm-profdata llvm-ar llvm-ranlib llvm-nm
+ do
+ ln -sf ../$tool ${D}${bindir}/${TARGET_PREFIX}$tool
+ done
+}
+
+SYSROOT_PREPROCESS_FUNCS += "clangcross_sysroot_preprocess"
+
+clangcross_sysroot_preprocess () {
+ sysroot_stage_dir ${D}${bindir} ${SYSROOT_DESTDIR}${bindir}
+}
+SSTATE_SCAN_FILES += "*-clang *-clang++ *-llvm-profdata *-llvm-ar \
+ *-llvm-ranlib *-llvm-nm"
+PACKAGES = ""
diff --git a/external/meta-clang/recipes-devtools/clang/clang-crosssdk_git.bb b/external/meta-clang/recipes-devtools/clang/clang-crosssdk_git.bb
new file mode 100644
index 00000000..ac1dd63a
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang-crosssdk_git.bb
@@ -0,0 +1,30 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "SDK Cross compiler wrappers for LLVM based C/C++ compiler"
+HOMEPAGE = "http://clang.llvm.org/"
+LICENSE = "NCSA"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/NCSA;md5=1b5fdec70ee13ad8a91667f16c1959d7"
+SECTION = "devel"
+
+PN = "clang-crosssdk-${TARGET_ARCH}"
+
+require clang.inc
+require common-source.inc
+inherit crosssdk
+DEPENDS += "clang-native nativesdk-clang-glue virtual/${TARGET_PREFIX}binutils-crosssdk virtual/nativesdk-libc"
+
+do_install() {
+ install -d ${D}${bindir}
+ for tool in clang clang++ llvm-profdata llvm-ar llvm-ranlib llvm-nm
+ do
+ ln -sf ../$tool ${D}${bindir}/${TARGET_PREFIX}$tool
+ done
+}
+SSTATE_SCAN_FILES += "*-clang *-clang++ *-llvm-profdata *-llvm-ar \
+ *-llvm-ranlib *-llvm-nm"
+sysroot_stage_all () {
+ sysroot_stage_dir ${D}${bindir} ${SYSROOT_DESTDIR}${bindir}
+}
+
+PACKAGES = ""
diff --git a/external/meta-clang/recipes-devtools/clang/clang.inc b/external/meta-clang/recipes-devtools/clang/clang.inc
new file mode 100644
index 00000000..e8cf3f26
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang.inc
@@ -0,0 +1,21 @@
+LLVM_RELEASE = ""
+LLVM_DIR = "llvm${LLVM_RELEASE}"
+
+LLVM_GIT ?= "git://github.com/llvm"
+LLVM_GIT_PROTOCOL ?= "https"
+
+MAJOR_VER = "7"
+MINOR_VER = "1"
+PATCH_VER = "0"
+
+SRCREV ?= "4856a9330ee01d30e9e11b6c2f991662b4c04b07"
+
+PV = "${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}"
+BRANCH = "release/${MAJOR_VER}.x"
+
+LLVMMD5SUM = "c520ed40e11887bb1d24d86f7f5b1f05"
+CLANGMD5SUM = "444af0e124949f07f791f12c928e5994"
+LLDMD5SUM = "f4941ace8ddb3d6cf177fff94966319a"
+LLDBMD5SUM = "b6320ed0b0d00ae661dd94f277bbf024"
+
+require common.inc
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0001-clang-driver-Use-lib-for-ldso-on-OE.patch b/external/meta-clang/recipes-devtools/clang/clang/0001-clang-driver-Use-lib-for-ldso-on-OE.patch
new file mode 100644
index 00000000..2b06da25
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0001-clang-driver-Use-lib-for-ldso-on-OE.patch
@@ -0,0 +1,56 @@
+From 06033c7fa2d575a9a68b377f5ce9324433c23806 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 21 May 2016 21:52:36 -0700
+Subject: [PATCH 1/8] clang: driver: Use /lib for ldso on OE
+
+OE does not follow the default base_libdir
+that clang has, therefore adjust it for OE
+it wont be able to support multilib since
+in multilib case OE switches the base libdir
+for 64bit to /lib64 instead of /lib
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ lib/Driver/ToolChains/Linux.cpp | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/lib/Driver/ToolChains/Linux.cpp b/lib/Driver/ToolChains/Linux.cpp
+index f8f3623918..e662b6b262 100644
+--- a/lib/Driver/ToolChains/Linux.cpp
++++ b/lib/Driver/ToolChains/Linux.cpp
+@@ -566,12 +566,12 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+ Loader = "ld.so.1";
+ break;
+ case llvm::Triple::ppc64:
+- LibDir = "lib64";
++ LibDir = "lib";
+ Loader =
+ (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1";
+ break;
+ case llvm::Triple::ppc64le:
+- LibDir = "lib64";
++ LibDir = "lib";
+ Loader =
+ (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
+ break;
+@@ -593,7 +593,7 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+ Loader = "ld-linux.so.2";
+ break;
+ case llvm::Triple::sparcv9:
+- LibDir = "lib64";
++ LibDir = "lib";
+ Loader = "ld-linux.so.2";
+ break;
+ case llvm::Triple::systemz:
+@@ -607,7 +607,7 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+ case llvm::Triple::x86_64: {
+ bool X32 = Triple.getEnvironment() == llvm::Triple::GNUX32;
+
+- LibDir = X32 ? "libx32" : "lib64";
++ LibDir = "lib";
+ Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2";
+ break;
+ }
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0001-compiler-rt-support-a-new-embedded-linux-target.patch b/external/meta-clang/recipes-devtools/clang/clang/0001-compiler-rt-support-a-new-embedded-linux-target.patch
new file mode 100644
index 00000000..8b0c9feb
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0001-compiler-rt-support-a-new-embedded-linux-target.patch
@@ -0,0 +1,326 @@
+From 8b0d5d19e8ebec9b6508b51701cb0c64069091cb Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sun, 19 Apr 2015 15:16:23 -0700
+Subject: [PATCH 1/4] compiler-rt: support a new embedded linux target
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ lib/builtins/int_util.c | 3 +-
+ make/platform/clang_linux_embedded.mk | 286 ++++++++++++++++++
+ .../clang_linux_embedded_test_input.c | 0
+ 3 files changed, 287 insertions(+), 2 deletions(-)
+ create mode 100644 make/platform/clang_linux_embedded.mk
+ create mode 100644 make/platform/clang_linux_embedded_test_input.c
+
+diff --git a/lib/builtins/int_util.c b/lib/builtins/int_util.c
+index de87410db..0d5b56fe1 100644
+--- a/lib/builtins/int_util.c
++++ b/lib/builtins/int_util.c
+@@ -58,8 +58,7 @@ void compilerrt_abort_impl(const char *file, int line, const char *function) {
+ #else
+
+ /* Get the system definition of abort() */
+-#include <stdlib.h>
+-
++extern void abort (void) __attribute__ ((__noreturn__));
+ #ifndef _WIN32
+ __attribute__((weak))
+ __attribute__((visibility("hidden")))
+diff --git a/make/platform/clang_linux_embedded.mk b/make/platform/clang_linux_embedded.mk
+new file mode 100644
+index 000000000..d0a890075
+--- /dev/null
++++ b/make/platform/clang_linux_embedded.mk
+@@ -0,0 +1,286 @@
++# These are the functions which clang needs when it is targeting a previous
++# version of the OS. The issue is that the backend may use functions which were
++# not present in the libgcc that shipped on the platform. In such cases, we link
++# with a version of the library which contains private_extern definitions of all
++# the extra functions which might be referenced.
++
++Description := Static runtime libraries for embedded clang/Linux
++
++# A function that ensures we don't try to build for architectures that we
++# don't have working toolchains for.
++CheckArches = \
++ $(shell \
++ result=""; \
++ for arch in $(1); do \
++ if $(CC) -arch $$arch -c \
++ -integrated-as \
++ $(ProjSrcRoot)/make/platform/clang_linux_embedded_test_input.c \
++ -o /dev/null > /dev/null 2> /dev/null; then \
++ result="$$result$$arch "; \
++ else \
++ printf 1>&2 \
++ "warning: clang_linux_embedded.mk: dropping arch '$$arch' from lib '$(2)'\n"; \
++ fi; \
++ done; \
++ echo $$result)
++
++XCRun = \
++ $(shell \
++ result=`xcrun -find $(1) 2> /dev/null`; \
++ if [ "$$?" != "0" ]; then result=$(1); fi; \
++ echo $$result)
++
++###
++
++CC := $(call XCRun,clang)
++AR := $(call XCRun,ar)
++RANLIB := $(call XCRun,ranlib)
++STRIP := $(call XCRun,strip)
++LIPO := $(call XCRun,lipo)
++DSYMUTIL := $(call XCRun,dsymutil)
++Configs :=
++UniversalArchs :=
++
++# Soft-float version of the runtime. No floating-point instructions will be used
++# and the ABI (out of necessity) passes floating values in normal registers:
++# non-VFP variant of the AAPCS.
++UniversalArchs.soft_static := $(call CheckArches,arm armv7m armv7em armv7,soft_static)
++Configs += $(if $(UniversalArchs.soft_static),soft_static)
++
++# Hard-float version of the runtime. On ARM VFP instructions and registers are
++# allowed, and floating point values get passed in them. VFP variant of the
++# AAPCS.
++UniversalArchs.hard_static := $(call CheckArches,armv7em armv7 i386 x86_64,hard_static)
++Configs += $(if $(UniversalArchs.hard_static),hard_static)
++
++UniversalArchs.soft_pic := $(call CheckArches,armv6m armv7m armv7em armv7,soft_pic)
++Configs += $(if $(UniversalArchs.soft_pic),soft_pic)
++
++UniversalArchs.hard_pic := $(call CheckArches,armv7em armv7 i386 x86_64,hard_pic)
++Configs += $(if $(UniversalArchs.hard_pic),hard_pic)
++
++CFLAGS := -Wall -Werror -Oz -fomit-frame-pointer -ffreestanding
++
++PIC_CFLAGS := -fPIC
++STATIC_CFLAGS := -static
++
++CFLAGS_SOFT := -mfloat-abi=soft
++CFLAGS_HARD := -mfloat-abi=hard
++
++CFLAGS_I386 := -march=pentium
++
++CFLAGS.soft_static := $(CFLAGS) $(STATIC_CFLAGS) $(CFLAGS_SOFT)
++CFLAGS.hard_static := $(CFLAGS) $(STATIC_CFLAGS) $(CFLAGS_HARD)
++CFLAGS.soft_pic := $(CFLAGS) $(PIC_CFLAGS) $(CFLAGS_SOFT)
++CFLAGS.hard_pic := $(CFLAGS) $(PIC_CFLAGS) $(CFLAGS_HARD)
++
++CFLAGS.soft_static.armv7 := $(CFLAGS.soft_static) $(CFLAGS_ARMV7)
++CFLAGS.hard_static.armv7 := $(CFLAGS.hard_static) $(CFLAGS_ARMV7)
++CFLAGS.soft_pic.armv7 := $(CFLAGS.soft_pic) $(CFLAGS_ARMV7)
++CFLAGS.hard_pic.armv7 := $(CFLAGS.hard_pic) $(CFLAGS_ARMV7)
++
++# x86 platforms ignore -mfloat-abi options and complain about doing so. Despite
++# this they're hard-float.
++CFLAGS.hard_static.i386 := $(CFLAGS) $(STATIC_CFLAGS) $(CFLAGS_I386)
++CFLAGS.hard_pic.i386 := $(CFLAGS) $(PIC_CFLAGS) $(CFLAGS_I386)
++CFLAGS.hard_static.x86_64 := $(CFLAGS) $(STATIC_CFLAGS)
++CFLAGS.hard_pic.x86_64 := $(CFLAGS) $(PIC_CFLAGS)
++
++# Functions not wanted:
++# + eprintf is obsolete anyway
++# + *vfp: designed for Thumb1 CPUs with VFPv2
++
++COMMON_FUNCTIONS := \
++ absvdi2 \
++ absvsi2 \
++ addvdi3 \
++ addvsi3 \
++ ashldi3 \
++ ashrdi3 \
++ bswapdi2 \
++ bswapsi2 \
++ clzdi2 \
++ clzsi2 \
++ cmpdi2 \
++ ctzdi2 \
++ ctzsi2 \
++ divdc3 \
++ divdi3 \
++ divsc3 \
++ divmodsi4 \
++ udivmodsi4 \
++ do_global_dtors \
++ ffsdi2 \
++ fixdfdi \
++ fixsfdi \
++ fixunsdfdi \
++ fixunsdfsi \
++ fixunssfdi \
++ fixunssfsi \
++ floatdidf \
++ floatdisf \
++ floatundidf \
++ floatundisf \
++ gcc_bcmp \
++ lshrdi3 \
++ moddi3 \
++ muldc3 \
++ muldi3 \
++ mulsc3 \
++ mulvdi3 \
++ mulvsi3 \
++ negdi2 \
++ negvdi2 \
++ negvsi2 \
++ paritydi2 \
++ paritysi2 \
++ popcountdi2 \
++ popcountsi2 \
++ powidf2 \
++ powisf2 \
++ subvdi3 \
++ subvsi3 \
++ ucmpdi2 \
++ udiv_w_sdiv \
++ udivdi3 \
++ udivmoddi4 \
++ umoddi3 \
++ adddf3 \
++ addsf3 \
++ cmpdf2 \
++ cmpsf2 \
++ div0 \
++ divdf3 \
++ divsf3 \
++ divsi3 \
++ extendsfdf2 \
++ ffssi2 \
++ fixdfsi \
++ fixsfsi \
++ floatsidf \
++ floatsisf \
++ floatunsidf \
++ floatunsisf \
++ comparedf2 \
++ comparesf2 \
++ modsi3 \
++ muldf3 \
++ mulsf3 \
++ negdf2 \
++ negsf2 \
++ subdf3 \
++ subsf3 \
++ truncdfsf2 \
++ udivsi3 \
++ umodsi3 \
++ unorddf2 \
++ unordsf2
++
++ARM_FUNCTIONS := \
++ aeabi_cdcmpeq \
++ aeabi_cdrcmple \
++ aeabi_cfcmpeq \
++ aeabi_cfrcmple \
++ aeabi_dcmpeq \
++ aeabi_dcmpge \
++ aeabi_dcmpgt \
++ aeabi_dcmple \
++ aeabi_dcmplt \
++ aeabi_drsub \
++ aeabi_fcmpeq \
++ aeabi_fcmpge \
++ aeabi_fcmpgt \
++ aeabi_fcmple \
++ aeabi_fcmplt \
++ aeabi_frsub \
++ aeabi_idivmod \
++ aeabi_uidivmod \
++
++# ARM Assembly implementation which requires Thumb2 (i.e. won't work on v6M).
++THUMB2_FUNCTIONS := \
++ switch16 \
++ switch32 \
++ switch8 \
++ switchu8 \
++ sync_fetch_and_add_4 \
++ sync_fetch_and_sub_4 \
++ sync_fetch_and_and_4 \
++ sync_fetch_and_or_4 \
++ sync_fetch_and_xor_4 \
++ sync_fetch_and_nand_4 \
++ sync_fetch_and_max_4 \
++ sync_fetch_and_umax_4 \
++ sync_fetch_and_min_4 \
++ sync_fetch_and_umin_4 \
++ sync_fetch_and_add_8 \
++ sync_fetch_and_sub_8 \
++ sync_fetch_and_and_8 \
++ sync_fetch_and_or_8 \
++ sync_fetch_and_xor_8 \
++ sync_fetch_and_nand_8 \
++ sync_fetch_and_max_8 \
++ sync_fetch_and_umax_8 \
++ sync_fetch_and_min_8 \
++ sync_fetch_and_umin_8
++
++I386_FUNCTIONS := \
++ i686.get_pc_thunk.eax \
++ i686.get_pc_thunk.ebp \
++ i686.get_pc_thunk.ebx \
++ i686.get_pc_thunk.ecx \
++ i686.get_pc_thunk.edi \
++ i686.get_pc_thunk.edx \
++ i686.get_pc_thunk.esi
++
++# FIXME: Currently, compiler-rt is missing implementations for a number of the
++# functions. Filter them out for now.
++MISSING_FUNCTIONS := \
++ cmpdf2 cmpsf2 div0 \
++ ffssi2 \
++ udiv_w_sdiv unorddf2 unordsf2 bswapdi2 \
++ bswapsi2 \
++ gcc_bcmp \
++ do_global_dtors \
++ i686.get_pc_thunk.eax i686.get_pc_thunk.ebp i686.get_pc_thunk.ebx \
++ i686.get_pc_thunk.ecx i686.get_pc_thunk.edi i686.get_pc_thunk.edx \
++ i686.get_pc_thunk.esi \
++ aeabi_cdcmpeq aeabi_cdrcmple aeabi_cfcmpeq aeabi_cfrcmple aeabi_dcmpeq \
++ aeabi_dcmpge aeabi_dcmpgt aeabi_dcmple aeabi_dcmplt aeabi_drsub \
++ aeabi_fcmpeq \ aeabi_fcmpge aeabi_fcmpgt aeabi_fcmple aeabi_fcmplt \
++ aeabi_frsub aeabi_idivmod aeabi_uidivmod
++
++FUNCTIONS_ARMV6M := $(COMMON_FUNCTIONS) $(ARM_FUNCTIONS)
++FUNCTIONS_ARM_ALL := $(COMMON_FUNCTIONS) $(ARM_FUNCTIONS) $(THUMB2_FUNCTIONS)
++FUNCTIONS_I386 := $(COMMON_FUNCTIONS) $(I386_FUNCTIONS)
++FUNCTIONS_X86_64 := $(COMMON_FUNCTIONS)
++
++FUNCTIONS_ARMV6M := \
++ $(filter-out $(MISSING_FUNCTIONS),$(FUNCTIONS_ARMV6M))
++FUNCTIONS_ARM_ALL := \
++ $(filter-out $(MISSING_FUNCTIONS),$(FUNCTIONS_ARM_ALL))
++FUNCTIONS_I386 := \
++ $(filter-out $(MISSING_FUNCTIONS),$(FUNCTIONS_I386))
++FUNCTIONS_X86_64 := \
++ $(filter-out $(MISSING_FUNCTIONS),$(FUNCTIONS_X86_64))
++
++FUNCTIONS.soft_static.armv6m := $(FUNCTIONS_ARMV6M)
++FUNCTIONS.soft_pic.armv6m := $(FUNCTIONS_ARMV6M)
++
++FUNCTIONS.soft_static.armv7m := $(FUNCTIONS_ARM_ALL)
++FUNCTIONS.soft_pic.armv7m := $(FUNCTIONS_ARM_ALL)
++
++FUNCTIONS.soft_static.armv7em := $(FUNCTIONS_ARM_ALL)
++FUNCTIONS.hard_static.armv7em := $(FUNCTIONS_ARM_ALL)
++FUNCTIONS.soft_pic.armv7em := $(FUNCTIONS_ARM_ALL)
++FUNCTIONS.hard_pic.armv7em := $(FUNCTIONS_ARM_ALL)
++
++FUNCTIONS.soft_static.armv7 := $(FUNCTIONS_ARM_ALL)
++FUNCTIONS.hard_static.armv7 := $(FUNCTIONS_ARM_ALL)
++FUNCTIONS.soft_pic.armv7 := $(FUNCTIONS_ARM_ALL)
++FUNCTIONS.hard_pic.armv7 := $(FUNCTIONS_ARM_ALL)
++
++FUNCTIONS.hard_static.i386 := $(FUNCTIONS_I386)
++FUNCTIONS.hard_pic.i386 := $(FUNCTIONS_I386)
++
++FUNCTIONS.hard_static.x86_64 := $(FUNCTIONS_X86_64)
++FUNCTIONS.hard_pic.x86_64 := $(FUNCTIONS_X86_64)
+diff --git a/make/platform/clang_linux_embedded_test_input.c b/make/platform/clang_linux_embedded_test_input.c
+new file mode 100644
+index 000000000..e69de29bb
+--
+2.20.1
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0001-libcxxabi-Find-libunwind-headers-when-LIBCXXABI_LIBU.patch b/external/meta-clang/recipes-devtools/clang/clang/0001-libcxxabi-Find-libunwind-headers-when-LIBCXXABI_LIBU.patch
new file mode 100644
index 00000000..297b56d1
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0001-libcxxabi-Find-libunwind-headers-when-LIBCXXABI_LIBU.patch
@@ -0,0 +1,68 @@
+From a122717a9bc31e0ab44197e743aa466711c4bf79 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sun, 27 Aug 2017 10:37:49 -0700
+Subject: [PATCH] libcxxabi: Find libunwind headers when
+ LIBCXXABI_LIBUNWIND_INCLUDES is set
+
+Currently, when LIBCXXABI_LIBUNWIND_INCLUDES is set via CMake arguments
+then it ends up not searching the specified dir and unwind.h is not found
+especially for ARM targets
+
+This patch makes the searching synthesized directories and then set
+LIBCXXABI_LIBUNWIND_INCLUDES if its there in environment
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ CMakeLists.txt | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index d6648ed..12c02f2 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -434,15 +434,10 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCXXABI_C_FLAGS}")
+ # Setup Source Code
+ #===============================================================================
+
+-set(LIBCXXABI_LIBUNWIND_INCLUDES "${LIBCXXABI_LIBUNWIND_INCLUDES}" CACHE PATH
+- "Specify path to libunwind includes." FORCE)
+-set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH
+- "Specify path to libunwind source." FORCE)
+-
+ include_directories(include)
+ if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
+ find_path(
+- LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL
++ LIBCXXABI_LIBUNWIND_INCLUDES
+ libunwind.h
+ PATHS ${LIBCXXABI_LIBUNWIND_INCLUDES}
+ ${LIBCXXABI_LIBUNWIND_PATH}/include
+@@ -454,15 +449,21 @@ if (LIBCXXABI_USE_LLVM_UNWINDER OR LLVM_NATIVE_ARCH MATCHES ARM)
+ NO_CMAKE_FIND_ROOT_PATH
+ )
+
+- if (LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND")
+- set(LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL "")
++ if (LIBCXXABI_LIBUNWIND_INCLUDES STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES-NOTFOUND")
++ set(LIBCXXABI_LIBUNWIND_INCLUDES "")
+ endif()
+
+- if (NOT LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "")
+- include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL}")
++ if (NOT LIBCXXABI_LIBUNWIND_INCLUDES STREQUAL "")
++ include_directories("${LIBCXXABI_LIBUNWIND_INCLUDES}")
+ endif()
+ endif()
+
++set(LIBCXXABI_LIBUNWIND_INCLUDES "${LIBCXXABI_LIBUNWIND_INCLUDES}" CACHE PATH
++ "Specify path to libunwind includes." FORCE)
++set(LIBCXXABI_LIBUNWIND_PATH "${LIBCXXABI_LIBUNWIND_PATH}" CACHE PATH
++ "Specify path to libunwind source." FORCE)
++
++
+ # Add source code. This also contains all of the logic for deciding linker flags
+ # soname, etc...
+ add_subdirectory(src)
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0001-lldb-Include-limits.h-for-PATH_MAX-definition.patch b/external/meta-clang/recipes-devtools/clang/clang/0001-lldb-Include-limits.h-for-PATH_MAX-definition.patch
new file mode 100644
index 00000000..1c42931f
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0001-lldb-Include-limits.h-for-PATH_MAX-definition.patch
@@ -0,0 +1,28 @@
+From ff8d7137ed4d62e9db6d31581822a2ce06d5cbc6 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Thu, 18 May 2017 23:12:34 -0700
+Subject: [PATCH 1/2] lldb: Include limits.h for PATH_MAX definition
+
+Helps compiling on musl targets
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ source/Utility/FileSpec.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/source/Utility/FileSpec.cpp b/source/Utility/FileSpec.cpp
+index b6952f7e3..2cedf5d90 100644
+--- a/source/Utility/FileSpec.cpp
++++ b/source/Utility/FileSpec.cpp
+@@ -29,7 +29,7 @@
+ #include <assert.h> // for assert
+ #include <stdio.h> // for size_t, NULL, snpr...
+ #include <string.h> // for strcmp
+-
++#include <limits.h> // for PATH_MAX
+ using namespace lldb;
+ using namespace lldb_private;
+
+--
+2.20.1
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0001-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch b/external/meta-clang/recipes-devtools/clang/clang/0001-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch
new file mode 100644
index 00000000..de8da745
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0001-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch
@@ -0,0 +1,91 @@
+From fc9904be5d4ee1d1e92a1ff86b01218fbf91b12f Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 21 May 2016 00:33:20 +0000
+Subject: [PATCH 1/3] llvm: TargetLibraryInfo: Undefine libc functions if they
+ are macros
+
+musl defines some functions as macros and not inline functions
+if this is the case then make sure to undefine them
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ include/llvm/Analysis/TargetLibraryInfo.def | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+diff --git a/include/llvm/Analysis/TargetLibraryInfo.def b/include/llvm/Analysis/TargetLibraryInfo.def
+index f94debba9c5..e92dbc98c55 100644
+--- a/include/llvm/Analysis/TargetLibraryInfo.def
++++ b/include/llvm/Analysis/TargetLibraryInfo.def
+@@ -707,6 +707,9 @@ TLI_DEFINE_STRING_INTERNAL("fmodl")
+ TLI_DEFINE_ENUM_INTERNAL(fopen)
+ TLI_DEFINE_STRING_INTERNAL("fopen")
+ /// FILE *fopen64(const char *filename, const char *opentype)
++#ifdef fopen64
++#undef fopen64
++#endif
+ TLI_DEFINE_ENUM_INTERNAL(fopen64)
+ TLI_DEFINE_STRING_INTERNAL("fopen64")
+ /// int fprintf(FILE *stream, const char *format, ...);
+@@ -751,6 +754,9 @@ TLI_DEFINE_STRING_INTERNAL("fseek")
+ /// int fseeko(FILE *stream, off_t offset, int whence);
+ TLI_DEFINE_ENUM_INTERNAL(fseeko)
+ TLI_DEFINE_STRING_INTERNAL("fseeko")
++#ifdef fseeko64
++#undef fseeko64
++#endif
+ /// int fseeko64(FILE *stream, off64_t offset, int whence)
+ TLI_DEFINE_ENUM_INTERNAL(fseeko64)
+ TLI_DEFINE_STRING_INTERNAL("fseeko64")
+@@ -761,6 +767,9 @@ TLI_DEFINE_STRING_INTERNAL("fsetpos")
+ TLI_DEFINE_ENUM_INTERNAL(fstat)
+ TLI_DEFINE_STRING_INTERNAL("fstat")
+ /// int fstat64(int filedes, struct stat64 *buf)
++#ifdef fstat64
++#undef fstat64
++#endif
+ TLI_DEFINE_ENUM_INTERNAL(fstat64)
+ TLI_DEFINE_STRING_INTERNAL("fstat64")
+ /// int fstatvfs(int fildes, struct statvfs *buf);
+@@ -776,6 +785,9 @@ TLI_DEFINE_STRING_INTERNAL("ftell")
+ TLI_DEFINE_ENUM_INTERNAL(ftello)
+ TLI_DEFINE_STRING_INTERNAL("ftello")
+ /// off64_t ftello64(FILE *stream)
++#ifdef ftello64
++#undef ftello64
++#endif
+ TLI_DEFINE_ENUM_INTERNAL(ftello64)
+ TLI_DEFINE_STRING_INTERNAL("ftello64")
+ /// int ftrylockfile(FILE *file);
+@@ -902,6 +914,9 @@ TLI_DEFINE_STRING_INTERNAL("logl")
+ TLI_DEFINE_ENUM_INTERNAL(lstat)
+ TLI_DEFINE_STRING_INTERNAL("lstat")
+ /// int lstat64(const char *path, struct stat64 *buf);
++#ifdef lstat64
++#undef lstat64
++#endif
+ TLI_DEFINE_ENUM_INTERNAL(lstat64)
+ TLI_DEFINE_STRING_INTERNAL("lstat64")
+ /// void *malloc(size_t size);
+@@ -1127,6 +1142,9 @@ TLI_DEFINE_STRING_INTERNAL("sscanf")
+ TLI_DEFINE_ENUM_INTERNAL(stat)
+ TLI_DEFINE_STRING_INTERNAL("stat")
+ /// int stat64(const char *path, struct stat64 *buf);
++#ifdef stat64
++#undef stat64
++#endif
+ TLI_DEFINE_ENUM_INTERNAL(stat64)
+ TLI_DEFINE_STRING_INTERNAL("stat64")
+ /// int statvfs(const char *path, struct statvfs *buf);
+@@ -1256,6 +1274,9 @@ TLI_DEFINE_STRING_INTERNAL("times")
+ TLI_DEFINE_ENUM_INTERNAL(tmpfile)
+ TLI_DEFINE_STRING_INTERNAL("tmpfile")
+ /// FILE *tmpfile64(void)
++#ifdef tmpfile64
++#undef tmpfile64
++#endif
+ TLI_DEFINE_ENUM_INTERNAL(tmpfile64)
+ TLI_DEFINE_STRING_INTERNAL("tmpfile64")
+ /// int toascii(int c);
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0002-clang-Driver-tools.cpp-Add-lssp_nonshared-on-musl.patch b/external/meta-clang/recipes-devtools/clang/clang/0002-clang-Driver-tools.cpp-Add-lssp_nonshared-on-musl.patch
new file mode 100644
index 00000000..f73b1c0f
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0002-clang-Driver-tools.cpp-Add-lssp_nonshared-on-musl.patch
@@ -0,0 +1,34 @@
+From fc628b03a5ac41a446fd2dfea0ecbe03331e54d8 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Thu, 19 May 2016 21:11:06 -0700
+Subject: [PATCH 2/8] clang: Driver/tools.cpp: Add -lssp_nonshared on musl
+
+musl driver will need to add ssp_nonshared for stack_check_local
+on the linker cmdline when using stack protector commands on
+compiler cmdline
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ lib/Driver/ToolChains/Gnu.cpp | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp
+index 3755673250..766c650b3c 100644
+--- a/lib/Driver/ToolChains/Gnu.cpp
++++ b/lib/Driver/ToolChains/Gnu.cpp
+@@ -503,6 +503,12 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
+ if (IsIAMCU)
+ CmdArgs.push_back("-lgloss");
+
++ if (ToolChain.getTriple().isMusl() &&
++ (Args.hasArg(options::OPT_fstack_protector) ||
++ Args.hasArg(options::OPT_fstack_protector_strong) ||
++ Args.hasArg(options::OPT_fstack_protector_all))) {
++ CmdArgs.push_back("-lssp_nonshared");
++ }
+ if (Args.hasArg(options::OPT_static))
+ CmdArgs.push_back("--end-group");
+ else
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0002-compiler-rt-Simplify-cross-compilation.-Don-t-use-na.patch b/external/meta-clang/recipes-devtools/clang/clang/0002-compiler-rt-Simplify-cross-compilation.-Don-t-use-na.patch
new file mode 100644
index 00000000..2ff903b1
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0002-compiler-rt-Simplify-cross-compilation.-Don-t-use-na.patch
@@ -0,0 +1,46 @@
+From 5ee148af76169aa327bfa0bfc1c2618a68e873fb Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Thu, 19 May 2016 23:11:45 -0700
+Subject: [PATCH 2/4] compiler-rt: Simplify cross-compilation. Don't use
+ native-compiled llvm-config.
+
+ Note: AddLLVM.cmake does not expose the LLVM source directory.
+ So if you want to run the test suite, you need to either:
+
+ 1) set LLVM_MAIN_SRC_DIR explicitly (to find lit.py)
+ 2) change AddLLVM.cmake to point to an installed 'lit'.
+ 3) add_subdirectory(compiler-rt/test) from clang instead of compiler-rt.
+
+https://us.codeaurora.org/patches/quic/llvm/50683/compiler-rt-cross-compilation.patch
+
+Signed-off-by: Greg Fitzgerald <gregf@codeaurora.org>
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ CMakeLists.txt | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 86ca2b3ef..07d894c8a 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -63,7 +63,16 @@ set(COMPILER_RT_BAREMETAL_BUILD OFF CACHE BOOLEAN
+ "Build for a bare-metal target.")
+
+ if (COMPILER_RT_STANDALONE_BUILD)
+- load_llvm_config()
++ find_package(LLVM REQUIRED)
++ list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
++
++ # Variables that AddLLVM.cmake depends on (included by AddCompilerRT)
++ set(LLVM_TOOLS_BINARY_DIR "${LLVM_INSTALL_PREFIX}/bin")
++ set(LLVM_LIBRARY_DIR "${LLVM_INSTALL_PREFIX}/lib")
++
++ set(LLVM_LIBRARY_OUTPUT_INTDIR
++ ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
++
+ if (TARGET intrinsics_gen)
+ # Loading the llvm config causes this target to be imported so place it
+ # under the appropriate folder in an IDE.
+--
+2.20.1
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0002-lldb-Add-lxml2-to-linker-cmdline-of-xml-is-found.patch b/external/meta-clang/recipes-devtools/clang/clang/0002-lldb-Add-lxml2-to-linker-cmdline-of-xml-is-found.patch
new file mode 100644
index 00000000..c331e7a7
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0002-lldb-Add-lxml2-to-linker-cmdline-of-xml-is-found.patch
@@ -0,0 +1,40 @@
+From fa140ec90e72da40d49301e674c84854fdac804b Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Mon, 22 May 2017 17:36:16 -0700
+Subject: [PATCH 2/2] lldb: Add -lxml2 to linker cmdline of xml is found
+
+When cross compiling for systems where static libs
+for libxml are not available cmake's detection mechanism
+resort to linking with libxml.so but doesnt use -lxml2
+liblldbHost.a however requires libxml on linker
+cmdline _after_ itself so its use of symbols from libxml2
+can be resolved. Here check for libxml2 being detected and
+add it if its found.
+
+Fixes
+
+| ../../../../lib/liblldbHost.a(XML.cpp.o): In function `lldb_private::XMLDocument::Clear()':
+| /usr/src/debug/lldb/5.0.0+gitAUTOINC+69edad7913_08d6b47db9_cf6c5b3386-r0/git/tools/lldb/source/Host/common/XML.cpp:29: undefined reference to `xmlFreeDoc'
+| /usr/src/debug/lldb/5.0.0+gitAUTOINC+69edad7913_08d6b47db9_cf6c5b3386-r0/git/tools/lldb/source/Host/common/XML.cpp:29: undefined reference to `xmlFreeDoc'
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ source/Host/CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/source/Host/CMakeLists.txt b/source/Host/CMakeLists.txt
+index 5a92447ed..22ce6eee4 100644
+--- a/source/Host/CMakeLists.txt
++++ b/source/Host/CMakeLists.txt
+@@ -149,7 +149,7 @@ if (APPLE)
+ list(APPEND EXTRA_LIBS xml2)
+ else ()
+ if (LIBXML2_FOUND)
+- list(APPEND EXTRA_LIBS ${LIBXML2_LIBRARIES})
++ list(APPEND EXTRA_LIBS xml2)
+ endif()
+ endif ()
+ if (HAVE_LIBDL)
+--
+2.20.1
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0002-llvm-allow-env-override-of-exe-path.patch b/external/meta-clang/recipes-devtools/clang/clang/0002-llvm-allow-env-override-of-exe-path.patch
new file mode 100644
index 00000000..fa49e677
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0002-llvm-allow-env-override-of-exe-path.patch
@@ -0,0 +1,37 @@
+From c65c0af4a5721e3c0dfcc56c15ef3310a54e0008 Mon Sep 17 00:00:00 2001
+From: Martin Kelly <mkelly@xevo.com>
+Date: Fri, 19 May 2017 00:22:57 -0700
+Subject: [PATCH 2/3] llvm: allow env override of exe path
+
+When using a native llvm-config from inside a sysroot, we need llvm-config to
+return the libraries, include directories, etc. from inside the sysroot rather
+than from the native sysroot. Thus provide an env override for calling
+llvm-config from a target sysroot.
+
+Signed-off-by: Martin Kelly <mkelly@xevo.com>
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ tools/llvm-config/llvm-config.cpp | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp
+index 892adc3b9dd..38f190ecbd1 100644
+--- a/tools/llvm-config/llvm-config.cpp
++++ b/tools/llvm-config/llvm-config.cpp
+@@ -226,6 +226,13 @@ Typical components:\n\
+
+ /// Compute the path to the main executable.
+ std::string GetExecutablePath(const char *Argv0) {
++ // Hack for Yocto: we need to override the root path when we are using
++ // llvm-config from within a target sysroot.
++ const char *Sysroot = std::getenv("YOCTO_ALTERNATE_EXE_PATH");
++ if (Sysroot != nullptr) {
++ return Sysroot;
++ }
++
+ // This just needs to be some symbol in the binary; C++ doesn't
+ // allow taking the address of ::main however.
+ void *P = (void *)(intptr_t)GetExecutablePath;
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0003-clang-musl-ppc-does-not-support-128-bit-long-double.patch b/external/meta-clang/recipes-devtools/clang/clang/0003-clang-musl-ppc-does-not-support-128-bit-long-double.patch
new file mode 100644
index 00000000..868fc3b6
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0003-clang-musl-ppc-does-not-support-128-bit-long-double.patch
@@ -0,0 +1,27 @@
+From 48fa180df65f7ee63a85dd69fd2c1382609c5e95 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 10 May 2016 02:00:11 -0700
+Subject: [PATCH 3/8] clang: musl/ppc does not support 128-bit long double
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ lib/Basic/Targets/PPC.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/lib/Basic/Targets/PPC.h b/lib/Basic/Targets/PPC.h
+index 439c73a0e3..8da698ee21 100644
+--- a/lib/Basic/Targets/PPC.h
++++ b/lib/Basic/Targets/PPC.h
+@@ -328,7 +328,8 @@ public:
+ break;
+ }
+
+- if (getTriple().getOS() == llvm::Triple::FreeBSD) {
++ if (getTriple().getOS() == llvm::Triple::FreeBSD
++ || getTriple().isMusl()) {
+ LongDoubleWidth = LongDoubleAlign = 64;
+ LongDoubleFormat = &llvm::APFloat::IEEEdouble();
+ }
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0003-compiler-rt-Disable-tsan-on-OE-glibc.patch b/external/meta-clang/recipes-devtools/clang/clang/0003-compiler-rt-Disable-tsan-on-OE-glibc.patch
new file mode 100644
index 00000000..8f45c2b8
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0003-compiler-rt-Disable-tsan-on-OE-glibc.patch
@@ -0,0 +1,42 @@
+From c7d41a6e4dd61733530d2f44c377b91e13004b71 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Mon, 18 Jul 2016 08:05:02 +0000
+Subject: [PATCH 3/4] compiler-rt: Disable tsan on OE/glibc
+
+It does not build see
+http://lists.llvm.org/pipermail/llvm-dev/2016-July/102235.html
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ cmake/config-ix.cmake | 2 +-
+ test/sanitizer_common/CMakeLists.txt | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake
+index f3935ffd6..2c651b756 100644
+--- a/cmake/config-ix.cmake
++++ b/cmake/config-ix.cmake
+@@ -564,7 +564,7 @@ else()
+ endif()
+
+ if (COMPILER_RT_HAS_SANITIZER_COMMON AND TSAN_SUPPORTED_ARCH AND
+- OS_NAME MATCHES "Darwin|Linux|FreeBSD|Android|NetBSD")
++ OS_NAME MATCHES "Darwin|FreeBSD|Android|NetBSD")
+ set(COMPILER_RT_HAS_TSAN TRUE)
+ else()
+ set(COMPILER_RT_HAS_TSAN FALSE)
+diff --git a/test/sanitizer_common/CMakeLists.txt b/test/sanitizer_common/CMakeLists.txt
+index 4e2c80390..990315f11 100644
+--- a/test/sanitizer_common/CMakeLists.txt
++++ b/test/sanitizer_common/CMakeLists.txt
+@@ -8,7 +8,6 @@ if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux|FreeBSD|NetBSD|SunOS")
+ list(APPEND SUPPORTED_TOOLS asan)
+ endif()
+ if(CMAKE_SYSTEM_NAME MATCHES "NetBSD" OR (CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT ANDROID))
+- list(APPEND SUPPORTED_TOOLS tsan)
+ list(APPEND SUPPORTED_TOOLS msan)
+ list(APPEND SUPPORTED_TOOLS ubsan)
+ endif()
+--
+2.20.1
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0003-llvm-Disable-calls-to-_finite-and-other-glibc-only-f.patch b/external/meta-clang/recipes-devtools/clang/clang/0003-llvm-Disable-calls-to-_finite-and-other-glibc-only-f.patch
new file mode 100644
index 00000000..9f665e36
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0003-llvm-Disable-calls-to-_finite-and-other-glibc-only-f.patch
@@ -0,0 +1,65 @@
+From cb1b6f021d2ce82d7d0084758b7efaa3917640f5 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sun, 26 Aug 2018 22:43:19 -0700
+Subject: [PATCH 3/3] llvm: Disable calls to *_finite and other glibc-only
+ functions on Musl.
+
+glibc's finite lib calls are generated when possible.
+However, they are not supported on Musl/linux. This change also
+disables other functions not available on Musl.
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ lib/Analysis/TargetLibraryInfo.cpp | 29 +++++++++++++++--------------
+ 1 file changed, 15 insertions(+), 14 deletions(-)
+
+diff --git a/lib/Analysis/TargetLibraryInfo.cpp b/lib/Analysis/TargetLibraryInfo.cpp
+index 102135fbf31..5bc4d2b47f5 100644
+--- a/lib/Analysis/TargetLibraryInfo.cpp
++++ b/lib/Analysis/TargetLibraryInfo.cpp
+@@ -415,27 +415,28 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
+
+ // The following functions are available on Linux,
+ // but Android uses bionic instead of glibc.
+- if (!T.isOSLinux() || T.isAndroid()) {
++ if (!T.isOSLinux() || T.isAndroid() || T.isMusl()) {
+ TLI.setUnavailable(LibFunc_dunder_strdup);
+ TLI.setUnavailable(LibFunc_dunder_strtok_r);
+ TLI.setUnavailable(LibFunc_dunder_isoc99_scanf);
+ TLI.setUnavailable(LibFunc_dunder_isoc99_sscanf);
+ TLI.setUnavailable(LibFunc_under_IO_getc);
+ TLI.setUnavailable(LibFunc_under_IO_putc);
+- // But, Android has memalign.
+- if (!T.isAndroid())
++ // But, Android/Musl has memalign.
++ if (!T.isAndroid() || !T.isMusl() )
+ TLI.setUnavailable(LibFunc_memalign);
+- TLI.setUnavailable(LibFunc_fopen64);
+- TLI.setUnavailable(LibFunc_fseeko64);
+- TLI.setUnavailable(LibFunc_fstat64);
+- TLI.setUnavailable(LibFunc_fstatvfs64);
+- TLI.setUnavailable(LibFunc_ftello64);
+- TLI.setUnavailable(LibFunc_lstat64);
+- TLI.setUnavailable(LibFunc_open64);
+- TLI.setUnavailable(LibFunc_stat64);
+- TLI.setUnavailable(LibFunc_statvfs64);
+- TLI.setUnavailable(LibFunc_tmpfile64);
+-
++ if (!T.isMusl()) {
++ TLI.setUnavailable(LibFunc_fopen64);
++ TLI.setUnavailable(LibFunc_fseeko64);
++ TLI.setUnavailable(LibFunc_fstat64);
++ TLI.setUnavailable(LibFunc_fstatvfs64);
++ TLI.setUnavailable(LibFunc_ftello64);
++ TLI.setUnavailable(LibFunc_lstat64);
++ TLI.setUnavailable(LibFunc_open64);
++ TLI.setUnavailable(LibFunc_stat64);
++ TLI.setUnavailable(LibFunc_statvfs64);
++ TLI.setUnavailable(LibFunc_tmpfile64);
++ }
+ // Relaxed math functions are included in math-finite.h on Linux (GLIBC).
+ TLI.setUnavailable(LibFunc_acos_finite);
+ TLI.setUnavailable(LibFunc_acosf_finite);
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0004-clang-Prepend-trailing-to-sysroot.patch b/external/meta-clang/recipes-devtools/clang/clang/0004-clang-Prepend-trailing-to-sysroot.patch
new file mode 100644
index 00000000..03c6babf
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0004-clang-Prepend-trailing-to-sysroot.patch
@@ -0,0 +1,41 @@
+From 4764d8f8b613631de2e3c9a3614427d07c599017 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Thu, 16 Mar 2017 09:02:13 -0700
+Subject: [PATCH 4/8] clang: Prepend trailing '/' to sysroot
+
+This is needed to handle a case where clang
+isntall and target sysroot are perilously same
+
+e.g.
+
+sysroot = /mnt/clang/recipe-sysroot
+clang install = /mnt/clang/recipe-sysroot-native
+
+in this case it will mistakenly assume that
+clang is installed under the same sysroot dir
+and it will try to add relative ../lib paths
+to linker steps which would then be wrong
+since they will become relative to clang
+installation and not sysroot
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ lib/Driver/ToolChains/Linux.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/Driver/ToolChains/Linux.cpp b/lib/Driver/ToolChains/Linux.cpp
+index e662b6b262..5bca972cc2 100644
+--- a/lib/Driver/ToolChains/Linux.cpp
++++ b/lib/Driver/ToolChains/Linux.cpp
+@@ -211,7 +211,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
+ GCCInstallation.init(Triple, Args);
+ Multilibs = GCCInstallation.getMultilibs();
+ llvm::Triple::ArchType Arch = Triple.getArch();
+- std::string SysRoot = computeSysRoot();
++ std::string SysRoot = computeSysRoot() + "/";
+
+ // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
+ // least) put various tools in a triple-prefixed directory off of the parent
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0004-compiler-rt-cmake-mips-Do-not-specify-target-with-OE.patch b/external/meta-clang/recipes-devtools/clang/clang/0004-compiler-rt-cmake-mips-Do-not-specify-target-with-OE.patch
new file mode 100644
index 00000000..0356e2a6
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0004-compiler-rt-cmake-mips-Do-not-specify-target-with-OE.patch
@@ -0,0 +1,44 @@
+From b29deaeb42a8f56bb5dd72b5a8c3e2c755a6bb9e Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 11 Feb 2017 17:54:33 +0000
+Subject: [PATCH 4/4] compiler-rt: cmake/mips: Do not specify --target with OE
+
+OE already specifies cross compiler correctly, adding this additional
+--target confuses the clang driver and it resorts to invoke host assembler
+when using -no-integrated-as
+
+Fixes errors e.g.
+| Assembler messages:
+|
+| Fatal error: invalid -march= option: `mips32r2'
+|
+| clang-4.0: error: assembler command failed with exit code 1
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ cmake/base-config-ix.cmake | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/cmake/base-config-ix.cmake b/cmake/base-config-ix.cmake
+index 91fe2494b..789b80628 100644
+--- a/cmake/base-config-ix.cmake
++++ b/cmake/base-config-ix.cmake
+@@ -191,11 +191,11 @@ macro(test_targets)
+ # clang's default CPU's. In the 64-bit case, we must also specify the ABI
+ # since the default ABI differs between gcc and clang.
+ # FIXME: Ideally, we would build the N32 library too.
+- test_target_arch(mipsel "" "-mips32r2" "--target=mipsel-linux-gnu")
+- test_target_arch(mips64el "" "-mips64r2" "--target=mips64el-linux-gnu" "-mabi=64")
++ test_target_arch(mipsel "" "-mips32r2")
++ test_target_arch(mips64el "" "-mips64r2" "-mabi=64")
+ elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "mips")
+- test_target_arch(mips "" "-mips32r2" "--target=mips-linux-gnu")
+- test_target_arch(mips64 "" "-mips64r2" "--target=mips64-linux-gnu" "-mabi=64")
++ test_target_arch(mips "" "-mips32r2")
++ test_target_arch(mips64 "" "-mips64r2" "-mabi=64")
+ elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "arm")
+ if(WIN32)
+ test_target_arch(arm "" "" "")
+--
+2.20.1
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0005-clang-Look-inside-the-target-sysroot-for-compiler-ru.patch b/external/meta-clang/recipes-devtools/clang/clang/0005-clang-Look-inside-the-target-sysroot-for-compiler-ru.patch
new file mode 100644
index 00000000..8425f8d8
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0005-clang-Look-inside-the-target-sysroot-for-compiler-ru.patch
@@ -0,0 +1,44 @@
+From e02d9f3e1c724a4161709952a3ef59f81432fc06 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Thu, 16 Mar 2017 19:06:26 -0700
+Subject: [PATCH 5/8] clang: Look inside the target sysroot for compiler
+ runtime
+
+In OE compiler-rt and libc++ are built and staged into target
+sysroot and not into resourcedir which is relative to clang
+driver installation where the libraries are not instlled
+
+Specific to cross compiling the way yocto/OE works
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ lib/Driver/ToolChain.cpp | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp
+index cf3db34688..dae3178380 100644
+--- a/lib/Driver/ToolChain.cpp
++++ b/lib/Driver/ToolChain.cpp
+@@ -13,6 +13,7 @@
+ #include "ToolChains/Clang.h"
+ #include "clang/Basic/ObjCRuntime.h"
+ #include "clang/Basic/Sanitizers.h"
++#include "clang/Basic/Version.h"
+ #include "clang/Basic/VirtualFileSystem.h"
+ #include "clang/Config/config.h"
+ #include "clang/Driver/Action.h"
+@@ -343,7 +344,10 @@ StringRef ToolChain::getOSLibName() const {
+ }
+
+ std::string ToolChain::getCompilerRTPath() const {
+- SmallString<128> Path(getDriver().ResourceDir);
++ SmallString<128> Path(getDriver().SysRoot);
++ StringRef ClangLibdirSuffix(CLANG_LIBDIR_SUFFIX);
++ llvm::sys::path::append(Path, "/usr/", Twine("lib") + ClangLibdirSuffix, "clang",
++ CLANG_VERSION_STRING);
+ if (Triple.isOSUnknown()) {
+ llvm::sys::path::append(Path, "lib");
+ } else {
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0006-clang-Define-releative-gcc-installation-dir.patch b/external/meta-clang/recipes-devtools/clang/clang/0006-clang-Define-releative-gcc-installation-dir.patch
new file mode 100644
index 00000000..b611dd50
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0006-clang-Define-releative-gcc-installation-dir.patch
@@ -0,0 +1,32 @@
+From e6232d22df73b80ced3784fd85166ebe24e6c31b Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sun, 21 May 2017 15:38:25 -0700
+Subject: [PATCH 6/8] clang: Define / releative gcc installation dir
+
+This is required for OE gcc installation to work.
+Without this its not able to find the paths for libgcc
+and other standard headers and libraries from gcc
+installation in OE
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ lib/Driver/ToolChains/Gnu.cpp | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp
+index 766c650b3c..777526e063 100644
+--- a/lib/Driver/ToolChains/Gnu.cpp
++++ b/lib/Driver/ToolChains/Gnu.cpp
+@@ -2190,6 +2190,9 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
+ {"gcc-cross/" + CandidateTriple.str(), "../..",
+ TargetTriple.getOS() != llvm::Triple::Solaris},
+
++ // OE cross-compilers path structures
++ {"/" + CandidateTriple.str(), "..", true},
++
+ // The Freescale PPC SDK has the gcc libraries in
+ // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. Only do
+ // this on Freescale triples, though, since some systems put a *lot* of
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0007-clang-Fix-ldso-for-musl-on-x86-and-x32-architectures.patch b/external/meta-clang/recipes-devtools/clang/clang/0007-clang-Fix-ldso-for-musl-on-x86-and-x32-architectures.patch
new file mode 100644
index 00000000..b456a59d
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0007-clang-Fix-ldso-for-musl-on-x86-and-x32-architectures.patch
@@ -0,0 +1,44 @@
+From 5840f5a6756f8f67dbba1b47015e75c8c3264b2b Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 16 Aug 2017 15:16:15 -0700
+Subject: [PATCH 7/8] clang: Fix ldso for musl on x86 and x32 architectures
+
+x32 linker is called ld-musl-x32.so.1 and x86 linker
+is called ld-musl-i386.so.1, Currently, linker for
+x86 is returned as ld-musl-i586.so.1, when default
+arch is i586, which is not the right thing
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ lib/Driver/ToolChains/Linux.cpp | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/lib/Driver/ToolChains/Linux.cpp b/lib/Driver/ToolChains/Linux.cpp
+index 5bca972cc2..2ca285679c 100644
+--- a/lib/Driver/ToolChains/Linux.cpp
++++ b/lib/Driver/ToolChains/Linux.cpp
+@@ -492,6 +492,7 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+ if (Triple.isMusl()) {
+ std::string ArchName;
+ bool IsArm = false;
++ bool isX32 = false;
+
+ switch (Arch) {
+ case llvm::Triple::arm:
+@@ -504,6 +505,13 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
+ ArchName = "armeb";
+ IsArm = true;
+ break;
++ case llvm::Triple::x86:
++ ArchName = "i386";
++ break;
++ case llvm::Triple::x86_64:
++ isX32 = Triple.getEnvironment() == llvm::Triple::GNUX32;
++ ArchName = isX32 ? "x32" : Triple.getArchName().str();
++ break;
+ default:
+ ArchName = Triple.getArchName().str();
+ }
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0008-clang-scan-view-needs-python-2.x.patch b/external/meta-clang/recipes-devtools/clang/clang/0008-clang-scan-view-needs-python-2.x.patch
new file mode 100644
index 00000000..c55b309e
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0008-clang-scan-view-needs-python-2.x.patch
@@ -0,0 +1,27 @@
+From 846e59787ec12b6cd817640151d1f23d3b78d6b5 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 15 May 2018 10:28:43 -0700
+Subject: [PATCH 8/8] clang: scan-view needs python 2.x
+
+Some distributions e.g. archlinux have switched to pointing
+python to python3, therefore its better to be specific about
+python version needed.
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ tools/scan-view/bin/scan-view | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/scan-view/bin/scan-view b/tools/scan-view/bin/scan-view
+index 1b6e8ba90d..7c5867d1be 100755
+--- a/tools/scan-view/bin/scan-view
++++ b/tools/scan-view/bin/scan-view
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python2
+
+ """The clang static analyzer results viewer.
+ """
+--
+2.18.0
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0009-clang-Enable-SSP-and-PIE-by-default.patch b/external/meta-clang/recipes-devtools/clang/clang/0009-clang-Enable-SSP-and-PIE-by-default.patch
new file mode 100644
index 00000000..d7b61bb1
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0009-clang-Enable-SSP-and-PIE-by-default.patch
@@ -0,0 +1,284 @@
+From 594abc54ce652e0490860c96038513cfb576bb92 Mon Sep 17 00:00:00 2001
+From: Evangelos Foutras <evangelos@foutrelis.com>
+Date: Thu, 20 Sep 2018 06:20:28 +0300
+Subject: [PATCH 9/9] clang: Enable SSP and PIE by default
+
+This is a minimal set of changes needed to make clang use SSP and PIE by
+default on Arch Linux. Tests that were easy to adjust have been changed
+accordingly; only test/Driver/linux-ld.c has been marked as "expected
+failure" due to the number of changes it would require (mostly replacing
+crtbegin.o with crtbeginS.o).
+
+Doing so is needed in order to align clang with the new default GCC
+behavior in Arch which generates PIE executables by default and also
+defaults to -fstack-protector-strong. It is not meant to be a long term
+solution, but a simple temporary fix.
+
+Hopefully these changes will be obsoleted by the introduction upstream
+of a compile-time option (https://bugs.llvm.org/show_bug.cgi?id=13410)
+---
+ lib/Driver/ToolChains/Linux.cpp | 14 ++++++++++++--
+ lib/Driver/ToolChains/Linux.h | 1 +
+ test/Driver/clang-offload-bundler.c | 2 +-
+ test/Driver/cross-linux.c | 16 ++++++++--------
+ test/Driver/env.c | 2 +-
+ test/Driver/fsanitize.c | 14 +++++++-------
+ test/Driver/gcc-toolchain.cpp | 2 +-
+ test/Driver/hexagon-toolchain-elf.c | 2 +-
+ test/Driver/linux-as.c | 4 ++--
+ test/Driver/linux-ld.c | 2 ++
+ test/Driver/riscv32-toolchain.c | 4 ++--
+ test/Driver/stack-protector.c | 4 ++--
+ 12 files changed, 40 insertions(+), 27 deletions(-)
+
+diff --git a/lib/Driver/ToolChains/Linux.cpp b/lib/Driver/ToolChains/Linux.cpp
+index 2ca285679c..22f1a1da6d 100644
+--- a/lib/Driver/ToolChains/Linux.cpp
++++ b/lib/Driver/ToolChains/Linux.cpp
+@@ -911,8 +911,18 @@ void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs,
+ }
+
+ bool Linux::isPIEDefault() const {
+- return (getTriple().isAndroid() && !getTriple().isAndroidVersionLT(16)) ||
+- getTriple().isMusl() || getSanitizerArgs().requiresPIE();
++ const bool IsMips = getTriple().isMIPS();
++ const bool IsAndroid = getTriple().isAndroid();
++
++ if (IsMips || IsAndroid)
++ return (getTriple().isAndroid() && !getTriple().isAndroidVersionLT(16)) ||
++ getTriple().isMusl() || getSanitizerArgs().requiresPIE();
++
++ return true;
++}
++
++unsigned Linux::GetDefaultStackProtectorLevel(bool KernelOrKext) const {
++ return 2;
+ }
+
+ SanitizerMask Linux::getSupportedSanitizers() const {
+diff --git a/lib/Driver/ToolChains/Linux.h b/lib/Driver/ToolChains/Linux.h
+index 22dbbecf6b..ba0d5587e0 100644
+--- a/lib/Driver/ToolChains/Linux.h
++++ b/lib/Driver/ToolChains/Linux.h
+@@ -38,6 +38,7 @@ public:
+ void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs,
+ llvm::opt::ArgStringList &CC1Args) const override;
+ bool isPIEDefault() const override;
++ unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override;
+ SanitizerMask getSupportedSanitizers() const override;
+ void addProfileRTLibs(const llvm::opt::ArgList &Args,
+ llvm::opt::ArgStringList &CmdArgs) const override;
+diff --git a/test/Driver/clang-offload-bundler.c b/test/Driver/clang-offload-bundler.c
+index adf13f59d4..fd2f6e5d8c 100644
+--- a/test/Driver/clang-offload-bundler.c
++++ b/test/Driver/clang-offload-bundler.c
+@@ -115,7 +115,7 @@
+ // CK-TEXTI: // __CLANG_OFFLOAD_BUNDLE____END__ openmp-x86_64-pc-linux-gnu
+
+ // CK-TEXTLL: ; __CLANG_OFFLOAD_BUNDLE____START__ host-powerpc64le-ibm-linux-gnu
+-// CK-TEXTLL: @A = global i32 0
++// CK-TEXTLL: @A = {{(dso_local )?}}global i32 0
+ // CK-TEXTLL: define {{.*}}@test_func()
+ // CK-TEXTLL: ; __CLANG_OFFLOAD_BUNDLE____END__ host-powerpc64le-ibm-linux-gnu
+ // CK-TEXTLL: ; __CLANG_OFFLOAD_BUNDLE____START__ openmp-powerpc64le-ibm-linux-gnu
+diff --git a/test/Driver/cross-linux.c b/test/Driver/cross-linux.c
+index a5ea832e77..1949c05a60 100644
+--- a/test/Driver/cross-linux.c
++++ b/test/Driver/cross-linux.c
+@@ -42,8 +42,8 @@
+ // CHECK-MULTI32-I386: "{{.*}}/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0/../../../../i386-unknown-linux/bin{{/|\\\\}}ld"
+ // CHECK-MULTI32-I386: "--sysroot=[[sysroot:.*/Inputs/basic_linux_tree]]"
+ // CHECK-MULTI32-I386: "-m" "elf_i386"
+-// CHECK-MULTI32-I386: "crti.o" "[[gcc_install:.*/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0]]{{/|\\\\}}crtbegin.o"
+-// CHECK-MULTI32-I386: "-L[[gcc_install]]"
++// CHECK-MULTI32-I386: "crti.o" "crtbeginS.o"
++// CHECK-MULTI32-I386: "-L[[gcc_install:.*/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0]]"
+ // CHECK-MULTI32-I386: "-L[[gcc_install]]/../../../../i386-unknown-linux/lib/../lib32"
+ // CHECK-MULTI32-I386: "-L[[gcc_install]]/../../../../i386-unknown-linux/lib"
+ // CHECK-MULTI32-I386: "-L[[sysroot]]/lib"
+@@ -59,8 +59,8 @@
+ // CHECK-MULTI32-X86-64: "{{.*}}/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0/../../../../i386-unknown-linux/bin{{/|\\\\}}ld"
+ // CHECK-MULTI32-X86-64: "--sysroot=[[sysroot:.*/Inputs/basic_linux_tree]]"
+ // CHECK-MULTI32-X86-64: "-m" "elf_x86_64"
+-// CHECK-MULTI32-X86-64: "crti.o" "[[gcc_install:.*/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0]]/64{{/|\\\\}}crtbegin.o"
+-// CHECK-MULTI32-X86-64: "-L[[gcc_install]]/64"
++// CHECK-MULTI32-X86-64: "crti.o" "crtbeginS.o"
++// CHECK-MULTI32-X86-64: "-L[[gcc_install:.*/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0]]/64"
+ // CHECK-MULTI32-X86-64: "-L[[gcc_install]]/../../../../i386-unknown-linux/lib/../lib64"
+ // CHECK-MULTI32-X86-64: "-L[[gcc_install]]"
+ // CHECK-MULTI32-X86-64: "-L[[gcc_install]]/../../../../i386-unknown-linux/lib"
+@@ -77,8 +77,8 @@
+ // CHECK-MULTI64-I386: "{{.*}}/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0/../../../../x86_64-unknown-linux/bin{{/|\\\\}}ld"
+ // CHECK-MULTI64-I386: "--sysroot=[[sysroot:.*/Inputs/basic_linux_tree]]"
+ // CHECK-MULTI64-I386: "-m" "elf_i386"
+-// CHECK-MULTI64-I386: "crti.o" "[[gcc_install:.*/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0]]/32{{/|\\\\}}crtbegin.o"
+-// CHECK-MULTI64-I386: "-L[[gcc_install]]/32"
++// CHECK-MULTI64-I386: "crti.o" "crtbeginS.o"
++// CHECK-MULTI64-I386: "-L[[gcc_install:.*/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0]]/32"
+ // CHECK-MULTI64-I386: "-L[[gcc_install]]/../../../../x86_64-unknown-linux/lib/../lib32"
+ // CHECK-MULTI64-I386: "-L[[gcc_install]]"
+ // CHECK-MULTI64-I386: "-L[[gcc_install]]/../../../../x86_64-unknown-linux/lib"
+@@ -95,8 +95,8 @@
+ // CHECK-MULTI64-X86-64: "{{.*}}/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0/../../../../x86_64-unknown-linux/bin{{/|\\\\}}ld"
+ // CHECK-MULTI64-X86-64: "--sysroot=[[sysroot:.*/Inputs/basic_linux_tree]]"
+ // CHECK-MULTI64-X86-64: "-m" "elf_x86_64"
+-// CHECK-MULTI64-X86-64: "crti.o" "[[gcc_install:.*/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0]]{{/|\\\\}}crtbegin.o"
+-// CHECK-MULTI64-X86-64: "-L[[gcc_install]]"
++// CHECK-MULTI64-X86-64: "crti.o" "crtbeginS.o"
++// CHECK-MULTI64-X86-64: "-L[[gcc_install:.*/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0]]"
+ // CHECK-MULTI64-X86-64: "-L[[gcc_install]]/../../../../x86_64-unknown-linux/lib/../lib64"
+ // CHECK-MULTI64-X86-64: "-L[[gcc_install]]/../../../../x86_64-unknown-linux/lib"
+ // CHECK-MULTI64-X86-64: "-L[[sysroot]]/lib"
+diff --git a/test/Driver/env.c b/test/Driver/env.c
+index 0371bc91c4..ea89f52512 100644
+--- a/test/Driver/env.c
++++ b/test/Driver/env.c
+@@ -20,7 +20,7 @@
+ //
+ // CHECK-LD-32-NOT: warning:
+ // CHECK-LD-32: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
+-// CHECK-LD-32: "{{.*}}/usr/lib/gcc/i386-unknown-linux/4.6.0{{/|\\\\}}crtbegin.o"
++// CHECK-LD-32: "crtbeginS.o"
+ // CHECK-LD-32: "-L[[SYSROOT]]/usr/lib/gcc/i386-unknown-linux/4.6.0"
+ // CHECK-LD-32: "-L[[SYSROOT]]/usr/lib/gcc/i386-unknown-linux/4.6.0/../../../../i386-unknown-linux/lib"
+ // CHECK-LD-32: "-L[[SYSROOT]]/usr/lib/gcc/i386-unknown-linux/4.6.0/../../.."
+diff --git a/test/Driver/fsanitize.c b/test/Driver/fsanitize.c
+index 304e759302..c157f9fc48 100644
+--- a/test/Driver/fsanitize.c
++++ b/test/Driver/fsanitize.c
+@@ -238,15 +238,15 @@
+ // RUN: %clang -target x86_64-linux-gnu -fsanitize=vptr -fno-sanitize=vptr -fsanitize=undefined,address %s -### 2>&1
+ // OK
+
+-// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-PIE
+-// RUN: %clang -target x86_64-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-PIE
++// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
++// RUN: %clang -target x86_64-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
+ // RUN: %clang -target x86_64-unknown-freebsd -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
+ // RUN: %clang -target aarch64-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
+ // RUN: %clang -target arm-linux-androideabi -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIC-NO-PIE
+ // RUN: %clang -target arm-linux-androideabi24 -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
+ // RUN: %clang -target aarch64-linux-android -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
+-// RUN: %clang -target x86_64-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-PIE
+-// RUN: %clang -target i386-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-PIE
++// RUN: %clang -target x86_64-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
++// RUN: %clang -target i386-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
+
+ // CHECK-NO-PIE-NOT: "-pie"
+ // CHECK-NO-PIE: "-mrelocation-model" "static"
+@@ -585,12 +585,12 @@
+ // RUN: %clang -fno-sanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NOSP
+ // NOSP-NOT: "-fsanitize=safe-stack"
+
+-// RUN: %clang -target x86_64-linux-gnu -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP
++// RUN: %clang -target x86_64-linux-gnu -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP
+ // RUN: %clang -target x86_64-linux-gnu -fsanitize=address,safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP-ASAN
+ // RUN: %clang -target x86_64-linux-gnu -fstack-protector -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP
+ // RUN: %clang -target x86_64-linux-gnu -fsanitize=safe-stack -fstack-protector-all -### %s 2>&1 | FileCheck %s -check-prefix=SP
+-// RUN: %clang -target arm-linux-androideabi -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP
+-// RUN: %clang -target aarch64-linux-android -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP
++// RUN: %clang -target arm-linux-androideabi -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP
++// RUN: %clang -target aarch64-linux-android -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP
+ // RUN: %clang -target i386-contiki-unknown -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP
+ // NO-SP-NOT: stack-protector
+ // NO-SP: "-fsanitize=safe-stack"
+diff --git a/test/Driver/gcc-toolchain.cpp b/test/Driver/gcc-toolchain.cpp
+index ca96757a2b..ae1c25e989 100644
+--- a/test/Driver/gcc-toolchain.cpp
++++ b/test/Driver/gcc-toolchain.cpp
+@@ -24,6 +24,6 @@
+ // the same precise formatting of the path as the '-internal-system' flags
+ // above, so we just blanket wildcard match the 'crtbegin.o'.
+ // CHECK: "{{[^"]*}}ld{{(.exe)?}}"
+-// CHECK: "{{[^"]*}}/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5{{/|\\\\}}crtbegin.o"
++// CHECK: "crtbeginS.o"
+ // CHECK: "-L[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5"
+ // CHECK: "-L[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../.."
+diff --git a/test/Driver/hexagon-toolchain-elf.c b/test/Driver/hexagon-toolchain-elf.c
+index 8f4c320ce4..a4d9ae502b 100644
+--- a/test/Driver/hexagon-toolchain-elf.c
++++ b/test/Driver/hexagon-toolchain-elf.c
+@@ -457,7 +457,7 @@
+ // RUN: %s 2>&1 \
+ // RUN: | FileCheck -check-prefix=CHECK042 %s
+ // CHECK042: "-cc1"
+-// CHECK042: "-mrelocation-model" "static"
++// CHECK042: "-mrelocation-model" "pic"
+ // CHECK042: "-mllvm" "-hexagon-small-data-threshold=8"
+ // CHECK042-NEXT: llvm-mc
+ // CHECK042: "-gpsize=8"
+diff --git a/test/Driver/linux-as.c b/test/Driver/linux-as.c
+index 68cf403d97..92b556db73 100644
+--- a/test/Driver/linux-as.c
++++ b/test/Driver/linux-as.c
+@@ -133,7 +133,7 @@
+ // CHECK-PPC-NO-MCPU-NOT: as{{.*}} "-mcpu=invalid-cpu"
+ //
+ // RUN: %clang -target sparc64-linux -mcpu=invalid-cpu -### \
+-// RUN: -no-integrated-as -c %s 2>&1 \
++// RUN: -no-integrated-as -fno-pic -c %s 2>&1 \
+ // RUN: | FileCheck -check-prefix=CHECK-SPARCV9 %s
+ // CHECK-SPARCV9: as
+ // CHECK-SPARCV9: -64
+@@ -142,7 +142,7 @@
+ // CHECK-SPARCV9: -o
+ //
+ // RUN: %clang -target sparc64-linux -mcpu=invalid-cpu -### \
+-// RUN: -no-integrated-as -fpic -c %s 2>&1 \
++// RUN: -no-integrated-as -c %s 2>&1 \
+ // RUN: | FileCheck -check-prefix=CHECK-SPARCV9PIC %s
+ // CHECK-SPARCV9PIC: as
+ // CHECK-SPARCV9PIC: -64
+diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c
+index 787013931a..cba173b354 100644
+--- a/test/Driver/linux-ld.c
++++ b/test/Driver/linux-ld.c
+@@ -1,3 +1,5 @@
++// XFAIL: linux
++
+ // General tests that ld invocations on Linux targets sane. Note that we use
+ // sysroot to make these tests independent of the host system.
+ //
+diff --git a/test/Driver/riscv32-toolchain.c b/test/Driver/riscv32-toolchain.c
+index 1e0c750a3f..563493a33b 100644
+--- a/test/Driver/riscv32-toolchain.c
++++ b/test/Driver/riscv32-toolchain.c
+@@ -44,7 +44,7 @@
+ // C-RV32-LINUX-MULTI-ILP32: "--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot"
+ // C-RV32-LINUX-MULTI-ILP32: "-m" "elf32lriscv"
+ // C-RV32-LINUX-MULTI-ILP32: "-dynamic-linker" "/lib/ld-linux-riscv32-ilp32.so.1"
+-// C-RV32-LINUX-MULTI-ILP32: "{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib32/ilp32{{/|\\\\}}crtbegin.o"
++// C-RV32-LINUX-MULTI-ILP32: "crtbeginS.o"
+ // C-RV32-LINUX-MULTI-ILP32: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib32/ilp32"
+ // C-RV32-LINUX-MULTI-ILP32: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/lib32/ilp32"
+ // C-RV32-LINUX-MULTI-ILP32: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/usr/lib32/ilp32"
+@@ -59,7 +59,7 @@
+ // C-RV32-LINUX-MULTI-ILP32D: "--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot"
+ // C-RV32-LINUX-MULTI-ILP32D: "-m" "elf32lriscv"
+ // C-RV32-LINUX-MULTI-ILP32D: "-dynamic-linker" "/lib/ld-linux-riscv32-ilp32d.so.1"
+-// C-RV32-LINUX-MULTI-ILP32D: "{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib32/ilp32d{{/|\\\\}}crtbegin.o"
++// C-RV32-LINUX-MULTI-ILP32D: "crtbeginS.o"
+ // C-RV32-LINUX-MULTI-ILP32D: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib32/ilp32d"
+ // C-RV32-LINUX-MULTI-ILP32D: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/lib32/ilp32d"
+ // C-RV32-LINUX-MULTI-ILP32D: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/usr/lib32/ilp32d"
+diff --git a/test/Driver/stack-protector.c b/test/Driver/stack-protector.c
+index a3e40b50ee..dfffe0d6cf 100644
+--- a/test/Driver/stack-protector.c
++++ b/test/Driver/stack-protector.c
+@@ -3,11 +3,11 @@
+ // NOSSP-NOT: "-stack-protector-buffer-size"
+
+ // RUN: %clang -target i386-unknown-linux -fstack-protector -### %s 2>&1 | FileCheck %s -check-prefix=SSP
+-// SSP: "-stack-protector" "1"
++// SSP: "-stack-protector" "2"
+ // SSP-NOT: "-stack-protector-buffer-size"
+
+ // RUN: %clang -target i386-unknown-linux -fstack-protector --param ssp-buffer-size=16 -### %s 2>&1 | FileCheck %s -check-prefix=SSP-BUF
+-// SSP-BUF: "-stack-protector" "1"
++// SSP-BUF: "-stack-protector" "2"
+ // SSP-BUF: "-stack-protector-buffer-size" "16"
+
+ // RUN: %clang -target i386-pc-openbsd -### %s 2>&1 | FileCheck %s -check-prefix=OPENBSD
+--
+2.19.2
+
diff --git a/external/meta-clang/recipes-devtools/clang/clang/0020-clang-link-libgcc_eh-when-using-compiler-rt.patch b/external/meta-clang/recipes-devtools/clang/clang/0020-clang-link-libgcc_eh-when-using-compiler-rt.patch
new file mode 100644
index 00000000..d9eac9a6
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang/0020-clang-link-libgcc_eh-when-using-compiler-rt.patch
@@ -0,0 +1,24 @@
+From 98e1067695596c4c4a91f4c58e2a6f6aaeb56a0c Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Sat, 21 Sep 2019 08:57:36 -0700
+Subject: [PATCH] clang: link libgcc_eh when using compiler-rt
+
+we still need libgcc unwinder
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ clang/lib/Driver/ToolChains/CommonArgs.cpp | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
+index 1e093b25b90..4b81ae2b50a 100644
+--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
++++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
+@@ -1162,6 +1162,7 @@ void tools::AddRunTimeLibs(const ToolChain &TC, const Driver &D,
+ switch (RLT) {
+ case ToolChain::RLT_CompilerRT:
+ CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
++ CmdArgs.push_back("-lgcc_eh");
+ break;
+ case ToolChain::RLT_Libgcc:
+ // Make sure libgcc is not used under MSVC environment by default
diff --git a/external/meta-clang/recipes-devtools/clang/clang_git.bb b/external/meta-clang/recipes-devtools/clang/clang_git.bb
new file mode 100644
index 00000000..b3b82724
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/clang_git.bb
@@ -0,0 +1,150 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "LLVM based C/C++ compiler"
+HOMEPAGE = "http://clang.llvm.org/"
+SECTION = "devel"
+
+require clang.inc
+require common-source.inc
+
+INHIBIT_DEFAULT_DEPS = "1"
+
+inherit cmake cmake-native
+
+OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "BOTH"
+
+def get_clang_arch(bb, d, arch_var):
+ import re
+ a = d.getVar(arch_var, True)
+ if re.match('(i.86|athlon|x86.64)$', a): return 'X86'
+ elif re.match('arm$', a): return 'ARM'
+ elif re.match('armeb$', a): return 'ARM'
+ elif re.match('aarch64$', a): return 'AArch64'
+ elif re.match('aarch64_be$', a): return 'AArch64'
+ elif re.match('mips(isa|)(32|64|)(r6|)(el|)$', a): return 'Mips'
+ elif re.match('p(pc|owerpc)(|64)', a): return 'PowerPC'
+ elif re.match('riscv(32|64)$', a): return 'RISCV'
+ else:
+ bb.error("cannot map '%s' to a supported llvm architecture" % a)
+ return ""
+
+def get_clang_host_arch(bb, d):
+ return get_clang_arch(bb, d, 'HOST_ARCH')
+
+def get_clang_target_arch(bb, d):
+ return get_clang_arch(bb, d, 'TARGET_ARCH')
+
+PACKAGECONFIG ??= "compiler-rt libcplusplus shared-libs"
+PACKAGECONFIG_class-native = ""
+PACKAGECONFIG_class-nativesdk = "compiler-rt libcplusplus"
+
+PACKAGECONFIG[compiler-rt] = "-DCLANG_DEFAULT_RTLIB=compiler-rt,,compiler-rt"
+PACKAGECONFIG[libcplusplus] = "-DCLANG_DEFAULT_CXX_STDLIB=libc++,,libcxx"
+PACKAGECONFIG[shared-libs] = "-DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON,,,"
+
+#
+# Default to build all OE-Core supported target arches (user overridable).
+#
+LLVM_TARGETS_TO_BUILD ?= "AArch64;ARM;BPF;Mips;PowerPC;X86"
+LLVM_TARGETS_TO_BUILD_append = ";${@get_clang_host_arch(bb, d)};${@get_clang_target_arch(bb, d)}"
+
+LLVM_TARGETS_TO_BUILD_TARGET ?= ""
+LLVM_TARGETS_TO_BUILD_TARGET_append ?= ";${@get_clang_target_arch(bb, d)}"
+EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \
+ -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \
+ -DLLVM_ENABLE_PIC=ON \
+ -DLLVM_BINDINGS_LIST='' \
+ -DLLVM_ENABLE_FFI=ON \
+ -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \
+ -DLLVM_OPTIMIZED_TABLEGEN=ON \
+ -DLLVM_ENABLE_RTTI=ON \
+ -DLLVM_ENABLE_EH=ON \
+ -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON \
+ -DCMAKE_SYSTEM_NAME=Linux \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DBUILD_SHARED_LIBS=OFF \
+ -DLLVM_ENABLE_PROJECTS='clang;lld' \
+ -G Ninja ${S}/llvm \
+"
+
+EXTRA_OECMAKE_append_class-native = "\
+ -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS_TO_BUILD}' \
+"
+EXTRA_OECMAKE_append_class-nativesdk = "\
+ -DCMAKE_CROSSCOMPILING:BOOL=ON \
+ -DCROSS_TOOLCHAIN_FLAGS_NATIVE='-DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain-native.cmake' \
+ -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS_TO_BUILD}' \
+ -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
+ -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \
+"
+EXTRA_OECMAKE_append_class-target = "\
+ -DCMAKE_CROSSCOMPILING:BOOL=ON \
+ -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
+ -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \
+ -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS_TO_BUILD_TARGET}' \
+ -DLLVM_TARGET_ARCH=${@get_clang_target_arch(bb, d)} \
+ -DLLVM_DEFAULT_TARGET_TRIPLE=${TARGET_SYS} \
+"
+
+DEPENDS = "zlib libffi libxml2 ninja-native"
+DEPENDS_append_class-nativesdk = " clang-native virtual/${TARGET_PREFIX}binutils-crosssdk virtual/${TARGET_PREFIX}gcc-crosssdk virtual/${TARGET_PREFIX}g++-crosssdk"
+DEPENDS_append_class-target = " clang-cross-${TARGET_ARCH} ${@bb.utils.contains('TOOLCHAIN', 'gcc', 'virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}g++', '', d)}"
+
+RRECOMMENDS_${PN} = "binutils"
+
+do_compile() {
+ ninja ${PARALLEL_MAKE}
+}
+
+do_install() {
+ DESTDIR=${D} ninja ${PARALLEL_MAKE} install
+}
+
+do_install_append_class-native () {
+ install -Dm 0755 ${B}/bin/clang-tblgen ${D}${bindir}/clang-tblgen
+ for f in `find ${D}${bindir} -executable -type f -not -type l`; do
+ test -n "`file $f|grep -i ELF`" && ${STRIP} $f
+ echo "stripped $f"
+ done
+}
+
+do_install_append_class-nativesdk () {
+ install -Dm 0755 ${B}/bin/clang-tblgen ${D}${bindir}/clang-tblgen
+ for f in `find ${D}${bindir} -executable -type f -not -type l`; do
+ test -n "`file $f|grep -i ELF`" && ${STRIP} $f
+ done
+ rm -rf ${D}${datadir}/llvm/cmake
+ rm -rf ${D}${datadir}/llvm
+}
+
+PACKAGE_DEBUG_SPLIT_STYLE_class-nativesdk = "debug-without-src"
+
+PACKAGES =+ "${PN}-libllvm"
+
+BBCLASSEXTEND = "native nativesdk"
+
+FILES_${PN} += "\
+ ${libdir}/BugpointPasses.so \
+ ${libdir}/LLVMHello.so \
+ ${libdir}/TestPlugin.so \
+ ${datadir}/scan-* \
+ ${datadir}/opt-viewer/ \
+"
+
+FILES_${PN}-libllvm += "\
+ ${libdir}/libLLVM-${MAJOR_VER}.${MINOR_VER}.so \
+ ${libdir}/libLLVM-${MAJOR_VER}.so \
+ ${libdir}/libLLVM-${MAJOR_VER}.${MINOR_VER}svn.so \
+"
+
+FILES_${PN}-dev += "\
+ ${datadir}/llvm/cmake \
+ ${libdir}/cmake \
+"
+
+INSANE_SKIP_${PN} += "already-stripped"
+INSANE_SKIP_${PN}-dev += "dev-elf"
+
+#Avoid SSTATE_SCAN_COMMAND running sed over llvm-config.
+SSTATE_SCAN_FILES_remove = "*-config"
diff --git a/external/meta-clang/recipes-devtools/clang/common-source.inc b/external/meta-clang/recipes-devtools/clang/common-source.inc
new file mode 100644
index 00000000..e7fb06fb
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/common-source.inc
@@ -0,0 +1,11 @@
+do_fetch() {
+ :
+}
+do_fetch[noexec] = "1"
+deltask do_unpack
+deltask do_patch
+
+SRC_URI = ""
+
+do_configure[depends] += "llvm-project-source-${PV}:do_patch"
+do_populate_lic[depends] += "llvm-project-source-${PV}:do_unpack"
diff --git a/external/meta-clang/recipes-devtools/clang/common.inc b/external/meta-clang/recipes-devtools/clang/common.inc
new file mode 100644
index 00000000..52f30c6d
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/common.inc
@@ -0,0 +1,71 @@
+FILESEXTRAPATHS =. "${FILE_DIRNAME}/clang:"
+
+LIC_FILES_CHKSUM = "file://llvm/LICENSE.TXT;md5=${LLVMMD5SUM} \
+ file://clang/LICENSE.TXT;md5=${CLANGMD5SUM} \
+"
+LICENSE = "NCSA"
+
+BASEURI ??= "${LLVM_GIT}/llvm-project;protocol=${LLVM_GIT_PROTOCOL};branch=${BRANCH}"
+SRC_URI = "\
+ ${BASEURI} \
+ ${LLVMPATCHES} \
+ ${CLANGPATCHES} \
+ ${COMPILERRTPATCHES} \
+ ${LIBCXXABIPATCHES} \
+ ${LIBCXXPATCHES} \
+ ${LLDBPATCHES} \
+"
+
+# llvm patches
+#
+LLVMPATCHES = "\
+ file://0001-llvm-TargetLibraryInfo-Undefine-libc-functions-if-th.patch;patchdir=llvm \
+ file://0002-llvm-allow-env-override-of-exe-path.patch;patchdir=llvm \
+ file://0003-llvm-Disable-calls-to-_finite-and-other-glibc-only-f.patch;patchdir=llvm \
+"
+# Fallback to no-PIE if not set
+GCCPIE ??= ""
+
+# Clang patches
+CLANGPATCHES = "\
+ file://0001-clang-driver-Use-lib-for-ldso-on-OE.patch;patchdir=clang \
+ file://0002-clang-Driver-tools.cpp-Add-lssp_nonshared-on-musl.patch;patchdir=clang \
+ file://0003-clang-musl-ppc-does-not-support-128-bit-long-double.patch;patchdir=clang \
+ file://0004-clang-Prepend-trailing-to-sysroot.patch;patchdir=clang \
+ file://0005-clang-Look-inside-the-target-sysroot-for-compiler-ru.patch;patchdir=clang \
+ file://0006-clang-Define-releative-gcc-installation-dir.patch;patchdir=clang \
+ file://0007-clang-Fix-ldso-for-musl-on-x86-and-x32-architectures.patch;patchdir=clang \
+ file://0008-clang-scan-view-needs-python-2.x.patch;patchdir=clang \
+ file://0020-clang-link-libgcc_eh-when-using-compiler-rt.patch \
+"
+CLANGPATCHES += "${@'file://0009-clang-Enable-SSP-and-PIE-by-default.patch;patchdir=clang' if '${GCCPIE}' else ''}"
+
+# compiler-rt patches
+COMPILERRTPATCHES = "\
+ file://0001-compiler-rt-support-a-new-embedded-linux-target.patch;patchdir=compiler-rt \
+ file://0002-compiler-rt-Simplify-cross-compilation.-Don-t-use-na.patch;patchdir=compiler-rt \
+ file://0003-compiler-rt-Disable-tsan-on-OE-glibc.patch;patchdir=compiler-rt \
+ file://0004-compiler-rt-cmake-mips-Do-not-specify-target-with-OE.patch;patchdir=compiler-rt \
+"
+# libcxxabi patches
+LIBCXXABIPATCHES ="\
+ file://0001-libcxxabi-Find-libunwind-headers-when-LIBCXXABI_LIBU.patch;patchdir=libcxxabi \
+"
+
+# libc++ patches
+LIBCXXPATCHES = "\
+"
+
+# lldb patches
+LLDBPATCHES = "\
+ file://0001-lldb-Include-limits.h-for-PATH_MAX-definition.patch;patchdir=lldb \
+ file://0002-lldb-Add-lxml2-to-linker-cmdline-of-xml-is-found.patch;patchdir=lldb \
+"
+
+S = "${TMPDIR}/work-shared/llvm-project-source-${PV}-${PR}/git"
+B = "${WORKDIR}/llvm-project-source-${PV}/build.${HOST_SYS}.${TARGET_SYS}"
+
+# We need to ensure that for the shared work directory, the do_patch signatures match
+# The real WORKDIR location isn't a dependency for the shared workdir.
+src_patches[vardepsexclude] = "WORKDIR"
+should_apply[vardepsexclude] += "PN"
diff --git a/external/meta-clang/recipes-devtools/clang/compiler-rt_git.bb b/external/meta-clang/recipes-devtools/clang/compiler-rt_git.bb
new file mode 100644
index 00000000..05de71f4
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/compiler-rt_git.bb
@@ -0,0 +1,96 @@
+# Copyright (C) 2015 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "LLVM based C/C++ compiler Runtime"
+HOMEPAGE = "http://compiler-rt.llvm.org/"
+LICENSE = "MIT | NCSA"
+SECTION = "base"
+
+require clang.inc
+require common-source.inc
+
+inherit cmake pkgconfig pythonnative
+
+
+LIC_FILES_CHKSUM = "file://compiler-rt/LICENSE.TXT;md5=92bfbe70fc44c6e5efc6403a31180ed7; \
+"
+
+BASEDEPENDS_remove_toolchain-clang_class-target = "compiler-rt"
+BASEDEPENDS_remove_toolchain-clang_class-target = "libcxx"
+TARGET_CXXFLAGS_remove_toolchain-clang = " -stdlib=libc++ "
+TUNE_CCARGS_remove = "-no-integrated-as --rtlib=compiler-rt"
+DEPENDS += "ninja-native"
+DEPENDS_append_class-nativesdk = " clang-native"
+
+THUMB_TUNE_CCARGS = ""
+#TUNE_CCARGS += "-nostdlib"
+
+HF = "${@ bb.utils.contains('TUNE_CCARGS_MFLOAT', 'hard', 'hf', '', d)}"
+HF[vardepvalue] = "${HF}"
+EXTRA_OECMAKE += "-DCOMPILER_RT_STANDALONE_BUILD=ON \
+ -DCOMPILER_RT_DEFAULT_TARGET_TRIPLE=${HOST_ARCH}${HF}${HOST_VENDOR}-${HOST_OS} \
+ -DCOMPILER_RT_BUILD_XRAY=OFF \
+ -G Ninja ${S}/compiler-rt \
+"
+EXTRA_OECMAKE_append_class-target = "\
+ -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \
+ -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \
+ -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \
+"
+EXTRA_OECMAKE_append_class-nativesdk = "\
+ -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
+ -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \
+"
+
+EXTRA_OECMAKE_append_libc-musl = " -DCOMPILER_RT_BUILD_SANITIZERS=OFF -DCOMPILER_RT_BUILD_XRAY=OFF "
+EXTRA_OECMAKE_append_mipsarch = "-DCOMPILER_RT_BUILD_SANITIZERS=OFF -DCOMPILER_RT_BUILD_XRAY=OFF "
+
+do_compile() {
+ ninja ${PARALLEL_MAKE}
+}
+
+do_install() {
+ DESTDIR=${D} ninja ${PARALLEL_MAKE} install
+}
+
+
+do_install_append () {
+ if [ -d ${D}${libdir}/linux ]; then
+ for f in `find ${D}${libdir}/linux -maxdepth 1 -type f`
+ do
+ install -D -m 0644 $f ${D}${libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/`basename $f`
+ rm $f
+ done
+ rmdir ${D}${libdir}/linux
+ fi
+ for f in `find ${D}${exec_prefix} -maxdepth 1 -name '*.txt' -type f`
+ do
+ install -D -m 0644 $f ${D}${libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/`basename $f`
+ rm $f
+ done
+}
+
+FILES_SOLIBSDEV = ""
+FILES_${PN} += "${libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/lib*${SOLIBSDEV} \
+ ${libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/*.txt"
+FILES_${PN}-staticdev += "${libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/*.a"
+FILES_${PN}-dev += "${datadir} ${libdir}/clang/${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}/lib/linux/*.syms"
+INSANE_SKIP_${PN} = "dev-so"
+
+#PROVIDES_append_class-target = "\
+# virtual/${TARGET_PREFIX}compilerlibs \
+# libgcc \
+# libgcc-initial \
+# libgcc-dev \
+# libgcc-initial-dev \
+# "
+#
+
+RDEPENDS_${PN}-dev += "${PN}-staticdev"
+
+BBCLASSEXTEND = "native nativesdk"
+
+ALLOW_EMPTY_${PN} = "1"
+ALLOW_EMPTY_${PN}-dev = "1"
+
+TOOLCHAIN = "clang"
diff --git a/external/meta-clang/recipes-devtools/clang/libcxx_git.bb b/external/meta-clang/recipes-devtools/clang/libcxx_git.bb
new file mode 100644
index 00000000..b879df13
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/libcxx_git.bb
@@ -0,0 +1,81 @@
+# Copyright (C) 2015 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "libc++ is a new implementation of the C++ standard library, targeting C++11"
+HOMEPAGE = "http://libcxx.llvm.org/"
+LICENSE = "MIT | NCSA"
+SECTION = "base"
+
+require clang.inc
+require common-source.inc
+
+inherit cmake pythonnative
+
+DEPENDS += "ninja-native"
+BASEDEPENDS_remove_toolchain-clang = "libcxx"
+TARGET_CXXFLAGS_remove_toolchain-clang = " -stdlib=libc++ "
+
+PACKAGECONFIG ??= "unwind"
+PACKAGECONFIG_powerpc = ""
+PACKAGECONFIG_mipsarch = ""
+PACKAGECONFIG_riscv64 = ""
+PACKAGECONFIG[unwind] = "-DLIBCXXABI_USE_LLVM_UNWINDER=ON -DLIBCXXABI_LIBUNWIND_INCLUDES=${S}/projects/libunwind/include, -DLIBCXXABI_USE_LLVM_UNWINDER=OFF,"
+
+PROVIDES += "${@bb.utils.contains('PACKAGECONFIG', 'unwind', 'libunwind', '', d)}"
+
+LIC_FILES_CHKSUM = "file://libcxx/LICENSE.TXT;md5=7b3a0e1b99822669d630011defe9bfd9; \
+ file://libcxxabi/LICENSE.TXT;md5=3600117b7c18121ab04c53e4615dc36e \
+ file://libunwind/LICENSE.TXT;md5=7ea986af7f70eaea5a297dd2744c79a5 \
+"
+THUMB_TUNE_CCARGS = ""
+#TUNE_CCARGS += "-nostdlib"
+
+EXTRA_OECMAKE += "\
+ -DLIBCXX_CXX_ABI=libcxxabi \
+ -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON \
+ -DCXX_SUPPORTS_CXX11=ON \
+ -DLIBCXXABI_LIBCXX_INCLUDES=${S}/libcxx/include \
+ -DLIBCXX_CXX_ABI_INCLUDE_PATHS=${S}/libcxxabi/include \
+ -DLIBCXX_CXX_ABI_LIBRARY_PATH=${B}/lib \
+ -DLLVM_ENABLE_PROJECTS='libcxx;libcxxabi;libunwind' \
+ -G Ninja \
+ ${S}/llvm \
+"
+
+EXTRA_OECMAKE_append_class-target = "\
+ -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \
+ -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \
+ -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \
+"
+
+EXTRA_OECMAKE_append_class-native = " -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=OFF"
+EXTRA_OECMAKE_append_class-nativesdk = " -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=OFF"
+EXTRA_OECMAKE_append_libc-musl = " -DLIBCXX_HAS_MUSL_LIBC=ON "
+
+do_compile() {
+
+ ninja -v ${PARALLEL_MAKE} cxxabi
+ ninja -v ${PARALLEL_MAKE} cxx
+ if ${@bb.utils.contains('PACKAGECONFIG', 'unwind', 'true', 'false', d)}; then
+ ninja -v ${PARALLEL_MAKE} unwind
+ fi
+
+}
+
+do_install() {
+ DESTDIR=${D} ninja ${PARALLEL_MAKE} install-cxxabi
+ DESTDIR=${D} ninja ${PARALLEL_MAKE} install-cxx
+ if ${@bb.utils.contains('PACKAGECONFIG', 'unwind', 'true', 'false', d)}; then
+ DESTDIR=${D} ninja ${PARALLEL_MAKE} install-unwind
+ fi
+}
+
+PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'unwind', 'libunwind', '', d)}"
+FILES_libunwind += "${libdir}/libunwind.so.*"
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN}-dev += "${PN}-staticdev"
+
+BBCLASSEXTEND = "native nativesdk"
+TOOLCHAIN = "clang"
diff --git a/external/meta-clang/recipes-devtools/clang/lldb_git.bb b/external/meta-clang/recipes-devtools/clang/lldb_git.bb
new file mode 100644
index 00000000..7c4be42f
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/lldb_git.bb
@@ -0,0 +1,57 @@
+# Copyright (C) 2017 Kai Ruhnau <kai.ruhnau@target-sg.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "Next generation, high-performance debugger"
+HOMEPAGE = "http://lldb.llvm.org/"
+LICENSE = "MIT | NCSA"
+SECTION = "devel"
+
+DEPENDS += "clang-native zlib libxml2 ninja-native"
+
+require clang.inc
+require common-source.inc
+
+inherit cmake pkgconfig
+
+LIC_FILES_CHKSUM = "file://llvm/LICENSE.TXT;md5=${LLVMMD5SUM}; \
+ file://clang/LICENSE.TXT;md5=${CLANGMD5SUM}; \
+ file://lldb/LICENSE.TXT;md5=${LLDBMD5SUM}; \
+"
+
+OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "BOTH"
+
+EXTRA_OECMAKE="\
+ -DCMAKE_CROSSCOMPILING=1 \
+ -DLLVM_ENABLE_CXX11=ON \
+ -DLLVM_BUILD_LLVM_DYLIB=ON \
+ -DBUILD_SHARED_LIBS=OFF \
+ -DLLVM_BUILD_LLVM_DYLIB=ON \
+ -DLLVM_ENABLE_PIC=ON \
+ -DLLDB_DISABLE_LIBEDIT=1 \
+ -DLLDB_DISABLE_CURSES=1 \
+ -DLLDB_DISABLE_PYTHON=1 \
+ -DLLVM_ENABLE_TERMINFO=0 \
+ -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
+ -DCLANG_TABLEGEN=${STAGING_BINDIR_NATIVE}/clang-tblgen \
+ -DLLVM_HOST_TRIPLE=${TARGET_SYS} \
+ -DLLDB_TEST_USE_CUSTOM_C_COMPILER=ON \
+ -DLLDB_TEST_USE_CUSTOM_CXX_COMPILER=ON \
+ -DLLDB_TEST_C_COMPILER='${CC}' \
+ -DLLDB_TEST_CXX_COMPILER='${CXX}' \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DLLVM_ENABLE_PROJECTS='clang;lldb' \
+ -G Ninja ${S}/llvm \
+"
+
+EXTRA_OEMAKE = "VERBOSE=1"
+
+do_compile() {
+ ninja ${PARALLEL_MAKE} lldb
+}
+
+do_install() {
+ DESTDIR=${D} ninja ${PARALLEL_MAKE} tools/lldb/install
+}
+
+INSANE_SKIP_${PN}-dbg = "libdir"
+INSANE_SKIP_${PN} = "libdir"
diff --git a/external/meta-clang/recipes-devtools/clang/llvm-common.bb b/external/meta-clang/recipes-devtools/clang/llvm-common.bb
new file mode 100644
index 00000000..f17f01c2
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/llvm-common.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Helper script for OE's llvm support"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+SRC_URI = "file://llvm-config"
+
+S = "${WORKDIR}"
+
+ALLOW_EMPTY_${PN} = "1"
+SYSROOT_PREPROCESS_FUNCS_append_class-target = " llvm_common_sysroot_preprocess"
+
+llvm_common_sysroot_preprocess() {
+ install -d ${SYSROOT_DESTDIR}${bindir_crossscripts}/
+ install -m 0755 ${WORKDIR}/llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/
+}
+
+do_install_class-native() {
+ install -d ${D}${bindir}
+ install -m 0755 ${WORKDIR}/llvm-config ${D}${bindir}
+}
+
+BBCLASSEXTEND = "native"
diff --git a/external/meta-clang/recipes-devtools/clang/llvm-common/llvm-config b/external/meta-clang/recipes-devtools/clang/llvm-common/llvm-config
new file mode 100644
index 00000000..4462896a
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/llvm-common/llvm-config
@@ -0,0 +1,39 @@
+#!/bin/bash
+#
+# Wrapper script for llvm-config. Supplies the right environment variables
+# for the target and delegates to the native llvm-config for anything else. This
+# is needed because arguments like --ldflags, --cxxflags, etc. are set by the
+# native compile rather than the target compile.
+#
+
+SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
+NEXT_LLVM_CONFIG="$(which -a llvm-config | sed -n 2p)"
+export YOCTO_ALTERNATE_EXE_PATH="$(readlink -f "$SCRIPT_DIR/../llvm-config")"
+
+if [[ $# == 0 ]]; then
+ exec "$NEXT_LLVM_CONFIG"
+fi
+
+if [[ $1 == "--libs" ]]; then
+ exec "$NEXT_LLVM_CONFIG" $@
+fi
+
+for arg in "$@"; do
+ case "$arg" in
+ --cppflags)
+ echo $TARGET_CPPFLAGS
+ ;;
+ --cflags)
+ echo $TARGET_CFLAGS
+ ;;
+ --cxxflags)
+ echo $TARGET_CXXFLAGS
+ ;;
+ --ldflags)
+ echo $TARGET_LDFLAGS
+ ;;
+ *)
+ echo "$("$NEXT_LLVM_CONFIG" "$arg")"
+ ;;
+ esac
+done
diff --git a/external/meta-clang/recipes-devtools/clang/llvm-project-source.bb b/external/meta-clang/recipes-devtools/clang/llvm-project-source.bb
new file mode 100644
index 00000000..78664c57
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/llvm-project-source.bb
@@ -0,0 +1,10 @@
+# Copyright (C) 2018 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+SUMMARY = "This is the canonical git mirror of the LLVM subversion repository."
+HOMEPAGE = "https://github.com/llvm/llvm-project"
+
+require llvm-project-source.inc
+require clang.inc
+
+EXCLUDE_FROM_WORLD = "1"
diff --git a/external/meta-clang/recipes-devtools/clang/llvm-project-source.inc b/external/meta-clang/recipes-devtools/clang/llvm-project-source.inc
new file mode 100644
index 00000000..f6c552d8
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/llvm-project-source.inc
@@ -0,0 +1,20 @@
+deltask do_configure
+deltask do_compile
+deltask do_install
+deltask do_populate_sysroot
+deltask do_populate_lic
+RM_WORK_EXCLUDE += "${PN}"
+
+inherit nopackages
+
+PN = "llvm-project-source-${PV}"
+
+WORKDIR = "${TMPDIR}/work-shared/llvm-project-source-${PV}-${PR}"
+SSTATE_SWSPEC = "sstate:llvm-project-source::${PV}:${PR}::${SSTATE_VERSION}:"
+
+STAMP = "${STAMPS_DIR}/work-shared/llvm-project-source-${PV}-${PR}"
+STAMPCLEAN = "${STAMPS_DIR}/work-shared/llvm-project-source-${PV}-*"
+
+INHIBIT_DEFAULT_DEPS = "1"
+DEPENDS = ""
+PACKAGES = ""
diff --git a/external/meta-clang/recipes-devtools/clang/nativesdk-clang-glue.bb b/external/meta-clang/recipes-devtools/clang/nativesdk-clang-glue.bb
new file mode 100644
index 00000000..6824bcb5
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/nativesdk-clang-glue.bb
@@ -0,0 +1,27 @@
+# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "SDK Cross compiler wrappers for LLVM based C/C++ compiler"
+HOMEPAGE = "http://clang.llvm.org/"
+LICENSE = "NCSA"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/NCSA;md5=1b5fdec70ee13ad8a91667f16c1959d7"
+SECTION = "devel"
+
+require clang.inc
+require common-source.inc
+inherit nativesdk
+DEPENDS += "nativesdk-clang"
+
+do_install() {
+ install -d ${D}${prefix_nativesdk}
+ cd ${D}${prefix_nativesdk}
+ ln -s ..${libdir} .
+ ln -s ..${includedir} .
+}
+
+sysroot_stage_all () {
+ sysroot_stage_dir ${D} ${SYSROOT_DESTDIR}
+}
+
+FILES_${PN} += "${prefix_nativesdk}"
+FILES_${PN}-dbg = ""
diff --git a/external/meta-clang/recipes-devtools/clang/openmp_git.bb b/external/meta-clang/recipes-devtools/clang/openmp_git.bb
new file mode 100644
index 00000000..30bc3071
--- /dev/null
+++ b/external/meta-clang/recipes-devtools/clang/openmp_git.bb
@@ -0,0 +1,40 @@
+# Copyright (C) 2017 Khem Raj <raj.khem@gmail.com>
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "LLVM based C/C++ compiler Runtime"
+HOMEPAGE = "http://openmp.llvm.org/"
+LICENSE = "MIT | NCSA"
+SECTION = "base"
+
+require clang.inc
+require common-source.inc
+
+DEPENDS += "ninja-native"
+
+RPROVIDES_${PN} += "libgomp"
+RPROVIDES_${PN}-dev += "libgomp-dev"
+
+TOOLCHAIN = "clang"
+
+LIC_FILES_CHKSUM = "file://openmp/LICENSE.txt;md5=5dcbca021bcb2fbc22186bc7a8a159e6"
+
+BASEDEPENDS_remove_toolchain-clang_class-target = "compiler-rt"
+BASEDEPENDS_remove_toolchain-clang_class-target = "libcxx"
+
+inherit cmake pkgconfig perlnative
+
+EXTRA_OECMAKE = "-G Ninja ${S}/openmp"
+
+THUMB_TUNE_CCARGS = ""
+
+do_compile() {
+ ninja ${PARALLEL_MAKE}
+}
+
+do_install() {
+ DESTDIR=${D} ninja ${PARALLEL_MAKE} install
+}
+
+FILES_SOLIBSDEV = ""
+FILES_${PN} += "${libdir}/lib*${SOLIBSDEV}"
+INSANE_SKIP_${PN} = "dev-so"
diff --git a/external/meta-clang/recipes-extended/mdadm/mdadm_%.bbappend b/external/meta-clang/recipes-extended/mdadm/mdadm_%.bbappend
new file mode 100644
index 00000000..903836e5
--- /dev/null
+++ b/external/meta-clang/recipes-extended/mdadm/mdadm_%.bbappend
@@ -0,0 +1,6 @@
+# Fix errors like
+# | super-intel.c:1673:23: error: taking address of packed member 'size_high' of class or structure 'imsm_dev' may result in an unaligned pointer value [-Werror,-Waddress-of-packed-member]
+# | &dev->size_low, &dev->size_high);
+# | ^~~~~~~~~~~~~~
+
+CFLAGS_append_toolchain-clang = " -Wno-error=address-of-packed-member"
diff --git a/external/meta-clang/recipes-gnome/gcr/gcr_%.bbappend b/external/meta-clang/recipes-gnome/gcr/gcr_%.bbappend
new file mode 100644
index 00000000..4432748d
--- /dev/null
+++ b/external/meta-clang/recipes-gnome/gcr/gcr_%.bbappend
@@ -0,0 +1,4 @@
+# qemu crashes when built with hardening flags
+#
+GI_DATA_ENABLED_toolchain-clang = "False"
+
diff --git a/external/meta-clang/recipes-graphics/mesa/mesa_%.bbappend b/external/meta-clang/recipes-graphics/mesa/mesa_%.bbappend
new file mode 100644
index 00000000..fadc95ce
--- /dev/null
+++ b/external/meta-clang/recipes-graphics/mesa/mesa_%.bbappend
@@ -0,0 +1,5 @@
+LDFLAGS_append_toolchain-clang = " -latomic -lm"
+DEPENDS_append_toolchain-clang = " libatomic-ops"
+
+EXTRA_OECONF_append_toolchain-clang_x86 = " --disable-asm"
+EXTRA_OECONF_append_toolchain-clang_x86-64 = " --disable-asm"
diff --git a/external/meta-clang/recipes-kernel/perf/perf.bbappend b/external/meta-clang/recipes-kernel/perf/perf.bbappend
new file mode 100644
index 00000000..df46b9cd
--- /dev/null
+++ b/external/meta-clang/recipes-kernel/perf/perf.bbappend
@@ -0,0 +1 @@
+DEPENDS_append_toolchain-clang_class-target = " clang-cross-${TARGET_ARCH}"
diff --git a/external/meta-clang/recipes-multimedia/libvorbis/libvorbis_%.bbappend b/external/meta-clang/recipes-multimedia/libvorbis/libvorbis_%.bbappend
new file mode 100644
index 00000000..c6fe98c2
--- /dev/null
+++ b/external/meta-clang/recipes-multimedia/libvorbis/libvorbis_%.bbappend
@@ -0,0 +1,4 @@
+# | clang-7: error: unknown argument: '-mfused-madd'
+do_configure_prepend_toolchain-clang() {
+ sed -i -e "s/-mfused-madd//g" ${S}/configure.ac
+}