Configure the default arch variant features per-OS
am: 01a3c25ed7
Change-Id: Icb12a09355a8b418667eef9ec6668dbd4f240525
This commit is contained in:
@@ -106,6 +106,7 @@ module {
|
|||||||
var archVariants = map[ArchType][]string{}
|
var archVariants = map[ArchType][]string{}
|
||||||
var archFeatures = map[ArchType][]string{}
|
var archFeatures = map[ArchType][]string{}
|
||||||
var archFeatureMap = map[ArchType]map[string][]string{}
|
var archFeatureMap = map[ArchType]map[string][]string{}
|
||||||
|
var defaultArchFeatureMap = map[OsType]map[ArchType][]string{}
|
||||||
|
|
||||||
func RegisterArchVariants(arch ArchType, variants ...string) {
|
func RegisterArchVariants(arch ArchType, variants ...string) {
|
||||||
checkCalledFromInit()
|
checkCalledFromInit()
|
||||||
@@ -117,9 +118,24 @@ func RegisterArchFeatures(arch ArchType, features ...string) {
|
|||||||
archFeatures[arch] = append(archFeatures[arch], features...)
|
archFeatures[arch] = append(archFeatures[arch], features...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RegisterDefaultArchVariantFeatures(os OsType, arch ArchType, features ...string) {
|
||||||
|
checkCalledFromInit()
|
||||||
|
|
||||||
|
for _, feature := range features {
|
||||||
|
if !InList(feature, archFeatures[arch]) {
|
||||||
|
panic(fmt.Errorf("Invalid feature %q for arch %q variant \"\"", feature, arch))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if defaultArchFeatureMap[os] == nil {
|
||||||
|
defaultArchFeatureMap[os] = make(map[ArchType][]string)
|
||||||
|
}
|
||||||
|
defaultArchFeatureMap[os][arch] = features
|
||||||
|
}
|
||||||
|
|
||||||
func RegisterArchVariantFeatures(arch ArchType, variant string, features ...string) {
|
func RegisterArchVariantFeatures(arch ArchType, variant string, features ...string) {
|
||||||
checkCalledFromInit()
|
checkCalledFromInit()
|
||||||
if variant != "" && !InList(variant, archVariants[arch]) {
|
if !InList(variant, archVariants[arch]) {
|
||||||
panic(fmt.Errorf("Invalid variant %q for arch %q", variant, arch))
|
panic(fmt.Errorf("Invalid variant %q for arch %q", variant, arch))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -952,7 +968,7 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
arch, err := decodeArch(archName, archVariant, cpuVariant, abi)
|
arch, err := decodeArch(os, archName, archVariant, cpuVariant, abi)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
targetErr = err
|
targetErr = err
|
||||||
return
|
return
|
||||||
@@ -1127,11 +1143,11 @@ func getNdkAbisConfig() []archConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func decodeArchSettings(archConfigs []archConfig) ([]Target, error) {
|
func decodeArchSettings(os OsType, archConfigs []archConfig) ([]Target, error) {
|
||||||
var ret []Target
|
var ret []Target
|
||||||
|
|
||||||
for _, config := range archConfigs {
|
for _, config := range archConfigs {
|
||||||
arch, err := decodeArch(config.arch, &config.archVariant,
|
arch, err := decodeArch(os, config.arch, &config.archVariant,
|
||||||
&config.cpuVariant, &config.abi)
|
&config.cpuVariant, &config.abi)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -1147,7 +1163,7 @@ func decodeArchSettings(archConfigs []archConfig) ([]Target, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Convert a set of strings from product variables into a single Arch struct
|
// Convert a set of strings from product variables into a single Arch struct
|
||||||
func decodeArch(arch string, archVariant, cpuVariant *string, abi *[]string) (Arch, error) {
|
func decodeArch(os OsType, arch string, archVariant, cpuVariant *string, abi *[]string) (Arch, error) {
|
||||||
stringPtr := func(p *string) string {
|
stringPtr := func(p *string) string {
|
||||||
if p != nil {
|
if p != nil {
|
||||||
return *p
|
return *p
|
||||||
@@ -1190,9 +1206,15 @@ func decodeArch(arch string, archVariant, cpuVariant *string, abi *[]string) (Ar
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if a.ArchVariant == "" {
|
||||||
|
if featureMap, ok := defaultArchFeatureMap[os]; ok {
|
||||||
|
a.ArchFeatures = featureMap[archType]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if featureMap, ok := archFeatureMap[archType]; ok {
|
if featureMap, ok := archFeatureMap[archType]; ok {
|
||||||
a.ArchFeatures = featureMap[a.ArchVariant]
|
a.ArchFeatures = featureMap[a.ArchVariant]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
|
@@ -303,7 +303,7 @@ func NewConfig(srcDir, buildDir string) (Config, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if archConfig != nil {
|
if archConfig != nil {
|
||||||
androidTargets, err := decodeArchSettings(archConfig)
|
androidTargets, err := decodeArchSettings(Android, archConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Config{}, err
|
return Config{}, err
|
||||||
}
|
}
|
||||||
|
@@ -81,7 +81,7 @@ func init() {
|
|||||||
"aes_ni",
|
"aes_ni",
|
||||||
"avx",
|
"avx",
|
||||||
"popcnt")
|
"popcnt")
|
||||||
android.RegisterArchVariantFeatures(android.X86_64, "",
|
android.RegisterDefaultArchVariantFeatures(android.Android, android.X86_64,
|
||||||
"ssse3",
|
"ssse3",
|
||||||
"sse4",
|
"sse4",
|
||||||
"sse4_1",
|
"sse4_1",
|
||||||
|
Reference in New Issue
Block a user