diff options
Diffstat (limited to 'clang/lib/Basic')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 0ebe8a23c36..081b4caafd2 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -4257,21 +4257,18 @@ class ARMTargetInfo : public TargetInfo { ArchISA = llvm::ARMTargetParser::parseArchISA(ArchName); DefaultCPU = getDefaultCPU(ArchName); - // SubArch is specified by the target triple - if (!DefaultCPU.empty()) - setArchInfo(DefaultCPU); - else - // FIXME ArchInfo should be based on ArchName from triple, not on - // a hard-coded CPU name. Doing so currently causes regressions: - // test/Preprocessor/init.c: __ARM_ARCH_6J__ not defined - setArchInfo(CPU); + unsigned ArchKind = llvm::ARMTargetParser::parseArch(ArchName); + if (ArchKind == llvm::ARM::AK_INVALID) + // set arch of the CPU, either provided explicitly or hardcoded default + ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU); + setArchInfo(ArchKind); } - void setArchInfo(StringRef CPU) { + void setArchInfo(unsigned Kind) { StringRef SubArch; // cache TargetParser info - ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU); + ArchKind = Kind; SubArch = llvm::ARMTargetParser::getSubArch(ArchKind); ArchProfile = llvm::ARMTargetParser::parseArchProfile(SubArch); ArchVersion = llvm::ARMTargetParser::parseArchVersion(SubArch); @@ -4570,10 +4567,11 @@ public: } bool setCPU(const std::string &Name) override { - unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name); + if (Name != "generic") + setArchInfo(llvm::ARMTargetParser::parseCPUArch(Name)); + if (ArchKind == llvm::ARM::AK_INVALID) return false; - setArchInfo(Name); setAtomic(); CPU = Name; return true; |