aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Driver/Tools.cpp
diff options
context:
space:
mode:
authorVladimir Sukharev <vladimir.sukharev@arm.com>2015-09-23 09:29:32 +0000
committerVladimir Sukharev <vladimir.sukharev@arm.com>2015-09-23 09:29:32 +0000
commit64f68248cda569a2ed9402a9a87eea42202e9794 (patch)
tree52fc0409400b2990d1ef9f6cd3903becbd9d489e /clang/lib/Driver/Tools.cpp
parentf2ed5c68d2c44588e7059212589de328768bf7c6 (diff)
downloadllvm-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.cpp24
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);