authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-01-09 17:08:08-08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-01-09 17:08:08-08:00
log157cdaee0e508ae0411d6f785456e4273f4fa862
tree144fe91d3af2b7259cf74eca6f14045f7c1b915f
parentfcc0c5ddc7a8d25f0b12f51b4b244bc97fc549e4
parent0cd508b09ffe194dbe6b08ea9f17cfa58f8d9e8b
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #18498 from castholm/cpu-cortex-m-optional-deps

Don't enable optional ARM Cortex-M series CPU features by default

2 files changed, 76 insertions(+), 28 deletions(-)

lib/std/Target/arm.zig+3-11
...@@ -2204,9 +2204,7 @@ pub const cpu = struct {...@@ -2204,9 +2204,7 @@ pub const cpu = struct {
2204 .name = "cortex_m33",2204 .name = "cortex_m33",
2205 .llvm_name = "cortex-m33",2205 .llvm_name = "cortex-m33",
2206 .features = featureSet(&[_]Feature{2206 .features = featureSet(&[_]Feature{
2207 .dsp,
2208 .fix_cmse_cve_2021_35465,2207 .fix_cmse_cve_2021_35465,
2209 .fp_armv8d16sp,
2210 .loop_align,2208 .loop_align,
2211 .no_branch_predictor,2209 .no_branch_predictor,
2212 .slowfpvfmx,2210 .slowfpvfmx,
...@@ -2219,9 +2217,7 @@ pub const cpu = struct {...@@ -2219,9 +2217,7 @@ pub const cpu = struct {
2219 .name = "cortex_m35p",2217 .name = "cortex_m35p",
2220 .llvm_name = "cortex-m35p",2218 .llvm_name = "cortex-m35p",
2221 .features = featureSet(&[_]Feature{2219 .features = featureSet(&[_]Feature{
2222 .dsp,
2223 .fix_cmse_cve_2021_35465,2220 .fix_cmse_cve_2021_35465,
2224 .fp_armv8d16sp,
2225 .loop_align,2221 .loop_align,
2226 .no_branch_predictor,2222 .no_branch_predictor,
2227 .slowfpvfmx,2223 .slowfpvfmx,
...@@ -2240,17 +2236,15 @@ pub const cpu = struct {...@@ -2240,17 +2236,15 @@ pub const cpu = struct {
2240 .slowfpvmlx,2236 .slowfpvmlx,
2241 .use_misched,2237 .use_misched,
2242 .v7em,2238 .v7em,
2243 .vfp4d16sp,
2244 }),2239 }),
2245 };2240 };
2246 pub const cortex_m55 = CpuModel{2241 pub const cortex_m55 = CpuModel{
2247 .name = "cortex_m55",2242 .name = "cortex_m55",
2248 .llvm_name = "cortex-m55",2243 .llvm_name = "cortex-m55",
2249 .features = featureSet(&[_]Feature{2244 .features = featureSet(&[_]Feature{
2245 .dsp,
2250 .fix_cmse_cve_2021_35465,2246 .fix_cmse_cve_2021_35465,
2251 .fp_armv8d16,
2252 .loop_align,2247 .loop_align,
2253 .mve_fp,
2254 .no_branch_predictor,2248 .no_branch_predictor,
2255 .slowfpvmlx,2249 .slowfpvmlx,
2256 .use_misched,2250 .use_misched,
...@@ -2261,7 +2255,6 @@ pub const cpu = struct {...@@ -2261,7 +2255,6 @@ pub const cpu = struct {
2261 .name = "cortex_m7",2255 .name = "cortex_m7",
2262 .llvm_name = "cortex-m7",2256 .llvm_name = "cortex-m7",
2263 .features = featureSet(&[_]Feature{2257 .features = featureSet(&[_]Feature{
2264 .fp_armv8d16,
2265 .use_mipipeliner,2258 .use_mipipeliner,
2266 .use_misched,2259 .use_misched,
2267 .v7em,2260 .v7em,
...@@ -2271,9 +2264,8 @@ pub const cpu = struct {...@@ -2271,9 +2264,8 @@ pub const cpu = struct {
2271 .name = "cortex_m85",2264 .name = "cortex_m85",
2272 .llvm_name = "cortex-m85",2265 .llvm_name = "cortex-m85",
2273 .features = featureSet(&[_]Feature{2266 .features = featureSet(&[_]Feature{
2274 .fp_armv8d16,2267 .dsp,
2275 .mve_fp,2268 .trustzone,
2276 .pacbti,
2277 .use_misched,2269 .use_misched,
2278 .v8_1m_main,2270 .v8_1m_main,
2279 }),2271 }),
tools/update_cpu_features.zig+73-17
...@@ -16,6 +16,7 @@ const FeatureOverride = struct {...@@ -16,6 +16,7 @@ const FeatureOverride = struct {
16 flatten: bool = false,16 flatten: bool = false,
17 zig_name: ?[]const u8 = null,17 zig_name: ?[]const u8 = null,
18 desc: ?[]const u8 = null,18 desc: ?[]const u8 = null,
19 omit_deps: []const []const u8 = &.{},
19 extra_deps: []const []const u8 = &.{},20 extra_deps: []const []const u8 = &.{},
20};21};
2122
...@@ -378,6 +379,31 @@ const llvm_targets = [_]LlvmTarget{...@@ -378,6 +379,31 @@ const llvm_targets = [_]LlvmTarget{
378 .llvm_name = "cortex-a710",379 .llvm_name = "cortex-a710",
379 .flatten = true,380 .flatten = true,
380 },381 },
382 .{
383 .llvm_name = "cortex-m4",
384 .omit_deps = &.{"vfp4d16sp"},
385 },
386 .{
387 .llvm_name = "cortex-m7",
388 .omit_deps = &.{"fp_armv8d16"},
389 },
390 .{
391 .llvm_name = "cortex-m33",
392 .omit_deps = &.{ "fp_armv8d16sp", "dsp" },
393 },
394 .{
395 .llvm_name = "cortex-m35p",
396 .omit_deps = &.{ "fp_armv8d16sp", "dsp" },
397 },
398 .{
399 .llvm_name = "cortex-m55",
400 .omit_deps = &.{ "mve_fp", "fp_armv8d16" },
401 },
402 .{
403 .llvm_name = "cortex-m85",
404 .omit_deps = &.{ "mve_fp", "pacbti", "fp_armv8d16" },
405 .extra_deps = &.{"trustzone"},
406 },
381 .{407 .{
382 .llvm_name = "cortex-x1c",408 .llvm_name = "cortex-x1c",
383 .flatten = true,409 .flatten = true,
...@@ -1114,18 +1140,8 @@ fn processOneTarget(job: Job) anyerror!void {...@@ -1114,18 +1140,8 @@ fn processOneTarget(job: Job) anyerror!void {
1114 var deps = std.ArrayList([]const u8).init(arena);1140 var deps = std.ArrayList([]const u8).init(arena);
1115 var omit = false;1141 var omit = false;
1116 var flatten = false;1142 var flatten = false;
1117 const implies = kv.value_ptr.object.get("Implies").?.array;1143 var omit_deps: []const []const u8 = &.{};
1118 for (implies.items) |imply| {1144 var extra_deps: []const []const u8 = &.{};
1119 const other_key = imply.object.get("def").?.string;
1120 const other_obj = &root_map.getPtr(other_key).?.object;
1121 const other_llvm_name = other_obj.get("Name").?.string;
1122 const other_zig_name = (try llvmNameToZigNameOmit(
1123 arena,
1124 llvm_target,
1125 other_llvm_name,
1126 )) orelse continue;
1127 try deps.append(other_zig_name);
1128 }
1129 for (llvm_target.feature_overrides) |feature_override| {1145 for (llvm_target.feature_overrides) |feature_override| {
1130 if (mem.eql(u8, llvm_name, feature_override.llvm_name)) {1146 if (mem.eql(u8, llvm_name, feature_override.llvm_name)) {
1131 if (feature_override.omit) {1147 if (feature_override.omit) {
...@@ -1142,12 +1158,30 @@ fn processOneTarget(job: Job) anyerror!void {...@@ -1142,12 +1158,30 @@ fn processOneTarget(job: Job) anyerror!void {
1142 if (feature_override.desc) |override_desc| {1158 if (feature_override.desc) |override_desc| {
1143 desc = override_desc;1159 desc = override_desc;
1144 }1160 }
1145 for (feature_override.extra_deps) |extra_dep| {1161 omit_deps = feature_override.omit_deps;
1146 try deps.append(extra_dep);1162 extra_deps = feature_override.extra_deps;
1147 }
1148 break;1163 break;
1149 }1164 }
1150 }1165 }
1166 const implies = kv.value_ptr.object.get("Implies").?.array;
1167 for (implies.items) |imply| {
1168 const other_key = imply.object.get("def").?.string;
1169 const other_obj = &root_map.getPtr(other_key).?.object;
1170 const other_llvm_name = other_obj.get("Name").?.string;
1171 const other_zig_name = (try llvmNameToZigNameOmit(
1172 arena,
1173 llvm_target,
1174 other_llvm_name,
1175 )) orelse continue;
1176 for (omit_deps) |omit_dep| {
1177 if (mem.eql(u8, other_zig_name, omit_dep)) break;
1178 } else {
1179 try deps.append(other_zig_name);
1180 }
1181 }
1182 for (extra_deps) |extra_dep| {
1183 try deps.append(extra_dep);
1184 }
1151 const feature: Feature = .{1185 const feature: Feature = .{
1152 .llvm_name = llvm_name,1186 .llvm_name = llvm_name,
1153 .zig_name = zig_name,1187 .zig_name = zig_name,
...@@ -1170,6 +1204,21 @@ fn processOneTarget(job: Job) anyerror!void {...@@ -1170,6 +1204,21 @@ fn processOneTarget(job: Job) anyerror!void {
11701204
1171 var zig_name = try llvmNameToZigName(arena, llvm_name);1205 var zig_name = try llvmNameToZigName(arena, llvm_name);
1172 var deps = std.ArrayList([]const u8).init(arena);1206 var deps = std.ArrayList([]const u8).init(arena);
1207 var omit_deps: []const []const u8 = &.{};
1208 var extra_deps: []const []const u8 = &.{};
1209 for (llvm_target.feature_overrides) |feature_override| {
1210 if (mem.eql(u8, llvm_name, feature_override.llvm_name)) {
1211 if (feature_override.omit) {
1212 continue :root_it;
1213 }
1214 if (feature_override.zig_name) |override_name| {
1215 zig_name = override_name;
1216 }
1217 omit_deps = feature_override.omit_deps;
1218 extra_deps = feature_override.extra_deps;
1219 break;
1220 }
1221 }
1173 const features = kv.value_ptr.object.get("Features").?.array;1222 const features = kv.value_ptr.object.get("Features").?.array;
1174 for (features.items) |feature| {1223 for (features.items) |feature| {
1175 const feature_key = feature.object.get("def").?.string;1224 const feature_key = feature.object.get("def").?.string;
...@@ -1181,7 +1230,14 @@ fn processOneTarget(job: Job) anyerror!void {...@@ -1181,7 +1230,14 @@ fn processOneTarget(job: Job) anyerror!void {
1181 llvm_target,1230 llvm_target,
1182 feature_llvm_name,1231 feature_llvm_name,
1183 )) orelse continue;1232 )) orelse continue;
1184 try deps.append(feature_zig_name);1233 for (omit_deps) |omit_dep| {
1234 if (mem.eql(u8, feature_zig_name, omit_dep)) break;
1235 } else {
1236 try deps.append(feature_zig_name);
1237 }
1238 }
1239 for (extra_deps) |extra_dep| {
1240 try deps.append(extra_dep);
1185 }1241 }
1186 const tune_features = kv.value_ptr.object.get("TuneFeatures").?.array;1242 const tune_features = kv.value_ptr.object.get("TuneFeatures").?.array;
1187 for (tune_features.items) |feature| {1243 for (tune_features.items) |feature| {
...@@ -1228,7 +1284,7 @@ fn processOneTarget(job: Job) anyerror!void {...@@ -1228,7 +1284,7 @@ fn processOneTarget(job: Job) anyerror!void {
1228 mem.sort(Feature, all_features.items, {}, featureLessThan);1284 mem.sort(Feature, all_features.items, {}, featureLessThan);
1229 mem.sort(Cpu, all_cpus.items, {}, cpuLessThan);1285 mem.sort(Cpu, all_cpus.items, {}, cpuLessThan);
12301286
1231 const target_sub_path = try fs.path.join(arena, &.{ "lib", "std", "target" });1287 const target_sub_path = try fs.path.join(arena, &.{ "lib", "std", "Target" });
1232 var target_dir = try job.zig_src_dir.makeOpenPath(target_sub_path, .{});1288 var target_dir = try job.zig_src_dir.makeOpenPath(target_sub_path, .{});
1233 defer target_dir.close();1289 defer target_dir.close();
12341290