| ... | ... | @@ -16,6 +16,7 @@ const FeatureOverride = struct { |
| 16 | 16 | flatten: bool = false, |
| 17 | 17 | zig_name: ?[]const u8 = null, |
| 18 | 18 | desc: ?[]const u8 = null, |
| 19 | omit_deps: []const []const u8 = &.{}, |
| 19 | 20 | extra_deps: []const []const u8 = &.{}, |
| 20 | 21 | }; |
| 21 | 22 | |
| ... | ... | @@ -378,6 +379,31 @@ const llvm_targets = [_]LlvmTarget{ |
| 378 | 379 | .llvm_name = "cortex-a710", |
| 379 | 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 | 408 | .llvm_name = "cortex-x1c", |
| 383 | 409 | .flatten = true, |
| ... | ... | @@ -1114,18 +1140,8 @@ fn processOneTarget(job: Job) anyerror!void { |
| 1114 | 1140 | var deps = std.ArrayList([]const u8).init(arena); |
| 1115 | 1141 | var omit = false; |
| 1116 | 1142 | var flatten = false; |
| 1117 | | const implies = kv.value_ptr.object.get("Implies").?.array; |
| 1118 | | for (implies.items) |imply| { |
| 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 | | } |
| 1143 | var omit_deps: []const []const u8 = &.{}; |
| 1144 | var extra_deps: []const []const u8 = &.{}; |
| 1129 | 1145 | for (llvm_target.feature_overrides) |feature_override| { |
| 1130 | 1146 | if (mem.eql(u8, llvm_name, feature_override.llvm_name)) { |
| 1131 | 1147 | if (feature_override.omit) { |
| ... | ... | @@ -1142,12 +1158,30 @@ fn processOneTarget(job: Job) anyerror!void { |
| 1142 | 1158 | if (feature_override.desc) |override_desc| { |
| 1143 | 1159 | desc = override_desc; |
| 1144 | 1160 | } |
| 1145 | | for (feature_override.extra_deps) |extra_dep| { |
| 1146 | | try deps.append(extra_dep); |
| 1147 | | } |
| 1161 | omit_deps = feature_override.omit_deps; |
| 1162 | extra_deps = feature_override.extra_deps; |
| 1148 | 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 | 1185 | const feature: Feature = .{ |
| 1152 | 1186 | .llvm_name = llvm_name, |
| 1153 | 1187 | .zig_name = zig_name, |
| ... | ... | @@ -1170,6 +1204,21 @@ fn processOneTarget(job: Job) anyerror!void { |
| 1170 | 1204 | |
| 1171 | 1205 | var zig_name = try llvmNameToZigName(arena, llvm_name); |
| 1172 | 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 | 1222 | const features = kv.value_ptr.object.get("Features").?.array; |
| 1174 | 1223 | for (features.items) |feature| { |
| 1175 | 1224 | const feature_key = feature.object.get("def").?.string; |
| ... | ... | @@ -1181,7 +1230,14 @@ fn processOneTarget(job: Job) anyerror!void { |
| 1181 | 1230 | llvm_target, |
| 1182 | 1231 | feature_llvm_name, |
| 1183 | 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 | 1242 | const tune_features = kv.value_ptr.object.get("TuneFeatures").?.array; |
| 1187 | 1243 | for (tune_features.items) |feature| { |
| ... | ... | @@ -1228,7 +1284,7 @@ fn processOneTarget(job: Job) anyerror!void { |
| 1228 | 1284 | mem.sort(Feature, all_features.items, {}, featureLessThan); |
| 1229 | 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 | 1288 | var target_dir = try job.zig_src_dir.makeOpenPath(target_sub_path, .{}); |
| 1233 | 1289 | defer target_dir.close(); |
| 1234 | 1290 | |