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