Skip to content

Commit 609bf92

Browse files
committed
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. llvm-svn: 222129
1 parent 6a3fd83 commit 609bf92

File tree

2 files changed

+80
-13
lines changed

2 files changed

+80
-13
lines changed

llvm/lib/Support/Triple.cpp

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,50 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
222222
.Default(UnknownArch);
223223
}
224224

225+
static Triple::ArchType parseARMArch(StringRef ArchName) {
226+
size_t offset = StringRef::npos;
227+
Triple::ArchType arch = Triple::UnknownArch;
228+
bool isThumb = ArchName.startswith("thumb");
229+
230+
if (ArchName.equals("arm"))
231+
return Triple::arm;
232+
if (ArchName.equals("armeb"))
233+
return Triple::armeb;
234+
if (ArchName.equals("thumb"))
235+
return Triple::thumb;
236+
if (ArchName.equals("thumbeb"))
237+
return Triple::thumbeb;
238+
if (ArchName.equals("arm64") || ArchName.equals("aarch64"))
239+
return Triple::aarch64;
240+
if (ArchName.equals("aarch64_be"))
241+
return Triple::aarch64_be;
242+
243+
if (ArchName.startswith("armv")) {
244+
offset = 3;
245+
arch = Triple::arm;
246+
} else if (ArchName.startswith("armebv")) {
247+
offset = 5;
248+
arch = Triple::armeb;
249+
} else if (ArchName.startswith("thumbv")) {
250+
offset = 5;
251+
arch = Triple::thumb;
252+
} else if (ArchName.startswith("thumbebv")) {
253+
offset = 7;
254+
arch = Triple::thumbeb;
255+
}
256+
return StringSwitch<Triple::ArchType>(ArchName.substr(offset))
257+
.Cases("v2", "v2a", isThumb ? Triple::UnknownArch : arch)
258+
.Cases("v3", "v3m", isThumb ? Triple::UnknownArch : arch)
259+
.Cases("v4", "v4t", arch)
260+
.Cases("v5", "v5e", "v5t", "v5te", "v5tej", arch)
261+
.Cases("v6", "v6j", "v6k", "v6m", arch)
262+
.Cases("v6t2", "v6z", "v6zk", arch)
263+
.Cases("v7", "v7a", "v7em", "v7l", arch)
264+
.Cases("v7m", "v7r", "v7s", arch)
265+
.Cases("v8", "v8a", arch)
266+
.Default(Triple::UnknownArch);
267+
}
268+
225269
static Triple::ArchType parseArch(StringRef ArchName) {
226270
return StringSwitch<Triple::ArchType>(ArchName)
227271
.Cases("i386", "i486", "i586", "i686", Triple::x86)
@@ -231,19 +275,10 @@ static Triple::ArchType parseArch(StringRef ArchName) {
231275
.Case("powerpc", Triple::ppc)
232276
.Cases("powerpc64", "ppu", Triple::ppc64)
233277
.Case("powerpc64le", Triple::ppc64le)
234-
.Case("aarch64", Triple::aarch64)
235-
.Case("aarch64_be", Triple::aarch64_be)
236-
.Case("arm64", Triple::aarch64)
237-
.Cases("arm", "xscale", Triple::arm)
238-
// FIXME: It would be good to replace these with explicit names for all the
239-
// various suffixes supported.
240-
.StartsWith("armv", Triple::arm)
241-
.Case("armeb", Triple::armeb)
242-
.StartsWith("armebv", Triple::armeb)
243-
.Case("thumb", Triple::thumb)
244-
.StartsWith("thumbv", Triple::thumb)
245-
.Case("thumbeb", Triple::thumbeb)
246-
.StartsWith("thumbebv", Triple::thumbeb)
278+
.Case("xscale", Triple::arm)
279+
.StartsWith("arm", parseARMArch(ArchName))
280+
.StartsWith("thumb", parseARMArch(ArchName))
281+
.StartsWith("aarch64", parseARMArch(ArchName))
247282
.Case("msp430", Triple::msp430)
248283
.Cases("mips", "mipseb", "mipsallegrex", Triple::mips)
249284
.Cases("mipsel", "mipsallegrexel", Triple::mipsel)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; RUN: not llc -mtriple armvinvalid-linux-gnueabi %s -o - 2>&1 | \
2+
; RUN: FileCheck %s --check-prefix=ARMVINVALID
3+
4+
; RUN: not llc -mtriple armebvinvalid-linux-gnueabi %s -o - 2>&1 | \
5+
; RUN: FileCheck %s --check-prefix=ARMEBVINVALID
6+
7+
; RUN: not llc -mtriple thumbvinvalid-linux-gnueabi %s -o - 2>&1 | \
8+
; RUN: FileCheck %s --check-prefix=THUMBVINVALID
9+
10+
; RUN: not llc -mtriple thumbebvinvalid-linux-gnueabi %s -o - 2>&1 | \
11+
; RUN: FileCheck %s --check-prefix=THUMBEBVINVALID
12+
13+
; RUN: not llc -mtriple thumbv2-linux-gnueabi %s -o - 2>&1 | \
14+
; RUN: FileCheck %s --check-prefix=THUMBV2
15+
16+
; RUN: not llc -mtriple thumbv3-linux-gnueabi %s -o - 2>&1 | \
17+
; RUN: FileCheck %s --check-prefix=THUMBV3
18+
19+
; RUN: not llc -mtriple arm64invalid-linux-gnu %s -o - 2>&1 | \
20+
; RUN: FileCheck %s --check-prefix=ARM64INVALID
21+
22+
; RUN: not llc -mtriple aarch64invalid-linux-gnu %s -o - 2>&1 | \
23+
; RUN: FileCheck %s --check-prefix=AARCH64INVALID
24+
25+
; ARMVINVALID: error: unable to get target for 'armvinvalid--linux-gnueabi'
26+
; ARMEBVINVALID: error: unable to get target for 'armebvinvalid--linux-gnueabi'
27+
; THUMBVINVALID: error: unable to get target for 'thumbvinvalid--linux-gnueabi'
28+
; THUMBEBVINVALID: error: unable to get target for 'thumbebvinvalid--linux-gnueabi'
29+
; THUMBV2: error: unable to get target for 'thumbv2--linux-gnueabi'
30+
; THUMBV3: error: unable to get target for 'thumbv3--linux-gnueabi'
31+
; ARM64INVALID: error: unable to get target for 'arm64invalid--linux-gnu'
32+
; AARCH64INVALID: error: unable to get target for 'aarch64invalid--linux-gnu'

0 commit comments

Comments
 (0)