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