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:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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],
|
||||||
}, " "),
|
}, " "),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
cc/cc.go
2
cc/cc.go
@@ -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) {
|
||||||
|
@@ -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),
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user