This is a fairly large changeset, but it can be broken into a few pieces: - `llvm/Support/*TargetParser*` are all moved from the LLVM Support component into a new LLVM Component called "TargetParser". This potentially enables using tablegen to maintain this information, as is shown in https://reviews.llvm.org/D137517. This cannot currently be done, as llvm-tblgen relies on LLVM's Support component. - This also moves two files from Support which use and depend on information in the TargetParser: - `llvm/Support/Host.{h,cpp}` which contains functions for inspecting the current Host machine for info about it, primarily to support getting the host triple, but also for `-mcpu=native` support in e.g. Clang. This is fairly tightly intertwined with the information in `X86TargetParser.h`, so keeping them in the same component makes sense. - `llvm/ADT/Triple.h` and `llvm/Support/Triple.cpp`, which contains the target triple parser and representation. This is very intertwined with the Arm target parser, because the arm architecture version appears in canonical triples on arm platforms. - I moved the relevant unittests to their own directory. And so, we end up with a single component that has all the information about the following, which to me seems like a unified component: - Triples that LLVM Knows about - Architecture names and CPUs that LLVM knows about - CPU detection logic for LLVM Given this, I have also moved `RISCVISAInfo.h` into this component, as it seems to me to be part of that same set of functionality. If you get link errors in your components after this patch, you likely need to add TargetParser into LLVM_LINK_COMPONENTS in CMake. Differential Revision: https://reviews.llvm.org/D137838
204 lines
5.5 KiB
C++
204 lines
5.5 KiB
C++
//===-- CSKYTargetParser - Parser for CSKY target features --------*- C++
|
|
//-*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements a target parser to recognise CSKY hardware features
|
|
// such as FPU/CPU/ARCH/extensions and specific support such as HWDIV.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TARGETPARSER_CSKYTARGETPARSER_H
|
|
#define LLVM_TARGETPARSER_CSKYTARGETPARSER_H
|
|
|
|
#include "llvm/TargetParser/Triple.h"
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
|
|
namespace CSKY {
|
|
|
|
// Arch extension modifiers for CPUs.
|
|
enum ArchExtKind : uint64_t {
|
|
AEK_INVALID = 0,
|
|
AEK_NONE = 1,
|
|
AEK_FPUV2SF = 1 << 1,
|
|
AEK_FPUV2DF = 1 << 2,
|
|
AEK_FDIVDU = 1 << 3,
|
|
AEK_FPUV3HI = 1 << 4,
|
|
AEK_FPUV3HF = 1 << 5,
|
|
AEK_FPUV3SF = 1 << 6,
|
|
AEK_FPUV3DF = 1 << 7,
|
|
AEK_FLOATE1 = 1 << 8,
|
|
AEK_FLOAT1E2 = 1 << 9,
|
|
AEK_FLOAT1E3 = 1 << 10,
|
|
AEK_FLOAT3E4 = 1 << 11,
|
|
AEK_FLOAT7E60 = 1 << 12,
|
|
AEK_HWDIV = 1 << 13,
|
|
AEK_STLD = 1 << 14,
|
|
AEK_PUSHPOP = 1 << 15,
|
|
AEK_EDSP = 1 << 16,
|
|
AEK_DSP1E2 = 1 << 17,
|
|
AEK_DSPE60 = 1 << 18,
|
|
AEK_DSPV2 = 1 << 19,
|
|
AEK_DSPSILAN = 1 << 20,
|
|
AEK_ELRW = 1 << 21,
|
|
AEK_TRUST = 1 << 22,
|
|
AEK_JAVA = 1 << 23,
|
|
AEK_CACHE = 1 << 24,
|
|
AEK_NVIC = 1 << 25,
|
|
AEK_DOLOOP = 1 << 26,
|
|
AEK_HIGHREG = 1 << 27,
|
|
AEK_SMART = 1 << 28,
|
|
AEK_VDSP2E3 = 1 << 29,
|
|
AEK_VDSP2E60F = 1 << 30,
|
|
AEK_VDSPV2 = 1ULL << 31,
|
|
AEK_HARDTP = 1ULL << 32,
|
|
AEK_SOFTTP = 1ULL << 33,
|
|
AEK_ISTACK = 1ULL << 34,
|
|
AEK_CONSTPOOL = 1ULL << 35,
|
|
AEK_STACKSIZE = 1ULL << 36,
|
|
AEK_CCRT = 1ULL << 37,
|
|
AEK_VDSPV1 = 1ULL << 38,
|
|
AEK_E1 = 1ULL << 39,
|
|
AEK_E2 = 1ULL << 40,
|
|
AEK_2E3 = 1ULL << 41,
|
|
AEK_MP = 1ULL << 42,
|
|
AEK_3E3R1 = 1ULL << 43,
|
|
AEK_3E3R2 = 1ULL << 44,
|
|
AEK_3E3R3 = 1ULL << 45,
|
|
AEK_3E7 = 1ULL << 46,
|
|
AEK_MP1E2 = 1ULL << 47,
|
|
AEK_7E10 = 1ULL << 48,
|
|
AEK_10E60 = 1ULL << 49
|
|
|
|
};
|
|
|
|
// Arch extension modifiers for CPUs.
|
|
enum MultiArchExtKind : uint64_t {
|
|
MAEK_E1 = CSKY::AEK_E1 | CSKY::AEK_ELRW,
|
|
MAEK_E2 = CSKY::AEK_E2 | CSKY::MAEK_E1,
|
|
MAEK_2E3 = CSKY::AEK_2E3 | CSKY::MAEK_E2,
|
|
MAEK_MP = CSKY::AEK_MP | CSKY::MAEK_2E3,
|
|
MAEK_3E3R1 = CSKY::AEK_3E3R1,
|
|
MAEK_3E3R2 = CSKY::AEK_3E3R1 | CSKY::AEK_3E3R2 | CSKY::AEK_DOLOOP,
|
|
MAEK_3E7 = CSKY::AEK_3E7 | CSKY::MAEK_2E3,
|
|
MAEK_MP1E2 = CSKY::AEK_MP1E2 | CSKY::MAEK_3E7,
|
|
MAEK_7E10 = CSKY::AEK_7E10 | CSKY::MAEK_3E7,
|
|
MAEK_10E60 = CSKY::AEK_10E60 | CSKY::MAEK_7E10,
|
|
};
|
|
// FPU names.
|
|
enum CSKYFPUKind {
|
|
#define CSKY_FPU(NAME, KIND, VERSION) KIND,
|
|
#include "CSKYTargetParser.def"
|
|
FK_LAST
|
|
};
|
|
|
|
// FPU Version
|
|
enum class FPUVersion {
|
|
NONE,
|
|
FPV2,
|
|
FPV3,
|
|
};
|
|
|
|
// Arch names.
|
|
enum class ArchKind {
|
|
#define CSKY_ARCH(NAME, ID, ARCH_BASE_EXT) ID,
|
|
#include "CSKYTargetParser.def"
|
|
};
|
|
|
|
// List of Arch Extension names.
|
|
// FIXME: TableGen this.
|
|
struct ExtName {
|
|
const char *NameCStr;
|
|
size_t NameLength;
|
|
uint64_t ID;
|
|
const char *Feature;
|
|
const char *NegFeature;
|
|
|
|
StringRef getName() const { return StringRef(NameCStr, NameLength); }
|
|
};
|
|
|
|
const CSKY::ExtName CSKYARCHExtNames[] = {
|
|
#define CSKY_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) \
|
|
{NAME, sizeof(NAME) - 1, ID, FEATURE, NEGFEATURE},
|
|
#include "CSKYTargetParser.def"
|
|
};
|
|
|
|
// List of CPU names and their arches.
|
|
template <typename T> struct CpuNames {
|
|
const char *NameCStr;
|
|
size_t NameLength;
|
|
T ArchID;
|
|
uint64_t defaultExt;
|
|
|
|
StringRef getName() const { return StringRef(NameCStr, NameLength); }
|
|
};
|
|
const CpuNames<CSKY::ArchKind> CPUNames[] = {
|
|
#define CSKY_CPU_NAME(NAME, ARCH_ID, DEFAULT_EXT) \
|
|
{NAME, sizeof(NAME) - 1, CSKY::ArchKind::ARCH_ID, DEFAULT_EXT},
|
|
#include "llvm/TargetParser/CSKYTargetParser.def"
|
|
};
|
|
|
|
// FIXME: TableGen this.
|
|
// The entries must appear in the order listed in CSKY::CSKYFPUKind for correct
|
|
// indexing
|
|
struct FPUName {
|
|
const char *NameCStr;
|
|
size_t NameLength;
|
|
CSKYFPUKind ID;
|
|
FPUVersion FPUVer;
|
|
|
|
StringRef getName() const { return StringRef(NameCStr, NameLength); }
|
|
};
|
|
|
|
static const FPUName FPUNames[] = {
|
|
#define CSKY_FPU(NAME, KIND, VERSION) {NAME, sizeof(NAME) - 1, KIND, VERSION},
|
|
#include "llvm/TargetParser/CSKYTargetParser.def"
|
|
};
|
|
|
|
// List of canonical arch names.
|
|
template <typename T> struct ArchNames {
|
|
const char *NameCStr;
|
|
size_t NameLength;
|
|
T ID;
|
|
uint64_t archBaseExt;
|
|
StringRef getName() const { return StringRef(NameCStr, NameLength); }
|
|
};
|
|
const ArchNames<CSKY::ArchKind> ARCHNames[] = {
|
|
#define CSKY_ARCH(NAME, ID, ARCH_BASE_EXT) \
|
|
{NAME, sizeof(NAME) - 1, CSKY::ArchKind::ID, ARCH_BASE_EXT},
|
|
#include "llvm/TargetParser/CSKYTargetParser.def"
|
|
};
|
|
|
|
StringRef getArchName(ArchKind AK);
|
|
StringRef getDefaultCPU(StringRef Arch);
|
|
StringRef getArchExtName(uint64_t ArchExtKind);
|
|
StringRef getArchExtFeature(StringRef ArchExt);
|
|
uint64_t getDefaultExtensions(StringRef CPU);
|
|
bool getExtensionFeatures(uint64_t Extensions,
|
|
std::vector<StringRef> &Features);
|
|
|
|
// Information by ID
|
|
StringRef getFPUName(unsigned FPUKind);
|
|
FPUVersion getFPUVersion(unsigned FPUKind);
|
|
|
|
bool getFPUFeatures(CSKYFPUKind Kind, std::vector<StringRef> &Features);
|
|
|
|
// Parser
|
|
ArchKind parseArch(StringRef Arch);
|
|
ArchKind parseCPUArch(StringRef CPU);
|
|
uint64_t parseArchExt(StringRef ArchExt);
|
|
void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values);
|
|
|
|
} // namespace CSKY
|
|
|
|
} // namespace llvm
|
|
|
|
#endif
|