Skip to content

Commit 005e782

Browse files
authored
Merge pull request #55 from owenv/parse-arm
Improved ARM arch parsing
2 parents 684581c + 5fd0954 commit 005e782

File tree

2 files changed

+147
-84
lines changed

2 files changed

+147
-84
lines changed

Sources/SwiftDriver/Utilities/Triple.swift

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,67 @@ extension Triple {
569569
}
570570
}
571571

572+
enum Endianness {
573+
case big, little
574+
575+
// Based on LLVM's ARM::parseArchEndian
576+
init?<S: StringProtocol>(armArchName archName: S) {
577+
if archName.starts(with: "armeb") || archName.starts(with: "thumbeb") || archName.starts(with: "aarch64_be") {
578+
self = .big
579+
} else if archName.starts(with: "arm") || archName.starts(with: "thumb") {
580+
self = archName.hasSuffix("eb") ? .big : .little
581+
} else if archName.starts(with: "aarch64") || archName.starts(with: "aarch64_32") {
582+
self = .little
583+
} else {
584+
return nil
585+
}
586+
}
587+
}
588+
589+
enum ARMISA {
590+
case aarch64, thumb, arm
591+
592+
// Based on LLVM's ARM::parseArchISA
593+
init?<S: StringProtocol>(archName: S) {
594+
if archName.starts(with: "aarch64") || archName.starts(with: "arm64") {
595+
self = .aarch64
596+
} else if archName.starts(with: "thumb") {
597+
self = .thumb
598+
} else if archName.starts(with: "arm") {
599+
self = .arm
600+
} else {
601+
return nil
602+
}
603+
}
604+
}
605+
606+
// Parse ARM architectures not handled by `parse`. On its own, this is not
607+
// enough to correctly parse an ARM architecture.
572608
private static func parseARMArch<S: StringProtocol>(_ archName: S) -> Triple.Arch? {
573-
fatalError("Unimplemented")
609+
let ISA = ARMISA(archName: archName)
610+
let endianness = Endianness(armArchName: archName)
611+
612+
var arch: Triple.Arch? = nil
613+
switch (endianness, ISA) {
614+
case (.little, .arm):
615+
arch = .arm
616+
case (.little, .thumb):
617+
arch = .thumb
618+
case (.little, .aarch64):
619+
arch = .aarch64
620+
case (.big, .arm):
621+
arch = .armeb
622+
case (.big, .thumb):
623+
arch = .thumbeb
624+
case (.big, .aarch64):
625+
arch = .aarch64_be
626+
default:
627+
break
628+
}
629+
630+
// FIXME: thumb architectures require additional validation. See LLVM's [parseARMArch](https://llvm.org/doxygen/Triple_8cpp.html#a721eb5bffb57cea96d7a9b45cbe302cf)
631+
632+
return arch
574633
}
575634

576635
private static func parseBPFArch<S: StringProtocol>(_ archName: S) -> Triple.Arch? {
@@ -590,13 +649,13 @@ extension Triple {
590649
}
591650

592651
/// Whether or not this architecture has 64-bit pointers
593-
var is64Bit: Bool { pointerBitWidth == 64 }
652+
public var is64Bit: Bool { pointerBitWidth == 64 }
594653

595654
/// Whether or not this architecture has 32-bit pointers
596-
var is32Bit: Bool { pointerBitWidth == 32 }
655+
public var is32Bit: Bool { pointerBitWidth == 32 }
597656

598657
/// Whether or not this architecture has 16-bit pointers
599-
var is16Bit: Bool { pointerBitWidth == 16 }
658+
public var is16Bit: Bool { pointerBitWidth == 16 }
600659

601660
/// The width in bits of pointers on this architecture.
602661
var pointerBitWidth: Int {

Tests/SwiftDriverTests/TripleTests.swift

Lines changed: 84 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -196,17 +196,17 @@ final class TripleTests: XCTestCase {
196196
XCTAssertEqual(T.os, Triple.OS.linux)
197197
XCTAssertEqual(T.environment, Triple.Environment.musleabi)
198198

199-
// T = Triple("armv6hl-none-linux-gnueabi")
200-
// XCTAssertEqual(T.arch, Triple.Arch.arm)
201-
// XCTAssertEqual(T.os, Triple.OS.linux)
202-
// XCTAssertEqual(T.vendor, nil)
203-
// XCTAssertEqual(T.environment, Triple.Environment.gnueabi)
204-
//
205-
// T = Triple("armv7hl-none-linux-gnueabi")
206-
// XCTAssertEqual(T.arch, Triple.Arch.arm)
207-
// XCTAssertEqual(T.os, Triple.OS.linux)
208-
// XCTAssertEqual(T.vendor, nil)
209-
// XCTAssertEqual(T.environment, Triple.Environment.gnueabi)
199+
T = Triple("armv6hl-none-linux-gnueabi")
200+
XCTAssertEqual(T.arch, Triple.Arch.arm)
201+
XCTAssertEqual(T.os, Triple.OS.linux)
202+
XCTAssertEqual(T.vendor, nil)
203+
XCTAssertEqual(T.environment, Triple.Environment.gnueabi)
204+
205+
T = Triple("armv7hl-none-linux-gnueabi")
206+
XCTAssertEqual(T.arch, Triple.Arch.arm)
207+
XCTAssertEqual(T.os, Triple.OS.linux)
208+
XCTAssertEqual(T.vendor, nil)
209+
XCTAssertEqual(T.environment, Triple.Environment.gnueabi)
210210

211211
T = Triple("amdil-unknown-unknown")
212212
XCTAssertEqual(T.arch, Triple.Arch.amdil)
@@ -351,11 +351,11 @@ final class TripleTests: XCTestCase {
351351
XCTAssertEqual(T.os, Triple.OS.freeBSD)
352352
XCTAssertEqual(T.environment, nil)
353353

354-
// T = Triple("armv7hl-suse-linux-gnueabi")
355-
// XCTAssertEqual(T.arch, Triple.Arch.arm)
356-
// XCTAssertEqual(T.vendor, Triple.Vendor.suse)
357-
// XCTAssertEqual(T.os, Triple.OS.linux)
358-
// XCTAssertEqual(T.environment, Triple.Environment.gnueabi)
354+
T = Triple("armv7hl-suse-linux-gnueabi")
355+
XCTAssertEqual(T.arch, Triple.Arch.arm)
356+
XCTAssertEqual(T.vendor, Triple.Vendor.suse)
357+
XCTAssertEqual(T.os, Triple.OS.linux)
358+
XCTAssertEqual(T.environment, Triple.Environment.gnueabi)
359359

360360
T = Triple("i586-pc-haiku")
361361
XCTAssertEqual(T.arch, Triple.Arch.x86)
@@ -562,24 +562,24 @@ final class TripleTests: XCTestCase {
562562
XCTAssertEqual(T.environment, Triple.Environment.gnu)
563563
// XCTAssertEqual(T.subArch, Triple.SubArch.mipsSubArch_r6)
564564

565-
// T = Triple("arm-oe-linux-gnueabi")
566-
// XCTAssertEqual(T.arch, Triple.Arch.arm)
567-
// XCTAssertEqual(T.vendor, Triple.Vendor.openEmbedded)
568-
// XCTAssertEqual(T.os, Triple.OS.linux)
569-
// XCTAssertEqual(T.environment, Triple.Environment.gnueabi)
565+
T = Triple("arm-oe-linux-gnueabi")
566+
XCTAssertEqual(T.arch, Triple.Arch.arm)
567+
XCTAssertEqual(T.vendor, Triple.Vendor.openEmbedded)
568+
XCTAssertEqual(T.os, Triple.OS.linux)
569+
XCTAssertEqual(T.environment, Triple.Environment.gnueabi)
570570

571571
T = Triple("aarch64-oe-linux")
572572
XCTAssertEqual(T.arch, Triple.Arch.aarch64)
573573
XCTAssertEqual(T.vendor, Triple.Vendor.openEmbedded)
574574
XCTAssertEqual(T.os, Triple.OS.linux)
575575
XCTAssertEqual(T.environment, nil)
576-
// XCTAssertTrue(T.isArch64Bit())
576+
XCTAssertEqual(T.arch?.is64Bit, true)
577577

578578
T = Triple("arm64_32-apple-ios")
579579
XCTAssertEqual(T.arch, Triple.Arch.aarch64_32)
580580
XCTAssertEqual(T.os, Triple.OS.ios)
581581
XCTAssertEqual(T.environment, nil)
582-
// XCTAssertTrue(T.isArch32Bit())
582+
XCTAssertEqual(T.arch?.is32Bit, true)
583583

584584
T = Triple("huh")
585585
XCTAssertEqual(T.arch, nil)
@@ -748,35 +748,39 @@ final class TripleTests: XCTestCase {
748748
// "i686-pc-windows-elf")
749749
}
750750

751-
// func testNormalizeARM() {
752-
// assertNormalizesEqual("armv6-netbsd-eabi",
753-
// "armv6-unknown-netbsd-eabi")
754-
// assertNormalizesEqual("armv7-netbsd-eabi",
755-
// "armv7-unknown-netbsd-eabi")
756-
// assertNormalizesEqual("armv6eb-netbsd-eabi",
757-
// "armv6eb-unknown-netbsd-eabi")
758-
// assertNormalizesEqual("armv7eb-netbsd-eabi",
759-
// "armv7eb-unknown-netbsd-eabi")
760-
// assertNormalizesEqual("armv6-netbsd-eabihf",
761-
// "armv6-unknown-netbsd-eabihf")
762-
// assertNormalizesEqual("armv7-netbsd-eabihf",
763-
// "armv7-unknown-netbsd-eabihf")
764-
// assertNormalizesEqual("armv6eb-netbsd-eabihf",
765-
// "armv6eb-unknown-netbsd-eabihf")
766-
// assertNormalizesEqual("armv7eb-netbsd-eabihf",
767-
// "armv7eb-unknown-netbsd-eabihf")
768-
//
751+
func testNormalizeARM() {
752+
assertNormalizesEqual("armv6-netbsd-eabi",
753+
"armv6-unknown-netbsd-eabi")
754+
assertNormalizesEqual("armv7-netbsd-eabi",
755+
"armv7-unknown-netbsd-eabi")
756+
assertNormalizesEqual("armv6eb-netbsd-eabi",
757+
"armv6eb-unknown-netbsd-eabi")
758+
assertNormalizesEqual("armv7eb-netbsd-eabi",
759+
"armv7eb-unknown-netbsd-eabi")
760+
assertNormalizesEqual("armv6-netbsd-eabihf",
761+
"armv6-unknown-netbsd-eabihf")
762+
assertNormalizesEqual("armv7-netbsd-eabihf",
763+
"armv7-unknown-netbsd-eabihf")
764+
assertNormalizesEqual("armv6eb-netbsd-eabihf",
765+
"armv6eb-unknown-netbsd-eabihf")
766+
assertNormalizesEqual("armv7eb-netbsd-eabihf",
767+
"armv7eb-unknown-netbsd-eabihf")
768+
769769
// assertNormalizesEqual("armv7-suse-linux-gnueabi",
770770
// "armv7-suse-linux-gnueabihf")
771-
//
772-
// var T: Triple
773-
// T = Triple("armv6--netbsd-eabi")
774-
// XCTAssertEqual(.arm, T.arch)
775-
// T = Triple("armv6eb--netbsd-eabi")
776-
// XCTAssertEqual(.armeb, T.arch)
777-
// T = Triple("armv7-suse-linux-gnueabihf")
778-
// XCTAssertEqual(.gnueabihf, T.environment)
779-
// }
771+
772+
var T: Triple
773+
T = Triple("armv6--netbsd-eabi")
774+
XCTAssertEqual(.arm, T.arch)
775+
T = Triple("armv6eb--netbsd-eabi")
776+
XCTAssertEqual(.armeb, T.arch)
777+
T = Triple("arm64--netbsd-eabi")
778+
XCTAssertEqual(.aarch64, T.arch)
779+
T = Triple("aarch64_be--netbsd-eabi")
780+
XCTAssertEqual(.aarch64_be, T.arch)
781+
T = Triple("armv7-suse-linux-gnueabihf")
782+
XCTAssertEqual(.gnueabihf, T.environment)
783+
}
780784

781785
func testOSVersion() {
782786
var T: Triple
@@ -842,36 +846,36 @@ final class TripleTests: XCTestCase {
842846
XCTAssertEqual(V?.minor, 0)
843847
XCTAssertEqual(V?.micro, 0)
844848

845-
// T = Triple("armv7-apple-ios")
846-
// XCTAssertFalse(T.os?.isMacOSX)
847-
// XCTAssertTrue(T.os?.isiOS)
848-
//// XCTAssertFalse(T.isArch16Bit())
849-
//// XCTAssertTrue(T.isArch32Bit())
850-
//// XCTAssertFalse(T.isArch64Bit())
851-
// V = T.macOSXVersion
852-
// XCTAssertEqual(V?.major, 10)
853-
// XCTAssertEqual(V?.minor, 4)
854-
// XCTAssertEqual(V?.micro, 0)
855-
// V = T.iOSVersion
856-
// XCTAssertEqual(V?.major, 5)
857-
// XCTAssertEqual(V?.minor, 0)
858-
// XCTAssertEqual(V?.micro, 0)
859-
//
860-
// T = Triple("armv7-apple-ios7.0")
861-
// XCTAssertFalse(T.os?.isMacOSX)
862-
// XCTAssertTrue(T.os?.isiOS)
863-
//// XCTAssertFalse(T.isArch16Bit())
864-
//// XCTAssertTrue(T.isArch32Bit())
865-
//// XCTAssertFalse(T.isArch64Bit())
866-
// V = T.macOSXVersion
867-
// XCTAssertEqual(V?.major, 10)
868-
// XCTAssertEqual(V?.minor, 4)
869-
// XCTAssertEqual(V?.micro, 0)
870-
// V = T.iOSVersion
871-
// XCTAssertEqual(V?.major, 7)
872-
// XCTAssertEqual(V?.minor, 0)
873-
// XCTAssertEqual(V?.micro, 0)
874-
// XCTAssertFalse(T._isSimulatorEnvironment)
849+
T = Triple("armv7-apple-ios")
850+
XCTAssertFalse(T.os?.isMacOSX)
851+
XCTAssertTrue(T.os?.isiOS)
852+
XCTAssertEqual(T.arch?.is16Bit, false)
853+
XCTAssertEqual(T.arch?.is32Bit, true)
854+
XCTAssertEqual(T.arch?.is64Bit, false)
855+
V = T.version(for: .macOS)
856+
XCTAssertEqual(V?.major, 10)
857+
XCTAssertEqual(V?.minor, 4)
858+
XCTAssertEqual(V?.micro, 0)
859+
V = T.version(for: .iOS(.device))
860+
XCTAssertEqual(V?.major, 5)
861+
XCTAssertEqual(V?.minor, 0)
862+
XCTAssertEqual(V?.micro, 0)
863+
864+
T = Triple("armv7-apple-ios7.0")
865+
XCTAssertFalse(T.os?.isMacOSX)
866+
XCTAssertTrue(T.os?.isiOS)
867+
XCTAssertEqual(T.arch?.is16Bit, false)
868+
XCTAssertEqual(T.arch?.is32Bit, true)
869+
XCTAssertEqual(T.arch?.is64Bit, false)
870+
V = T.version(for: .macOS)
871+
XCTAssertEqual(V?.major, 10)
872+
XCTAssertEqual(V?.minor, 4)
873+
XCTAssertEqual(V?.micro, 0)
874+
V = T.version(for: .iOS(.device))
875+
XCTAssertEqual(V?.major, 7)
876+
XCTAssertEqual(V?.minor, 0)
877+
XCTAssertEqual(V?.micro, 0)
878+
XCTAssertFalse(T._isSimulatorEnvironment)
875879

876880
T = Triple("x86_64-apple-ios10.3-simulator")
877881
XCTAssertTrue(T.os?.isiOS)

0 commit comments

Comments
 (0)