libclang_rt* libs are now specified in Android.bp

Bug: 63053790
Test: BOARD_VNDK_VERSION=current m -j libstagefright_foundation.vendor
Test: repo init to aosp-llvm branch, then run python
external/clang/build.py --no-multi-stage --no-debug-clang
Test: SANITIZE_TARGET=address m -j <a_module>

Change-Id: I37e6209a82ffe9f62f76a0c533ff81b0e3290894
diff --git a/Android.bp b/Android.bp
index 9981e4d..a46a765 100644
--- a/Android.bp
+++ b/Android.bp
@@ -21,6 +21,138 @@
     },
 }
 
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.asan-arm-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        arm: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.asan-aarch64-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        arm64: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.asan-mips-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        mips: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.asan-mips64-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        mips64: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.asan-i686-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        x86: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.asan-x86_64-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        x86_64: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.ubsan_standalone-arm-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        arm: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.ubsan_standalone-aarch64-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        arm64: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.ubsan_standalone-mips-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        mips: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.ubsan_standalone-mips64-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        mips64: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.ubsan_standalone-i686-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        x86: {
+            enabled: true,
+        },
+    },
+}
+
+libclang_rt_prebuilt_library_shared {
+    name: "libclang_rt.ubsan_standalone-x86_64-android",
+    enabled: false,
+    vendor_available: true,
+    arch: {
+        x86_64: {
+            enabled: true,
+        },
+    },
+}
+
 subdirs = [
     "soong",
 ]
diff --git a/Android.mk b/Android.mk
index 89758b2..1cf3f5c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -22,138 +22,6 @@
 
 libclang_dir := $(LLVM_PREBUILTS_VERSION)/lib64/clang/$(LLVM_RELEASE_VERSION)
 
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.asan-arm-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := arm
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.asan-aarch64-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := arm64
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib64
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.asan-i686-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := x86
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.asan-mips-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := mips
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.asan-mips64-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := mips64
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib64
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.ubsan_standalone-arm-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := arm
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.ubsan_standalone-aarch64-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := arm64
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib64
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.ubsan_standalone-i686-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := x86
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.ubsan_standalone-x86_64-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := x86_64
-LOCAL_MODULE_PATH_64 := $(TARGET_OUT)/lib64
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.ubsan_standalone-mips-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := mips
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libclang_rt.ubsan_standalone-mips64-android
-LOCAL_SRC_FILES := $(libclang_dir)/lib/linux/$(LOCAL_MODULE).so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_TARGET_ARCH := mips64
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib64
-LOCAL_SANITIZE := never
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_CXX_STL := none
-include $(BUILD_PREBUILT)
-
 # Also build/install the newest asan_test for each arch
 # We rename it to asan-test for now to avoid duplicate definitions.
 
diff --git a/soong/Android.bp b/soong/Android.bp
index 0bb87a8..ab020a5 100644
--- a/soong/Android.bp
+++ b/soong/Android.bp
@@ -15,8 +15,8 @@
 //
 
 bootstrap_go_package {
-    name: "soong-libfuzzer",
-    pkgPath: "android/soong/prebuilts/clang/host/linux-x86",
+    name: "soong-clang-prebuilts",
+    pkgPath: "android/soong/prebuilts/clang/host/linux-x86/clangprebuilts",
     deps: [
         "blueprint",
         "soong-android",
@@ -24,7 +24,7 @@
         "soong-cc-config"
     ],
     srcs: [
-        "libfuzzer.go",
+        "clangprebuilts.go",
     ],
     pluginFor: ["soong_build"],
 }
diff --git a/soong/libfuzzer.go b/soong/clangprebuilts.go
similarity index 61%
rename from soong/libfuzzer.go
rename to soong/clangprebuilts.go
index b6cc70a..71e0b50 100644
--- a/soong/libfuzzer.go
+++ b/soong/clangprebuilts.go
@@ -14,11 +14,12 @@
 // limitations under the License.
 //
 
-package libfuzzer
+package clangprebuilts
 
 import (
 	"path"
 	"path/filepath"
+	"strings"
 
 	"github.com/google/blueprint/proptools"
 
@@ -27,13 +28,48 @@
 	"android/soong/cc/config"
 )
 
-// This module is used to generate libfuzzer static libraries. When
+// This module is used to generate libfuzzer 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("libfuzzer_prebuilt_library_static",
 		libfuzzerPrebuiltLibraryStaticFactory)
+	android.RegisterModuleType("libclang_rt_prebuilt_library_shared",
+		libClangRtPrebuiltLibrarySharedFactory)
+}
+
+func getClangDirs(ctx android.LoadHookContext) (libDir string, headerDir string) {
+	clangDir := path.Join(
+		"./",
+		ctx.AConfig().GetenvWithDefault("LLVM_PREBUILTS_VERSION", config.ClangDefaultVersion),
+	)
+	headerDir = path.Join(clangDir, "prebuilt_include", "llvm", "lib", "Fuzzer")
+	releaseVersion := ctx.AConfig().GetenvWithDefault("LLVM_RELEASE_VERSION",
+		config.ClangDefaultShortVersion)
+	libDir = path.Join(clangDir, "lib64", "clang", releaseVersion, "lib", "linux")
+	return
+}
+
+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 libfuzzerPrebuiltLibraryStatic(ctx android.LoadHookContext) {
@@ -52,38 +88,12 @@
 		}
 	}
 
-	clangDir := path.Join(
-		"./",
-		ctx.AConfig().GetenvWithDefault("LLVM_PREBUILTS_VERSION", config.ClangDefaultVersion),
-	)
-	headerDir := path.Join(clangDir, "prebuilt_include", "llvm", "lib", "Fuzzer")
-	releaseVersion := ctx.AConfig().GetenvWithDefault("LLVM_RELEASE_VERSION",
-		config.ClangDefaultShortVersion)
-	libDir := path.Join(clangDir, "lib64", "clang", releaseVersion, "lib", "linux")
+	libDir, headerDir := getClangDirs(ctx)
 
 	type props struct {
-		Enabled *bool
+		Enabled             *bool
 		Export_include_dirs []string
-		Target              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
-			}
-		}
+		Target              archProps
 	}
 
 	p := &props{}
@@ -99,8 +109,49 @@
 	ctx.AppendProperties(p)
 }
 
+func libClangRtPrebuiltLibraryShared(ctx android.LoadHookContext) {
+	if ctx.AConfig().IsEnvTrue("FORCE_BUILD_SANITIZER_SHARED_OBJECTS") {
+		return
+	}
+
+	libDir, _ := getClangDirs(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.Replace(ctx.ModuleName(), "prebuilt_", "", 1)
+
+	p.Srcs = []string{path.Join(libDir, name+".so")}
+	p.System_shared_libs = []string{}
+	p.Sanitize.Never = true
+	p.Strip.None = true
+	disable := false
+	p.Pack_relocations = &disable
+	none := "none"
+	p.Stl = &none
+	ctx.AppendProperties(p)
+}
+
 func libfuzzerPrebuiltLibraryStaticFactory() android.Module {
 	module, _ := cc.NewPrebuiltStaticLibrary(android.HostAndDeviceSupported)
 	android.AddLoadHook(module, libfuzzerPrebuiltLibraryStatic)
 	return module.Init()
 }
+
+func libClangRtPrebuiltLibrarySharedFactory() android.Module {
+	module, _ := cc.NewPrebuiltSharedLibrary(android.DeviceSupported)
+	android.AddLoadHook(module, libClangRtPrebuiltLibraryShared)
+	return module.Init()
+}