Support sanitizer builds inside make

Make expects libraries built with address sanitizer to be installed into
/data, and can't handle multiple variants of modules.

Change-Id: Ice575ff6f0788a88f296e7b3ee521a2b9771f55f
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 5b160c6..53c05d4 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -26,6 +26,7 @@
 func (c *Module) AndroidMk() (ret common.AndroidMkData, err error) {
 	ret.OutputFile = c.outputFile
 	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile common.Path) (err error) {
+		fmt.Fprintln(w, "LOCAL_SANITIZE := never")
 		if len(c.Properties.AndroidMkSharedLibs) > 0 {
 			fmt.Fprintln(w, "LOCAL_SHARED_LIBRARIES := "+strings.Join(c.Properties.AndroidMkSharedLibs, " "))
 		}
diff --git a/cc/cc.go b/cc/cc.go
index 1a8ba3b..f740ebc 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -1482,7 +1482,7 @@
 	flags.Nocrt = Bool(library.Properties.Nocrt)
 
 	if !library.static() {
-		libName := ctx.ModuleName()
+		libName := ctx.ModuleName() + library.Properties.VariantName
 		// GCC for Android assumes that -shared means -Bsymbolic, use -Wl,-shared instead
 		sharedFlag := "-Wl,-shared"
 		if flags.Clang || ctx.Host() {
@@ -1663,7 +1663,8 @@
 type libraryInstaller struct {
 	baseInstaller
 
-	linker *libraryLinker
+	linker   *libraryLinker
+	sanitize *sanitize
 }
 
 func (library *libraryInstaller) install(ctx ModuleContext, file common.Path) {
@@ -1672,6 +1673,10 @@
 	}
 }
 
+func (library *libraryInstaller) inData() bool {
+	return library.baseInstaller.inData() || library.sanitize.inData()
+}
+
 func NewLibrary(hod common.HostOrDeviceSupported, shared, static bool) *Module {
 	module := newModule(hod, common.MultilibBoth)
 
@@ -1688,7 +1693,8 @@
 			dir:   "lib",
 			dir64: "lib64",
 		},
-		linker: linker,
+		linker:   linker,
+		sanitize: module.sanitize,
 	}
 
 	return module
diff --git a/cc/sanitize.go b/cc/sanitize.go
index 676d5b3..670443b 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -69,6 +69,7 @@
 
 	SanitizerEnabled bool `blueprint:"mutated"`
 	SanitizeDep      bool `blueprint:"mutated"`
+	InData           bool `blueprint:"mutated"`
 }
 
 type sanitize struct {
@@ -266,6 +267,10 @@
 	return flags
 }
 
+func (sanitize *sanitize) inData() bool {
+	return sanitize.Properties.InData
+}
+
 func (sanitize *sanitize) Sanitizer(t sanitizerType) bool {
 	if sanitize == nil {
 		return false
@@ -314,14 +319,24 @@
 	return func(mctx common.AndroidBottomUpMutatorContext) {
 		if c, ok := mctx.Module().(*Module); ok && c.sanitize != nil {
 			if d, ok := c.linker.(baseLinkerInterface); ok && d.isDependencyRoot() && c.sanitize.Sanitizer(t) {
-				mctx.CreateVariations(t.String())
+				modules := mctx.CreateVariations(t.String())
+				modules[0].(*Module).sanitize.SetSanitizer(t, true)
+				if mctx.AConfig().EmbeddedInMake() {
+					modules[0].(*Module).sanitize.Properties.InData = true
+				}
 			} else if c.sanitize.Properties.SanitizeDep {
-				modules := mctx.CreateVariations("", t.String())
-				modules[0].(*Module).sanitize.SetSanitizer(t, false)
-				modules[1].(*Module).sanitize.SetSanitizer(t, true)
-				modules[1].(*Module).appendVariantName("_" + t.String())
-				modules[0].(*Module).sanitize.Properties.SanitizeDep = false
-				modules[1].(*Module).sanitize.Properties.SanitizeDep = false
+				if mctx.AConfig().EmbeddedInMake() {
+					modules := mctx.CreateVariations(t.String())
+					modules[0].(*Module).sanitize.SetSanitizer(t, true)
+					modules[0].(*Module).sanitize.Properties.InData = true
+				} else {
+					modules := mctx.CreateVariations("", t.String())
+					modules[0].(*Module).sanitize.SetSanitizer(t, false)
+					modules[1].(*Module).sanitize.SetSanitizer(t, true)
+					modules[1].(*Module).appendVariantName("_" + t.String())
+					modules[0].(*Module).sanitize.Properties.SanitizeDep = false
+					modules[1].(*Module).sanitize.Properties.SanitizeDep = false
+				}
 			}
 			c.sanitize.Properties.SanitizeDep = false
 		}