From 8f2e59934d3b053f0b9f1e7010d73bfe61fbf6ec Mon Sep 17 00:00:00 2001
From: Julian Veit <claymore1298@gmail.com>
Date: Sun, 01 Mar 2020 19:11:07 +0100
Subject: [PATCH] clang: cleanup for custom repository type

Change-Id: I0bcf482a175f89ddb4e13ed558669cb6ee2c0298
---

diff --git a/Android.bp b/Android.bp
deleted file mode 100644
index ae87073..0000000
--- a/Android.bp
+++ /dev/null
@@ -1,388 +0,0 @@
-//
-// Copyright (C) 2017 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-llvm_prebuilt_library_static {
-    name: "libFuzzer",
-    sanitize: {
-        never: true,
-    },
-}
-
-llvm_prebuilt_library_static {
-    name: "libomp",
-    vendor_available: true,
-    sanitize: {
-        never: true,
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.asan-arm-android",
-    enabled: false,
-    arch: {
-        arm: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.asan-aarch64-android",
-    enabled: false,
-    arch: {
-        arm64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.asan-mips-android",
-    enabled: false,
-    arch: {
-        mips: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.asan-mips64-android",
-    enabled: false,
-    arch: {
-        mips64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.asan-i686-android",
-    enabled: false,
-    arch: {
-        x86: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.asan-x86_64-android",
-    enabled: false,
-    arch: {
-        x86_64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_llndk_library {
-    name: "libclang_rt.asan-arm-android",
-    enabled: false,
-    arch: {
-        arm: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_llndk_library {
-    name: "libclang_rt.asan-aarch64-android",
-    enabled: false,
-    arch: {
-        arm64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_llndk_library {
-    name: "libclang_rt.asan-mips-android",
-    enabled: false,
-    arch: {
-        mips: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_llndk_library {
-    name: "libclang_rt.asan-mips64-android",
-    enabled: false,
-    arch: {
-        mips64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_llndk_library {
-    name: "libclang_rt.asan-i686-android",
-    enabled: false,
-    arch: {
-        x86: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_llndk_library {
-    name: "libclang_rt.asan-x86_64-android",
-    enabled: false,
-    arch: {
-        x86_64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.ubsan_standalone-arm-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        arm: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.ubsan_standalone-aarch64-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        arm64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.ubsan_standalone-mips-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        mips: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.ubsan_standalone-mips64-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        mips64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.ubsan_standalone-i686-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        x86: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_shared {
-    name: "libclang_rt.ubsan_standalone-x86_64-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        x86_64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.ubsan_minimal-arm-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        arm: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.ubsan_minimal-aarch64-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        arm64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.ubsan_minimal-mips64-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        mips64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.ubsan_minimal-mips-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        mips: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.ubsan_minimal-i686-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        x86: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.ubsan_minimal-x86_64-android",
-    enabled: false,
-    vendor_available: true,
-    vndk: {
-        enabled: true,
-    },
-    arch: {
-        x86_64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.profile-arm-android",
-    enabled: false,
-    vendor_available: true,
-    arch: {
-        arm: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.profile-aarch64-android",
-    enabled: false,
-    vendor_available: true,
-    arch: {
-        arm64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.profile-mips-android",
-    enabled: false,
-    vendor_available: true,
-    arch: {
-        mips: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.profile-mips64-android",
-    enabled: false,
-    vendor_available: true,
-    arch: {
-        mips64: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.profile-i686-android",
-    enabled: false,
-    vendor_available: true,
-    arch: {
-        x86: {
-            enabled: true,
-        },
-    },
-}
-
-libclang_rt_prebuilt_library_static {
-    name: "libclang_rt.profile-x86_64-android",
-    enabled: false,
-    vendor_available: true,
-    arch: {
-        x86_64: {
-            enabled: true,
-        },
-    },
-}
-
-subdirs = [
-    "soong",
-]
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 1cf3f5c..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,95 +0,0 @@
-#
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-# Use these prebuilts unless we are actually building from a newly rebased
-# LLVM. This variable is set by external/clang/build.py.
-ifneq (true,$(FORCE_BUILD_SANITIZER_SHARED_OBJECTS))
-
-libclang_dir := $(LLVM_PREBUILTS_VERSION)/lib64/clang/$(LLVM_RELEASE_VERSION)
-
-# Also build/install the newest asan_test for each arch
-# We rename it to asan-test for now to avoid duplicate definitions.
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := asan-test
-LOCAL_SRC_FILES := $(LLVM_PREBUILTS_VERSION)/test/arm/bin/asan_test
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE_SUFFIX :=
-LOCAL_MODULE_PATH := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
-LOCAL_MODULE_TAGS := debug
-LOCAL_MODULE_TARGET_ARCH := arm
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := asan-test
-LOCAL_SRC_FILES := $(LLVM_PREBUILTS_VERSION)/test/aarch64/bin/asan_test
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE_SUFFIX :=
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
-LOCAL_MODULE_TAGS := debug
-LOCAL_MODULE_TARGET_ARCH := arm64
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := asan-test
-LOCAL_SRC_FILES := $(LLVM_PREBUILTS_VERSION)/test/i686/bin/asan_test
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE_SUFFIX :=
-LOCAL_MODULE_PATH := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
-LOCAL_MODULE_TAGS := debug
-LOCAL_MODULE_TARGET_ARCH := x86
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-# There is no x86_64 prebuilt here yet.
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := asan-test
-LOCAL_SRC_FILES := $(LLVM_PREBUILTS_VERSION)/test/mips/bin/asan_test
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE_SUFFIX :=
-LOCAL_MODULE_PATH := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
-LOCAL_MODULE_TAGS := debug
-LOCAL_MODULE_TARGET_ARCH := mips
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := asan-test
-LOCAL_SRC_FILES := $(LLVM_PREBUILTS_VERSION)/test/mips64/bin/asan_test
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE_SUFFIX :=
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
-LOCAL_MODULE_TAGS := debug
-LOCAL_MODULE_TARGET_ARCH := mips64
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-endif
diff --git a/CleanSpec.mk b/CleanSpec.mk
deleted file mode 100644
index 5cb815c..0000000
--- a/CleanSpec.mk
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (C) 2007 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# If you don't need to do a full clean build but would like to touch
-# a file or delete some intermediate files, add a clean step to the end
-# of the list.  These steps will only be run once, if they haven't been
-# run before.
-#
-# E.g.:
-#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
-#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
-#
-# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
-# files that are missing or have been moved.
-#
-# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
-# Use $(OUT_DIR) to refer to the "out" directory.
-#
-# If you need to re-do something that's already mentioned, just copy
-# the command and add it to the bottom of the list.  E.g., if a change
-# that you made last week required touching a file and a change you
-# made today requires touching the same file, just copy the old
-# touch step and add it to the end of the list.
-#
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
-
-# For example:
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
-#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
-#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
-
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/lib/libclang_rt*)
-
-
-# libclang_rt.asan libs are now LLNDK, and thus should be removed from /system/lib/vndk
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/vndk/libclang_rt.asan*)
diff --git a/clang-stable/bin/clang-format b/clang-stable/bin/clang-format
deleted file mode 100755
index a181363..0000000
--- a/clang-stable/bin/clang-format
+++ /dev/null
Binary files differ
diff --git a/clang-stable/bin/git-clang-format b/clang-stable/bin/git-clang-format
deleted file mode 100755
index 60cd4fb..0000000
--- a/clang-stable/bin/git-clang-format
+++ /dev/null
@@ -1,579 +0,0 @@
-#!/usr/bin/env python
-#
-#===- git-clang-format - ClangFormat Git Integration ---------*- python -*--===#
-#
-#                     The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-#===------------------------------------------------------------------------===#
-
-r"""                                                                             
-clang-format git integration                                                     
-============================                                                     
-                                                                                 
-This file provides a clang-format integration for git. Put it somewhere in your  
-path and ensure that it is executable. Then, "git clang-format" will invoke      
-clang-format on the changes in current files or a specific commit.               
-                                                                                 
-For further details, run:                                                        
-git clang-format -h                                                              
-                                                                                 
-Requires Python 2.7 or Python 3                                                  
-"""               
-
-from __future__ import print_function
-import argparse
-import collections
-import contextlib
-import errno
-import os
-import re
-import subprocess
-import sys
-
-usage = 'git clang-format [OPTIONS] [<commit>] [<commit>] [--] [<file>...]'
-
-desc = '''
-If zero or one commits are given, run clang-format on all lines that differ
-between the working directory and <commit>, which defaults to HEAD.  Changes are
-only applied to the working directory.
-
-If two commits are given (requires --diff), run clang-format on all lines in the
-second <commit> that differ from the first <commit>.
-
-The following git-config settings set the default of the corresponding option:
-  clangFormat.binary
-  clangFormat.commit
-  clangFormat.extension
-  clangFormat.style
-'''
-
-# Name of the temporary index file in which save the output of clang-format.
-# This file is created within the .git directory.
-temp_index_basename = 'clang-format-index'
-
-
-Range = collections.namedtuple('Range', 'start, count')
-
-
-def main():
-  config = load_git_config()
-
-  # In order to keep '--' yet allow options after positionals, we need to
-  # check for '--' ourselves.  (Setting nargs='*' throws away the '--', while
-  # nargs=argparse.REMAINDER disallows options after positionals.)
-  argv = sys.argv[1:]
-  try:
-    idx = argv.index('--')
-  except ValueError:
-    dash_dash = []
-  else:
-    dash_dash = argv[idx:]
-    argv = argv[:idx]
-
-  default_extensions = ','.join([
-      # From clang/lib/Frontend/FrontendOptions.cpp, all lower case
-      'c', 'h',  # C
-      'm',  # ObjC
-      'mm',  # ObjC++
-      'cc', 'cp', 'cpp', 'c++', 'cxx', 'hpp',  # C++
-      # Other languages that clang-format supports
-      'proto', 'protodevel',  # Protocol Buffers
-      'java',  # Java
-      'js',  # JavaScript
-      'ts',  # TypeScript
-      ])
-
-  p = argparse.ArgumentParser(
-    usage=usage, formatter_class=argparse.RawDescriptionHelpFormatter,
-    description=desc)
-  p.add_argument('--binary',
-                 default=config.get('clangformat.binary', 'clang-format'),
-                 help='path to clang-format'),
-  p.add_argument('--commit',
-                 default=config.get('clangformat.commit', 'HEAD'),
-                 help='default commit to use if none is specified'),
-  p.add_argument('--diff', action='store_true',
-                 help='print a diff instead of applying the changes')
-  p.add_argument('--extensions',
-                 default=config.get('clangformat.extensions',
-                                    default_extensions),
-                 help=('comma-separated list of file extensions to format, '
-                       'excluding the period and case-insensitive')),
-  p.add_argument('-f', '--force', action='store_true',
-                 help='allow changes to unstaged files')
-  p.add_argument('-p', '--patch', action='store_true',
-                 help='select hunks interactively')
-  p.add_argument('-q', '--quiet', action='count', default=0,
-                 help='print less information')
-  p.add_argument('--style',
-                 default=config.get('clangformat.style', None),
-                 help='passed to clang-format'),
-  p.add_argument('-v', '--verbose', action='count', default=0,
-                 help='print extra information')
-  # We gather all the remaining positional arguments into 'args' since we need
-  # to use some heuristics to determine whether or not <commit> was present.
-  # However, to print pretty messages, we make use of metavar and help.
-  p.add_argument('args', nargs='*', metavar='<commit>',
-                 help='revision from which to compute the diff')
-  p.add_argument('ignored', nargs='*', metavar='<file>...',
-                 help='if specified, only consider differences in these files')
-  opts = p.parse_args(argv)
-
-  opts.verbose -= opts.quiet
-  del opts.quiet
-
-  commits, files = interpret_args(opts.args, dash_dash, opts.commit)
-  if len(commits) > 1:
-    if not opts.diff:
-      die('--diff is required when two commits are given')
-  else:
-    if len(commits) > 2:
-      die('at most two commits allowed; %d given' % len(commits))
-  changed_lines = compute_diff_and_extract_lines(commits, files)
-  if opts.verbose >= 1:
-    ignored_files = set(changed_lines)
-  filter_by_extension(changed_lines, opts.extensions.lower().split(','))
-  if opts.verbose >= 1:
-    ignored_files.difference_update(changed_lines)
-    if ignored_files:
-      print('Ignoring changes in the following files (wrong extension):')
-      for filename in ignored_files:
-        print('    %s' % filename)
-    if changed_lines:
-      print('Running clang-format on the following files:')
-      for filename in changed_lines:
-        print('    %s' % filename)
-  if not changed_lines:
-    print('no modified files to format')
-    return
-  # The computed diff outputs absolute paths, so we must cd before accessing
-  # those files.
-  cd_to_toplevel()
-  if len(commits) > 1:
-    old_tree = commits[1]
-    new_tree = run_clang_format_and_save_to_tree(changed_lines,
-                                                 revision=commits[1],
-                                                 binary=opts.binary,
-                                                 style=opts.style)
-  else:
-    old_tree = create_tree_from_workdir(changed_lines)
-    new_tree = run_clang_format_and_save_to_tree(changed_lines,
-                                                 binary=opts.binary,
-                                                 style=opts.style)
-  if opts.verbose >= 1:
-    print('old tree: %s' % old_tree)
-    print('new tree: %s' % new_tree)
-  if old_tree == new_tree:
-    if opts.verbose >= 0:
-      print('clang-format did not modify any files')
-  elif opts.diff:
-    print_diff(old_tree, new_tree)
-  else:
-    changed_files = apply_changes(old_tree, new_tree, force=opts.force,
-                                  patch_mode=opts.patch)
-    if (opts.verbose >= 0 and not opts.patch) or opts.verbose >= 1:
-      print('changed files:')
-      for filename in changed_files:
-        print('    %s' % filename)
-
-
-def load_git_config(non_string_options=None):
-  """Return the git configuration as a dictionary.
-
-  All options are assumed to be strings unless in `non_string_options`, in which
-  is a dictionary mapping option name (in lower case) to either "--bool" or
-  "--int"."""
-  if non_string_options is None:
-    non_string_options = {}
-  out = {}
-  for entry in run('git', 'config', '--list', '--null').split('\0'):
-    if entry:
-      name, value = entry.split('\n', 1)
-      if name in non_string_options:
-        value = run('git', 'config', non_string_options[name], name)
-      out[name] = value
-  return out
-
-
-def interpret_args(args, dash_dash, default_commit):
-  """Interpret `args` as "[commits] [--] [files]" and return (commits, files).
-
-  It is assumed that "--" and everything that follows has been removed from
-  args and placed in `dash_dash`.
-
-  If "--" is present (i.e., `dash_dash` is non-empty), the arguments to its
-  left (if present) are taken as commits.  Otherwise, the arguments are checked
-  from left to right if they are commits or files.  If commits are not given,
-  a list with `default_commit` is used."""
-  if dash_dash:
-    if len(args) == 0:
-      commits = [default_commit]
-    else:
-      commits = args
-    for commit in commits:
-      object_type = get_object_type(commit)
-      if object_type not in ('commit', 'tag'):
-        if object_type is None:
-          die("'%s' is not a commit" % commit)
-        else:
-          die("'%s' is a %s, but a commit was expected" % (commit, object_type))
-    files = dash_dash[1:]
-  elif args:
-    commits = []
-    while args:
-      if not disambiguate_revision(args[0]):
-        break
-      commits.append(args.pop(0))
-    if not commits:
-      commits = [default_commit]
-    files = args
-  else:
-    commits = [default_commit]
-    files = []
-  return commits, files
-
-
-def disambiguate_revision(value):
-  """Returns True if `value` is a revision, False if it is a file, or dies."""
-  # If `value` is ambiguous (neither a commit nor a file), the following
-  # command will die with an appropriate error message.
-  run('git', 'rev-parse', value, verbose=False)
-  object_type = get_object_type(value)
-  if object_type is None:
-    return False
-  if object_type in ('commit', 'tag'):
-    return True
-  die('`%s` is a %s, but a commit or filename was expected' %
-      (value, object_type))
-
-
-def get_object_type(value):
-  """Returns a string description of an object's type, or None if it is not
-  a valid git object."""
-  cmd = ['git', 'cat-file', '-t', value]
-  p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  stdout, stderr = p.communicate()
-  if p.returncode != 0:
-    return None
-  return convert_string(stdout.strip())
-
-
-def compute_diff_and_extract_lines(commits, files):
-  """Calls compute_diff() followed by extract_lines()."""
-  diff_process = compute_diff(commits, files)
-  changed_lines = extract_lines(diff_process.stdout)
-  diff_process.stdout.close()
-  diff_process.wait()
-  if diff_process.returncode != 0:
-    # Assume error was already printed to stderr.
-    sys.exit(2)
-  return changed_lines
-
-
-def compute_diff(commits, files):
-  """Return a subprocess object producing the diff from `commits`.
-
-  The return value's `stdin` file object will produce a patch with the
-  differences between the working directory and the first commit if a single
-  one was specified, or the difference between both specified commits, filtered
-  on `files` (if non-empty).  Zero context lines are used in the patch."""
-  git_tool = 'diff-index'
-  if len(commits) > 1:
-    git_tool = 'diff-tree'
-  cmd = ['git', git_tool, '-p', '-U0'] + commits + ['--']
-  cmd.extend(files)
-  p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
-  p.stdin.close()
-  return p
-
-
-def extract_lines(patch_file):
-  """Extract the changed lines in `patch_file`.
-
-  The return value is a dictionary mapping filename to a list of (start_line,
-  line_count) pairs.
-
-  The input must have been produced with ``-U0``, meaning unidiff format with
-  zero lines of context.  The return value is a dict mapping filename to a
-  list of line `Range`s."""
-  matches = {}
-  for line in patch_file:
-    line = convert_string(line)
-    match = re.search(r'^\+\+\+\ [^/]+/(.*)', line)
-    if match:
-      filename = match.group(1).rstrip('\r\n')
-    match = re.search(r'^@@ -[0-9,]+ \+(\d+)(,(\d+))?', line)
-    if match:
-      start_line = int(match.group(1))
-      line_count = 1
-      if match.group(3):
-        line_count = int(match.group(3))
-      if line_count > 0:
-        matches.setdefault(filename, []).append(Range(start_line, line_count))
-  return matches
-
-
-def filter_by_extension(dictionary, allowed_extensions):
-  """Delete every key in `dictionary` that doesn't have an allowed extension.
-
-  `allowed_extensions` must be a collection of lowercase file extensions,
-  excluding the period."""
-  allowed_extensions = frozenset(allowed_extensions)
-  for filename in list(dictionary.keys()):
-    base_ext = filename.rsplit('.', 1)
-    if len(base_ext) == 1 and '' in allowed_extensions:
-        continue
-    if len(base_ext) == 1 or base_ext[1].lower() not in allowed_extensions:
-      del dictionary[filename]
-
-
-def cd_to_toplevel():
-  """Change to the top level of the git repository."""
-  toplevel = run('git', 'rev-parse', '--show-toplevel')
-  os.chdir(toplevel)
-
-
-def create_tree_from_workdir(filenames):
-  """Create a new git tree with the given files from the working directory.
-
-  Returns the object ID (SHA-1) of the created tree."""
-  return create_tree(filenames, '--stdin')
-
-
-def run_clang_format_and_save_to_tree(changed_lines, revision=None,
-                                      binary='clang-format', style=None):
-  """Run clang-format on each file and save the result to a git tree.
-
-  Returns the object ID (SHA-1) of the created tree."""
-  def iteritems(container):
-      try:
-          return container.iteritems() # Python 2
-      except AttributeError:
-          return container.items() # Python 3
-  def index_info_generator():
-    for filename, line_ranges in iteritems(changed_lines):
-      if revision:
-        git_metadata_cmd = ['git', 'ls-tree',
-                            '%s:%s' % (revision, os.path.dirname(filename)),
-                            os.path.basename(filename)]
-        git_metadata = subprocess.Popen(git_metadata_cmd, stdin=subprocess.PIPE,
-                                        stdout=subprocess.PIPE)
-        stdout = git_metadata.communicate()[0]
-        mode = oct(int(stdout.split()[0], 8))
-      else:
-        mode = oct(os.stat(filename).st_mode)
-      # Adjust python3 octal format so that it matches what git expects
-      if mode.startswith('0o'):
-          mode = '0' + mode[2:]
-      blob_id = clang_format_to_blob(filename, line_ranges,
-                                     revision=revision,
-                                     binary=binary,
-                                     style=style)
-      yield '%s %s\t%s' % (mode, blob_id, filename)
-  return create_tree(index_info_generator(), '--index-info')
-
-
-def create_tree(input_lines, mode):
-  """Create a tree object from the given input.
-
-  If mode is '--stdin', it must be a list of filenames.  If mode is
-  '--index-info' is must be a list of values suitable for "git update-index
-  --index-info", such as "<mode> <SP> <sha1> <TAB> <filename>".  Any other mode
-  is invalid."""
-  assert mode in ('--stdin', '--index-info')
-  cmd = ['git', 'update-index', '--add', '-z', mode]
-  with temporary_index_file():
-    p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
-    for line in input_lines:
-      p.stdin.write(to_bytes('%s\0' % line))
-    p.stdin.close()
-    if p.wait() != 0:
-      die('`%s` failed' % ' '.join(cmd))
-    tree_id = run('git', 'write-tree')
-    return tree_id
-
-
-def clang_format_to_blob(filename, line_ranges, revision=None,
-                         binary='clang-format', style=None):
-  """Run clang-format on the given file and save the result to a git blob.
-
-  Runs on the file in `revision` if not None, or on the file in the working
-  directory if `revision` is None.
-
-  Returns the object ID (SHA-1) of the created blob."""
-  clang_format_cmd = [binary]
-  if style:
-    clang_format_cmd.extend(['-style='+style])
-  clang_format_cmd.extend([
-      '-lines=%s:%s' % (start_line, start_line+line_count-1)
-      for start_line, line_count in line_ranges])
-  if revision:
-    clang_format_cmd.extend(['-assume-filename='+filename])
-    git_show_cmd = ['git', 'cat-file', 'blob', '%s:%s' % (revision, filename)]
-    git_show = subprocess.Popen(git_show_cmd, stdin=subprocess.PIPE,
-                                stdout=subprocess.PIPE)
-    git_show.stdin.close()
-    clang_format_stdin = git_show.stdout
-  else:
-    clang_format_cmd.extend([filename])
-    git_show = None
-    clang_format_stdin = subprocess.PIPE
-  try:
-    clang_format = subprocess.Popen(clang_format_cmd, stdin=clang_format_stdin,
-                                    stdout=subprocess.PIPE)
-    if clang_format_stdin == subprocess.PIPE:
-      clang_format_stdin = clang_format.stdin
-  except OSError as e:
-    if e.errno == errno.ENOENT:
-      die('cannot find executable "%s"' % binary)
-    else:
-      raise
-  clang_format_stdin.close()
-  hash_object_cmd = ['git', 'hash-object', '-w', '--path='+filename, '--stdin']
-  hash_object = subprocess.Popen(hash_object_cmd, stdin=clang_format.stdout,
-                                 stdout=subprocess.PIPE)
-  clang_format.stdout.close()
-  stdout = hash_object.communicate()[0]
-  if hash_object.returncode != 0:
-    die('`%s` failed' % ' '.join(hash_object_cmd))
-  if clang_format.wait() != 0:
-    die('`%s` failed' % ' '.join(clang_format_cmd))
-  if git_show and git_show.wait() != 0:
-    die('`%s` failed' % ' '.join(git_show_cmd))
-  return convert_string(stdout).rstrip('\r\n')
-
-
-@contextlib.contextmanager
-def temporary_index_file(tree=None):
-  """Context manager for setting GIT_INDEX_FILE to a temporary file and deleting
-  the file afterward."""
-  index_path = create_temporary_index(tree)
-  old_index_path = os.environ.get('GIT_INDEX_FILE')
-  os.environ['GIT_INDEX_FILE'] = index_path
-  try:
-    yield
-  finally:
-    if old_index_path is None:
-      del os.environ['GIT_INDEX_FILE']
-    else:
-      os.environ['GIT_INDEX_FILE'] = old_index_path
-    os.remove(index_path)
-
-
-def create_temporary_index(tree=None):
-  """Create a temporary index file and return the created file's path.
-
-  If `tree` is not None, use that as the tree to read in.  Otherwise, an
-  empty index is created."""
-  gitdir = run('git', 'rev-parse', '--git-dir')
-  path = os.path.join(gitdir, temp_index_basename)
-  if tree is None:
-    tree = '--empty'
-  run('git', 'read-tree', '--index-output='+path, tree)
-  return path
-
-
-def print_diff(old_tree, new_tree):
-  """Print the diff between the two trees to stdout."""
-  # We use the porcelain 'diff' and not plumbing 'diff-tree' because the output
-  # is expected to be viewed by the user, and only the former does nice things
-  # like color and pagination.
-  #
-  # We also only print modified files since `new_tree` only contains the files
-  # that were modified, so unmodified files would show as deleted without the
-  # filter.
-  subprocess.check_call(['git', 'diff', '--diff-filter=M', old_tree, new_tree,
-                         '--'])
-
-
-def apply_changes(old_tree, new_tree, force=False, patch_mode=False):
-  """Apply the changes in `new_tree` to the working directory.
-
-  Bails if there are local changes in those files and not `force`.  If
-  `patch_mode`, runs `git checkout --patch` to select hunks interactively."""
-  changed_files = run('git', 'diff-tree', '--diff-filter=M', '-r', '-z',
-                      '--name-only', old_tree,
-                      new_tree).rstrip('\0').split('\0')
-  if not force:
-    unstaged_files = run('git', 'diff-files', '--name-status', *changed_files)
-    if unstaged_files:
-      print('The following files would be modified but '
-                'have unstaged changes:', file=sys.stderr)
-      print(unstaged_files, file=sys.stderr)
-      print('Please commit, stage, or stash them first.', file=sys.stderr)
-      sys.exit(2)
-  if patch_mode:
-    # In patch mode, we could just as well create an index from the new tree
-    # and checkout from that, but then the user will be presented with a
-    # message saying "Discard ... from worktree".  Instead, we use the old
-    # tree as the index and checkout from new_tree, which gives the slightly
-    # better message, "Apply ... to index and worktree".  This is not quite
-    # right, since it won't be applied to the user's index, but oh well.
-    with temporary_index_file(old_tree):
-      subprocess.check_call(['git', 'checkout', '--patch', new_tree])
-    index_tree = old_tree
-  else:
-    with temporary_index_file(new_tree):
-      run('git', 'checkout-index', '-a', '-f')
-  return changed_files
-
-
-def run(*args, **kwargs):
-  stdin = kwargs.pop('stdin', '')
-  verbose = kwargs.pop('verbose', True)
-  strip = kwargs.pop('strip', True)
-  for name in kwargs:
-    raise TypeError("run() got an unexpected keyword argument '%s'" % name)
-  p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-                       stdin=subprocess.PIPE)
-  stdout, stderr = p.communicate(input=stdin)
-
-  stdout = convert_string(stdout)
-  stderr = convert_string(stderr)
-
-  if p.returncode == 0:
-    if stderr:
-      if verbose:
-        print('`%s` printed to stderr:' % ' '.join(args), file=sys.stderr)
-      print(stderr.rstrip(), file=sys.stderr)
-    if strip:
-      stdout = stdout.rstrip('\r\n')
-    return stdout
-  if verbose:
-    print('`%s` returned %s' % (' '.join(args), p.returncode), file=sys.stderr)
-  if stderr:
-    print(stderr.rstrip(), file=sys.stderr)
-  sys.exit(2)
-
-
-def die(message):
-  print('error:', message, file=sys.stderr)
-  sys.exit(2)
-
-
-def to_bytes(str_input):
-    # Encode to UTF-8 to get binary data.
-    if isinstance(str_input, bytes):
-        return str_input
-    return str_input.encode('utf-8')
-
-
-def to_string(bytes_input):
-    if isinstance(bytes_input, str):
-        return bytes_input
-    return bytes_input.encode('utf-8')
-
-
-def convert_string(bytes_input):
-    try:
-        return to_string(bytes_input.decode('utf-8'))
-    except AttributeError: # 'str' object has no attribute 'decode'.
-        return str(bytes_input)
-    except UnicodeError:
-        return str(bytes_input)
-
-if __name__ == '__main__':
-  main()
diff --git a/clang-stable/lib64/libc++.so b/clang-stable/lib64/libc++.so
deleted file mode 120000
index 7515e92..0000000
--- a/clang-stable/lib64/libc++.so
+++ /dev/null
@@ -1 +0,0 @@
-libc++.so.1
\ No newline at end of file
diff --git a/clang-stable/lib64/libc++.so.1 b/clang-stable/lib64/libc++.so.1
deleted file mode 120000
index a9c46ec..0000000
--- a/clang-stable/lib64/libc++.so.1
+++ /dev/null
@@ -1 +0,0 @@
-libc++.so.1.0
\ No newline at end of file
diff --git a/clang-stable/lib64/libc++.so.1.0 b/clang-stable/lib64/libc++.so.1.0
deleted file mode 100644
index f246bcb..0000000
--- a/clang-stable/lib64/libc++.so.1.0
+++ /dev/null
Binary files differ
diff --git a/llvm-binutils-stable/llvm-ar b/llvm-binutils-stable/llvm-ar
deleted file mode 120000
index 5c78294..0000000
--- a/llvm-binutils-stable/llvm-ar
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-ar
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-as b/llvm-binutils-stable/llvm-as
deleted file mode 120000
index ad1cb96..0000000
--- a/llvm-binutils-stable/llvm-as
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-as
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-cov b/llvm-binutils-stable/llvm-cov
deleted file mode 120000
index 248d13b..0000000
--- a/llvm-binutils-stable/llvm-cov
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-cov
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-dis b/llvm-binutils-stable/llvm-dis
deleted file mode 120000
index b85c5b4..0000000
--- a/llvm-binutils-stable/llvm-dis
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-dis
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-link b/llvm-binutils-stable/llvm-link
deleted file mode 120000
index da81f28..0000000
--- a/llvm-binutils-stable/llvm-link
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-link
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-modextract b/llvm-binutils-stable/llvm-modextract
deleted file mode 120000
index 27e487e..0000000
--- a/llvm-binutils-stable/llvm-modextract
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-modextract
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-nm b/llvm-binutils-stable/llvm-nm
deleted file mode 120000
index 36336bd..0000000
--- a/llvm-binutils-stable/llvm-nm
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-nm
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-objcopy b/llvm-binutils-stable/llvm-objcopy
deleted file mode 120000
index a8b4c9f..0000000
--- a/llvm-binutils-stable/llvm-objcopy
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-objcopy
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-objdump b/llvm-binutils-stable/llvm-objdump
deleted file mode 120000
index 04481ef..0000000
--- a/llvm-binutils-stable/llvm-objdump
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-objdump
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-profdata b/llvm-binutils-stable/llvm-profdata
deleted file mode 120000
index bfc39af..0000000
--- a/llvm-binutils-stable/llvm-profdata
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-profdata
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-readobj b/llvm-binutils-stable/llvm-readobj
deleted file mode 120000
index 48b55b3..0000000
--- a/llvm-binutils-stable/llvm-readobj
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-readobj
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-strip b/llvm-binutils-stable/llvm-strip
deleted file mode 120000
index 4ea9c8f..0000000
--- a/llvm-binutils-stable/llvm-strip
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-strip
\ No newline at end of file
diff --git a/llvm-binutils-stable/llvm-symbolizer b/llvm-binutils-stable/llvm-symbolizer
deleted file mode 120000
index bfd772d..0000000
--- a/llvm-binutils-stable/llvm-symbolizer
+++ /dev/null
@@ -1 +0,0 @@
-../clang-r353983c/bin/llvm-symbolizer
\ No newline at end of file
diff --git a/profiles/6.0.1.profdata b/profiles/6.0.1.profdata
deleted file mode 100644
index 8af0bd3..0000000
--- a/profiles/6.0.1.profdata
+++ /dev/null
Binary files differ
diff --git a/soong/Android.bp b/soong/Android.bp
deleted file mode 100644
index ab020a5..0000000
--- a/soong/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-// Copyright (C) 2017 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-bootstrap_go_package {
-    name: "soong-clang-prebuilts",
-    pkgPath: "android/soong/prebuilts/clang/host/linux-x86/clangprebuilts",
-    deps: [
-        "blueprint",
-        "soong-android",
-        "soong-cc",
-        "soong-cc-config"
-    ],
-    srcs: [
-        "clangprebuilts.go",
-    ],
-    pluginFor: ["soong_build"],
-}
diff --git a/soong/clangprebuilts.go b/soong/clangprebuilts.go
deleted file mode 100644
index f16f3ba..0000000
--- a/soong/clangprebuilts.go
+++ /dev/null
@@ -1,190 +0,0 @@
-//
-// Copyright (C) 2017 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-package clangprebuilts
-
-import (
-	"path"
-	"strings"
-
-	"github.com/google/blueprint/proptools"
-
-	"android/soong/android"
-	"android/soong/cc"
-	"android/soong/cc/config"
-)
-
-// This module is used to generate libfuzzer, libomp static libraries and
-// libclang_rt.* shared libraries. When LLVM_PREBUILTS_VERSION and
-// LLVM_RELEASE_VERSION are set, the library will generated from the given
-// path.
-
-func init() {
-	android.RegisterModuleType("llvm_prebuilt_library_static",
-		llvmPrebuiltLibraryStaticFactory)
-	android.RegisterModuleType("libclang_rt_prebuilt_library_shared",
-		libClangRtPrebuiltLibrarySharedFactory)
-	android.RegisterModuleType("libclang_rt_prebuilt_library_static",
-		libClangRtPrebuiltLibraryStaticFactory)
-	android.RegisterModuleType("libclang_rt_llndk_library",
-		libClangRtLLndkLibraryFactory)
-}
-
-func getClangPrebuiltDir(ctx android.LoadHookContext) string {
-	return path.Join(
-		"./",
-		ctx.AConfig().GetenvWithDefault("LLVM_PREBUILTS_VERSION", config.ClangDefaultVersion),
-	)
-}
-
-func getClangResourceDir(ctx android.LoadHookContext) string {
-	clangDir := getClangPrebuiltDir(ctx)
-	releaseVersion := ctx.AConfig().GetenvWithDefault("LLVM_RELEASE_VERSION",
-		config.ClangDefaultShortVersion)
-	return path.Join(clangDir, "lib64", "clang", releaseVersion, "lib", "linux")
-}
-
-type archProps struct {
-	Android_arm struct {
-		Srcs []string
-	}
-	Android_arm64 struct {
-		Srcs []string
-	}
-	Android_mips struct {
-		Srcs []string
-	}
-	Android_mips64 struct {
-		Srcs []string
-	}
-	Android_x86 struct {
-		Srcs []string
-	}
-	Android_x86_64 struct {
-		Srcs []string
-	}
-}
-
-func llvmPrebuiltLibraryStatic(ctx android.LoadHookContext) {
-	libDir := getClangResourceDir(ctx)
-	name := strings.TrimPrefix(ctx.ModuleName(), "prebuilt_") + ".a"
-
-	type props struct {
-		Export_include_dirs []string
-		Target              archProps
-	}
-
-	p := &props{}
-
-	if (name == "libFuzzer.a") {
-		headerDir := path.Join(getClangPrebuiltDir(ctx), "prebuilt_include", "llvm", "lib", "Fuzzer")
-		p.Export_include_dirs = []string{headerDir}
-	}
-
-	p.Target.Android_arm.Srcs = []string{path.Join(libDir, "arm", name)}
-	p.Target.Android_arm64.Srcs = []string{path.Join(libDir, "aarch64", name)}
-	p.Target.Android_mips.Srcs = []string{path.Join(libDir, "mipsel", name)}
-	p.Target.Android_mips64.Srcs = []string{path.Join(libDir, "mips64el", name)}
-	p.Target.Android_x86.Srcs = []string{path.Join(libDir, "i386", name)}
-	p.Target.Android_x86_64.Srcs = []string{path.Join(libDir, "x86_64", name)}
-	ctx.AppendProperties(p)
-}
-
-func libClangRtPrebuiltLibraryShared(ctx android.LoadHookContext) {
-	if ctx.AConfig().IsEnvTrue("FORCE_BUILD_SANITIZER_SHARED_OBJECTS") {
-		return
-	}
-
-	libDir := getClangResourceDir(ctx)
-
-	type props struct {
-		Srcs               []string
-		System_shared_libs []string
-		Sanitize           struct {
-			Never *bool
-		}
-		Strip struct {
-			None *bool
-		}
-		Pack_relocations *bool
-		Stl              *string
-	}
-
-	p := &props{}
-
-	name := strings.TrimPrefix(ctx.ModuleName(), "prebuilt_")
-
-	p.Srcs = []string{path.Join(libDir, name+".so")}
-	p.System_shared_libs = []string{}
-	p.Sanitize.Never = proptools.BoolPtr(true)
-	p.Strip.None = proptools.BoolPtr(true)
-	disable := false
-	p.Pack_relocations = &disable
-	none := "none"
-	p.Stl = &none
-	ctx.AppendProperties(p)
-}
-
-func libClangRtPrebuiltLibraryStatic(ctx android.LoadHookContext) {
-	libDir := getClangResourceDir(ctx)
-
-	type props struct {
-		Srcs []string
-	}
-
-	name := strings.TrimPrefix(ctx.ModuleName(), "prebuilt_")
-
-	p := &props{}
-	p.Srcs = []string{path.Join(libDir, name+".a")}
-	ctx.AppendProperties(p)
-}
-
-func libClangRtLLndkLibrary(ctx android.LoadHookContext) {
-	libDir := getClangResourceDir(ctx)
-
-	type props struct {
-		Symbol_file *string
-	}
-
-	p := &props{}
-	symbol_file := string(path.Join(libDir, strings.TrimSuffix(ctx.ModuleName(), ".llndk") + ".map.txt"))
-	p.Symbol_file = proptools.StringPtr(symbol_file)
-	ctx.AppendProperties(p)
-}
-
-func llvmPrebuiltLibraryStaticFactory() android.Module {
-	module, _ := cc.NewPrebuiltStaticLibrary(android.DeviceSupported)
-	android.AddLoadHook(module, llvmPrebuiltLibraryStatic)
-	return module.Init()
-}
-
-func libClangRtPrebuiltLibrarySharedFactory() android.Module {
-	module, _ := cc.NewPrebuiltSharedLibrary(android.DeviceSupported)
-	android.AddLoadHook(module, libClangRtPrebuiltLibraryShared)
-	return module.Init()
-}
-
-func libClangRtPrebuiltLibraryStaticFactory() android.Module {
-	module, _ := cc.NewPrebuiltStaticLibrary(android.DeviceSupported)
-	android.AddLoadHook(module, libClangRtPrebuiltLibraryStatic)
-	return module.Init()
-}
-
-func libClangRtLLndkLibraryFactory() android.Module {
-	module := cc.NewLLndkStubLibrary()
-	android.AddLoadHook(module, libClangRtLLndkLibrary)
-	return module.Init()
-}
