Merge pull request #159 from hpux735/master
Adding support for ARMv7 on linux
diff --git a/CoreFoundation/Base.subproj/CFBase.c b/CoreFoundation/Base.subproj/CFBase.c
index c20582b..8bf684a 100644
--- a/CoreFoundation/Base.subproj/CFBase.c
+++ b/CoreFoundation/Base.subproj/CFBase.c
@@ -875,15 +875,7 @@
extern void __HALT() {
-#if defined(__ppc__)
- __asm__("trap");
-#elif defined(__i386__) || defined(__x86_64__)
-#if defined(_MSC_VER)
- __asm int 3;
-#else
- __asm__("int3");
-#endif
-#endif
+ __builtin_trap();
}
diff --git a/CoreFoundation/Base.subproj/CFInternal.h b/CoreFoundation/Base.subproj/CFInternal.h
index 4366d3b..fdf0ce3 100644
--- a/CoreFoundation/Base.subproj/CFInternal.h
+++ b/CoreFoundation/Base.subproj/CFInternal.h
@@ -169,6 +169,14 @@
#else
#error Compiler not supported
#endif
+#elif defined(__ppc__) || (__arm__)
+ #if defined(__GNUC__)
+ #define HALT do {asm __volatile__("trap"); kill(getpid(), 9); __builtin_unreachable(); } while (0)
+ #elif defined(_MSC_VER)
+ #define HALT do { DebugBreak(); abort(); __builtin_unreachable(); } while (0)
+ #else
+ #error Compiler not supported
+ #endif
#endif
#if defined(DEBUG)
diff --git a/Foundation/NSXMLParser.swift b/Foundation/NSXMLParser.swift
index 8a2fe04..d27b350 100644
--- a/Foundation/NSXMLParser.swift
+++ b/Foundation/NSXMLParser.swift
@@ -7,6 +7,12 @@
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
+// It is necessary to explicitly cast strlen to UInt to match the type
+// of prefixLen because currently, strlen (and other functions that
+// rely on swift_ssize_t) use the machine word size (int on 32 bit and
+// long in on 64 bit). I've filed a bug at bugs.swift.org:
+// https://bugs.swift.org/browse/SR-314
+
#if os(OSX) || os(iOS)
import Darwin
#elseif os(Linux)
@@ -233,9 +239,9 @@
let parser = ctx.parser
let reportQNameURI = parser.shouldProcessNamespaces
let reportNamespaces = parser.shouldReportNamespacePrefixes
- let prefixLen = prefix == nil ? strlen(UnsafePointer<Int8>(prefix)) : 0
+ let prefixLen = prefix == nil ? UInt(strlen(UnsafePointer<Int8>(prefix))) : 0
let localnameString = (prefixLen == 0 || reportQNameURI) ? UTF8STRING(localname) : nil
- let qualifiedNameString = prefixLen != 0 ? _colonSeparatedStringFromPrefixAndSuffix(prefix, prefixLen, localname, strlen(UnsafePointer<Int8>(localname))) : localnameString
+ let qualifiedNameString = prefixLen != 0 ? _colonSeparatedStringFromPrefixAndSuffix(prefix, UInt(prefixLen), localname, UInt(strlen(UnsafePointer<Int8>(localname)))) : localnameString
let namespaceURIString = reportQNameURI ? UTF8STRING(URI) : nil
var nsDict = [String:String]()
@@ -248,7 +254,7 @@
if reportNamespaces {
namespaceNameString = UTF8STRING(namespaces[idx])
}
- asAttrNamespaceNameString = _colonSeparatedStringFromPrefixAndSuffix("xmlns", 5, namespaces[idx], strlen(UnsafePointer<Int8>(namespaces[idx])))
+ asAttrNamespaceNameString = _colonSeparatedStringFromPrefixAndSuffix("xmlns", 5, namespaces[idx], UInt(strlen(UnsafePointer<Int8>(namespaces[idx]))))
} else {
namespaceNameString = ""
asAttrNamespaceNameString = "xmlns"
@@ -280,7 +286,7 @@
let attrPrefix = attributes[idx + 1]
let attrPrefixLen = attrPrefix == nil ? strlen(UnsafePointer<Int8>(attrPrefix)) : 0
if attrPrefixLen != 0 {
- attributeQName = _colonSeparatedStringFromPrefixAndSuffix(attrPrefix, attrPrefixLen, attrLocalName, strlen((UnsafePointer<Int8>(attrLocalName))))
+ attributeQName = _colonSeparatedStringFromPrefixAndSuffix(attrPrefix, UInt(attrPrefixLen), attrLocalName, UInt(strlen((UnsafePointer<Int8>(attrLocalName)))))
} else {
attributeQName = UTF8STRING(attrLocalName)!
}
@@ -318,7 +324,7 @@
let prefixLen = prefix == nil ? strlen(UnsafePointer<Int8>(prefix)) : 0
let localnameString = (prefixLen == 0 || reportQNameURI) ? UTF8STRING(localname) : nil
let nilStr: String? = nil
- let qualifiedNameString = (prefixLen != 0) ? _colonSeparatedStringFromPrefixAndSuffix(prefix, prefixLen, localname, strlen(UnsafePointer<Int8>(localname))) : nilStr
+ let qualifiedNameString = (prefixLen != 0) ? _colonSeparatedStringFromPrefixAndSuffix(prefix, UInt(prefixLen), localname, UInt(strlen(UnsafePointer<Int8>(localname)))) : nilStr
let namespaceURIString = reportQNameURI ? UTF8STRING(URI) : nilStr
diff --git a/configure b/configure
index c4ce91a..23edb6b 100755
--- a/configure
+++ b/configure
@@ -179,4 +179,5 @@
if __name__ == "__main__":
- main()
\ No newline at end of file
+ main()
+
diff --git a/lib/target.py b/lib/target.py
index 7360aac..a8472ba 100644
--- a/lib/target.py
+++ b/lib/target.py
@@ -51,13 +51,99 @@
spir64 = 37
kalimba = 38
shave = 39
-
+# Do not assume that these are 1:1 mapping. This should follow
+# canonical naming conventions for arm, etc. architectures.
+# See apple/swift PR #608
+ @staticmethod
+ def to_string(value):
+ if value == ArchType.arm:
+ return "armv7"
+ if value == ArchType.armeb:
+ return "armeb"
+ if value == ArchType.aarch64:
+ return "aarch64"
+ if value == ArchType.aarch64_be:
+ return "aarch64_be"
+ if value == ArchType.bpfel:
+ return "bpfel"
+ if value == ArchType.bpfeb:
+ return "bpfeb"
+ if value == ArchType.hexagon:
+ return "hexagon"
+ if value == ArchType.mips:
+ return "mips"
+ if value == ArchType.mipsel:
+ return "mipsel"
+ if value == ArchType.mips64:
+ return "mips64"
+ if value == ArchType.mips64el:
+ return "mips64el"
+ if value == ArchType.msp430:
+ return "msp430"
+ if value == ArchType.ppc:
+ return "ppc"
+ if value == ArchType.ppc64:
+ return "ppc64"
+ if value == ArchType.ppc64le:
+ return "ppc64le"
+ if value == ArchType.r600:
+ return "r600"
+ if value == ArchType.amdgcn:
+ return "amdgcn"
+ if value == ArchType.sparc:
+ return "sparc"
+ if value == ArchType.sparcv9:
+ return "sparcv9"
+ if value == ArchType.sparcel:
+ return "sparcel"
+ if value == ArchType.systemz:
+ return "systemz"
+ if value == ArchType.tce:
+ return "tce"
+ if value == ArchType.thumb:
+ return "armv7"
+ if value == ArchType.thumbeb:
+ return "thumbeb"
+ if value == ArchType.x86:
+ return "i386"
+ if value == ArchType.x86_64:
+ return "x86_64"
+ if value == ArchType.xcore:
+ return "xcore"
+ if value == ArchType.nvptx:
+ return "nvptx"
+ if value == ArchType.nvptx64:
+ return "nvptx64"
+ if value == ArchType.le32:
+ return "le32"
+ if value == ArchType.le64:
+ return "le64"
+ if value == ArchType.amdil:
+ return "amdil"
+ if value == ArchType.amdil64:
+ return "amdil64"
+ if value == ArchType.hsail:
+ return "hsail"
+ if value == ArchType.hsail64:
+ return "hsail64"
+ if value == ArchType.spir:
+ return "spir"
+ if value == ArchType.spir64:
+ return "spir64"
+ if value == ArchType.kalimba:
+ return "kalimba"
+ if value == ArchType.shave:
+ return "shave"
+ return "unknown"
+# Not 1:1, See to_string
@staticmethod
def from_string(string):
- if string == "arm":
- return ArchType.arm
+ # Match big endian arm first
if string == "armeb":
return ArchType.armeb
+ # Catch-all for little endian arm
+ if "arm" in string:
+ return ArchType.arm
if string == "aarch64":
return ArchType.aarch64
if string == "aarch64_be":
@@ -223,8 +309,8 @@
class Target:
triple = None
- sdk = OSType.MacOSX
- arch = ArchType.x86_64
+ sdk = None
+ arch = None
executable_suffix = ""
dynamic_library_prefix = "lib"
dynamic_library_suffix = ".dylib"
@@ -242,20 +328,30 @@
self.sdk = OSType.Win32
self.dynamic_library_suffix = ".dll"
self.executable_suffix = ".exe"
+ elif "darwin" in triple:
+ self.sdk = OSType.MacOSX
+ else:
+ print("Unknown platform")
+
self.triple = triple
+
comps = triple.split('-')
- ArchType.from_string(comps[0])
+ self.arch = ArchType.from_string(comps[0])
@staticmethod
def default():
- triple = platform.machine() + "-"
+ arch = ArchType.from_string(platform.machine())
+ triple = ArchType.to_string(arch)
if platform.system() == "Linux":
- triple += "linux-gnu"
+ if arch == ArchType.arm:
+ triple += "-linux-gnueabihf"
+ else:
+ triple += "-linux-gnu"
elif platform.system() == "Darwin":
- triple += "apple-darwin"
+ triple += "-apple-darwin"
elif platform.system() == "FreeBSD":
- # Make this working on 10 as well.
- triple += "freebsd11.0"
+ # Make this work on 10 as well.
+ triple += "-freebsd11.0"
else:
# TODO: This should be a bit more exhaustive
print("unknown host os")
@@ -264,21 +360,17 @@
@property
def swift_triple(self):
- triple = ""
- if self.arch == ArchType.x86_64:
- triple = "x86_64"
- else:
- print("unknown arch for swift")
- return None
+ triple = ArchType.to_string(self.arch)
if self.sdk == OSType.MacOSX:
return None
elif self.sdk == OSType.Linux:
- triple += "-pc-linux"
+ triple += "-unknown-linux"
elif self.sdk == OSType.FreeBSD:
triple += "-unknown-freebsd"
else:
print("unknown sdk for swift")
return None
+
return triple
@property
@@ -296,13 +388,7 @@
@property
def swift_arch(self):
- arch = ""
- if self.arch == ArchType.x86_64:
- arch = "x86_64"
- else:
- print("unknown arch for swift")
- return None
- return arch
+ return ArchType.to_string(self.arch)
class TargetConditional:
_sdk = None