Simplify arch target handling

Soong's multi-architecture building has grown complex, with the
combination of HostOrDevice+HostType+Arch necessary to determine how to
build a variant of a module, and three separate mutators to split each
into its variations.

Combine HostOrDevice+HostType into Os, which will be Linux, Darwin,
Windows, or Android.  Store Os+Arch as a single Target.

Change-Id: I92f2e2dac53617d595a35cc285d2bd348baa0fbd
diff --git a/cc/toolchain.go b/cc/toolchain.go
index efb7953..87657ef 100644
--- a/cc/toolchain.go
+++ b/cc/toolchain.go
@@ -22,23 +22,13 @@
 
 type toolchainFactory func(arch android.Arch) Toolchain
 
-var toolchainFactories = map[android.HostOrDevice]map[android.HostType]map[android.ArchType]toolchainFactory{
-	android.Host: map[android.HostType]map[android.ArchType]toolchainFactory{
-		android.Linux:   make(map[android.ArchType]toolchainFactory),
-		android.Darwin:  make(map[android.ArchType]toolchainFactory),
-		android.Windows: make(map[android.ArchType]toolchainFactory),
-	},
-	android.Device: map[android.HostType]map[android.ArchType]toolchainFactory{
-		android.NoHostType: make(map[android.ArchType]toolchainFactory),
-	},
-}
+var toolchainFactories = make(map[android.OsType]map[android.ArchType]toolchainFactory)
 
-func registerDeviceToolchainFactory(arch android.ArchType, factory toolchainFactory) {
-	toolchainFactories[android.Device][android.NoHostType][arch] = factory
-}
-
-func registerHostToolchainFactory(ht android.HostType, arch android.ArchType, factory toolchainFactory) {
-	toolchainFactories[android.Host][ht][arch] = factory
+func registerToolchainFactory(os android.OsType, arch android.ArchType, factory toolchainFactory) {
+	if toolchainFactories[os] == nil {
+		toolchainFactories[os] = make(map[android.ArchType]toolchainFactory)
+	}
+	toolchainFactories[os][arch] = factory
 }
 
 type Toolchain interface {