From 18e5ce01881041db078312a2dd875cc89deb2c25 Mon Sep 17 00:00:00 2001 From: Renato Golin Date: Mon, 17 Nov 2014 14:08:57 +0000 Subject: [PATCH] Fix ARM triple parsing The triple parser should only accept existing architecture names when the triple starts with armv, armebv, thumbv or thumbebv. Patch by Gabor Ballabas. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222129 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Triple.cpp | 61 +++++++++++++++++++++++------- test/CodeGen/ARM/invalid-target.ll | 32 ++++++++++++++++ 2 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 test/CodeGen/ARM/invalid-target.ll diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp index 7a9dc39369f..4a4773e2f7e 100644 --- a/lib/Support/Triple.cpp +++ b/lib/Support/Triple.cpp @@ -222,6 +222,50 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { .Default(UnknownArch); } +static Triple::ArchType parseARMArch(StringRef ArchName) { + size_t offset = StringRef::npos; + Triple::ArchType arch = Triple::UnknownArch; + bool isThumb = ArchName.startswith("thumb"); + + if (ArchName.equals("arm")) + return Triple::arm; + if (ArchName.equals("armeb")) + return Triple::armeb; + if (ArchName.equals("thumb")) + return Triple::thumb; + if (ArchName.equals("thumbeb")) + return Triple::thumbeb; + if (ArchName.equals("arm64") || ArchName.equals("aarch64")) + return Triple::aarch64; + if (ArchName.equals("aarch64_be")) + return Triple::aarch64_be; + + if (ArchName.startswith("armv")) { + offset = 3; + arch = Triple::arm; + } else if (ArchName.startswith("armebv")) { + offset = 5; + arch = Triple::armeb; + } else if (ArchName.startswith("thumbv")) { + offset = 5; + arch = Triple::thumb; + } else if (ArchName.startswith("thumbebv")) { + offset = 7; + arch = Triple::thumbeb; + } + return StringSwitch(ArchName.substr(offset)) + .Cases("v2", "v2a", isThumb ? Triple::UnknownArch : arch) + .Cases("v3", "v3m", isThumb ? Triple::UnknownArch : arch) + .Cases("v4", "v4t", arch) + .Cases("v5", "v5e", "v5t", "v5te", "v5tej", arch) + .Cases("v6", "v6j", "v6k", "v6m", arch) + .Cases("v6t2", "v6z", "v6zk", arch) + .Cases("v7", "v7a", "v7em", "v7l", arch) + .Cases("v7m", "v7r", "v7s", arch) + .Cases("v8", "v8a", arch) + .Default(Triple::UnknownArch); +} + static Triple::ArchType parseArch(StringRef ArchName) { return StringSwitch(ArchName) .Cases("i386", "i486", "i586", "i686", Triple::x86) @@ -231,19 +275,10 @@ static Triple::ArchType parseArch(StringRef ArchName) { .Case("powerpc", Triple::ppc) .Cases("powerpc64", "ppu", Triple::ppc64) .Case("powerpc64le", Triple::ppc64le) - .Case("aarch64", Triple::aarch64) - .Case("aarch64_be", Triple::aarch64_be) - .Case("arm64", Triple::aarch64) - .Cases("arm", "xscale", Triple::arm) - // FIXME: It would be good to replace these with explicit names for all the - // various suffixes supported. - .StartsWith("armv", Triple::arm) - .Case("armeb", Triple::armeb) - .StartsWith("armebv", Triple::armeb) - .Case("thumb", Triple::thumb) - .StartsWith("thumbv", Triple::thumb) - .Case("thumbeb", Triple::thumbeb) - .StartsWith("thumbebv", Triple::thumbeb) + .Case("xscale", Triple::arm) + .StartsWith("arm", parseARMArch(ArchName)) + .StartsWith("thumb", parseARMArch(ArchName)) + .StartsWith("aarch64", parseARMArch(ArchName)) .Case("msp430", Triple::msp430) .Cases("mips", "mipseb", "mipsallegrex", Triple::mips) .Cases("mipsel", "mipsallegrexel", Triple::mipsel) diff --git a/test/CodeGen/ARM/invalid-target.ll b/test/CodeGen/ARM/invalid-target.ll new file mode 100644 index 00000000000..bb0ada4c2fd --- /dev/null +++ b/test/CodeGen/ARM/invalid-target.ll @@ -0,0 +1,32 @@ +; RUN: not llc -mtriple armvinvalid-linux-gnueabi %s -o - 2>&1 | \ +; RUN: FileCheck %s --check-prefix=ARMVINVALID + +; RUN: not llc -mtriple armebvinvalid-linux-gnueabi %s -o - 2>&1 | \ +; RUN: FileCheck %s --check-prefix=ARMEBVINVALID + +; RUN: not llc -mtriple thumbvinvalid-linux-gnueabi %s -o - 2>&1 | \ +; RUN: FileCheck %s --check-prefix=THUMBVINVALID + +; RUN: not llc -mtriple thumbebvinvalid-linux-gnueabi %s -o - 2>&1 | \ +; RUN: FileCheck %s --check-prefix=THUMBEBVINVALID + +; RUN: not llc -mtriple thumbv2-linux-gnueabi %s -o - 2>&1 | \ +; RUN: FileCheck %s --check-prefix=THUMBV2 + +; RUN: not llc -mtriple thumbv3-linux-gnueabi %s -o - 2>&1 | \ +; RUN: FileCheck %s --check-prefix=THUMBV3 + +; RUN: not llc -mtriple arm64invalid-linux-gnu %s -o - 2>&1 | \ +; RUN: FileCheck %s --check-prefix=ARM64INVALID + +; RUN: not llc -mtriple aarch64invalid-linux-gnu %s -o - 2>&1 | \ +; RUN: FileCheck %s --check-prefix=AARCH64INVALID + +; ARMVINVALID: error: unable to get target for 'armvinvalid--linux-gnueabi' +; ARMEBVINVALID: error: unable to get target for 'armebvinvalid--linux-gnueabi' +; THUMBVINVALID: error: unable to get target for 'thumbvinvalid--linux-gnueabi' +; THUMBEBVINVALID: error: unable to get target for 'thumbebvinvalid--linux-gnueabi' +; THUMBV2: error: unable to get target for 'thumbv2--linux-gnueabi' +; THUMBV3: error: unable to get target for 'thumbv3--linux-gnueabi' +; ARM64INVALID: error: unable to get target for 'arm64invalid--linux-gnu' +; AARCH64INVALID: error: unable to get target for 'aarch64invalid--linux-gnu' -- 2.34.1