Add script for updating llvm 10

Upstream llvm now lives in a mono-repo along with clang, libc, lldb and a whole bunch of other projects (~90k files at time of writing).
SwiftShader only requires the llvm project from this repo, and does not wish to pull in everything else.

This script performs the following:
 * The llvm10-clean branch is fetched and checked out.
 * A sparse checkout of the llvm project is made to a temporary directory.
 * The third_party/llvm-10.0/llvm is replaced with the latest LLVM version.
 * This is committed and pushed.
 * The original branch is checked out again, and a merge from llvm10-clean to
   the original branch is made.

Bug: b/152339534
Change-Id: I75a7bf9e3f4deb7cbf6ff3f7f9428f07b8422800
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/42968
Tested-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/third_party/update-llvm-10.sh b/third_party/update-llvm-10.sh
new file mode 100755
index 0000000..1823778
--- /dev/null
+++ b/third_party/update-llvm-10.sh
@@ -0,0 +1,92 @@
+#!/bin/bash
+
+# llvm now lives in a mono-repo along with clang, libc, lldb and a whole bunch
+# of other projects (~90k files at time of writing).
+# SwiftShader only requires the llvm project from this repo, and does not wish
+# to pull in everything else.
+# This script performs the following:
+# * The llvm10-clean branch is fetched and checked out.
+# * A sparse checkout of the llvm project is made to a temporary directory.
+# * The third_party/llvm-10.0/llvm is replaced with the latest LLVM version.
+# * This is committed and pushed.
+# * The original branch is checked out again, and a merge from llvm10-clean to
+#   the original branch is made.
+
+THIRD_PARTY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )"
+STAGING_DIR="/tmp/llvm-10-update"
+CLEAN_BRANCH="llvm10-clean"
+SOURCE_DIR="${STAGING_DIR}/llvm"
+TARGET_DIR="${THIRD_PARTY_DIR}/llvm-10.0/llvm"
+LLVM_REPO_BRANCH="release/10.x"
+BUG_NUMBER="b/152339534"
+
+SWIFTSHADER_HEAD=`git rev-parse HEAD`
+
+# Check there are no local changes
+if ! git diff --quiet HEAD; then
+  echo "Git workspace not clean"
+  exit 1
+fi
+
+# Clone or update the staging directory
+if [[ -d "$STAGING_DIR" ]]; then
+  pushd "$STAGING_DIR"
+else
+  mkdir "$STAGING_DIR"
+  pushd "$STAGING_DIR"
+  git init
+  git remote add origin https://github.com/llvm/llvm-project.git
+  git config core.sparsecheckout true
+  echo "/llvm/lib" >> .git/info/sparse-checkout
+  echo "/llvm/include" >> .git/info/sparse-checkout
+fi
+git pull origin $LLVM_REPO_BRANCH
+LLVM_HEAD=`git log HEAD -n 1 --pretty=format:'%h'`
+popd
+
+if [[ -d "$TARGET_DIR" ]]; then
+  # Look for the last update change.
+  LAST_TARGET_UPDATE=`git log --grep="^llvm-10-update: [0-9a-f]\{9\}$" -n 1 --pretty=format:'%h' ${TARGET_DIR}`
+  if [[ ! -z "$LAST_TARGET_UPDATE" ]]; then
+    # Get the LLVM commit hash from the update change.
+    LAST_SOURCE_UPDATE=`git log $LAST_TARGET_UPDATE -n 1 | grep -oP "llvm-10-update: \K([0-9a-f]{9})"`
+    if [ $LLVM_HEAD == $LAST_SOURCE_UPDATE ]; then
+      echo "No new LLVM changes to apply"
+      exit 0
+    fi
+
+    # Gather list of changes since last update
+    pushd "$STAGING_DIR"
+    LLVM_CHANGE_LOG=`git log $LAST_SOURCE_UPDATE..$LLVM_HEAD --pretty=format:'  %h %s'`
+    LLVM_CHANGE_LOG="Changes:\n${LLVM_CHANGE_LOG}\n\n"
+    popd
+  fi
+fi
+
+COMMIT_MSG=`echo -e "Update LLVM 10 to ${LLVM_HEAD}\n\n${LLVM_CHANGE_LOG}Commands:\n  third_party/update-llvm-10.sh\n\nllvm-10-update: ${LLVM_HEAD}\nBug: ${BUG_NUMBER}"`
+
+# Switch to the llvm-10-clean branch.
+git fetch "https://swiftshader.googlesource.com/SwiftShader" $CLEAN_BRANCH
+git checkout FETCH_HEAD
+
+# Delete the target directory. We're going to re-populate it.
+rm -fr "$TARGET_DIR"
+
+# Update SwiftShader's $TARGET_DIR with a clean copy of latest LLVM
+mkdir -p "$TARGET_DIR"
+cp -r "$SOURCE_DIR/." "$TARGET_DIR"
+git add "$TARGET_DIR"
+git commit -m "$COMMIT_MSG"
+MERGE_SOURCE=`git log HEAD -n 1 --pretty=format:'%h'`
+
+# Push llvm-10-clean branch.
+git push "https://swiftshader.googlesource.com/SwiftShader" $CLEAN_BRANCH
+
+# Switch to the branch in use when calling the script.
+git checkout $SWIFTSHADER_HEAD
+
+# Update SwiftShader's $TARGET_DIR with a clean copy of latest LLVM
+git merge -m "$COMMIT_MSG" "$MERGE_SOURCE"
+
+# We're now done with the staging dir. Delete it.
+rm -fr "$STAGING_DIR"