Skip to content

Commit 24d7f78

Browse files
authored
Use enum properly to directly access kConfig struct (#83)
2 parents bdb36d9 + 22c05ed commit 24d7f78

File tree

4 files changed

+99
-252
lines changed

4 files changed

+99
-252
lines changed

src/cpuinfo_aarch64.c

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "internal/string_view.h"
2121
#include "internal/unix_features_aggregator.h"
2222

23+
#include <assert.h>
2324
#include <ctype.h>
2425

2526
DECLARE_SETTER(Aarch64Features, fp)
@@ -31,13 +32,13 @@ DECLARE_SETTER(Aarch64Features, sha2)
3132
DECLARE_SETTER(Aarch64Features, crc32)
3233

3334
static const CapabilityConfig kConfigs[] = {
34-
{{AARCH64_HWCAP_FP, 0}, "fp", &set_fp}, //
35-
{{AARCH64_HWCAP_ASIMD, 0}, "asimd", &set_asimd}, //
36-
{{AARCH64_HWCAP_AES, 0}, "aes", &set_aes}, //
37-
{{AARCH64_HWCAP_PMULL, 0}, "pmull", &set_pmull}, //
38-
{{AARCH64_HWCAP_SHA1, 0}, "sha1", &set_sha1}, //
39-
{{AARCH64_HWCAP_SHA2, 0}, "sha2", &set_sha2}, //
40-
{{AARCH64_HWCAP_CRC32, 0}, "crc32", &set_crc32}, //
35+
[AARCH64_FP] = {{AARCH64_HWCAP_FP, 0}, "fp", &set_fp}, //
36+
[AARCH64_ASIMD] = {{AARCH64_HWCAP_ASIMD, 0}, "asimd", &set_asimd}, //
37+
[AARCH64_AES] = {{AARCH64_HWCAP_AES, 0}, "aes", &set_aes}, //
38+
[AARCH64_PMULL] = {{AARCH64_HWCAP_PMULL, 0}, "pmull", &set_pmull}, //
39+
[AARCH64_SHA1] = {{AARCH64_HWCAP_SHA1, 0}, "sha1", &set_sha1}, //
40+
[AARCH64_SHA2] = {{AARCH64_HWCAP_SHA2, 0}, "sha2", &set_sha2}, //
41+
[AARCH64_CRC32] {{AARCH64_HWCAP_CRC32, 0}, "crc32", &set_crc32}, //
4142
};
4243

4344
static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig);
@@ -79,6 +80,8 @@ static void FillProcCpuInfoData(Aarch64Info* const info) {
7980
static const Aarch64Info kEmptyAarch64Info;
8081

8182
Aarch64Info GetAarch64Info(void) {
83+
assert(kConfigsSize == AARCH64_LAST_);
84+
8285
// capabilities are fetched from both getauxval and /proc/cpuinfo so we can
8386
// have some information if the executable is sandboxed (aka no access to
8487
// /proc/cpuinfo).
@@ -119,23 +122,7 @@ int GetAarch64FeaturesEnumValue(const Aarch64Features* features,
119122
}
120123

121124
const char* GetAarch64FeaturesEnumName(Aarch64FeaturesEnum value) {
122-
switch (value) {
123-
case AARCH64_FP:
124-
return "fp";
125-
case AARCH64_ASIMD:
126-
return "asimd";
127-
case AARCH64_AES:
128-
return "aes";
129-
case AARCH64_PMULL:
130-
return "pmull";
131-
case AARCH64_SHA1:
132-
return "sha1";
133-
case AARCH64_SHA2:
134-
return "sha2";
135-
case AARCH64_CRC32:
136-
return "crc32";
137-
case AARCH64_LAST_:
138-
break;
139-
}
140-
return "unknown feature";
125+
if(value >= kConfigsSize)
126+
return "unknown feature";
127+
return kConfigs[value].proc_cpuinfo_flag;
141128
}

src/cpuinfo_arm.c

Lines changed: 31 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "internal/string_view.h"
2222
#include "internal/unix_features_aggregator.h"
2323

24+
#include <assert.h>
2425
#include <ctype.h>
2526

2627
DECLARE_SETTER(ArmFeatures, swp)
@@ -52,33 +53,33 @@ DECLARE_SETTER(ArmFeatures, sha2)
5253
DECLARE_SETTER(ArmFeatures, crc32)
5354

5455
static const CapabilityConfig kConfigs[] = {
55-
{{ARM_HWCAP_SWP, 0}, "swp", &set_swp}, //
56-
{{ARM_HWCAP_HALF, 0}, "half", &set_half}, //
57-
{{ARM_HWCAP_THUMB, 0}, "thumb", &set_thumb}, //
58-
{{ARM_HWCAP_26BIT, 0}, "26bit", &set__26bit}, //
59-
{{ARM_HWCAP_FAST_MULT, 0}, "fastmult", &set_fastmult}, //
60-
{{ARM_HWCAP_FPA, 0}, "fpa", &set_fpa}, //
61-
{{ARM_HWCAP_VFP, 0}, "vfp", &set_vfp}, //
62-
{{ARM_HWCAP_EDSP, 0}, "edsp", &set_edsp}, //
63-
{{ARM_HWCAP_JAVA, 0}, "java", &set_java}, //
64-
{{ARM_HWCAP_IWMMXT, 0}, "iwmmxt", &set_iwmmxt}, //
65-
{{ARM_HWCAP_CRUNCH, 0}, "crunch", &set_crunch}, //
66-
{{ARM_HWCAP_THUMBEE, 0}, "thumbee", &set_thumbee}, //
67-
{{ARM_HWCAP_NEON, 0}, "neon", &set_neon}, //
68-
{{ARM_HWCAP_VFPV3, 0}, "vfpv3", &set_vfpv3}, //
69-
{{ARM_HWCAP_VFPV3D16, 0}, "vfpv3d16", &set_vfpv3d16}, //
70-
{{ARM_HWCAP_TLS, 0}, "tls", &set_tls}, //
71-
{{ARM_HWCAP_VFPV4, 0}, "vfpv4", &set_vfpv4}, //
72-
{{ARM_HWCAP_IDIVA, 0}, "idiva", &set_idiva}, //
73-
{{ARM_HWCAP_IDIVT, 0}, "idivt", &set_idivt}, //
74-
{{ARM_HWCAP_VFPD32, 0}, "vfpd32", &set_vfpd32}, //
75-
{{ARM_HWCAP_LPAE, 0}, "lpae", &set_lpae}, //
76-
{{ARM_HWCAP_EVTSTRM, 0}, "evtstrm", &set_evtstrm}, //
77-
{{0, ARM_HWCAP2_AES}, "aes", &set_aes}, //
78-
{{0, ARM_HWCAP2_PMULL}, "pmull", &set_pmull}, //
79-
{{0, ARM_HWCAP2_SHA1}, "sha1", &set_sha1}, //
80-
{{0, ARM_HWCAP2_SHA2}, "sha2", &set_sha2}, //
81-
{{0, ARM_HWCAP2_CRC32}, "crc32", &set_crc32}, //
56+
[ARM_SWP] = {{ARM_HWCAP_SWP, 0}, "swp", &set_swp}, //
57+
[ARM_HALF] = {{ARM_HWCAP_HALF, 0}, "half", &set_half}, //
58+
[ARM_THUMB] = {{ARM_HWCAP_THUMB, 0}, "thumb", &set_thumb}, //
59+
[ARM_26BIT] = {{ARM_HWCAP_26BIT, 0}, "26bit", &set__26bit}, //
60+
[ARM_FASTMULT] = {{ARM_HWCAP_FAST_MULT, 0}, "fastmult", &set_fastmult}, //
61+
[ARM_FPA] = {{ARM_HWCAP_FPA, 0}, "fpa", &set_fpa}, //
62+
[ARM_VFP] = {{ARM_HWCAP_VFP, 0}, "vfp", &set_vfp}, //
63+
[ARM_EDSP] = {{ARM_HWCAP_EDSP, 0}, "edsp", &set_edsp}, //
64+
[ARM_JAVA] = {{ARM_HWCAP_JAVA, 0}, "java", &set_java}, //
65+
[ARM_IWMMXT] = {{ARM_HWCAP_IWMMXT, 0}, "iwmmxt", &set_iwmmxt}, //
66+
[ARM_CRUNCH] = {{ARM_HWCAP_CRUNCH, 0}, "crunch", &set_crunch}, //
67+
[ARM_THUMBEE] = {{ARM_HWCAP_THUMBEE, 0}, "thumbee", &set_thumbee}, //
68+
[ARM_NEON] = {{ARM_HWCAP_NEON, 0}, "neon", &set_neon}, //
69+
[ARM_VFPV3] = {{ARM_HWCAP_VFPV3, 0}, "vfpv3", &set_vfpv3}, //
70+
[ARM_VFPV3D16] = {{ARM_HWCAP_VFPV3D16, 0}, "vfpv3d16", &set_vfpv3d16}, //
71+
[ARM_TLS] = {{ARM_HWCAP_TLS, 0}, "tls", &set_tls}, //
72+
[ARM_VFPV4] = {{ARM_HWCAP_VFPV4, 0}, "vfpv4", &set_vfpv4}, //
73+
[ARM_IDIVA] = {{ARM_HWCAP_IDIVA, 0}, "idiva", &set_idiva}, //
74+
[ARM_IDIVT] = {{ARM_HWCAP_IDIVT, 0}, "idivt", &set_idivt}, //
75+
[ARM_VFPD32] = {{ARM_HWCAP_VFPD32, 0}, "vfpd32", &set_vfpd32}, //
76+
[ARM_LPAE] = {{ARM_HWCAP_LPAE, 0}, "lpae", &set_lpae}, //
77+
[ARM_EVTSTRM] = {{ARM_HWCAP_EVTSTRM, 0}, "evtstrm", &set_evtstrm}, //
78+
[ARM_AES] = {{0, ARM_HWCAP2_AES}, "aes", &set_aes}, //
79+
[ARM_PMULL] = {{0, ARM_HWCAP2_PMULL}, "pmull", &set_pmull}, //
80+
[ARM_SHA1] = {{0, ARM_HWCAP2_SHA1}, "sha1", &set_sha1}, //
81+
[ARM_SHA2] = {{0, ARM_HWCAP2_SHA2}, "sha2", &set_sha2}, //
82+
[ARM_CRC32] = {{0, ARM_HWCAP2_CRC32}, "crc32", &set_crc32}, //
8283
};
8384

8485
static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig);
@@ -285,61 +286,7 @@ int GetArmFeaturesEnumValue(const ArmFeatures* features,
285286
}
286287

287288
const char* GetArmFeaturesEnumName(ArmFeaturesEnum value) {
288-
switch (value) {
289-
case ARM_SWP:
290-
return "swp";
291-
case ARM_HALF:
292-
return "half";
293-
case ARM_THUMB:
294-
return "thumb";
295-
case ARM_FASTMULT:
296-
return "fastmult";
297-
case ARM_FPA:
298-
return "fpa";
299-
case ARM_VFP:
300-
return "vfp";
301-
case ARM_EDSP:
302-
return "edsp";
303-
case ARM_JAVA:
304-
return "java";
305-
case ARM_IWMMXT:
306-
return "iwmmxt";
307-
case ARM_CRUNCH:
308-
return "crunch";
309-
case ARM_THUMBEE:
310-
return "thumbee";
311-
case ARM_NEON:
312-
return "neon";
313-
case ARM_VFPV3:
314-
return "vfpv3";
315-
case ARM_VFPV3D16:
316-
return "vfpv3d16";
317-
case ARM_TLS:
318-
return "tls";
319-
case ARM_VFPV4:
320-
return "vfpv4";
321-
case ARM_IDIVA:
322-
return "idiva";
323-
case ARM_IDIVT:
324-
return "idivt";
325-
case ARM_VFPD32:
326-
return "vfpd32";
327-
case ARM_LPAE:
328-
return "lpae";
329-
case ARM_EVTSTRM:
330-
return "evtstrm";
331-
case ARM_AES:
332-
return "aes";
333-
case ARM_PMULL:
334-
return "pmull";
335-
case ARM_SHA1:
336-
return "sha1";
337-
case ARM_SHA2:
338-
return "sha2";
339-
case ARM_CRC32:
340-
return "crc32";
341-
case ARM_LAST_:
342-
break;
343-
}
344-
return "unknown feature";
289+
if(value >= kConfigsSize)
290+
return "unknown feature";
291+
return kConfigs[value].proc_cpuinfo_flag;
345292
}

src/cpuinfo_mips.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,16 @@
1919
#include "internal/string_view.h"
2020
#include "internal/unix_features_aggregator.h"
2121

22+
#include <assert.h>
23+
2224
DECLARE_SETTER(MipsFeatures, msa)
2325
DECLARE_SETTER(MipsFeatures, eva)
2426
DECLARE_SETTER(MipsFeatures, r6)
2527

2628
static const CapabilityConfig kConfigs[] = {
27-
{{MIPS_HWCAP_MSA, 0}, "msa", &set_msa}, //
28-
{{0, 0}, "eva", &set_eva}, //
29-
{{MIPS_HWCAP_R6, 0}, "r6", &set_r6}, //
29+
[MIPS_MSA] = {{MIPS_HWCAP_MSA, 0}, "msa", &set_msa}, //
30+
[MIPS_EVA] = {{0, 0}, "eva", &set_eva}, //
31+
[MIPS_R6] = {{MIPS_HWCAP_R6, 0}, "r6", &set_r6}, //
3032
};
3133
static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig);
3234

@@ -59,6 +61,8 @@ static void FillProcCpuInfoData(MipsFeatures* const features) {
5961
static const MipsInfo kEmptyMipsInfo;
6062

6163
MipsInfo GetMipsInfo(void) {
64+
assert(kConfigsSize == MIPS_LAST_);
65+
6266
// capabilities are fetched from both getauxval and /proc/cpuinfo so we can
6367
// have some information if the executable is sandboxed (aka no access to
6468
// /proc/cpuinfo).
@@ -90,15 +94,7 @@ int GetMipsFeaturesEnumValue(const MipsFeatures* features,
9094
}
9195

9296
const char* GetMipsFeaturesEnumName(MipsFeaturesEnum value) {
93-
switch (value) {
94-
case MIPS_MSA:
95-
return "msa";
96-
case MIPS_EVA:
97-
return "eva";
98-
case MIPS_R6:
99-
return "r6";
100-
case MIPS_LAST_:
101-
break;
102-
}
103-
return "unknown feature";
97+
if(value >= kConfigsSize)
98+
return "unknown feature";
99+
return kConfigs[value].proc_cpuinfo_flag;
104100
}

0 commit comments

Comments
 (0)