summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/TargetParser.cpp
diff options
context:
space:
mode:
authorKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>2018-09-11 18:56:51 +0000
committerKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>2018-09-11 18:56:51 +0000
commit941615e4c8c6eb0300665360f53f8ac768179a13 (patch)
tree31829e5458c54f357b88ba82d931d7ef4bb1f78a /llvm/lib/Support/TargetParser.cpp
parent342c3bcf110f4ce4f75f1855845e43ab1553bdb9 (diff)
downloadbcm5719-llvm-941615e4c8c6eb0300665360f53f8ac768179a13.tar.gz
bcm5719-llvm-941615e4c8c6eb0300665360f53f8ac768179a13.zip
AMDGPU: Move isa version and EF_AMDGPU_MACH_* determination
into TargetParser. Also switch away from target features to CPU string when determining isa version. This fixes an issue when we output wrong isa version in the object code when features of a particular CPU are altered (i.e. gfx902 w/o xnack used to result in gfx900). Differential Revision: https://reviews.llvm.org/D51890 llvm-svn: 341982
Diffstat (limited to 'llvm/lib/Support/TargetParser.cpp')
-rw-r--r--llvm/lib/Support/TargetParser.cpp138
1 files changed, 128 insertions, 10 deletions
diff --git a/llvm/lib/Support/TargetParser.cpp b/llvm/lib/Support/TargetParser.cpp
index 1f580378c01..f73eb290752 100644
--- a/llvm/lib/Support/TargetParser.cpp
+++ b/llvm/lib/Support/TargetParser.cpp
@@ -17,11 +17,13 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
+#include "llvm/BinaryFormat/ELF.h"
#include <cctype>
using namespace llvm;
using namespace ARM;
using namespace AArch64;
+using namespace AMDGPU;
namespace {
@@ -947,6 +949,8 @@ bool llvm::AArch64::isX18ReservedByDefault(const Triple &TT) {
TT.isOSWindows();
}
+namespace {
+
struct GPUInfo {
StringLiteral Name;
StringLiteral CanonicalName;
@@ -954,11 +958,9 @@ struct GPUInfo {
unsigned Features;
};
-using namespace AMDGPU;
-static constexpr GPUInfo R600GPUs[26] = {
- // Name Canonical Kind Features
- // Name
- //
+constexpr GPUInfo R600GPUs[26] = {
+ // Name Canonical Kind Features
+ // Name
{{"r600"}, {"r600"}, GK_R600, FEATURE_NONE },
{{"rv630"}, {"r600"}, GK_R600, FEATURE_NONE },
{{"rv635"}, {"r600"}, GK_R600, FEATURE_NONE },
@@ -989,9 +991,9 @@ static constexpr GPUInfo R600GPUs[26] = {
// This table should be sorted by the value of GPUKind
// Don't bother listing the implicitly true features
-static constexpr GPUInfo AMDGCNGPUs[32] = {
- // Name Canonical Kind Features
- // Name
+constexpr GPUInfo AMDGCNGPUs[32] = {
+ // Name Canonical Kind Features
+ // Name
{{"gfx600"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32},
{{"tahiti"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32},
{{"gfx601"}, {"gfx601"}, GK_GFX601, FEATURE_NONE},
@@ -1026,8 +1028,7 @@ static constexpr GPUInfo AMDGCNGPUs[32] = {
{{"gfx906"}, {"gfx906"}, GK_GFX906, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32},
};
-static const GPUInfo *getArchEntry(AMDGPU::GPUKind AK,
- ArrayRef<GPUInfo> Table) {
+const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) {
GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE };
auto I = std::lower_bound(Table.begin(), Table.end(), Search,
@@ -1040,6 +1041,8 @@ static const GPUInfo *getArchEntry(AMDGPU::GPUKind AK,
return I;
}
+} // namespace
+
StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
return Entry->CanonicalName;
@@ -1092,3 +1095,118 @@ void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {
for (const auto C : R600GPUs)
Values.push_back(C.Name);
}
+
+StringRef AMDGPU::getArchNameFromElfMach(unsigned ElfMach) {
+ AMDGPU::GPUKind AK;
+
+ switch (ElfMach) {
+ case ELF::EF_AMDGPU_MACH_R600_R600: AK = GK_R600; break;
+ case ELF::EF_AMDGPU_MACH_R600_R630: AK = GK_R630; break;
+ case ELF::EF_AMDGPU_MACH_R600_RS880: AK = GK_RS880; break;
+ case ELF::EF_AMDGPU_MACH_R600_RV670: AK = GK_RV670; break;
+ case ELF::EF_AMDGPU_MACH_R600_RV710: AK = GK_RV710; break;
+ case ELF::EF_AMDGPU_MACH_R600_RV730: AK = GK_RV730; break;
+ case ELF::EF_AMDGPU_MACH_R600_RV770: AK = GK_RV770; break;
+ case ELF::EF_AMDGPU_MACH_R600_CEDAR: AK = GK_CEDAR; break;
+ case ELF::EF_AMDGPU_MACH_R600_CYPRESS: AK = GK_CYPRESS; break;
+ case ELF::EF_AMDGPU_MACH_R600_JUNIPER: AK = GK_JUNIPER; break;
+ case ELF::EF_AMDGPU_MACH_R600_REDWOOD: AK = GK_REDWOOD; break;
+ case ELF::EF_AMDGPU_MACH_R600_SUMO: AK = GK_SUMO; break;
+ case ELF::EF_AMDGPU_MACH_R600_BARTS: AK = GK_BARTS; break;
+ case ELF::EF_AMDGPU_MACH_R600_CAICOS: AK = GK_CAICOS; break;
+ case ELF::EF_AMDGPU_MACH_R600_CAYMAN: AK = GK_CAYMAN; break;
+ case ELF::EF_AMDGPU_MACH_R600_TURKS: AK = GK_TURKS; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX600: AK = GK_GFX600; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX601: AK = GK_GFX601; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX700: AK = GK_GFX700; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX701: AK = GK_GFX701; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX702: AK = GK_GFX702; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX703: AK = GK_GFX703; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX704: AK = GK_GFX704; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX801: AK = GK_GFX801; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX802: AK = GK_GFX802; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX803: AK = GK_GFX803; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX810: AK = GK_GFX810; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX900: AK = GK_GFX900; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX902: AK = GK_GFX902; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX904: AK = GK_GFX904; break;
+ case ELF::EF_AMDGPU_MACH_AMDGCN_GFX906: AK = GK_GFX906; break;
+ case ELF::EF_AMDGPU_MACH_NONE: AK = GK_NONE; break;
+ }
+
+ StringRef GPUName = getArchNameAMDGCN(AK);
+ if (GPUName != "")
+ return GPUName;
+ return getArchNameR600(AK);
+}
+
+unsigned AMDGPU::getElfMach(StringRef GPU) {
+ AMDGPU::GPUKind AK = parseArchAMDGCN(GPU);
+ if (AK == AMDGPU::GPUKind::GK_NONE)
+ AK = parseArchR600(GPU);
+
+ switch (AK) {
+ case GK_R600: return ELF::EF_AMDGPU_MACH_R600_R600;
+ case GK_R630: return ELF::EF_AMDGPU_MACH_R600_R630;
+ case GK_RS880: return ELF::EF_AMDGPU_MACH_R600_RS880;
+ case GK_RV670: return ELF::EF_AMDGPU_MACH_R600_RV670;
+ case GK_RV710: return ELF::EF_AMDGPU_MACH_R600_RV710;
+ case GK_RV730: return ELF::EF_AMDGPU_MACH_R600_RV730;
+ case GK_RV770: return ELF::EF_AMDGPU_MACH_R600_RV770;
+ case GK_CEDAR: return ELF::EF_AMDGPU_MACH_R600_CEDAR;
+ case GK_CYPRESS: return ELF::EF_AMDGPU_MACH_R600_CYPRESS;
+ case GK_JUNIPER: return ELF::EF_AMDGPU_MACH_R600_JUNIPER;
+ case GK_REDWOOD: return ELF::EF_AMDGPU_MACH_R600_REDWOOD;
+ case GK_SUMO: return ELF::EF_AMDGPU_MACH_R600_SUMO;
+ case GK_BARTS: return ELF::EF_AMDGPU_MACH_R600_BARTS;
+ case GK_CAICOS: return ELF::EF_AMDGPU_MACH_R600_CAICOS;
+ case GK_CAYMAN: return ELF::EF_AMDGPU_MACH_R600_CAYMAN;
+ case GK_TURKS: return ELF::EF_AMDGPU_MACH_R600_TURKS;
+ case GK_GFX600: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX600;
+ case GK_GFX601: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX601;
+ case GK_GFX700: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX700;
+ case GK_GFX701: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX701;
+ case GK_GFX702: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX702;
+ case GK_GFX703: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX703;
+ case GK_GFX704: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX704;
+ case GK_GFX801: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX801;
+ case GK_GFX802: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX802;
+ case GK_GFX803: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX803;
+ case GK_GFX810: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX810;
+ case GK_GFX900: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX900;
+ case GK_GFX902: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX902;
+ case GK_GFX904: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX904;
+ case GK_GFX906: return ELF::EF_AMDGPU_MACH_AMDGCN_GFX906;
+ case GK_NONE: return ELF::EF_AMDGPU_MACH_NONE;
+ }
+
+ llvm_unreachable("unknown GPU");
+}
+
+AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
+ if (GPU == "generic")
+ return {7, 0, 0};
+
+ AMDGPU::GPUKind AK = parseArchAMDGCN(GPU);
+ if (AK == AMDGPU::GPUKind::GK_NONE)
+ return {0, 0, 0};
+
+ switch (AK) {
+ case GK_GFX600: return {6, 0, 0};
+ case GK_GFX601: return {6, 0, 1};
+ case GK_GFX700: return {7, 0, 0};
+ case GK_GFX701: return {7, 0, 1};
+ case GK_GFX702: return {7, 0, 2};
+ case GK_GFX703: return {7, 0, 3};
+ case GK_GFX704: return {7, 0, 4};
+ case GK_GFX801: return {8, 0, 1};
+ case GK_GFX802: return {8, 0, 2};
+ case GK_GFX803: return {8, 0, 3};
+ case GK_GFX810: return {8, 1, 0};
+ case GK_GFX900: return {9, 0, 0};
+ case GK_GFX902: return {9, 0, 2};
+ case GK_GFX904: return {9, 0, 4};
+ case GK_GFX906: return {9, 0, 6};
+ default: return {0, 0, 0};
+ }
+}
OpenPOWER on IntegriCloud