mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-17 23:44:43 +00:00
Switch the llvm::Triple class to immediately parse the triple string on
construction. Simplify its interface, implementation, and users accordingly as there is no longer an 'uninitialized' state to check for. Also, fixes a bug lurking in the interface as there was one method that didn't correctly check for initialization. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151024 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4b04578d65
commit
124e51c0d2
@ -64,9 +64,7 @@ public:
|
||||
ptx32, // PTX: ptx (32-bit)
|
||||
ptx64, // PTX: ptx (64-bit)
|
||||
le32, // le32: generic little-endian 32-bit CPU (PNaCl / Emscripten)
|
||||
amdil, // amdil: amd IL
|
||||
|
||||
InvalidArch
|
||||
amdil // amdil: amd IL
|
||||
};
|
||||
enum VendorType {
|
||||
UnknownVendor,
|
||||
@ -113,31 +111,29 @@ public:
|
||||
private:
|
||||
std::string Data;
|
||||
|
||||
/// The parsed arch type (or InvalidArch if uninitialized).
|
||||
mutable ArchType Arch;
|
||||
/// The parsed arch type.
|
||||
ArchType Arch;
|
||||
|
||||
/// The parsed vendor type.
|
||||
mutable VendorType Vendor;
|
||||
VendorType Vendor;
|
||||
|
||||
/// The parsed OS type.
|
||||
mutable OSType OS;
|
||||
OSType OS;
|
||||
|
||||
/// The parsed Environment type.
|
||||
mutable EnvironmentType Environment;
|
||||
EnvironmentType Environment;
|
||||
|
||||
bool isInitialized() const { return Arch != InvalidArch; }
|
||||
static ArchType ParseArch(StringRef ArchName);
|
||||
static VendorType ParseVendor(StringRef VendorName);
|
||||
static OSType ParseOS(StringRef OSName);
|
||||
static EnvironmentType ParseEnvironment(StringRef EnvironmentName);
|
||||
void Parse() const;
|
||||
|
||||
public:
|
||||
/// @name Constructors
|
||||
/// @{
|
||||
|
||||
/// \brief Default constructor produces an empty, invalid triple.
|
||||
Triple() : Data(), Arch(InvalidArch) {}
|
||||
Triple() : Data(), Arch(), Vendor(), OS(), Environment() {}
|
||||
|
||||
explicit Triple(const Twine &Str);
|
||||
Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr);
|
||||
@ -159,22 +155,13 @@ public:
|
||||
/// @{
|
||||
|
||||
/// getArch - Get the parsed architecture type of this triple.
|
||||
ArchType getArch() const {
|
||||
if (!isInitialized()) Parse();
|
||||
return Arch;
|
||||
}
|
||||
ArchType getArch() const { return Arch; }
|
||||
|
||||
/// getVendor - Get the parsed vendor type of this triple.
|
||||
VendorType getVendor() const {
|
||||
if (!isInitialized()) Parse();
|
||||
return Vendor;
|
||||
}
|
||||
VendorType getVendor() const { return Vendor; }
|
||||
|
||||
/// getOS - Get the parsed operating system type of this triple.
|
||||
OSType getOS() const {
|
||||
if (!isInitialized()) Parse();
|
||||
return OS;
|
||||
}
|
||||
OSType getOS() const { return OS; }
|
||||
|
||||
/// hasEnvironment - Does this triple have the optional environment
|
||||
/// (fourth) component?
|
||||
@ -183,10 +170,7 @@ public:
|
||||
}
|
||||
|
||||
/// getEnvironment - Get the parsed environment type of this triple.
|
||||
EnvironmentType getEnvironment() const {
|
||||
if (!isInitialized()) Parse();
|
||||
return Environment;
|
||||
}
|
||||
EnvironmentType getEnvironment() const { return Environment; }
|
||||
|
||||
/// getOSVersion - Parse the version number from the OS name component of the
|
||||
/// triple, if present.
|
||||
|
@ -786,7 +786,7 @@ namespace llvm {
|
||||
/// extern "C" void LLVMInitializeFooTargetInfo() {
|
||||
/// RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description");
|
||||
/// }
|
||||
template<Triple::ArchType TargetArchType = Triple::InvalidArch,
|
||||
template<Triple::ArchType TargetArchType = Triple::UnknownArch,
|
||||
bool HasJIT = false>
|
||||
struct RegisterTarget {
|
||||
RegisterTarget(Target &T, const char *Name, const char *Desc) {
|
||||
|
@ -47,8 +47,7 @@ static struct TripleMap triplemap[] = {
|
||||
{ Triple::x86, "i386-unknown-unknown" },
|
||||
{ Triple::x86_64, "x86_64-unknown-unknown" },
|
||||
{ Triple::arm, "arm-unknown-unknown" },
|
||||
{ Triple::thumb, "thumb-unknown-unknown" },
|
||||
{ Triple::InvalidArch, NULL, }
|
||||
{ Triple::thumb, "thumb-unknown-unknown" }
|
||||
};
|
||||
|
||||
/// infoFromArch - Returns the TripleMap corresponding to a given architecture,
|
||||
@ -128,8 +127,6 @@ EDDisassembler::EDDisassembler(CPUKey &key) :
|
||||
ErrorStream(nulls()),
|
||||
Key(key),
|
||||
TgtTriple(key.Triple.c_str()) {
|
||||
if (TgtTriple.getArch() == Triple::InvalidArch)
|
||||
return;
|
||||
|
||||
LLVMSyntaxVariant = getLLVMSyntaxVariant(TgtTriple.getArch(), key.Syntax);
|
||||
|
||||
|
@ -17,7 +17,6 @@ using namespace llvm;
|
||||
|
||||
const char *Triple::getArchTypeName(ArchType Kind) {
|
||||
switch (Kind) {
|
||||
case InvalidArch: return "<invalid>";
|
||||
case UnknownArch: return "unknown";
|
||||
|
||||
case arm: return "arm";
|
||||
@ -291,24 +290,19 @@ Triple::EnvironmentType Triple::ParseEnvironment(StringRef EnvironmentName) {
|
||||
.Default(UnknownEnvironment);
|
||||
}
|
||||
|
||||
void Triple::Parse() const {
|
||||
assert(!isInitialized() && "Invalid parse call.");
|
||||
|
||||
Arch = ParseArch(getArchName());
|
||||
Vendor = ParseVendor(getVendorName());
|
||||
OS = ParseOS(getOSName());
|
||||
Environment = ParseEnvironment(getEnvironmentName());
|
||||
|
||||
assert(isInitialized() && "Failed to initialize!");
|
||||
}
|
||||
|
||||
/// \brief Construct a triple from the string representation provided.
|
||||
///
|
||||
/// This doesn't actually parse the string representation eagerly. Instead it
|
||||
/// stores it, and tracks the fact that it hasn't been parsed. The first time
|
||||
/// any of the structural queries are made, the string is parsed and the
|
||||
/// results cached in various members.
|
||||
Triple::Triple(const Twine &Str) : Data(Str.str()), Arch(InvalidArch) {}
|
||||
Triple::Triple(const Twine &Str)
|
||||
: Data(Str.str()),
|
||||
Arch(ParseArch(getArchName())),
|
||||
Vendor(ParseVendor(getVendorName())),
|
||||
OS(ParseOS(getOSName())),
|
||||
Environment(ParseEnvironment(getEnvironmentName())) {
|
||||
}
|
||||
|
||||
/// \brief Construct a triple from string representations of the architecture,
|
||||
/// vendor, and OS.
|
||||
@ -318,7 +312,10 @@ Triple::Triple(const Twine &Str) : Data(Str.str()), Arch(InvalidArch) {}
|
||||
/// string, and lazily parses it on use.
|
||||
Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr)
|
||||
: Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()),
|
||||
Arch(InvalidArch) {
|
||||
Arch(ParseArch(ArchStr.str())),
|
||||
Vendor(ParseVendor(VendorStr.str())),
|
||||
OS(ParseOS(OSStr.str())),
|
||||
Environment() {
|
||||
}
|
||||
|
||||
/// \brief Construct a triple from string representations of the architecture,
|
||||
@ -331,7 +328,10 @@ Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
|
||||
const Twine &EnvironmentStr)
|
||||
: Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') +
|
||||
EnvironmentStr).str()),
|
||||
Arch(InvalidArch) {
|
||||
Arch(ParseArch(ArchStr.str())),
|
||||
Vendor(ParseVendor(VendorStr.str())),
|
||||
OS(ParseOS(OSStr.str())),
|
||||
Environment(ParseEnvironment(EnvironmentStr.str())) {
|
||||
}
|
||||
|
||||
std::string Triple::normalize(StringRef Str) {
|
||||
@ -577,8 +577,7 @@ bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor,
|
||||
}
|
||||
|
||||
void Triple::setTriple(const Twine &Str) {
|
||||
Data = Str.str();
|
||||
Arch = InvalidArch;
|
||||
*this = Triple(Str);
|
||||
}
|
||||
|
||||
void Triple::setArch(ArchType Kind) {
|
||||
@ -632,7 +631,6 @@ void Triple::setOSAndEnvironmentName(StringRef Str) {
|
||||
static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
|
||||
switch (Arch) {
|
||||
case llvm::Triple::UnknownArch:
|
||||
case llvm::Triple::InvalidArch:
|
||||
return 0;
|
||||
|
||||
case llvm::Triple::msp430:
|
||||
@ -682,7 +680,6 @@ Triple Triple::get32BitArchVariant() const {
|
||||
Triple T(*this);
|
||||
switch (getArch()) {
|
||||
case Triple::UnknownArch:
|
||||
case Triple::InvalidArch:
|
||||
case Triple::msp430:
|
||||
T.setArch(UnknownArch);
|
||||
break;
|
||||
@ -718,7 +715,6 @@ Triple Triple::get32BitArchVariant() const {
|
||||
Triple Triple::get64BitArchVariant() const {
|
||||
Triple T(*this);
|
||||
switch (getArch()) {
|
||||
case Triple::InvalidArch:
|
||||
case Triple::UnknownArch:
|
||||
case Triple::amdil:
|
||||
case Triple::arm:
|
||||
|
@ -154,7 +154,7 @@ TEST(TripleTest, Normalization) {
|
||||
// Check that normalizing a permutated set of valid components returns a
|
||||
// triple with the unpermuted components.
|
||||
StringRef C[4];
|
||||
for (int Arch = 1+Triple::UnknownArch; Arch < Triple::InvalidArch; ++Arch) {
|
||||
for (int Arch = 1+Triple::UnknownArch; Arch <= Triple::amdil; ++Arch) {
|
||||
C[0] = Triple::getArchTypeName(Triple::ArchType(Arch));
|
||||
for (int Vendor = 1+Triple::UnknownVendor; Vendor <= Triple::PC;
|
||||
++Vendor) {
|
||||
@ -273,11 +273,6 @@ TEST(TripleTest, BitWidthPredicates) {
|
||||
EXPECT_FALSE(T.isArch32Bit());
|
||||
EXPECT_FALSE(T.isArch64Bit());
|
||||
|
||||
T.setArch(Triple::InvalidArch);
|
||||
EXPECT_FALSE(T.isArch16Bit());
|
||||
EXPECT_FALSE(T.isArch32Bit());
|
||||
EXPECT_FALSE(T.isArch64Bit());
|
||||
|
||||
T.setArch(Triple::arm);
|
||||
EXPECT_FALSE(T.isArch16Bit());
|
||||
EXPECT_TRUE(T.isArch32Bit());
|
||||
|
Loading…
x
Reference in New Issue
Block a user