diff --git a/cc/config/x86_linux_host.go b/cc/config/x86_linux_host.go
index 13b5511..f08a379 100644
--- a/cc/config/x86_linux_host.go
+++ b/cc/config/x86_linux_host.go
@@ -234,7 +234,7 @@
 }
 
 func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string {
-	return "i386"
+	return "i686"
 }
 
 func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string {
diff --git a/cc/sanitize.go b/cc/sanitize.go
index ecaafe4..93c4b41 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -334,8 +334,8 @@
 		s.Diag.Cfi = nil
 	}
 
-	// Disable sanitizers that depend on the UBSan runtime for windows/darwin builds.
-	if !ctx.Os().Linux() {
+	// Disable sanitizers that depend on the UBSan runtime for host builds.
+	if ctx.Host() {
 		s.Cfi = nil
 		s.Diag.Cfi = nil
 		s.Misc_undefined = nil
@@ -433,18 +433,11 @@
 func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags {
 	minimalRuntimeLib := config.UndefinedBehaviorSanitizerMinimalRuntimeLibrary(ctx.toolchain()) + ".a"
 	minimalRuntimePath := "${config.ClangAsanLibDir}/" + minimalRuntimeLib
-	builtinsRuntimeLib := config.BuiltinsRuntimeLibrary(ctx.toolchain()) + ".a"
-	builtinsRuntimePath := "${config.ClangAsanLibDir}/" + builtinsRuntimeLib
 
-	if sanitize.Properties.MinimalRuntimeDep {
+	if ctx.Device() && sanitize.Properties.MinimalRuntimeDep {
 		flags.Local.LdFlags = append(flags.Local.LdFlags,
 			minimalRuntimePath,
 			"-Wl,--exclude-libs,"+minimalRuntimeLib)
-		if ctx.Host() {
-			flags.Local.LdFlags = append(flags.Local.LdFlags,
-				builtinsRuntimePath,
-				"-Wl,--exclude-libs,"+builtinsRuntimeLib)
-		}
 	}
 	if !sanitize.Properties.SanitizerEnabled && !sanitize.Properties.UbsanRuntimeDep {
 		return flags
@@ -548,15 +541,11 @@
 			// there will always be undefined symbols in intermediate libraries.
 			_, flags.Global.LdFlags = removeFromList("-Wl,--no-undefined", flags.Global.LdFlags)
 			flags.Local.LdFlags = append(flags.Local.LdFlags, sanitizeArg)
-		}
-
-		if enableMinimalRuntime(sanitize) {
-			flags.Local.CFlags = append(flags.Local.CFlags, strings.Join(minimalRuntimeFlags, " "))
-			flags.libFlags = append([]string{minimalRuntimePath}, flags.libFlags...)
-			flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,--exclude-libs,"+minimalRuntimeLib)
-			if !ctx.toolchain().Bionic() {
-				flags.libFlags = append([]string{builtinsRuntimePath}, flags.libFlags...)
-				flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,--exclude-libs,"+builtinsRuntimeLib)
+		} else {
+			if enableMinimalRuntime(sanitize) {
+				flags.Local.CFlags = append(flags.Local.CFlags, strings.Join(minimalRuntimeFlags, " "))
+				flags.libFlags = append([]string{minimalRuntimePath}, flags.libFlags...)
+				flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,--exclude-libs,"+minimalRuntimeLib)
 			}
 		}
 
@@ -899,46 +888,34 @@
 			runtimeLibrary = config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain)
 		}
 
-		if runtimeLibrary != "" {
-			// Devices and LinuxBionic use the same libraries.
-			if toolchain.Bionic() {
-				if isLlndkLibrary(runtimeLibrary, mctx.Config()) && !c.static() && c.UseVndk() {
-					runtimeLibrary = runtimeLibrary + llndkLibrarySuffix
-				}
-
-				// Adding dependency to the runtime library. We are using *FarVariation*
-				// because the runtime libraries themselves are not mutated by sanitizer
-				// mutators and thus don't have sanitizer variants whereas this module
-				// has been already mutated.
-				//
-				// Note that by adding dependency with {static|shared}DepTag, the lib is
-				// added to libFlags and LOCAL_SHARED_LIBRARIES by cc.Module
-				if c.staticBinary() {
-					// static executable gets static runtime libs
-					mctx.AddFarVariationDependencies(append(mctx.Target().Variations(), []blueprint.Variation{
-						{Mutator: "link", Variation: "static"},
-						c.ImageVariation(),
-					}...), StaticDepTag, append([]string{runtimeLibrary}, extraStaticDeps...)...)
-				} else if !c.static() && !c.header() {
-					// dynamic executable and shared libs get shared runtime libs
-					mctx.AddFarVariationDependencies(append(mctx.Target().Variations(), []blueprint.Variation{
-						{Mutator: "link", Variation: "shared"},
-						c.ImageVariation(),
-					}...), earlySharedDepTag, runtimeLibrary)
-				}
-				// static lib does not have dependency to the runtime library. The
-				// dependency will be added to the executables or shared libs using
-				// the static lib.
-			} else {
-				if c.sanitize.Properties.UbsanRuntimeDep {
-					// Support UBSan runtime on host modules, which requires the builtins linked in as well.
-					mctx.AddFarVariationDependencies(append(mctx.Target().Variations(), []blueprint.Variation{
-						{Mutator: "link", Variation: "static"},
-						c.ImageVariation(),
-					}...), StaticDepTag, append([]string{runtimeLibrary, config.BuiltinsRuntimeLibrary(toolchain)},
-						extraStaticDeps...)...)
-				}
+		if mctx.Device() && runtimeLibrary != "" {
+			if isLlndkLibrary(runtimeLibrary, mctx.Config()) && !c.static() && c.UseVndk() {
+				runtimeLibrary = runtimeLibrary + llndkLibrarySuffix
 			}
+
+			// Adding dependency to the runtime library. We are using *FarVariation*
+			// because the runtime libraries themselves are not mutated by sanitizer
+			// mutators and thus don't have sanitizer variants whereas this module
+			// has been already mutated.
+			//
+			// Note that by adding dependency with {static|shared}DepTag, the lib is
+			// added to libFlags and LOCAL_SHARED_LIBRARIES by cc.Module
+			if c.staticBinary() {
+				// static executable gets static runtime libs
+				mctx.AddFarVariationDependencies(append(mctx.Target().Variations(), []blueprint.Variation{
+					{Mutator: "link", Variation: "static"},
+					c.ImageVariation(),
+				}...), StaticDepTag, append([]string{runtimeLibrary}, extraStaticDeps...)...)
+			} else if !c.static() && !c.header() {
+				// dynamic executable and shared libs get shared runtime libs
+				mctx.AddFarVariationDependencies(append(mctx.Target().Variations(), []blueprint.Variation{
+					{Mutator: "link", Variation: "shared"},
+					c.ImageVariation(),
+				}...), earlySharedDepTag, runtimeLibrary)
+			}
+			// static lib does not have dependency to the runtime library. The
+			// dependency will be added to the executables or shared libs using
+			// the static lib.
 		}
 	}
 }
