From 5eb29d99dd3e3944da43b29c0eafb8608202ddba
Date: Tue, 11 May 2021 01:10:50 +0530
Subject: [PATCH] [android] Switch to new single-header modulemap for Bionic
 too

---
 stdlib/public/Platform/CMakeLists.txt         |   4 +-
 stdlib/public/Platform/SwiftGlibc.h.gyb       |   1 -
 stdlib/public/Platform/bionic.modulemap.gyb   | 393 ------------------
 stdlib/public/Platform/glibc.modulemap.gyb    |   4 +-
 stdlib/public/SwiftShims/LibcShims.h          |   2 +-
 test/Interop/C/libc/include-signal.swift      |   4 +-
 .../Cxx/class/memory-layout-silgen.swift      |   3 -
 test/Interop/Cxx/libc/include-glibc.swift     |   2 +-
 8 files changed, 7 insertions(+), 406 deletions(-)
 delete mode 100644 stdlib/public/Platform/bionic.modulemap.gyb

diff --git a/swift/stdlib/public/Platform/CMakeLists.txt b/swift/stdlib/public/Platform/CMakeLists.txt
index 9d6fccd4082ca..6ae5209186fd3 100644
--- a/swift/stdlib/public/Platform/CMakeLists.txt
+++ b/swift/stdlib/public/Platform/CMakeLists.txt
@@ -130,9 +130,7 @@ foreach(sdk ${SWIFT_SDKS})
     set(module_dir "${SWIFTLIB_DIR}/${arch_subdir}")
     set(module_dir_static "${SWIFTSTATICLIB_DIR}/${arch_subdir}")
 
-    if(${sdk} STREQUAL ANDROID)
-      set(glibc_modulemap_source "bionic.modulemap.gyb")
-    elseif(${sdk} STREQUAL OPENBSD)
+    if(${sdk} STREQUAL OPENBSD)
       set(glibc_modulemap_source "libc-openbsd.modulemap.gyb")
     else()
       set(glibc_modulemap_source "glibc.modulemap.gyb")
