Add arch features

Allow architecture toolchains to register "features" supported by the
current variant, and then apply properties from the selected features.
Equivalent to the ARCH_*_HAS_* variables in the combo makefiles.

Change-Id: Ib6823be1c1a52da677d081db9f24336a072eaf39
This commit is contained in:
Colin Cross
2015-11-20 15:35:00 -08:00
parent eeabb89426
commit c5c24ade63
7 changed files with 55 additions and 17 deletions

View File

@@ -136,7 +136,7 @@ func (t *toolchainArm64) ClangLdflags() string {
return "${arm64Ldflags}" return "${arm64Ldflags}"
} }
func arm64ToolchainFactory(archVariant string, cpuVariant string) Toolchain { func arm64ToolchainFactory(arch common.Arch) Toolchain {
return toolchainArm64Singleton return toolchainArm64Singleton
} }

View File

@@ -306,9 +306,9 @@ func (t *toolchainArm) ClangInstructionSetFlags(isa string) (string, error) {
} }
} }
func armToolchainFactory(archVariant string, cpuVariant string) Toolchain { func armToolchainFactory(arch common.Arch) Toolchain {
var fixCortexA8 string var fixCortexA8 string
switch cpuVariant { switch arch.CpuVariant {
case "cortex-a8", "": case "cortex-a8", "":
// Generic ARM might be a Cortex A8 -- better safe than sorry // Generic ARM might be a Cortex A8 -- better safe than sorry
fixCortexA8 = "-Wl,--fix-cortex-a8" fixCortexA8 = "-Wl,--fix-cortex-a8"
@@ -319,8 +319,8 @@ func armToolchainFactory(archVariant string, cpuVariant string) Toolchain {
return &toolchainArm{ return &toolchainArm{
cflags: strings.Join([]string{ cflags: strings.Join([]string{
"${armCflags}", "${armCflags}",
armArchVariantCflagsVar[archVariant], armArchVariantCflagsVar[arch.ArchVariant],
armCpuVariantCflagsVar[cpuVariant], armCpuVariantCflagsVar[arch.CpuVariant],
}, " "), }, " "),
ldflags: strings.Join([]string{ ldflags: strings.Join([]string{
"${armLdflags}", "${armLdflags}",
@@ -328,8 +328,8 @@ func armToolchainFactory(archVariant string, cpuVariant string) Toolchain {
}, " "), }, " "),
clangCflags: strings.Join([]string{ clangCflags: strings.Join([]string{
"${armClangCflags}", "${armClangCflags}",
armClangArchVariantCflagsVar[archVariant], armClangArchVariantCflagsVar[arch.ArchVariant],
armClangCpuVariantCflagsVar[cpuVariant], armClangCpuVariantCflagsVar[arch.CpuVariant],
}, " "), }, " "),
} }
} }

View File

@@ -412,7 +412,7 @@ func (c *CCBase) findToolchain(ctx common.AndroidModuleContext) Toolchain {
ctx.ModuleErrorf("Toolchain not found for %s arch %q", hod.String(), arch.String()) ctx.ModuleErrorf("Toolchain not found for %s arch %q", hod.String(), arch.String())
return nil return nil
} }
return factory(arch.ArchVariant, arch.CpuVariant) return factory(arch)
} }
func (c *CCBase) ModifyProperties(ctx CCModuleContext) { func (c *CCBase) ModifyProperties(ctx CCModuleContext) {

View File

@@ -20,7 +20,7 @@ import (
"android/soong/common" "android/soong/common"
) )
type toolchainFactory func(archVariant string, cpuVariant string) Toolchain type toolchainFactory func(arch common.Arch) Toolchain
var toolchainFactories = map[common.HostOrDevice]map[common.ArchType]toolchainFactory{ var toolchainFactories = map[common.HostOrDevice]map[common.ArchType]toolchainFactory{
common.Host: make(map[common.ArchType]toolchainFactory), common.Host: make(map[common.ArchType]toolchainFactory),

View File

@@ -198,11 +198,11 @@ func (t *toolchainDarwinX8664) ClangLdflags() string {
var toolchainDarwinX86Singleton Toolchain = &toolchainDarwinX86{} var toolchainDarwinX86Singleton Toolchain = &toolchainDarwinX86{}
var toolchainDarwinX8664Singleton Toolchain = &toolchainDarwinX8664{} var toolchainDarwinX8664Singleton Toolchain = &toolchainDarwinX8664{}
func darwinX86ToolchainFactory(archVariant string, cpuVariant string) Toolchain { func darwinX86ToolchainFactory(arch common.Arch) Toolchain {
return toolchainDarwinX86Singleton return toolchainDarwinX86Singleton
} }
func darwinX8664ToolchainFactory(archVariant string, cpuVariant string) Toolchain { func darwinX8664ToolchainFactory(arch common.Arch) Toolchain {
return toolchainDarwinX8664Singleton return toolchainDarwinX8664Singleton
} }

View File

@@ -224,11 +224,11 @@ func (t *toolchainLinuxX8664) ClangLdflags() string {
var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{} var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{}
var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{} var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{}
func linuxX86ToolchainFactory(archVariant string, cpuVariant string) Toolchain { func linuxX86ToolchainFactory(arch common.Arch) Toolchain {
return toolchainLinuxX86Singleton return toolchainLinuxX86Singleton
} }
func linuxX8664ToolchainFactory(archVariant string, cpuVariant string) Toolchain { func linuxX8664ToolchainFactory(arch common.Arch) Toolchain {
return toolchainLinuxX8664Singleton return toolchainLinuxX8664Singleton
} }

View File

@@ -208,12 +208,34 @@ type archProperties struct {
} }
} }
var archFeatureMap = map[ArchType]map[string][]string{}
func RegisterArchFeatures(arch ArchType, variant string, features ...string) {
field := proptools.FieldNameForProperty(variant)
if variant != "" {
if !reflect.ValueOf(archProperties{}.Arch).FieldByName(field).IsValid() {
panic(fmt.Errorf("Invalid variant %q for arch %q", variant, arch))
}
}
for _, feature := range features {
field := proptools.FieldNameForProperty(feature)
if !reflect.ValueOf(archProperties{}.Arch).FieldByName(field).IsValid() {
panic(fmt.Errorf("Invalid feature %q for arch %q variant %q", feature, arch, variant))
}
}
if archFeatureMap[arch] == nil {
archFeatureMap[arch] = make(map[string][]string)
}
archFeatureMap[arch][variant] = features
}
// An Arch indicates a single CPU architecture. // An Arch indicates a single CPU architecture.
type Arch struct { type Arch struct {
ArchType ArchType ArchType ArchType
ArchVariant string ArchVariant string
CpuVariant string CpuVariant string
Abi []string Abi []string
ArchFeatures []string
} }
func (a Arch) String() string { func (a Arch) String() string {
@@ -516,6 +538,18 @@ func (a *AndroidModuleBase) setArchProperties(ctx AndroidBottomUpMutatorContext)
a.appendProperties(ctx, genProps, archProps.Arch, field, prefix) a.appendProperties(ctx, genProps, archProps.Arch, field, prefix)
} }
// Handle arch-feature-specific properties in the form:
// arch: {
// feature: {
// key: value,
// },
// },
for _, feature := range arch.ArchFeatures {
field := proptools.FieldNameForProperty(feature)
prefix := "arch." + feature
a.appendProperties(ctx, genProps, archProps.Arch, field, prefix)
}
// Handle multilib-specific properties in the form: // Handle multilib-specific properties in the form:
// multilib: { // multilib: {
// lib32: { // lib32: {
@@ -729,6 +763,10 @@ func decodeArch(arch string, archVariant, cpuVariant *string, abi *[]string) (Ar
} }
} }
if featureMap, ok := archFeatureMap[archType]; ok {
a.ArchFeatures = featureMap[stringPtr(archVariant)]
}
return a, nil return a, nil
} }