| ... | ... | @@ -486,6 +486,54 @@ pub fn arePointersLogical(target: std.Target, as: AddressSpace) bool { |
| 486 | 486 | }; |
| 487 | 487 | } |
| 488 | 488 | |
| 489 | pub fn isDynamicAMDGCNFeature(target: std.Target, feature: std.Target.Cpu.Feature) bool { |
| 490 | if (target.cpu.arch != .amdgcn) return false; |
| 491 | |
| 492 | const sramecc_only = &[_]*const std.Target.Cpu.Model{ |
| 493 | &std.Target.amdgcn.cpu.gfx1010, |
| 494 | &std.Target.amdgcn.cpu.gfx1011, |
| 495 | &std.Target.amdgcn.cpu.gfx1012, |
| 496 | &std.Target.amdgcn.cpu.gfx1013, |
| 497 | }; |
| 498 | const xnack_or_sramecc = &[_]*const std.Target.Cpu.Model{ |
| 499 | &std.Target.amdgcn.cpu.gfx1030, |
| 500 | &std.Target.amdgcn.cpu.gfx1031, |
| 501 | &std.Target.amdgcn.cpu.gfx1032, |
| 502 | &std.Target.amdgcn.cpu.gfx1033, |
| 503 | &std.Target.amdgcn.cpu.gfx1034, |
| 504 | &std.Target.amdgcn.cpu.gfx1035, |
| 505 | &std.Target.amdgcn.cpu.gfx1036, |
| 506 | &std.Target.amdgcn.cpu.gfx1100, |
| 507 | &std.Target.amdgcn.cpu.gfx1101, |
| 508 | &std.Target.amdgcn.cpu.gfx1102, |
| 509 | &std.Target.amdgcn.cpu.gfx1103, |
| 510 | &std.Target.amdgcn.cpu.gfx1150, |
| 511 | &std.Target.amdgcn.cpu.gfx1151, |
| 512 | &std.Target.amdgcn.cpu.gfx1152, |
| 513 | &std.Target.amdgcn.cpu.gfx1153, |
| 514 | &std.Target.amdgcn.cpu.gfx1200, |
| 515 | &std.Target.amdgcn.cpu.gfx1201, |
| 516 | }; |
| 517 | const feature_tag: std.Target.amdgcn.Feature = @enumFromInt(feature.index); |
| 518 | |
| 519 | if (feature_tag == .sramecc) { |
| 520 | if (std.mem.indexOfScalar( |
| 521 | *const std.Target.Cpu.Model, |
| 522 | sramecc_only ++ xnack_or_sramecc, |
| 523 | target.cpu.model, |
| 524 | )) |_| return true; |
| 525 | } |
| 526 | if (feature_tag == .xnack) { |
| 527 | if (std.mem.indexOfScalar( |
| 528 | *const std.Target.Cpu.Model, |
| 529 | xnack_or_sramecc, |
| 530 | target.cpu.model, |
| 531 | )) |_| return true; |
| 532 | } |
| 533 | |
| 534 | return false; |
| 535 | } |
| 536 | |
| 489 | 537 | pub fn llvmMachineAbi(target: std.Target) ?[:0]const u8 { |
| 490 | 538 | // LLD does not support ELFv1. Rather than having LLVM produce ELFv1 code and then linking it |
| 491 | 539 | // into a broken ELFv2 binary, just force LLVM to use ELFv2 as well. This will break when glibc |