From 23654d9e7a29e6c051ba3122cc624d0199e81e73 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 22 Jun 2020 13:29:43 -0700 Subject: [PATCH] Recommit "[X86] Calculate the needed size of the feature arrays in _cpu_indicator_init and getHostCPUName using the size of the feature enum." Hopefully this version will fix the previously buildbot failure --- compiler-rt/lib/builtins/cpu_model.c | 9 +++++---- llvm/include/llvm/Support/X86TargetParser.h | 2 +- llvm/lib/Support/Host.cpp | 11 ++++------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/compiler-rt/lib/builtins/cpu_model.c b/compiler-rt/lib/builtins/cpu_model.c index 59c6974207c7..042657232d8e 100644 --- a/compiler-rt/lib/builtins/cpu_model.c +++ b/compiler-rt/lib/builtins/cpu_model.c @@ -125,7 +125,8 @@ enum ProcessorFeatures { FEATURE_AVX512VNNI, FEATURE_AVX512BITALG, FEATURE_AVX512BF16, - FEATURE_AVX512VP2INTERSECT + FEATURE_AVX512VP2INTERSECT, + CPU_FEATURE_MAX }; // The check below for i386 was copied from clang's cpuid.h (__get_cpuid_max). @@ -493,8 +494,6 @@ static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model, static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf, unsigned *Features) { - Features[0] = 0; - Features[1] = 0; unsigned EAX, EBX; #define setFeature(F) \ @@ -653,7 +652,7 @@ int CONSTRUCTOR_ATTRIBUTE __cpu_indicator_init(void) { unsigned MaxLeaf = 5; unsigned Vendor; unsigned Model, Family; - unsigned Features[2]; + unsigned Features[(CPU_FEATURE_MAX + 31) / 32] = {0}; // This function needs to run just once. if (__cpu_model.__cpu_vendor) @@ -670,6 +669,8 @@ int CONSTRUCTOR_ATTRIBUTE __cpu_indicator_init(void) { // Find available features. getAvailableFeatures(ECX, EDX, MaxLeaf, &Features[0]); + + assert((sizeof(Features)/sizeof(Features[0])) == 2); __cpu_model.__cpu_features[0] = Features[0]; __cpu_features2 = Features[1]; diff --git a/llvm/include/llvm/Support/X86TargetParser.h b/llvm/include/llvm/Support/X86TargetParser.h index 7b4ade866a9d..79cb0af4ed06 100644 --- a/llvm/include/llvm/Support/X86TargetParser.h +++ b/llvm/include/llvm/Support/X86TargetParser.h @@ -56,7 +56,7 @@ enum ProcessorFeatures { #define X86_FEATURE(ENUM) \ ENUM, #include "llvm/Support/X86TargetParser.def" - + CPU_FEATURE_MAX }; enum CPUKind { diff --git a/llvm/lib/Support/Host.cpp b/llvm/lib/Support/Host.cpp index c6b12e6516a4..e4c6b879884a 100644 --- a/llvm/lib/Support/Host.cpp +++ b/llvm/lib/Support/Host.cpp @@ -582,7 +582,7 @@ static void detectX86FamilyModel(unsigned EAX, unsigned *Family, static void getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model, - const unsigned (&Features)[3], + const unsigned *Features, unsigned *Type, unsigned *Subtype) { auto testFeature = [&](unsigned F) { return (Features[F / 32] & (1U << (F % 32))) != 0; @@ -910,7 +910,7 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model, } static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model, - const unsigned (&Features)[3], + const unsigned *Features, unsigned *Type, unsigned *Subtype) { auto testFeature = [&](unsigned F) { return (Features[F / 32] & (1U << (F % 32))) != 0; @@ -1012,10 +1012,7 @@ static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model, } static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf, - unsigned (&Features)[3]) { - Features[0] = 0; - Features[1] = 0; - Features[2] = 0; + unsigned *Features) { unsigned EAX, EBX; auto setFeature = [&](unsigned F) { @@ -1157,7 +1154,7 @@ StringRef sys::getHostCPUName() { getX86CpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX); unsigned Family = 0, Model = 0; - unsigned Features[3] = {0, 0, 0}; + unsigned Features[(X86::CPU_FEATURE_MAX + 31) / 32] = {0}; detectX86FamilyModel(EAX, &Family, &Model); getAvailableFeatures(ECX, EDX, MaxLeaf, Features);