diff --git a/swift/stdlib/public/Platform/SwiftGlibc.h.gyb b/swift/stdlib/public/Platform/SwiftGlibc.h.gyb
index 3391eaee29934..78c725bae8c73 100644
--- a/swift/stdlib/public/Platform/SwiftGlibc.h.gyb
+++ b/swift/stdlib/public/Platform/SwiftGlibc.h.gyb
@@ -28,7 +28,6 @@ headers = [
   'tgmath.h',
   'time.h',
   'utmp.h',
-  'utmpx.h',
 
   # POSIX
   'aio.h',
diff --git a/swift/stdlib/public/Platform/bionic.modulemap.gyb b/swift/stdlib/public/Platform/bionic.modulemap.gyb
deleted file mode 100644
index e44f9082653a6..0000000000000
--- a/swift/stdlib/public/Platform/bionic.modulemap.gyb
+++ /dev/null
@@ -1,393 +0,0 @@
-//===--- bionic.modulemap -------------------------------------------------===//
-//
-// This source file is part of the Swift.org open source project
-//
-// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
-// Licensed under Apache License v2.0 with Runtime Library Exception
-//
-// See https://swift.org/LICENSE.txt for license information
-// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
-//
-//===----------------------------------------------------------------------===//
-
-/// This is a semi-complete modulemap that maps bionics's headers in a roughly
-/// similar way to the Darwin SDK modulemap. We do not take care to list every
-/// single header which may be included by a particular submodule, so there can
-/// still be issues if imported into the same context as one in which someone
-/// included those headers directly.
-///
-/// It's not named just Bionic so that it doesn't conflict in the event of a
-/// future official bionic modulemap.
-module SwiftGlibc [system] {
-
-  link "dl"
-
-  // C standard library
-  module C {
-    module features {
-      header "${GLIBC_INCLUDE_PATH}/features.h"
-      export *
-    }
-
-    module complex {
-      header "${GLIBC_INCLUDE_PATH}/complex.h"
-      export *
-    }
-
-    module pty {
-      header "${GLIBC_INCLUDE_PATH}/pty.h"
-      export *
-    }
-    module utmp {
-      header "${GLIBC_INCLUDE_PATH}/utmp.h"
-      export *
-    }
-
-    module ctype {
-      header "${GLIBC_INCLUDE_PATH}/ctype.h"
-      export *
-    }
-    module errno {
-      header "${GLIBC_INCLUDE_PATH}/errno.h"
-      export *
-    }
-
-    module fenv {
-      header "${GLIBC_INCLUDE_PATH}/fenv.h"
-      export *
-    }
-
-    // note: supplied by compiler
-    // module float {
-    //   header "${GLIBC_INCLUDE_PATH}/float.h"
-    //   export *
-    // }
-
-    module inttypes {
-      header "${GLIBC_INCLUDE_PATH}/inttypes.h"
-      export *
-    }
-
-    // note: potentially supplied by compiler
-    // module iso646 {
-    //   header "${GLIBC_INCLUDE_PATH}/iso646.h"
-    //   export *
-    // }
-    // module limits {
-    //   header "${GLIBC_INCLUDE_PATH}/limits.h"
-    //   export *
-    // }
-
-    module locale {
-      header "${GLIBC_INCLUDE_PATH}/locale.h"
-      export *
-    }
-    module math {
-      link "m"
-      header "${GLIBC_INCLUDE_PATH}/math.h"
-      export *
-    }
-    module setjmp {
-      header "${GLIBC_INCLUDE_PATH}/setjmp.h"
-      export *
-    }
-    module signal {
-      header "${GLIBC_INCLUDE_PATH}/signal.h"
-      export *
-    }
-
-    // note: supplied by the compiler
-    // module stdarg {
-    //   header "${GLIBC_INCLUDE_PATH}/stdarg.h"
-    //   export *
-    // }
-    // module stdbool {
-    //   header "${GLIBC_INCLUDE_PATH}/stdbool.h"
-    //   export *
-    // }
-    // module stddef {
-    //   header "${GLIBC_INCLUDE_PATH}/stddef.h"
-    //   export *
-    // }
-    // module stdint {
-    //   header "${GLIBC_INCLUDE_PATH}/stdint.h"
-    //   export *
-    // }
-
-    module stdio {
-      header "${GLIBC_INCLUDE_PATH}/stdio.h"
-      export *
-    }
-    module stdlib {
-      header "${GLIBC_INCLUDE_PATH}/stdlib.h"
-      export *
-      export stddef
-    }
-    module string {
-      header "${GLIBC_INCLUDE_PATH}/string.h"
-      export *
-    }
-
-    // note: supplied by the compiler
-    // explicit module tgmath {
-    //   header "${GLIBC_INCLUDE_PATH}/tgmath.h"
-    //   export *
-    // }
-
-    module time {
-      header "${GLIBC_INCLUDE_PATH}/time.h"
-      export *
-    }
-  }
-
-  // POSIX
-  module POSIX {
-    module wait {
-      header "${GLIBC_INCLUDE_PATH}/wait.h"
-      export *
-    }
-
-    module cpio {
-      header "${GLIBC_INCLUDE_PATH}/cpio.h"
-      export *
-    }
-    module nl_types {
-      header "${GLIBC_INCLUDE_PATH}/nl_types.h"
-      export *
-    }
-
-    module ftw {
-      header "${GLIBC_INCLUDE_PATH}/ftw.h"
-      export *
-    }
-    module glob {
-      header "${GLIBC_INCLUDE_PATH}/glob.h"
-      export *
-    }
-    module iconv {
-      header "${GLIBC_INCLUDE_PATH}/iconv.h"
-      export *
-    }
-    module langinfo {
-      header "${GLIBC_INCLUDE_PATH}/langinfo.h"
-      export *
-    }
-    module netdb {
-      header "${GLIBC_INCLUDE_PATH}/netdb.h"
-      export *
-    }
-    module ifaddrs {
-      header "${GLIBC_INCLUDE_PATH}/ifaddrs.h"
-      export *
-    }
-    module search {
-      header "${GLIBC_INCLUDE_PATH}/search.h"
-      export *
-    }
-    module spawn {
-      header "${GLIBC_INCLUDE_PATH}/spawn.h"
-      export *
-    }
-    module syslog {
-      header "${GLIBC_INCLUDE_PATH}/syslog.h"
-      export *
-    }
-    module tar {
-      header "${GLIBC_INCLUDE_PATH}/tar.h"
-      export *
-    }
-
-    module arpa {
-      module inet {
-        header "${GLIBC_INCLUDE_PATH}/arpa/inet.h"
-        export *
-      }
-      export *
-    }
-    module dirent {
-      header "${GLIBC_INCLUDE_PATH}/dirent.h"
-      export *
-    }
-    module dlfcn {
-      header "${GLIBC_INCLUDE_PATH}/dlfcn.h"
-      export *
-    }
-    module fcntl {
-      header "${GLIBC_INCLUDE_PATH}/fcntl.h"
-      export *
-    }
-    module fnmatch {
-      header "${GLIBC_INCLUDE_PATH}/fnmatch.h"
-      export *
-    }
-    module grp {
-      header "${GLIBC_INCLUDE_PATH}/grp.h"
-      export *
-    }
-    module ioctl {
-      header "${GLIBC_ARCH_INCLUDE_PATH}/sys/ioctl.h"
-      export *
-    }
-    module libgen {
-      header "${GLIBC_INCLUDE_PATH}/libgen.h"
-      export *
-    }
-    module net {
-      module if {
-        header "${GLIBC_INCLUDE_PATH}/net/if.h"
-        export *
-      }
-    }
-    module netinet {
-      module in {
-        header "${GLIBC_INCLUDE_PATH}/netinet/in.h"
-        export *
-
-        exclude header "${GLIBC_INCLUDE_PATH}/netinet6/in6.h"
-      }
-      module tcp {
-        header "${GLIBC_INCLUDE_PATH}/netinet/tcp.h"
-        export *
-      }
-    }
-    module poll {
-      header "${GLIBC_INCLUDE_PATH}/poll.h"
-      export *
-    }
-    module pthread {
-      header "${GLIBC_INCLUDE_PATH}/pthread.h"
-      export *
-    }
-    module pwd {
-      header "${GLIBC_INCLUDE_PATH}/pwd.h"
-      export *
-    }
-    module regex {
-      header "${GLIBC_INCLUDE_PATH}/regex.h"
-      export *
-    }
-    module sched {
-      header "${GLIBC_INCLUDE_PATH}/sched.h"
-      export *
-    }
-    module semaphore {
-      header "${GLIBC_INCLUDE_PATH}/semaphore.h"
-      export *
-    }
-    module strings {
-      header "${GLIBC_INCLUDE_PATH}/strings.h"
-      export *
-    }
-
-    module sys {
-      export *
-
-      module cdefs {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/cdefs.h"
-        export *
-      }
-      module file {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/file.h"
-        export *
-      }
-      module sem {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/sem.h"
-        export *
-      }
-      module shm {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/shm.h"
-        export *
-      }
-      module inotify {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/inotify.h"
-        export *
-      }
-      module statvfs {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/statvfs.h"
-        export *
-      }
-
-      module ipc {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/ipc.h"
-        export *
-      }
-      module mman {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/mman.h"
-        export *
-      }
-      module msg {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/msg.h"
-        export *
-      }
-      module resource {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/resource.h"
-        export *
-      }
-      module select {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/select.h"
-        export *
-      }
-      module sendfile {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/sendfile.h"
-        export *
-      }
-      module socket {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/socket.h"
-        export *
-      }
-      module stat {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/stat.h"
-        export *
-      }
-      module time {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/time.h"
-        export *
-      }
-      module times {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/times.h"
-        export *
-      }
-      module types {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/types.h"
-        export *
-      }
-      module uio {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/uio.h"
-        export *
-      }
-      module un {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/un.h"
-        export *
-      }
-      module user {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/user.h"
-        export *
-      }
-      module utsname {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/utsname.h"
-        export *
-      }
-      module wait {
-        header "${GLIBC_ARCH_INCLUDE_PATH}/sys/wait.h"
-        export *
-      }
-    }
-    module sysexits {
-      header "${GLIBC_INCLUDE_PATH}/sysexits.h"
-      export *
-    }
-    module termios {
-      header "${GLIBC_INCLUDE_PATH}/termios.h"
-      export *
-    }
-    module unistd {
-      header "${GLIBC_INCLUDE_PATH}/unistd.h"
-      export *
-    }
-    module utime {
-      header "${GLIBC_INCLUDE_PATH}/utime.h"
-      export *
-    }
-  }
-}
-
diff --git a/swift/stdlib/public/Platform/glibc.modulemap.gyb b/swift/stdlib/public/Platform/glibc.modulemap.gyb
index 455dd111e2ce3..8f77e1028001c 100644
--- a/swift/stdlib/public/Platform/glibc.modulemap.gyb
+++ b/swift/stdlib/public/Platform/glibc.modulemap.gyb
@@ -19,7 +19,7 @@
 /// It's not named just Glibc so that it doesn't conflict in the event of a
 /// future official glibc modulemap.
 module SwiftGlibc [system] {
-% if CMAKE_SDK == "LINUX":
+% if CMAKE_SDK in ["LINUX", "ANDROID"]:
       link "m"
 % end
 % if CMAKE_SDK in ["LINUX", "FREEBSD", "CYGWIN"]:
@@ -43,7 +43,7 @@ module SwiftGlibc [system] {
   export *
 }
 
-% if CMAKE_SDK != "WASI":
+% if CMAKE_SDK != "WASI" and CMAKE_SDK != "ANDROID":
 module CUUID [system] {
   header "${GLIBC_INCLUDE_PATH}/uuid/uuid.h"
   link "uuid"
diff --git a/swift/stdlib/public/SwiftShims/LibcShims.h b/swift/stdlib/public/SwiftShims/LibcShims.h
index 7dfde65ae46a8..82a43efa06e10 100644
--- a/swift/stdlib/public/SwiftShims/LibcShims.h
+++ b/swift/stdlib/public/SwiftShims/LibcShims.h
@@ -68,7 +68,7 @@ static inline __swift_size_t _swift_stdlib_strlen_unsigned(const unsigned char *
 SWIFT_READONLY
 static inline int _swift_stdlib_memcmp(const void *s1, const void *s2,
                                        __swift_size_t n) {
-#if defined(__APPLE__)
+#if defined(__APPLE__) || defined(__ANDROID__)
   extern int memcmp(const void * _Nullable, const void * _Nullable, __swift_size_t);
 #else
   extern int memcmp(const void *, const void *, __swift_size_t);
diff --git a/swift/test/Interop/C/libc/include-signal.swift b/swift/test/Interop/C/libc/include-signal.swift
index 3b420364f3ce8..83029c9b3b530 100644
--- a/swift/test/Interop/C/libc/include-signal.swift
+++ b/swift/test/Interop/C/libc/include-signal.swift
@@ -28,6 +28,6 @@
 // See https://forums.swift.org/t/problems-with-swiftglibc-and-proposed-fix/37594
 // for further details.
 
-// REQUIRES: OS=linux-gnu
+// REQUIRES: OS=linux-gnu || OS=linux-android
 
-import IncludeSignal
\ No newline at end of file
+import IncludeSignal
diff --git a/swift/test/Interop/Cxx/class/memory-layout-silgen.swift b/swift/test/Interop/Cxx/class/memory-layout-silgen.swift
index a0301a03af7f3..35d3f2797ad32 100644
--- a/swift/test/Interop/Cxx/class/memory-layout-silgen.swift
+++ b/swift/test/Interop/Cxx/class/memory-layout-silgen.swift
@@ -1,8 +1,5 @@
 // RUN: %target-swiftxx-frontend -I %S/Inputs -emit-ir -o - %s | %FileCheck %s
 
-// XFAIL: OS=linux-android
-// XFAIL: OS=linux-androideabi
-
 import MemoryLayout
 
 var v = PrivateMemberLayout()
diff --git a/swift/test/Interop/Cxx/libc/include-glibc.swift b/swift/test/Interop/Cxx/libc/include-glibc.swift
index 116dc88895783..b36e7379d22b0 100644
--- a/swift/test/Interop/Cxx/libc/include-glibc.swift
+++ b/swift/test/Interop/Cxx/libc/include-glibc.swift
@@ -1,7 +1,7 @@
 // RUN: %target-run-simple-swift(-Xfrontend -enable-cxx-interop)
 
 // REQUIRES: executable_test
-// REQUIRES: OS=linux-gnu
+// REQUIRES: OS=linux-gnu || OS=linux-android
 
 import Glibc
 import StdlibUnittest
