aboutsummaryrefslogtreecommitdiffstats
path: root/dynamic-layers/clang-layer/recipes-devtools
diff options
context:
space:
mode:
Diffstat (limited to 'dynamic-layers/clang-layer/recipes-devtools')
-rw-r--r--dynamic-layers/clang-layer/recipes-devtools/clang/files/0001-dont-export-targets-for-binaries.patch68
-rw-r--r--dynamic-layers/clang-layer/recipes-devtools/clang/files/BasicBlockUtils-Add-metadata-fixing-in-SplitBlockPre.patch111
-rw-r--r--dynamic-layers/clang-layer/recipes-devtools/clang/files/IndVarSimplify-Do-not-use-SCEV-expander-for-IVCount-.patch146
-rw-r--r--dynamic-layers/clang-layer/recipes-devtools/clang/files/fix-shared-libs.patch30
-rw-r--r--dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-skip-building-tests.patch51
-rw-r--r--dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm9-skip-building-tests.patch51
-rw-r--r--dynamic-layers/clang-layer/recipes-devtools/clang/llvm-project-source.bbappend23
7 files changed, 480 insertions, 0 deletions
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/0001-dont-export-targets-for-binaries.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/0001-dont-export-targets-for-binaries.patch
new file mode 100644
index 00000000..da2475f9
--- /dev/null
+++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/0001-dont-export-targets-for-binaries.patch
@@ -0,0 +1,68 @@
+From 559fb8f82295ec4dc64a132b6566939b85c1b6fe Mon Sep 17 00:00:00 2001
+From: Anuj Mittal <anuj.mittal@intel.com>
+Date: Thu, 15 Aug 2019 22:34:31 +0800
+Subject: [PATCH] dont export targets for binaries
+
+The projects using LLVM cmake modules look for target binaries in
+sysroot as a result which isn't desirable in this case and isn't needed
+either.
+
+Upstream-Status: Inappropriate [cross-compile specific]
+
+Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
+Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
+---
+ llvm/cmake/modules/AddLLVM.cmake | 9 ---------
+ llvm/cmake/modules/TableGen.cmake | 6 ------
+ 2 files changed, 15 deletions(-)
+
+diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake
+index 619e986b8aa..d2bc1a25dd9 100644
+--- a/llvm/cmake/modules/AddLLVM.cmake
++++ b/llvm/cmake/modules/AddLLVM.cmake
+@@ -898,12 +898,6 @@ macro(add_llvm_tool name)
+
+ if ( ${name} IN_LIST LLVM_TOOLCHAIN_TOOLS OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
+ if( LLVM_BUILD_TOOLS )
+- set(export_to_llvmexports)
+- if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
+- NOT LLVM_DISTRIBUTION_COMPONENTS)
+- set(export_to_llvmexports EXPORT LLVMExports)
+- set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
+- endif()
+
+ install(TARGETS ${name}
+ ${export_to_llvmexports}
+@@ -917,9 +911,6 @@ macro(add_llvm_tool name)
+ endif()
+ endif()
+ endif()
+- if( LLVM_BUILD_TOOLS )
+- set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
+- endif()
+ set_target_properties(${name} PROPERTIES FOLDER "Tools")
+ endmacro(add_llvm_tool name)
+
+diff --git a/llvm/cmake/modules/TableGen.cmake b/llvm/cmake/modules/TableGen.cmake
+index 36c026b5c0f..537acd696d8 100644
+--- a/llvm/cmake/modules/TableGen.cmake
++++ b/llvm/cmake/modules/TableGen.cmake
+@@ -148,15 +148,9 @@ macro(add_tablegen target project)
+ endif()
+
+ if (${project} STREQUAL LLVM AND NOT LLVM_INSTALL_TOOLCHAIN_ONLY AND LLVM_BUILD_UTILS)
+- set(export_to_llvmexports)
+- if(${target} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
+- NOT LLVM_DISTRIBUTION_COMPONENTS)
+- set(export_to_llvmexports EXPORT LLVMExports)
+- endif()
+
+ install(TARGETS ${target}
+ ${export_to_llvmexports}
+ RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR})
+ endif()
+- set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${target})
+ endmacro()
+--
+2.17.1
+
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/BasicBlockUtils-Add-metadata-fixing-in-SplitBlockPre.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/BasicBlockUtils-Add-metadata-fixing-in-SplitBlockPre.patch
new file mode 100644
index 00000000..cd519971
--- /dev/null
+++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/BasicBlockUtils-Add-metadata-fixing-in-SplitBlockPre.patch
@@ -0,0 +1,111 @@
+From eeb816d95f0910bd246e37bb2bb3923acf0edf6b Mon Sep 17 00:00:00 2001
+From: Aleksander Us <aleksander.us@intel.com>
+Date: Mon, 26 Aug 2019 15:47:41 +0300
+Subject: [PATCH] [BasicBlockUtils] Add metadata fixing in
+ SplitBlockPredecessors.
+
+In case when BB is header of some loop and predecessor is latch of
+this loop, metadata was not attached to newly created basic block.
+This led to loss of loop metadata for other passes.
+
+Upstream-Status: Submitted [https://reviews.llvm.org/D66892]
+
+https://github.com/intel/llvm-patches/commit/8af4449e2d201707f7f2f832b473a0439e255f32
+
+Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
+---
+ lib/Transforms/Utils/BasicBlockUtils.cpp | 23 ++++++++----
+ test/Transforms/LoopSimplify/loop_metadata.ll | 36 +++++++++++++++++++
+ 2 files changed, 52 insertions(+), 7 deletions(-)
+ create mode 100644 test/Transforms/LoopSimplify/loop_metadata.ll
+
+diff --git a/lib/Transforms/Utils/BasicBlockUtils.cpp b/lib/Transforms/Utils/BasicBlockUtils.cpp
+index 5fa371377c8..3a90ae061fb 100644
+--- a/lib/Transforms/Utils/BasicBlockUtils.cpp
++++ b/lib/Transforms/Utils/BasicBlockUtils.cpp
+@@ -579,24 +579,33 @@ BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,
+
+ // The new block unconditionally branches to the old block.
+ BranchInst *BI = BranchInst::Create(BB, NewBB);
++ bool IsBBHeader = LI && LI->isLoopHeader(BB);
++ Loop *BBLoop = LI ? LI->getLoopFor(BB) : nullptr;
+ // Splitting the predecessors of a loop header creates a preheader block.
+- if (LI && LI->isLoopHeader(BB))
++ if (IsBBHeader)
+ // Using the loop start line number prevents debuggers stepping into the
+ // loop body for this instruction.
+- BI->setDebugLoc(LI->getLoopFor(BB)->getStartLoc());
++ BI->setDebugLoc(BBLoop->getStartLoc());
+ else
+ BI->setDebugLoc(BB->getFirstNonPHIOrDbg()->getDebugLoc());
+
+ // Move the edges from Preds to point to NewBB instead of BB.
+- for (unsigned i = 0, e = Preds.size(); i != e; ++i) {
++ for (BasicBlock *Pred : Preds) {
++ Instruction *PI = Pred->getTerminator();
+ // This is slightly more strict than necessary; the minimum requirement
+ // is that there be no more than one indirectbr branching to BB. And
+ // all BlockAddress uses would need to be updated.
+- assert(!isa<IndirectBrInst>(Preds[i]->getTerminator()) &&
++ assert(!isa<IndirectBrInst>(PI) &&
+ "Cannot split an edge from an IndirectBrInst");
+- assert(!isa<CallBrInst>(Preds[i]->getTerminator()) &&
+- "Cannot split an edge from a CallBrInst");
+- Preds[i]->getTerminator()->replaceUsesOfWith(BB, NewBB);
++ assert(!isa<CallBrInst>(PI) && "Cannot split an edge from a CallBrInst");
++ if (IsBBHeader && BBLoop->contains(Pred) && BBLoop->isLoopLatch(Pred)) {
++ // Update loop metadata if it exists.
++ if (MDNode *LoopMD = PI->getMetadata(LLVMContext::MD_loop)) {
++ BI->setMetadata(LLVMContext::MD_loop, LoopMD);
++ PI->setMetadata(LLVMContext::MD_loop, nullptr);
++ }
++ }
++ PI->replaceUsesOfWith(BB, NewBB);
+ }
+
+ // Insert a new PHI node into NewBB for every PHI node in BB and that new PHI
+diff --git a/test/Transforms/LoopSimplify/loop_metadata.ll b/test/Transforms/LoopSimplify/loop_metadata.ll
+new file mode 100644
+index 00000000000..c15c92fe3ae
+--- /dev/null
++++ b/test/Transforms/LoopSimplify/loop_metadata.ll
+@@ -0,0 +1,36 @@
++; RUN: opt -S -loop-simplify < %s | FileCheck %s
++
++; CHECK: for.cond.loopexit:
++; CHECK: br label %for.cond, !llvm.loop !0
++; CHECK: br i1 %cmp1, label %for.body1, label %for.cond.loopexit
++
++define void @foo() {
++entry:
++ br label %for.cond
++
++for.cond: ; preds = %for.cond1, %entry
++ %j = phi i32 [ 0, %entry ], [ %add, %for.cond1 ]
++ %cmp = icmp ult i32 %j, 8
++ br i1 %cmp, label %for.body, label %for.end
++
++for.body: ; preds = %for.cond
++ %dummy1 = add i32 1, 1
++ %add = add nuw nsw i32 %j, 1
++ br label %for.cond1
++
++for.cond1: ; preds = %for.body1, %for.body
++ %i.0 = phi i32 [ 1, %for.body ], [ %inc, %for.body1 ]
++ %cmp1 = icmp ult i32 %i.0, 8
++ br i1 %cmp1, label %for.body1, label %for.cond, !llvm.loop !0
++
++for.body1: ; preds = %for.cond1
++ %dummy2 = add i32 1, 1
++ %inc = add nuw nsw i32 %i.0, 1
++ br label %for.cond1
++
++for.end: ; preds = %for.cond
++ ret void
++}
++
++!0 = distinct !{!0, !1}
++!1 = !{!"llvm.loop.unroll.full"}
+--
+2.18.0
+
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/IndVarSimplify-Do-not-use-SCEV-expander-for-IVCount-.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/IndVarSimplify-Do-not-use-SCEV-expander-for-IVCount-.patch
new file mode 100644
index 00000000..48307deb
--- /dev/null
+++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/IndVarSimplify-Do-not-use-SCEV-expander-for-IVCount-.patch
@@ -0,0 +1,146 @@
+From 35e218a886f4c066eabd18685240d55270bd5a6d Mon Sep 17 00:00:00 2001
+From: Aleksander Us <aleksander.us@intel.com>
+Date: Mon, 26 Aug 2019 15:45:47 +0300
+Subject: [PATCH] [IndVarSimplify] Do not use SCEV expander for IVCount in
+ LFTR when possible.
+
+SCEV analysis cannot properly cache instruction with poison flags
+(for example, add nsw outside of loop will not be reused by expander).
+This can lead to generating of additional instructions by SCEV expander.
+
+Example IR:
+
+ ...
+ %maxval = add nuw nsw i32 %a1, %a2
+ ...
+for.body:
+ ...
+ %cmp22 = icmp ult i32 %ivadd, %maxval
+ br i1 %cmp22, label %for.body, label %for.end
+ ...
+
+SCEV expander will generate copy of %maxval in preheader but without
+nuw/nsw flags. This can be avoided by explicit check that iv count
+value gives the same SCEV expressions as calculated by LFTR.
+
+Upstream-Status: Submitted [https://reviews.llvm.org/D66890]
+
+https://github.com/intel/llvm-patches/commit/fd6a6c97341a56fd21bc32bc940afea751312e8f
+
+Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
+---
+ lib/Transforms/Scalar/IndVarSimplify.cpp | 12 +++++++++-
+ test/Transforms/IndVarSimplify/add_nsw.ll | 23 ++++++++++++++++++++
+ test/Transforms/IndVarSimplify/lftr-reuse.ll | 9 +++-----
+ test/Transforms/IndVarSimplify/udiv.ll | 1 +
+ 4 files changed, 38 insertions(+), 7 deletions(-)
+ create mode 100644 test/Transforms/IndVarSimplify/add_nsw.ll
+
+diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp
+index f9fc698a4a9..5e04dac8aa6 100644
+--- a/lib/Transforms/Scalar/IndVarSimplify.cpp
++++ b/lib/Transforms/Scalar/IndVarSimplify.cpp
+@@ -2375,6 +2375,17 @@ static Value *genLoopLimit(PHINode *IndVar, BasicBlock *ExitingBB,
+ if (UsePostInc)
+ IVLimit = SE->getAddExpr(IVLimit, SE->getOne(IVLimit->getType()));
+
++ // If computed limit is equal to old limit then do not use SCEV expander
++ // because it can lost NUW/NSW flags and create extra instructions.
++ BranchInst *BI = cast<BranchInst>(ExitingBB->getTerminator());
++ if (ICmpInst *Cmp = dyn_cast<ICmpInst>(BI->getOperand(0))) {
++ Value *Limit = Cmp->getOperand(0);
++ if (!L->isLoopInvariant(Limit))
++ Limit = Cmp->getOperand(1);
++ if (SE->getSCEV(Limit) == IVLimit)
++ return Limit;
++ }
++
+ // Expand the code for the iteration count.
+ assert(SE->isLoopInvariant(IVLimit, L) &&
+ "Computed iteration count is not loop invariant!");
+@@ -2383,7 +2394,6 @@ static Value *genLoopLimit(PHINode *IndVar, BasicBlock *ExitingBB,
+ // SCEV expression (IVInit) for a pointer type IV value (IndVar).
+ Type *LimitTy = ExitCount->getType()->isPointerTy() ?
+ IndVar->getType() : ExitCount->getType();
+- BranchInst *BI = cast<BranchInst>(ExitingBB->getTerminator());
+ return Rewriter.expandCodeFor(IVLimit, LimitTy, BI);
+ }
+ }
+diff --git a/test/Transforms/IndVarSimplify/add_nsw.ll b/test/Transforms/IndVarSimplify/add_nsw.ll
+new file mode 100644
+index 00000000000..abd1cbb6c51
+--- /dev/null
++++ b/test/Transforms/IndVarSimplify/add_nsw.ll
+@@ -0,0 +1,23 @@
++; RUN: opt -indvars -S %s | FileCheck %s
++
++target datalayout = "e-p:32:32-i64:64-n8:16:32"
++
++; CHECK: for.body.preheader:
++; CHECK-NOT: add
++; CHECK: for.body:
++
++define void @foo(i32 %a1, i32 %a2) {
++entry:
++ %maxval = add nuw nsw i32 %a1, %a2
++ %cmp = icmp slt i32 %maxval, 1
++ br i1 %cmp, label %for.end, label %for.body
++
++for.body: ; preds = %entry, %for.body
++ %j.02 = phi i32 [ 0, %entry ], [ %add31, %for.body ]
++ %add31 = add nuw nsw i32 %j.02, 1
++ %cmp22 = icmp slt i32 %add31, %maxval
++ br i1 %cmp22, label %for.body, label %for.end
++
++for.end: ; preds = %for.body
++ ret void
++}
+diff --git a/test/Transforms/IndVarSimplify/lftr-reuse.ll b/test/Transforms/IndVarSimplify/lftr-reuse.ll
+index 14ae9738696..509d662b767 100644
+--- a/test/Transforms/IndVarSimplify/lftr-reuse.ll
++++ b/test/Transforms/IndVarSimplify/lftr-reuse.ll
+@@ -67,11 +67,9 @@ define void @expandOuterRecurrence(i32 %arg) nounwind {
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 0, [[SUB1]]
+ ; CHECK-NEXT: br i1 [[CMP1]], label [[OUTER_PREHEADER:%.*]], label [[EXIT:%.*]]
+ ; CHECK: outer.preheader:
+-; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[ARG]], -1
+ ; CHECK-NEXT: br label [[OUTER:%.*]]
+ ; CHECK: outer:
+-; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i32 [ [[TMP0]], [[OUTER_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[OUTER_INC:%.*]] ]
+-; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_INC:%.*]], [[OUTER_INC]] ], [ 0, [[OUTER_PREHEADER]] ]
++; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_INC:%.*]], [[OUTER_INC:%.*]] ], [ 0, [[OUTER_PREHEADER]] ]
+ ; CHECK-NEXT: [[SUB2:%.*]] = sub nsw i32 [[ARG]], [[I]]
+ ; CHECK-NEXT: [[SUB3:%.*]] = sub nsw i32 [[SUB2]], 1
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 0, [[SUB3]]
+@@ -81,14 +79,13 @@ define void @expandOuterRecurrence(i32 %arg) nounwind {
+ ; CHECK: inner:
+ ; CHECK-NEXT: [[J:%.*]] = phi i32 [ 0, [[INNER_PH]] ], [ [[J_INC:%.*]], [[INNER]] ]
+ ; CHECK-NEXT: [[J_INC]] = add nuw nsw i32 [[J]], 1
+-; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[J_INC]], [[INDVARS_IV]]
++; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[J_INC]], [[SUB3]]
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[INNER]], label [[OUTER_INC_LOOPEXIT:%.*]]
+ ; CHECK: outer.inc.loopexit:
+ ; CHECK-NEXT: br label [[OUTER_INC]]
+ ; CHECK: outer.inc:
+ ; CHECK-NEXT: [[I_INC]] = add nuw nsw i32 [[I]], 1
+-; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add i32 [[INDVARS_IV]], -1
+-; CHECK-NEXT: [[EXITCOND1:%.*]] = icmp ne i32 [[I_INC]], [[TMP0]]
++; CHECK-NEXT: [[EXITCOND1:%.*]] = icmp ne i32 [[I_INC]], [[SUB1]]
+ ; CHECK-NEXT: br i1 [[EXITCOND1]], label [[OUTER]], label [[EXIT_LOOPEXIT:%.*]]
+ ; CHECK: exit.loopexit:
+ ; CHECK-NEXT: br label [[EXIT]]
+diff --git a/test/Transforms/IndVarSimplify/udiv.ll b/test/Transforms/IndVarSimplify/udiv.ll
+index b3f2c2a6a66..3530343ef4a 100644
+--- a/test/Transforms/IndVarSimplify/udiv.ll
++++ b/test/Transforms/IndVarSimplify/udiv.ll
+@@ -133,6 +133,7 @@ declare i32 @printf(i8* nocapture, ...) nounwind
+ ; CHECK-LABEL: @foo(
+ ; CHECK: for.body.preheader:
+ ; CHECK-NOT: udiv
++; CHECK: for.body:
+
+ define void @foo(double* %p, i64 %n) nounwind {
+ entry:
+--
+2.18.0
+
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/fix-shared-libs.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/fix-shared-libs.patch
new file mode 100644
index 00000000..d69d2a97
--- /dev/null
+++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/fix-shared-libs.patch
@@ -0,0 +1,30 @@
+From a6d4ccf082858e63e139ca06c02a071c343d2657 Mon Sep 17 00:00:00 2001
+From: Andrea Bocci <andrea.bocci@cern.ch>
+Date: Sun, 15 Mar 2020 17:35:44 +0100
+Subject: [PATCH] Fix building in-tree with cmake -DLLVM_LINK_LLVM_DYLIB=ON
+
+Building in-tree with LLVM 11.0 master with the LLVM_LINK_LLVM_DYLIB
+cmake flag fails to link with the LLVMSPIRVLib library.
+
+Add an explicit dependency to force the correct build order and linking.
+
+Signed-off-by: Andrea Bocci <andrea.bocci@cern.ch>
+Upstream-Status: Backport
+Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
+---
+ tools/llvm-spirv/CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/llvm-spirv/CMakeLists.txt b/tools/llvm-spirv/CMakeLists.txt
+index 9aa96d9c..501c0daf 100644
+--- a/tools/llvm-spirv/CMakeLists.txt
++++ b/tools/llvm-spirv/CMakeLists.txt
+@@ -14,7 +14,7 @@ add_llvm_tool(llvm-spirv
+ NO_INSTALL_RPATH
+ )
+
+-if (LLVM_SPIRV_BUILD_EXTERNAL)
++if (LLVM_SPIRV_BUILD_EXTERNAL OR LLVM_LINK_LLVM_DYLIB)
+ target_link_libraries(llvm-spirv PRIVATE LLVMSPIRVLib)
+ endif()
+
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-skip-building-tests.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-skip-building-tests.patch
new file mode 100644
index 00000000..8e58ec25
--- /dev/null
+++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm10-skip-building-tests.patch
@@ -0,0 +1,51 @@
+From 455ce9c25df5313f4a6649cc27075bdfbe25af18 Mon Sep 17 00:00:00 2001
+From: Naveen Saini <naveen.kumar.saini@intel.com>
+Date: Wed, 21 Aug 2019 14:35:31 +0800
+Subject: [PATCH] llvm-spirv: skip building tests
+
+Some of these need clang to be built and since we're building this in-tree,
+that leads to problems when compiling libcxx, compiler-rt which aren't built
+in-tree.
+
+Instead of using SPIRV_SKIP_CLANG_BUILD to skip clang build and adding this to
+all components, disable the building of tests altogether.
+
+Upstream-Status: Inappropriate
+
+Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
+Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
+---
+ CMakeLists.txt | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index b718c00..9805140 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -24,13 +24,6 @@ if(LLVM_SPIRV_BUILD_EXTERNAL)
+ set(CMAKE_CXX_STANDARD 14)
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+- if(LLVM_SPIRV_INCLUDE_TESTS)
+- set(LLVM_TEST_COMPONENTS
+- llvm-as
+- llvm-dis
+- )
+- endif(LLVM_SPIRV_INCLUDE_TESTS)
+-
+ find_package(LLVM 10.0.0 REQUIRED
+ COMPONENTS
+ Analysis
+@@ -61,9 +54,6 @@ set(LLVM_SPIRV_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include)
+
+ add_subdirectory(lib/SPIRV)
+ add_subdirectory(tools/llvm-spirv)
+-if(LLVM_SPIRV_INCLUDE_TESTS)
+- add_subdirectory(test)
+-endif(LLVM_SPIRV_INCLUDE_TESTS)
+
+ install(
+ FILES
+--
+2.7.4
+
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm9-skip-building-tests.patch b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm9-skip-building-tests.patch
new file mode 100644
index 00000000..9a7b8445
--- /dev/null
+++ b/dynamic-layers/clang-layer/recipes-devtools/clang/files/llvm9-skip-building-tests.patch
@@ -0,0 +1,51 @@
+From 48e50f06b1bbed94cdf5207587161d4bfce7366e Mon Sep 17 00:00:00 2001
+From: Naveen Saini <naveen.kumar.saini@intel.com>
+Date: Wed, 21 Aug 2019 14:35:31 +0800
+Subject: [PATCH] llvm-spirv: skip building tests
+
+Some of these need clang to be built and since we're building this in-tree,
+that leads to problems when compiling libcxx, compiler-rt which aren't built
+in-tree.
+
+Instead of using SPIRV_SKIP_CLANG_BUILD to skip clang build and adding this to
+all components, disable the building of tests altogether.
+
+Upstream-Status: Inappropriate
+
+Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
+Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
+---
+ CMakeLists.txt | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 1208741..20ca3e6 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -15,13 +15,6 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
+ set(CMAKE_CXX_STANDARD 11)
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+- if(LLVM_INCLUDE_TESTS)
+- set(LLVM_TEST_COMPONENTS
+- llvm-as
+- llvm-dis
+- )
+- endif(LLVM_INCLUDE_TESTS)
+-
+ find_package(LLVM 9.0.0 REQUIRED
+ COMPONENTS
+ Analysis
+@@ -56,9 +49,6 @@ set(LLVM_SPIRV_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include)
+
+ add_subdirectory(lib/SPIRV)
+ add_subdirectory(tools/llvm-spirv)
+-if(LLVM_INCLUDE_TESTS)
+- add_subdirectory(test)
+-endif(LLVM_INCLUDE_TESTS)
+
+ install(
+ FILES
+--
+2.17.1
+
diff --git a/dynamic-layers/clang-layer/recipes-devtools/clang/llvm-project-source.bbappend b/dynamic-layers/clang-layer/recipes-devtools/clang/llvm-project-source.bbappend
new file mode 100644
index 00000000..80752172
--- /dev/null
+++ b/dynamic-layers/clang-layer/recipes-devtools/clang/llvm-project-source.bbappend
@@ -0,0 +1,23 @@
+FILESEXTRAPATHS_prepend_intel-x86-common := "${THISDIR}/files:"
+
+SPIRV_BRANCH = "${@bb.utils.contains('LLVMVERSION', '9.0.1', 'llvm_release_90', 'llvm_release_100', d)}"
+
+SPIRV9_SRCREV = "70420631144a6a25613ae37178f2cc1d3607b65b"
+SPIRV10_SRCREV = "7743482f2053582be990e93ca46d15239c509c9d"
+SPIRV_SRCREV = "${@bb.utils.contains('LLVMVERSION', '9.0.1', '${SPIRV9_SRCREV}', '${SPIRV10_SRCREV}', d)}"
+
+LLVM9_PATCH_LIST = " file://0001-dont-export-targets-for-binaries.patch \
+ file://BasicBlockUtils-Add-metadata-fixing-in-SplitBlockPre.patch;patchdir=llvm \
+ file://IndVarSimplify-Do-not-use-SCEV-expander-for-IVCount-.patch;patchdir=llvm \
+ file://llvm9-skip-building-tests.patch;patchdir=llvm/projects/llvm-spirv \
+ "
+LLVM10_PATCH_LIST = " file://llvm10-skip-building-tests.patch;patchdir=llvm/projects/llvm-spirv \
+ file://fix-shared-libs.patch;patchdir=llvm/projects/llvm-spirv \
+ "
+
+SRC_URI_append_intel-x86-common = " \
+ git://github.com/KhronosGroup/SPIRV-LLVM-Translator.git;protocol=https;branch=${SPIRV_BRANCH};destsuffix=git/llvm/projects/llvm-spirv;name=spirv \
+ "
+SRC_URI_append_intel-x86-common = "${@bb.utils.contains('LLVMVERSION', '9.0.1', '${LLVM9_PATCH_LIST}', '${LLVM10_PATCH_LIST}', d)}"
+
+SRCREV_spirv = "${SPIRV_SRCREV}"