Merge "Support instrumenting all PGO-enabled modules"
diff --git a/android/androidmk.go b/android/androidmk.go
index 704b560..0ea7564 100644
--- a/android/androidmk.go
+++ b/android/androidmk.go
@@ -237,7 +237,7 @@
 			fmt.Fprintln(&data.preamble, "LOCAL_ODM_MODULE := true")
 		}
 		if Bool(amod.commonProperties.Product_specific) {
-			fmt.Fprintln(&data.preamble, "LOCAL_OEM_MODULE := true")
+			fmt.Fprintln(&data.preamble, "LOCAL_PRODUCT_MODULE := true")
 		}
 		if amod.commonProperties.Owner != nil {
 			fmt.Fprintln(&data.preamble, "LOCAL_MODULE_OWNER :=", *amod.commonProperties.Owner)
diff --git a/android/config.go b/android/config.go
index 2ce7f48..b5ec975 100644
--- a/android/config.go
+++ b/android/config.go
@@ -676,11 +676,11 @@
 	return "odm"
 }
 
-func (c *deviceConfig) OemPath() string {
-	if c.config.ProductVariables.OemPath != nil {
-		return *c.config.ProductVariables.OemPath
+func (c *deviceConfig) ProductPath() string {
+	if c.config.ProductVariables.ProductPath != nil {
+		return *c.config.ProductVariables.ProductPath
 	}
-	return "oem"
+	return "product"
 }
 
 func (c *deviceConfig) BtConfigIncludeDir() string {
diff --git a/android/module.go b/android/module.go
index 0fb9479..14b9f41 100644
--- a/android/module.go
+++ b/android/module.go
@@ -232,8 +232,8 @@
 	Device_specific *bool
 
 	// whether this module is specific to a software configuration of a product (e.g. country,
-	// network operator, etc). When set to true, it is installed into /oem (or /system/oem if
-	// oem partition does not exist).
+	// network operator, etc). When set to true, it is installed into /product (or
+	// /system/product if product partition does not exist).
 	Product_specific *bool
 
 	// init.rc files to be installed if this module is installed
diff --git a/android/paths.go b/android/paths.go
index 4d9c858..e941e96 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -850,7 +850,7 @@
 		} else if ctx.DeviceSpecific() {
 			partition = ctx.DeviceConfig().OdmPath()
 		} else if ctx.ProductSpecific() {
-			partition = ctx.DeviceConfig().OemPath()
+			partition = ctx.DeviceConfig().ProductPath()
 		} else {
 			partition = "system"
 		}
diff --git a/android/paths_test.go b/android/paths_test.go
index 110974f..61a172f 100644
--- a/android/paths_test.go
+++ b/android/paths_test.go
@@ -264,7 +264,7 @@
 			out: "target/product/test_device/odm/bin/my_test",
 		},
 		{
-			name: "oem binary",
+			name: "product binary",
 			ctx: &moduleInstallPathContextImpl{
 				androidBaseContextImpl: androidBaseContextImpl{
 					target: deviceTarget,
@@ -272,7 +272,7 @@
 				},
 			},
 			in:  []string{"bin", "my_test"},
-			out: "target/product/test_device/oem/bin/my_test",
+			out: "target/product/test_device/product/bin/my_test",
 		},
 
 		{
@@ -311,7 +311,7 @@
 			out: "target/product/test_device/data/nativetest/my_test",
 		},
 		{
-			name: "oem native test binary",
+			name: "product native test binary",
 			ctx: &moduleInstallPathContextImpl{
 				androidBaseContextImpl: androidBaseContextImpl{
 					target: deviceTarget,
@@ -359,7 +359,7 @@
 			out: "target/product/test_device/data/asan/odm/bin/my_test",
 		},
 		{
-			name: "sanitized oem binary",
+			name: "sanitized product binary",
 			ctx: &moduleInstallPathContextImpl{
 				androidBaseContextImpl: androidBaseContextImpl{
 					target: deviceTarget,
@@ -368,7 +368,7 @@
 				inSanitizerDir: true,
 			},
 			in:  []string{"bin", "my_test"},
-			out: "target/product/test_device/data/asan/oem/bin/my_test",
+			out: "target/product/test_device/data/asan/product/bin/my_test",
 		},
 
 		{
@@ -410,7 +410,7 @@
 			out: "target/product/test_device/data/asan/data/nativetest/my_test",
 		},
 		{
-			name: "sanitized oem native test binary",
+			name: "sanitized product native test binary",
 			ctx: &moduleInstallPathContextImpl{
 				androidBaseContextImpl: androidBaseContextImpl{
 					target: deviceTarget,
diff --git a/android/variable.go b/android/variable.go
index 40fa45e..2c2a0cf 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -174,9 +174,9 @@
 	CFIExcludePaths *[]string `json:",omitempty"`
 	CFIIncludePaths *[]string `json:",omitempty"`
 
-	VendorPath *string `json:",omitempty"`
-	OdmPath    *string `json:",omitempty"`
-	OemPath    *string `json:",omitempty"`
+	VendorPath  *string `json:",omitempty"`
+	OdmPath     *string `json:",omitempty"`
+	ProductPath *string `json:",omitempty"`
 
 	ClangTidy  *bool   `json:",omitempty"`
 	TidyChecks *string `json:",omitempty"`
diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go
index 3e134b6..960f103 100644
--- a/androidmk/cmd/androidmk/android.go
+++ b/androidmk/cmd/androidmk/android.go
@@ -128,6 +128,7 @@
 
 			"LOCAL_JAVA_RESOURCE_DIRS":    "java_resource_dirs",
 			"LOCAL_JAVACFLAGS":            "javacflags",
+			"LOCAL_ERROR_PRONE_FLAGS":     "errorprone.javacflags",
 			"LOCAL_DX_FLAGS":              "dxflags",
 			"LOCAL_JAVA_LIBRARIES":        "libs",
 			"LOCAL_STATIC_JAVA_LIBRARIES": "static_libs",
@@ -157,7 +158,7 @@
 			"LOCAL_PROPRIETARY_MODULE":       "proprietary",
 			"LOCAL_VENDOR_MODULE":            "vendor",
 			"LOCAL_ODM_MODULE":               "device_specific",
-			"LOCAL_OEM_MODULE":               "product_specific",
+			"LOCAL_PRODUCT_MODULE":           "product_specific",
 			"LOCAL_EXPORT_PACKAGE_RESOURCES": "export_package_resources",
 			"LOCAL_PRIVILEGED_MODULE":        "privileged",
 
diff --git a/androidmk/cmd/androidmk/androidmk_test.go b/androidmk/cmd/androidmk/androidmk_test.go
index c85aaaa..3252791 100644
--- a/androidmk/cmd/androidmk/androidmk_test.go
+++ b/androidmk/cmd/androidmk/androidmk_test.go
@@ -474,6 +474,24 @@
 			}
 		`,
 	},
+	{
+		desc: "errorprone options for java library",
+		in: `
+			include $(CLEAR_VARS)
+			LOCAL_ERROR_PRONE_FLAGS := -Xep:AsyncCallableReturnsNull:ERROR -Xep:AsyncFunctionReturnsNull:ERROR
+			include $(BUILD_JAVA_LIBRARY)
+		`,
+		expected: `
+			java_library {
+				errorprone: {
+					javacflags: [
+						"-Xep:AsyncCallableReturnsNull:ERROR",
+						"-Xep:AsyncFunctionReturnsNull:ERROR",
+					],
+				},
+			}
+		`,
+	},
 }
 
 func reformatBlueprint(input string) string {
diff --git a/cc/builder.go b/cc/builder.go
index fe35d5c..0646132 100644
--- a/cc/builder.go
+++ b/cc/builder.go
@@ -289,7 +289,7 @@
 
 // Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
 func TransformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
-	flags builderFlags, pathDeps android.Paths, genDeps android.Paths) Objects {
+	flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
 
 	objFiles := make(android.Paths, len(srcFiles))
 	var tidyFiles android.Paths
@@ -362,8 +362,8 @@
 				Description: "yasm " + srcFile.Rel(),
 				Output:      objFile,
 				Input:       srcFile,
-				Implicits:   pathDeps,
-				OrderOnly:   genDeps,
+				Implicits:   cFlagsDeps,
+				OrderOnly:   pathDeps,
 				Args: map[string]string{
 					"asFlags": flags.yasmFlags,
 				},
@@ -375,8 +375,8 @@
 				Description: "windres " + srcFile.Rel(),
 				Output:      objFile,
 				Input:       srcFile,
-				Implicits:   pathDeps,
-				OrderOnly:   genDeps,
+				Implicits:   cFlagsDeps,
+				OrderOnly:   pathDeps,
 				Args: map[string]string{
 					"windresCmd": gccCmd(flags.toolchain, "windres"),
 					"flags":      flags.toolchain.WindresFlags(),
@@ -444,8 +444,8 @@
 			Output:          objFile,
 			ImplicitOutputs: implicitOutputs,
 			Input:           srcFile,
-			Implicits:       pathDeps,
-			OrderOnly:       genDeps,
+			Implicits:       cFlagsDeps,
+			OrderOnly:       pathDeps,
 			Args: map[string]string{
 				"cFlags": moduleCflags,
 				"ccCmd":  ccCmd,
diff --git a/cc/cc.go b/cc/cc.go
index 9b1f220..9cc7dfa 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -1510,17 +1510,12 @@
 		mod := mctx.CreateVariations(vendorMode)
 		vendor := mod[0].(*Module)
 		vendor.Properties.UseVndk = true
-	} else if prebuilt, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
+	} else if _, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
 		// Make vendor variants only for the versions in BOARD_VNDK_VERSION and
 		// PRODUCT_EXTRA_VNDK_VERSIONS.
 		mod := mctx.CreateVariations(vendorMode)
 		vendor := mod[0].(*Module)
 		vendor.Properties.UseVndk = true
-		arches := mctx.DeviceConfig().Arches()
-		if len(arches) == 0 || arches[0].ArchType.String() != prebuilt.arch() {
-			vendor.Properties.PreventInstall = true
-			vendor.Properties.HideFromMake = true
-		}
 	} else if m.hasVendorVariant() && !vendorSpecific {
 		// This will be available in both /system and /vendor
 		// or a /system directory that is available to vendor.
diff --git a/cc/compiler.go b/cc/compiler.go
index 7e8e8b8..9b69114 100644
--- a/cc/compiler.go
+++ b/cc/compiler.go
@@ -160,7 +160,7 @@
 type baseCompiler struct {
 	Properties BaseCompilerProperties
 	Proto      android.ProtoProperties
-	genDeps    android.Paths
+	cFlagsDeps android.Paths
 	pathDeps   android.Paths
 	flags      builderFlags
 
@@ -548,16 +548,16 @@
 	srcs := append(android.Paths(nil), compiler.srcsBeforeGen...)
 
 	srcs, genDeps := genSources(ctx, srcs, buildFlags)
-	pathDeps = append(pathDeps, flags.CFlagsDeps...)
+	pathDeps = append(pathDeps, genDeps...)
 
 	compiler.pathDeps = pathDeps
-	compiler.genDeps = genDeps
+	compiler.cFlagsDeps = flags.CFlagsDeps
 
 	// Save src, buildFlags and context
 	compiler.srcs = srcs
 
 	// Compile files listed in c.Properties.Srcs into objects
-	objs := compileObjs(ctx, buildFlags, "", srcs, pathDeps, genDeps)
+	objs := compileObjs(ctx, buildFlags, "", srcs, pathDeps, compiler.cFlagsDeps)
 
 	if ctx.Failed() {
 		return Objects{}
@@ -568,7 +568,7 @@
 
 // Compile a list of source files into objects a specified subdirectory
 func compileObjs(ctx android.ModuleContext, flags builderFlags,
-	subdir string, srcFiles, pathDeps android.Paths, genDeps android.Paths) Objects {
+	subdir string, srcFiles, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
 
-	return TransformSourceToObj(ctx, subdir, srcFiles, flags, pathDeps, genDeps)
+	return TransformSourceToObj(ctx, subdir, srcFiles, flags, pathDeps, cFlagsDeps)
 }
diff --git a/cc/config/global.go b/cc/config/global.go
index 5e99cde..3784824 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -201,7 +201,7 @@
 		}
 		return ClangDefaultShortVersion, nil
 	})
-	pctx.StaticVariable("ClangAsanLibDir", "${ClangPath}/lib64/clang/${ClangShortVersion}/lib/linux")
+	pctx.StaticVariable("ClangAsanLibDir", "${ClangBase}/linux-x86/${ClangVersion}/lib64/clang/${ClangShortVersion}/lib/linux")
 	if runtime.GOOS == "darwin" {
 		pctx.StaticVariable("LLVMGoldPlugin", "${ClangPath}/lib64/LLVMgold.dylib")
 	} else {
diff --git a/cc/library.go b/cc/library.go
index 00282fc..54c5476 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -384,11 +384,11 @@
 	if library.static() {
 		srcs := android.PathsForModuleSrc(ctx, library.Properties.Static.Srcs)
 		objs = objs.Append(compileObjs(ctx, buildFlags, android.DeviceStaticLibrary,
-			srcs, library.baseCompiler.pathDeps, library.baseCompiler.genDeps))
+			srcs, library.baseCompiler.pathDeps, library.baseCompiler.cFlagsDeps))
 	} else if library.shared() {
 		srcs := android.PathsForModuleSrc(ctx, library.Properties.Shared.Srcs)
 		objs = objs.Append(compileObjs(ctx, buildFlags, android.DeviceSharedLibrary,
-			srcs, library.baseCompiler.pathDeps, library.baseCompiler.genDeps))
+			srcs, library.baseCompiler.pathDeps, library.baseCompiler.cFlagsDeps))
 	}
 
 	return objs
@@ -676,8 +676,8 @@
 			}
 			library.reexportFlags(flags)
 			library.reuseExportedFlags = append(library.reuseExportedFlags, flags...)
-			library.reexportDeps(library.baseCompiler.genDeps) // TODO: restrict to aidl deps
-			library.reuseExportedDeps = append(library.reuseExportedDeps, library.baseCompiler.genDeps...)
+			library.reexportDeps(library.baseCompiler.pathDeps) // TODO: restrict to aidl deps
+			library.reuseExportedDeps = append(library.reuseExportedDeps, library.baseCompiler.pathDeps...)
 		}
 	}
 
@@ -689,8 +689,8 @@
 			}
 			library.reexportFlags(flags)
 			library.reuseExportedFlags = append(library.reuseExportedFlags, flags...)
-			library.reexportDeps(library.baseCompiler.genDeps) // TODO: restrict to proto deps
-			library.reuseExportedDeps = append(library.reuseExportedDeps, library.baseCompiler.genDeps...)
+			library.reexportDeps(library.baseCompiler.pathDeps) // TODO: restrict to proto deps
+			library.reuseExportedDeps = append(library.reuseExportedDeps, library.baseCompiler.pathDeps...)
 		}
 	}
 
diff --git a/cc/vndk_prebuilt.go b/cc/vndk_prebuilt.go
index 99e35f3..9c9545d 100644
--- a/cc/vndk_prebuilt.go
+++ b/cc/vndk_prebuilt.go
@@ -110,6 +110,10 @@
 }
 
 func (p *vndkPrebuiltLibraryDecorator) install(ctx ModuleContext, file android.Path) {
+	arches := ctx.DeviceConfig().Arches()
+	if len(arches) == 0 || arches[0].ArchType.String() != p.arch() {
+		return
+	}
 	if p.shared() {
 		if ctx.isVndkSp() {
 			p.baseInstaller.subDir = "vndk-sp-" + p.version()
diff --git a/java/builder.go b/java/builder.go
index bf826e1..7273290 100644
--- a/java/builder.go
+++ b/java/builder.go
@@ -155,6 +155,8 @@
 	aidlFlags     string
 	javaVersion   string
 
+	errorProneExtraJavacFlags string
+
 	kotlincFlags     string
 	kotlincClasspath classpath
 
@@ -210,6 +212,14 @@
 		ctx.ModuleErrorf("cannot build with Error Prone, missing external/error_prone?")
 	}
 
+	if len(flags.errorProneExtraJavacFlags) > 0 {
+		if len(flags.javacFlags) > 0 {
+			flags.javacFlags = flags.errorProneExtraJavacFlags + " " + flags.javacFlags
+		} else {
+			flags.javacFlags = flags.errorProneExtraJavacFlags
+		}
+	}
+
 	transformJavaToClasses(ctx, outputFile, -1, srcFiles, srcJars, flags, nil,
 		"errorprone", "errorprone", errorprone)
 }
diff --git a/java/java.go b/java/java.go
index 65e3b41..a6769e7 100644
--- a/java/java.go
+++ b/java/java.go
@@ -142,6 +142,11 @@
 		Exclude_filter []string
 	}
 
+	Errorprone struct {
+		// List of javac flags that should only be used when running errorprone.
+		Javacflags []string
+	}
+
 	Proto struct {
 		// List of extra options that will be passed to the proto generator.
 		Output_params []string
@@ -646,6 +651,10 @@
 		flags.javacFlags = "$javacFlags"
 	}
 
+	if len(j.properties.Errorprone.Javacflags) > 0 {
+		flags.errorProneExtraJavacFlags = strings.Join(j.properties.Errorprone.Javacflags, " ")
+	}
+
 	// javaVersion flag.
 	sdk := sdkStringToNumber(ctx, String(j.deviceProperties.Sdk_version))
 	if j.properties.Java_version != nil {
diff --git a/java/system_modules.go b/java/system_modules.go
index 196d041..943eaeb 100644
--- a/java/system_modules.go
+++ b/java/system_modules.go
@@ -137,6 +137,10 @@
 				fmt.Fprintln(w, makevar, ":=", system.outputFile.String())
 				fmt.Fprintln(w, ".KATI_READONLY", ":=", makevar)
 				fmt.Fprintln(w, name+":", "$("+makevar+")")
+				fmt.Fprintln(w)
+				makevar = "SOONG_SYSTEM_MODULES_LIBS_" + name
+				fmt.Fprintln(w, makevar, ":=", strings.Join(system.properties.Libs, " "))
+				fmt.Fprintln(w, ".KATI_READONLY :=", makevar)
 			}
 		},
 	}
diff --git a/ui/build/soong.go b/ui/build/soong.go
index 6dafd27..cbb75c7 100644
--- a/ui/build/soong.go
+++ b/ui/build/soong.go
@@ -35,7 +35,7 @@
 		cmd.Environment.Set("BLUEPRINTDIR", "./build/blueprint")
 		cmd.Environment.Set("BOOTSTRAP", "./build/blueprint/bootstrap.bash")
 		cmd.Environment.Set("BUILDDIR", config.SoongOutDir())
-		cmd.Environment.Set("GOROOT", filepath.Join("./prebuilts/go", config.HostPrebuiltTag()))
+		cmd.Environment.Set("GOROOT", "./"+filepath.Join("prebuilts/go", config.HostPrebuiltTag()))
 		cmd.Environment.Set("BLUEPRINT_LIST_FILE", filepath.Join(config.FileListDir(), "Android.bp.list"))
 		cmd.Environment.Set("NINJA_BUILDDIR", config.OutDir())
 		cmd.Environment.Set("SRCDIR", ".")
@@ -99,7 +99,6 @@
 		if config.IsVerbose() {
 			cmd.Args = append(cmd.Args, "-v")
 		}
-		cmd.Environment.Set("GOROOT", filepath.Join("./prebuilts/go", config.HostPrebuiltTag()))
 		cmd.Sandbox = soongSandbox
 		cmd.Stdin = ctx.Stdin()
 		cmd.Stdout = ctx.Stdout()