Index: llvm/lib/Support/Triple.cpp =================================================================== --- llvm/lib/Support/Triple.cpp +++ llvm/lib/Support/Triple.cpp @@ -222,6 +222,29 @@ .Default(UnknownArch); } +static bool isValidARMArchName(StringRef ArchName) { + size_t offset = StringRef::npos; + if (ArchName.startswith("arm")) + offset = 3; + if (ArchName.startswith("armeb")) + offset = 5; + if (ArchName.startswith("thumb")) + offset = 5; + if (ArchName.startswith("thumbeb")) + offset = 7; + return StringSwitch(ArchName.substr(offset)) + .Cases("v2", "v2a", true) + .Cases("v3", "v3m", true) + .Cases("v4", "v4t", true) + .Cases("v5", "v5e", "v5t", "v5te", "v5tej", true) + .Cases("v6", "v6j", "v6k", "v6m", true) + .Cases("v6t2", "v6z", "v6zk", true) + .Cases("v7", "v7a", "v7em", "v7l", true) + .Cases("v7m", "v7r", "v7s", true) + .Cases("v8", "v8a", true) + .Default(false); +} + static Triple::ArchType parseArch(StringRef ArchName) { return StringSwitch(ArchName) .Cases("i386", "i486", "i586", "i686", Triple::x86) @@ -235,15 +258,17 @@ .Case("aarch64_be", Triple::aarch64_be) .Case("arm64", Triple::aarch64) .Cases("arm", "xscale", Triple::arm) - // FIXME: It would be good to replace these with explicit names for all the - // various suffixes supported. - .StartsWith("armv", Triple::arm) + .StartsWith("armv", + isValidARMArchName(ArchName) ? Triple::arm : Triple::UnknownArch) .Case("armeb", Triple::armeb) - .StartsWith("armebv", Triple::armeb) + .StartsWith("armebv", + isValidARMArchName(ArchName) ? Triple::armeb : Triple::UnknownArch) .Case("thumb", Triple::thumb) - .StartsWith("thumbv", Triple::thumb) + .StartsWith("thumbv", + isValidARMArchName(ArchName) ? Triple::thumb : Triple::UnknownArch) .Case("thumbeb", Triple::thumbeb) - .StartsWith("thumbebv", Triple::thumbeb) + .StartsWith("thumbebv", + isValidARMArchName(ArchName) ? Triple::thumbeb : Triple::UnknownArch) .Case("msp430", Triple::msp430) .Cases("mips", "mipseb", "mipsallegrex", Triple::mips) .Cases("mipsel", "mipsallegrexel", Triple::mipsel)