On Wed, Sep 23, 2015 at 11:29 AM, Vladimir Sukharev via cfe-commits < 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/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 > &CmdArgs, > const llvm::Triple &Triple); > > Modified: cfe/trunk/test/Driver/aarch64-cpus.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/aarch64-cpus.c?rev=248370&r1=248369&r2=248370&view=diff > > ============================================================================== > --- cfe/trunk/test/Driver/aarch64-cpus.c (original) > +++ cfe/trunk/test/Driver/aarch64-cpus.c Wed Sep 23 04:29:32 2015 > @@ -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" > > > 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=248370&r1=248369&r2=248370&view=diff > > ============================================================================== > --- cfe/trunk/test/Driver/arm-cortex-cpus.c (original) > +++ cfe/trunk/test/Driver/arm-cortex-cpus.c Wed Sep 23 04:29:32 2015 > @@ -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" > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > -- Alexander Kornienko | Software Engineer | ale...@google.com | Google Germany, Munich
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits