diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 22 | ||||
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 6 |
2 files changed, 13 insertions, 15 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; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 79d8dfb2a94..87111fa601f 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -6002,9 +6002,9 @@ std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch, /// CPU (or Arch, if CPU is generic). // FIXME: This is redundant with -mcpu, why does LLVM use this. const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) { - if (CPU == "generic" && - llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A) - return "v8.1a"; + if (CPU == "generic") + return llvm::ARMTargetParser::getSubArch( + llvm::ARMTargetParser::parseArch(Arch)); unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU); if (ArchKind == llvm::ARM::AK_INVALID) |