| ... | @@ -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 | }; |
| 21 | | 22 | |
| ... | @@ -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 { |
| 1170 | | 1204 | |
| 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); |
| 1230 | | 1286 | |
| 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(); |
| 1234 | | 1290 | |