mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Improve Triple to recognize the OS in i386-mingw32.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79359 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fe37ab335b
commit
651aa689cc
@ -29,8 +29,22 @@ class Twine;
|
||||
/// behavior for particular targets. This class isolates the mapping
|
||||
/// from the components of the target triple to well known IDs.
|
||||
///
|
||||
/// See autoconf/config.guess for a glimpse into what they look like
|
||||
/// in practice.
|
||||
/// At its core the Triple class is designed to be a wrapper for a triple
|
||||
/// string; it does not normally change or normalize the triple string, instead
|
||||
/// it provides additional APIs to parse normalized parts out of the triple.
|
||||
///
|
||||
/// One curiosity this implies is that for some odd triples the results of,
|
||||
/// e.g., getOSName() can be very different from the result of getOS(). For
|
||||
/// example, for 'i386-mingw32', getOS() will return MinGW32, but since
|
||||
/// getOSName() is purely based on the string structure that will return the
|
||||
/// empty string.
|
||||
///
|
||||
/// Clients should generally avoid using getOSName() and related APIs unless
|
||||
/// they are familiar with the triple format (this is particularly true when
|
||||
/// rewriting a triple).
|
||||
///
|
||||
/// See autoconf/config.guess for a glimpse into what they look like in
|
||||
/// practice.
|
||||
class Triple {
|
||||
public:
|
||||
enum ArchType {
|
||||
|
@ -117,6 +117,9 @@ void Triple::Parse() const {
|
||||
assert(!isInitialized() && "Invalid parse call.");
|
||||
|
||||
StringRef ArchName = getArchName();
|
||||
StringRef VendorName = getVendorName();
|
||||
StringRef OSName = getOSName();
|
||||
|
||||
if (ArchName.size() == 4 && ArchName[0] == 'i' &&
|
||||
ArchName[2] == '8' && ArchName[3] == '6' &&
|
||||
ArchName[1] - '3' < 6) // i[3-9]86
|
||||
@ -156,7 +159,22 @@ void Triple::Parse() const {
|
||||
else
|
||||
Arch = UnknownArch;
|
||||
|
||||
StringRef VendorName = getVendorName();
|
||||
|
||||
// Handle some exceptional cases where the OS / environment components are
|
||||
// stuck into the vendor field.
|
||||
if (StringRef(getTriple()).count('-') == 1) {
|
||||
StringRef VendorName = getVendorName();
|
||||
|
||||
if (VendorName.startswith("mingw32")) { // 'i386-mingw32', etc.
|
||||
Vendor = PC;
|
||||
OS = MinGW32;
|
||||
return;
|
||||
}
|
||||
|
||||
// arm-elf is another example, but we don't currently parse anything about
|
||||
// the environment.
|
||||
}
|
||||
|
||||
if (VendorName == "apple")
|
||||
Vendor = Apple;
|
||||
else if (VendorName == "pc")
|
||||
@ -164,7 +182,6 @@ void Triple::Parse() const {
|
||||
else
|
||||
Vendor = UnknownVendor;
|
||||
|
||||
StringRef OSName = getOSName();
|
||||
if (OSName.startswith("auroraux"))
|
||||
OS = AuroraUX;
|
||||
else if (OSName.startswith("cygwin"))
|
||||
|
@ -92,6 +92,18 @@ TEST(TripleTest, ParsedIDs) {
|
||||
|
||||
T = Triple("huh");
|
||||
EXPECT_EQ(Triple::UnknownArch, T.getArch());
|
||||
|
||||
// Two exceptional cases.
|
||||
|
||||
T = Triple("i386-mingw32");
|
||||
EXPECT_EQ(Triple::x86, T.getArch());
|
||||
EXPECT_EQ(Triple::PC, T.getVendor());
|
||||
EXPECT_EQ(Triple::MinGW32, T.getOS());
|
||||
|
||||
T = Triple("arm-elf");
|
||||
EXPECT_EQ(Triple::arm, T.getArch());
|
||||
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
|
||||
EXPECT_EQ(Triple::UnknownOS, T.getOS());
|
||||
}
|
||||
|
||||
TEST(TripleTest, MutateName) {
|
||||
|
Loading…
Reference in New Issue
Block a user