diff options
author | Vladimir Sukharev <vladimir.sukharev@arm.com> | 2015-09-23 09:29:32 +0000 |
---|---|---|
committer | Vladimir Sukharev <vladimir.sukharev@arm.com> | 2015-09-23 09:29:32 +0000 |
commit | 64f68248cda569a2ed9402a9a87eea42202e9794 (patch) | |
tree | 52fc0409400b2990d1ef9f6cd3903becbd9d489e /clang/lib/Driver/Tools.cpp | |
parent | f2ed5c68d2c44588e7059212589de328768bf7c6 (diff) | |
download | llvm-64f68248cda569a2ed9402a9a87eea42202e9794.zip llvm-64f68248cda569a2ed9402a9a87eea42202e9794.tar.gz llvm-64f68248cda569a2ed9402a9a87eea42202e9794.tar.bz2 |
[ARM] Fix crash "-target arm -mcpu=generic", without "-march="
An assertion hit has been fixed for cmdlines like
$ clang --target=arm-linux-gnueabi -mcpu=generic hello.c
Related to: http://reviews.llvm.org/rL245445
Reviewers: rengolin
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D13013
llvm-svn: 248370
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index d3afe3c..f407021 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -560,8 +560,7 @@ static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args, llvm::StringRef CPUName, llvm::StringRef ArchName, const llvm::Triple &Triple) { std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple); - std::string Arch = arm::getARMArch(ArchName, Triple); - if (arm::getLLVMArchSuffixForARM(CPU, Arch).empty()) + if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty()) D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); } @@ -6087,7 +6086,7 @@ const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) { std::string CPU = llvm::sys::getHostCPUName(); if (CPU != "generic") { // Translate the native cpu into the architecture suffix for that CPU. - StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch); + StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); // If there is no valid architecture suffix for this CPU we don't know how // to handle it, so return no architecture. if (Suffix.empty()) @@ -6133,12 +6132,19 @@ std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch, /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular /// CPU (or Arch, if CPU is generic). // FIXME: This is redundant with -mcpu, why does LLVM use this. -StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) { - if (CPU == "generic") - return llvm::ARM::getSubArch( - llvm::ARM::parseArch(Arch)); - - unsigned ArchKind = llvm::ARM::parseCPUArch(CPU); +StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch, + const llvm::Triple &Triple) { + unsigned ArchKind; + Arch = tools::arm::getARMArch(Arch, Triple); + if (CPU == "generic") { + ArchKind = llvm::ARM::parseArch(Arch); + if (ArchKind == llvm::ARM::AK_INVALID) + // In case of generic Arch, i.e. "arm", + // extract arch from default cpu of the Triple + ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(Arch)); + } else { + ArchKind = llvm::ARM::parseCPUArch(CPU); + } if (ArchKind == llvm::ARM::AK_INVALID) return ""; return llvm::ARM::getSubArch(ArchKind); |