[PATCH] D13013: Fix crash "-target arm -mcpu=generic", without "-march="
vsukharev created this revision. vsukharev added a reviewer: rengolin. vsukharev added a subscriber: cfe-commits. vsukharev set the repository for this revision to rL LLVM. Herald added subscribers: rengolin, aemerson. Follow-up to http://reviews.llvm.org/rL245445 Added more tests for "-mcpu=generic", a crash fixed. Repository: rL LLVM http://reviews.llvm.org/D13013 Files: lib/Driver/ToolChain.cpp lib/Driver/Tools.cpp lib/Driver/Tools.h test/Driver/aarch64-cpus.c test/Driver/arm-cortex-cpus.c Index: test/Driver/arm-cortex-cpus.c === --- test/Driver/arm-cortex-cpus.c +++ test/Driver/arm-cortex-cpus.c @@ -1,4 +1,16 @@ // == Check default CPU on each major architecture +// RUN: %clang -target arm -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-GENERIC %s +// CHECK-GENERIC: "-cc1"{{.*}} "-triple" "armv4t-{{.*}} "-target-cpu" "generic" + +// RUN: %clang -target armeb -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-GENERIC %s +// CHECK-BE-GENERIC: "-cc1"{{.*}} "-triple" "armebv4t-{{.*}} "-target-cpu" "generic" + +// RUN: %clang -target arm -mthumb -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-GENERIC-THUMB %s +// CHECK-GENERIC-THUMB: "-cc1"{{.*}} "-triple" "thumbv4t-{{.*}} "-target-cpu" "generic" + +// RUN: %clang -target armeb -mthumb -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-GENERIC-THUMB %s +// CHECK-BE-GENERIC-THUMB: "-cc1"{{.*}} "-triple" "thumbebv4t-{{.*}} "-target-cpu" "generic" + // RUN: %clang -target armv4t -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V4T %s // RUN: %clang -target arm -march=armv4t -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V4T %s // CHECK-V4T: "-cc1"{{.*}} "-triple" "armv4t-{{.*}} "-target-cpu" "arm7tdmi" Index: test/Driver/aarch64-cpus.c === --- test/Driver/aarch64-cpus.c +++ test/Driver/aarch64-cpus.c @@ -1,12 +1,17 @@ // Check target CPUs are correctly passed. // RUN: %clang -target aarch64 -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s +// RUN: %clang -target aarch64 -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s // RUN: %clang -target aarch64 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s +// RUN: %clang -target aarch64 -mlittle-endian -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s // RUN: %clang -target aarch64_be -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s +// RUN: %clang -target aarch64_be -mlittle-endian -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s // GENERIC: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" "generic" // RUN: %clang -target arm64 -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s +// RUN: %clang -target arm64 -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s // RUN: %clang -target arm64 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s +// RUN: %clang -target arm64 -mlittle-endian -mcpu-generic -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s // ARM64-GENERIC: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic" Index: lib/Driver/Tools.h === --- lib/Driver/Tools.h +++ lib/Driver/Tools.h @@ -246,7 +246,8 @@ const std::string getARMArch(StringRef Arch, const llvm::Triple &Triple); StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple); -StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch); +StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch, + const llvm::Triple &Triple); void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple); Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -560,8 +560,7 @@ 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); } @@ -6081,7 +6080,7 @@ 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
Re: [PATCH] D13013: [ARM] Fix crash "-target arm -mcpu=generic", without "-march="
vsukharev added a comment. Yes, trying to pass new tests in test/Driver/arm-cortex-cpus.c, without code patch, it crashes $ clang --target=arm-linux-gnueabi -mcpu=generic hello.c /work/oss_llvm/llvm/include/llvm/ADT/StringRef.h:84: llvm::StringRef::StringRef(const char*, size_t): Assertion `(data || length == 0) && "StringRef cannot be built from a NULL argument with non-null length"' failed. ... #9 0x2b22f25 (anonymous namespace)::._115::getSubArch() const lib/Support/TargetParser.cpp:74:0 #10 0x2b27147 llvm::ARM::getSubArch(unsigned int) lib/Support/TargetParser.cpp:309:0 #11 0x31871a1 clang::driver::tools::arm::getLLVMArchSuffixForARM(llvm::StringRef, llvm::StringRef) tools/clang/lib/Driver/Tools.cpp:6374:0 #12 0x3125da8 clang::driver::ToolChain::ComputeLLVMTriple(llvm::opt::ArgList const&, clang::driver::types::ID) const tools/clang/lib/Driver/ToolChain.cpp:321:0 #13 0x312656c clang::driver::ToolChain::ComputeEffectiveClangTriple(llvm::opt::ArgList const&, clang::driver::types::ID) const tools/clang/lib/Driver/ToolChain.cpp:353:0 #14 0x31726b1 clang::driver::tools::Clang::ConstructJob(clang::driver::Compilation&, clang::driver::JobAction const&, clang::driver::InputInfo const&, llvm::SmallVector const&, llvm::opt::ArgList const&, char const*) const tools/clang/lib/Driver/Tools.cpp:3363:0 Repository: rL LLVM http://reviews.llvm.org/D13013 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r248370 - [ARM] Fix crash "-target arm -mcpu=generic", without "-march="
Author: vsukharev Date: Wed Sep 23 04:29:32 2015 New Revision: 248370 URL: http://llvm.org/viewvc/llvm-project?rev=248370&view=rev Log: [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 Modified: cfe/trunk/lib/Driver/ToolChain.cpp cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/lib/Driver/Tools.h cfe/trunk/test/Driver/aarch64-cpus.c cfe/trunk/test/Driver/arm-cortex-cpus.c Modified: cfe/trunk/lib/Driver/ToolChain.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=248370&r1=248369&r2=248370&view=diff == --- cfe/trunk/lib/Driver/ToolChain.cpp (original) +++ cfe/trunk/lib/Driver/ToolChain.cpp Wed Sep 23 04:29:32 2015 @@ -317,8 +317,7 @@ std::string ToolChain::ComputeLLVMTriple ? tools::arm::getARMCPUForMArch(MArch, Triple).str() : tools::arm::getARMTargetCPU(MCPU, MArch, Triple); StringRef Suffix = - tools::arm::getLLVMArchSuffixForARM(CPU, - tools::arm::getARMArch(MArch, Triple)); + tools::arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); bool ThumbDefault = Suffix.startswith("v6m") || Suffix.startswith("v7m") || Suffix.startswith("v7em") || (Suffix.startswith("v7") && getTriple().isOSBinFormatMachO()); Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=248370&r1=248369&r2=248370&view=diff == --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Wed Sep 23 04:29:32 2015 @@ -560,8 +560,7 @@ static void checkARMCPUName(const Driver 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(String 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(StringR /// 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); Modified: cfe/trunk/lib/Driver/Tools.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.h?rev=248370&r1=248369&r2=248370&view=diff == --- cfe/trunk/lib/Driver/Tools.h (original) +++ cfe/trunk/lib/Driver/Tools.h Wed Sep 23 04:29:32 2015 @@ -246,7 +246,8 @@ std::string getARMTargetCPU(StringRef CP const std::string getARMArch(StringRef Arch, const llvm::Triple &Triple); StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple); -StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch); +StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch, + const llvm::Triple &Triple); void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArg
Re: [PATCH] D13013: [ARM] Fix crash "-target arm -mcpu=generic", without "-march="
This revision was automatically updated to reflect the committed changes. Closed by commit rL248370: [ARM] Fix crash "-target arm -mcpu=generic", without "-march=" (authored by vsukharev). Changed prior to commit: http://reviews.llvm.org/D13013?vs=35234&id=35472#toc Repository: rL LLVM http://reviews.llvm.org/D13013 Files: cfe/trunk/lib/Driver/ToolChain.cpp cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/lib/Driver/Tools.h cfe/trunk/test/Driver/aarch64-cpus.c cfe/trunk/test/Driver/arm-cortex-cpus.c Index: cfe/trunk/test/Driver/arm-cortex-cpus.c === --- cfe/trunk/test/Driver/arm-cortex-cpus.c +++ cfe/trunk/test/Driver/arm-cortex-cpus.c @@ -1,4 +1,16 @@ // == Check default CPU on each major architecture +// RUN: %clang -target arm -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-GENERIC %s +// CHECK-GENERIC: "-cc1"{{.*}} "-triple" "armv4t-{{.*}} "-target-cpu" "generic" + +// RUN: %clang -target armeb -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-GENERIC %s +// CHECK-BE-GENERIC: "-cc1"{{.*}} "-triple" "armebv4t-{{.*}} "-target-cpu" "generic" + +// RUN: %clang -target arm -mthumb -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-GENERIC-THUMB %s +// CHECK-GENERIC-THUMB: "-cc1"{{.*}} "-triple" "thumbv4t-{{.*}} "-target-cpu" "generic" + +// RUN: %clang -target armeb -mthumb -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-GENERIC-THUMB %s +// CHECK-BE-GENERIC-THUMB: "-cc1"{{.*}} "-triple" "thumbebv4t-{{.*}} "-target-cpu" "generic" + // RUN: %clang -target armv4t -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V4T %s // RUN: %clang -target arm -march=armv4t -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V4T %s // CHECK-V4T: "-cc1"{{.*}} "-triple" "armv4t-{{.*}} "-target-cpu" "arm7tdmi" Index: cfe/trunk/test/Driver/aarch64-cpus.c === --- cfe/trunk/test/Driver/aarch64-cpus.c +++ cfe/trunk/test/Driver/aarch64-cpus.c @@ -1,12 +1,17 @@ // Check target CPUs are correctly passed. // RUN: %clang -target aarch64 -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s +// RUN: %clang -target aarch64 -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s // RUN: %clang -target aarch64 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s +// RUN: %clang -target aarch64 -mlittle-endian -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s // RUN: %clang -target aarch64_be -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s +// RUN: %clang -target aarch64_be -mlittle-endian -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s // GENERIC: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" "generic" // RUN: %clang -target arm64 -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s +// RUN: %clang -target arm64 -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s // RUN: %clang -target arm64 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s +// RUN: %clang -target arm64 -mlittle-endian -mcpu-generic -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s // ARM64-GENERIC: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic" Index: cfe/trunk/lib/Driver/Tools.cpp === --- cfe/trunk/lib/Driver/Tools.cpp +++ cfe/trunk/lib/Driver/Tools.cpp @@ -560,8 +560,7 @@ 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 @@ 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 @@ /// 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, +
RE: r248370 - [ARM] Fix crash "-target arm -mcpu=generic", without "-march="
Hi Alexander, Sorry, forgot to run valgrind. I’m gonna commit quick follow-up (see attach), would you please take a look? Thanks, Vladimir From: Alexander Kornienko [mailto:ale...@google.com] Sent: 23 September 2015 15:41 To: Vladimir Sukharev Cc: cfe-commits Subject: Re: r248370 - [ARM] Fix crash "-target arm -mcpu=generic", without "-march=" On Wed, Sep 23, 2015 at 11:29 AM, Vladimir Sukharev via cfe-commits mailto:cfe-commits@lists.llvm.org>> wrote: Author: vsukharev Date: Wed Sep 23 04:29:32 2015 New Revision: 248370 URL: http://llvm.org/viewvc/llvm-project?rev=248370&view=rev Log: [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 Modified: cfe/trunk/lib/Driver/ToolChain.cpp cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/lib/Driver/Tools.h cfe/trunk/test/Driver/aarch64-cpus.c cfe/trunk/test/Driver/arm-cortex-cpus.c Modified: cfe/trunk/lib/Driver/ToolChain.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=248370&r1=248369&r2=248370&view=diff == --- cfe/trunk/lib/Driver/ToolChain.cpp (original) +++ cfe/trunk/lib/Driver/ToolChain.cpp Wed Sep 23 04:29:32 2015 @@ -317,8 +317,7 @@ std::string ToolChain::ComputeLLVMTriple ? tools::arm::getARMCPUForMArch(MArch, Triple).str() : tools::arm::getARMTargetCPU(MCPU, MArch, Triple); StringRef Suffix = - tools::arm::getLLVMArchSuffixForARM(CPU, - tools::arm::getARMArch(MArch, Triple)); + tools::arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); bool ThumbDefault = Suffix.startswith("v6m") || Suffix.startswith("v7m") || Suffix.startswith("v7em") || (Suffix.startswith("v7") && getTriple().isOSBinFormatMachO()); Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=248370&r1=248369&r2=248370&view=diff == --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Wed Sep 23 04:29:32 2015 @@ -560,8 +560,7 @@ static void checkARMCPUName(const Driver 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(String 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(StringR /// 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); arm::getARMArch returns std::string, so here you're ending up with a dangling StringRef. Please fix or revert. + 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); Modified: cfe/trunk/lib/Driver/Tools.h URL: http://llvm.org/vi
RE: r248370 - [ARM] Fix crash "-target arm -mcpu=generic", without "-march="
Ø valgrind??? I thought, every LLVM developer must know about ASAN <http://clang.llvm.org/docs/AddressSanitizer.html> ;) ASAN is not that great to quicktest such a small patches, and valgrind does its job in plug-and play manner. Or, which is recommended way to use ASAN as a pre-commit test, apart from obvious “always build clang with ASAN” ? Any docs, tips/tricks? Ø The patch changes the return value of the getLLVMArchSuffixForARM function. Is it intended? Not sure what do you mean. It seems I haven’t changed the semantics during this fix. If you’re asking about http://reviews.llvm.org/rL248370 , would you please post comment there? Ø Also, I'd prefer "std::string" instead of "auto". Ok, next version is attached -- Alex Thanks, Vladimir From: Alexander Kornienko [mailto:ale...@google.com] Sent: 23 September 2015 15:41 To: Vladimir Sukharev Cc: cfe-commits Subject: Re: r248370 - [ARM] Fix crash "-target arm -mcpu=generic", without "-march=" On Wed, Sep 23, 2015 at 11:29 AM, Vladimir Sukharev via cfe-commits wrote: Author: vsukharev Date: Wed Sep 23 04:29:32 2015 New Revision: 248370 URL: http://llvm.org/viewvc/llvm-project?rev=248370 <http://llvm.org/viewvc/llvm-project?rev=248370&view=rev> &view=rev Log: [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 Modified: cfe/trunk/lib/Driver/ToolChain.cpp cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/lib/Driver/Tools.h cfe/trunk/test/Driver/aarch64-cpus.c cfe/trunk/test/Driver/arm-cortex-cpus.c Modified: cfe/trunk/lib/Driver/ToolChain.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=248370 <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=248370&r1=248369&r2=248370&view=diff> &r1=248369&r2=248370&view=diff == --- cfe/trunk/lib/Driver/ToolChain.cpp (original) +++ cfe/trunk/lib/Driver/ToolChain.cpp Wed Sep 23 04:29:32 2015 @@ -317,8 +317,7 @@ std::string ToolChain::ComputeLLVMTriple ? tools::arm::getARMCPUForMArch(MArch, Triple).str() : tools::arm::getARMTargetCPU(MCPU, MArch, Triple); StringRef Suffix = - tools::arm::getLLVMArchSuffixForARM(CPU, - tools::arm::getARMArch(MArch, Triple)); + tools::arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); bool ThumbDefault = Suffix.startswith("v6m") || Suffix.startswith("v7m") || Suffix.startswith("v7em") || (Suffix.startswith("v7") && getTriple().isOSBinFormatMachO()); Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=248370 <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=248370&r1=248369&r2=248370&view=diff> &r1=248369&r2=248370&view=diff == --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Wed Sep 23 04:29:32 2015 @@ -560,8 +560,7 @@ static void checkARMCPUName(const Driver 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(String 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(StringR /// 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::get
r248479 - [ARM] Follow-up to fix crash "-target arm -mcpu=generic", without "-march="
Author: vsukharev Date: Thu Sep 24 04:55:08 2015 New Revision: 248479 URL: http://llvm.org/viewvc/llvm-project?rev=248479&view=rev Log: [ARM] Follow-up to fix crash "-target arm -mcpu=generic", without "-march=" Fix of dangling StringRef after temporary std::string is destroyed Follow-up to: http://reviews.llvm.org/rL248370 Reviewers: alexfh Subscribers: cfe-commits Modified: cfe/trunk/lib/Driver/Tools.cpp Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=248479&r1=248478&r2=248479&view=diff == --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Thu Sep 24 04:55:08 2015 @@ -6164,13 +6164,13 @@ std::string arm::getARMTargetCPU(StringR 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); +StringRef ARMArch = tools::arm::getARMArch(Arch, Triple); +ArchKind = llvm::ARM::parseArch(ARMArch); 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)); + ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch)); } else { ArchKind = llvm::ARM::parseCPUArch(CPU); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r248480 - [ARM] Follow-up to fix crash "-target arm -mcpu=generic", without "-march="
Author: vsukharev Date: Thu Sep 24 05:06:44 2015 New Revision: 248480 URL: http://llvm.org/viewvc/llvm-project?rev=248480&view=rev Log: [ARM] Follow-up to fix crash "-target arm -mcpu=generic", without "-march=" Fix of dangling StringRef after temporary std::string is destroyed Follow-up to: http://reviews.llvm.org/rL248479 Reviewers: alexfh Subscribers: cfe-commits Modified: cfe/trunk/lib/Driver/Tools.cpp Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=248480&r1=248479&r2=248480&view=diff == --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Thu Sep 24 05:06:44 2015 @@ -6165,7 +6165,7 @@ StringRef arm::getLLVMArchSuffixForARM(S const llvm::Triple &Triple) { unsigned ArchKind; if (CPU == "generic") { -StringRef ARMArch = tools::arm::getARMArch(Arch, Triple); +std::string ARMArch = tools::arm::getARMArch(Arch, Triple); ArchKind = llvm::ARM::parseArch(ARMArch); if (ArchKind == llvm::ARM::AK_INVALID) // In case of generic Arch, i.e. "arm", ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r245445 - [ARM] Proper generic cpus handling
Author: vsukharev Date: Wed Aug 19 09:50:18 2015 New Revision: 245445 URL: http://llvm.org/viewvc/llvm-project?rev=245445&view=rev Log: [ARM] Proper generic cpus handling "generic" cpu was wrongly handled as exact real CPU name of ARMv8.1A architecture. This has been fixed, now it is abstract name, suitable for any arch. Reviewers: rengolin Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D11640 Modified: cfe/trunk/lib/Basic/Targets.cpp cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/test/Driver/arm-cortex-cpus.c Modified: cfe/trunk/lib/Basic/Targets.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=245445&r1=245444&r2=245445&view=diff == --- cfe/trunk/lib/Basic/Targets.cpp (original) +++ cfe/trunk/lib/Basic/Targets.cpp Wed Aug 19 09:50:18 2015 @@ -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; Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=245445&r1=245444&r2=245445&view=diff == --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Wed Aug 19 09:50:18 2015 @@ -6002,9 +6002,9 @@ std::string arm::getARMTargetCPU(StringR /// 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) Modified: cfe/trunk/test/Driver/arm-cortex-cpus.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/arm-cortex-cpus.c?rev=245445&r1=245444&r2=245445&view=diff == --- cfe/trunk/test/Driver/arm-cortex-cpus.c (original) +++ cfe/trunk/test/Driver/arm-cortex-cpus.c Wed Aug 19 09:50:18 2015 @@ -134,6 +134,18 @@ // RUN: %clang -target arm -mlittle-endian -march=armv8-a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A %s // CHECK-V8A: "-cc1"{{.*}} "-triple" "armv8-{{.*}}" "-target-cpu" "cortex-a53" +// RUN: %clang -mcpu=generic -target armv8 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s +// RUN: %clang -mcpu=generic -target arm -march=armv8 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s +// RUN: %clang -mcpu=generic -target armv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s +// RUN: %clang -mcpu=generic -target arm -march=armv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s +// RUN: %clang -mcpu=generic -target arm -march=armv8-a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s +// RUN: %clang -mcpu=generic -target armv8 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s +// RUN: %clang -mcpu=generic -target arm -march=armv8 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V8A-GENERIC %s +// RUN: %clang -mcpu=generic -target armv8a -mlittle-endian -### -c %s 2>&1 | Fil