From 7fa1b4b2acd2a97cc84c220a25c43abf0d2f4f94 Mon Sep 17 00:00:00 2001
From: Butta <repo@butta.fastem.com>
Date: Wed, 25 Aug 2021 19:31:48 +0530
Subject: [PATCH] [android] Update to NDK 23

The latest Long Term Support NDK finally removed binutils, including the bfd/gold
linkers and libgcc. This simplifies our Android support, including making lld the
default linker for Android. Disable three reflection tests that now fail, likely
related to issues with swift-reflection-dump and switching to lld.

Also, add the libatomic dependency for Android armv7, just as on linux.
---
 CMakeLists.txt                                |  6 ++-
 cmake/modules/AddSwift.cmake                  | 14 ++-----
 cmake/modules/AddSwiftUnittests.cmake         |  3 --
 cmake/modules/SwiftAndroidSupport.cmake       | 40 ++-----------------
 docs/Android.md                               | 12 +++---
 lib/Driver/UnixToolChains.cpp                 |  3 ++
 stdlib/cmake/modules/AddSwiftStdlib.cmake     | 35 +++++++++-------
 stdlib/public/runtime/CMakeLists.txt          |  2 +-
 .../AutoDiff/validation-test/reflection.swift |  1 +
 .../function_sections-lld.swift               |  8 ++++
 test/LinkerSections/function_sections.swift   |  2 +-
 test/Reflection/capture_descriptors.sil       |  1 +
 .../typeref_decoding_imported.swift           |  1 +
 test/lit.cfg                                  | 17 +++-----
 test/lit.site.cfg.in                          |  8 +---
 utils/build-script-impl                       |  2 -
 .../build_swift/driver_arguments.py           |  9 -----
 utils/build_swift/tests/expected_options.py   |  3 --
 .../build_script_invocation.py                |  1 -
 validation-test/lit.site.cfg.in               |  8 +---
 20 files changed, 60 insertions(+), 116 deletions(-)
 create mode 100644 test/LinkerSections/function_sections-lld.swift

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 73fc7fe0ebc5f..5487dbc83cdc3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -180,6 +180,8 @@ set(CLANG_COMPILER_VERSION "" CACHE STRING
 # build environment.
 if(LLVM_USE_LINKER)
   set(SWIFT_USE_LINKER_default "${LLVM_USE_LINKER}")
+elseif(${SWIFT_HOST_VARIANT_SDK} STREQUAL ANDROID)
+  set(SWIFT_USE_LINKER_default "lld")
 elseif(CMAKE_SYSTEM_NAME STREQUAL Windows AND NOT CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
   set(SWIFT_USE_LINKER_default "lld")
 elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
@@ -306,8 +308,8 @@ set(SWIFT_ANDROID_API_LEVEL "" CACHE STRING
 
 set(SWIFT_ANDROID_NDK_PATH "" CACHE STRING
   "Path to the directory that contains the Android NDK tools that are executable on the build machine")
-set(SWIFT_ANDROID_NDK_GCC_VERSION "" CACHE STRING
-  "The GCC version to use when building for Android. Currently only 4.9 is supported.")
+set(SWIFT_ANDROID_NDK_CLANG_VERSION "12.0.5" CACHE STRING
+  "The Clang version to use when building for Android.")
 set(SWIFT_ANDROID_DEPLOY_DEVICE_PATH "" CACHE STRING
   "Path on an Android device where build products will be pushed. These are used when running the test suite against the device")
 
diff --git a/cmake/modules/AddSwift.cmake b/cmake/modules/AddSwift.cmake
index 4cd77fca0fee3..e51a966da3894 100644
--- a/cmake/modules/AddSwift.cmake
+++ b/cmake/modules/AddSwift.cmake
@@ -145,12 +145,9 @@ function(_add_host_variant_c_compile_link_flags name)
   endif()
 
   if(SWIFT_HOST_VARIANT_SDK STREQUAL ANDROID)
-    # lld can handle targeting the android build.  However, if lld is not
-    # enabled, then fallback to the linker included in the android NDK.
-    if(NOT SWIFT_USE_LINKER STREQUAL "lld")
-      swift_android_tools_path(${SWIFT_HOST_VARIANT_ARCH} tools_path)
-      target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-B${tools_path}>)
-    endif()
+    # Make sure the Android NDK lld is used.
+    swift_android_tools_path(${SWIFT_HOST_VARIANT_ARCH} tools_path)
+    target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-B${tools_path}>)
   endif()
 
   if(SWIFT_HOST_VARIANT_SDK IN_LIST SWIFT_DARWIN_PLATFORMS)
@@ -384,11 +381,6 @@ function(_add_host_variant_link_flags target)
       cxx_link_libraries)
     target_link_libraries(${target} PRIVATE
       ${cxx_link_libraries})
-
-    swift_android_libgcc_for_arch_cross_compile(${SWIFT_HOST_VARIANT_ARCH}
-      ${SWIFT_HOST_VARIANT_ARCH}_LIB)
-    target_link_directories(${target} PRIVATE
-      ${${SWIFT_HOST_VARIANT_ARCH}_LIB})
   else()
     # If lto is enabled, we need to add the object path flag so that the LTO code
     # generator leaves the intermediate object file in a place where it will not
diff --git a/cmake/modules/AddSwiftUnittests.cmake b/cmake/modules/AddSwiftUnittests.cmake
index ca0ae47288eef..54a3138bec743 100644
--- a/cmake/modules/AddSwiftUnittests.cmake
+++ b/cmake/modules/AddSwiftUnittests.cmake
@@ -32,9 +32,6 @@ function(add_swift_unittest test_dirname)
       COMMAND "${SWIFT_SOURCE_DIR}/utils/swift-rpathize.py"
               "$<TARGET_FILE:${test_dirname}>")
   elseif("${SWIFT_HOST_VARIANT}" STREQUAL "android")
-    swift_android_libgcc_for_arch_cross_compile(${SWIFT_HOST_VARIANT_ARCH} android_system_libs)
-    set_property(TARGET "${test_dirname}" APPEND PROPERTY LINK_DIRECTORIES
-      "${android_system_libs}")
     set_property(TARGET "${test_dirname}" APPEND PROPERTY LINK_LIBRARIES "log")
   elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
     if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")
diff --git a/cmake/modules/SwiftAndroidSupport.cmake b/cmake/modules/SwiftAndroidSupport.cmake
index c56404ca88eae..44f0775dd7607 100644
--- a/cmake/modules/SwiftAndroidSupport.cmake
+++ b/cmake/modules/SwiftAndroidSupport.cmake
@@ -1,28 +1,7 @@
-function(swift_android_prebuilt_host_name prebuilt_var_name)
-  # Get the prebuilt suffix to create the correct toolchain path when using the NDK
-  if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
-    set(${prebuilt_var_name} darwin-x86_64 PARENT_SCOPE)
-  elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux)
-    set(${prebuilt_var_name} linux-x86_64 PARENT_SCOPE)
-  elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
-    set(${prebuilt_var_name} Windows-x86_64 PARENT_SCOPE)
-  else()
-    message(SEND_ERROR "cannot cross-compile to android from ${CMAKE_HOST_SYSTEM_NAME}")
-  endif()
-endfunction()
-
-function(swift_android_libgcc_for_arch_cross_compile arch var)
-  set(paths)
-  if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
-    list(APPEND paths "${SWIFT_SDK_ANDROID_ARCH_${arch}_PATH}/../lib/gcc/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}/${SWIFT_ANDROID_NDK_GCC_VERSION}.x")
-  endif()
-  set(${var} ${paths} PARENT_SCOPE)
-endfunction()
-
 function(swift_android_sysroot sysroot_var_name)
   if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
-    swift_android_prebuilt_host_name(prebuilt_build)
-    set(${sysroot_var_name} "${SWIFT_ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/${prebuilt_build}/sysroot" PARENT_SCOPE)
+    string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} platform)
+    set(${sysroot_var_name} "${SWIFT_ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/${platform}-x86_64/sysroot" PARENT_SCOPE)
   elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
     set(${sysroot_var_name} "${SWIFT_ANDROID_NATIVE_SYSROOT}" PARENT_SCOPE)
   else()
@@ -32,19 +11,8 @@ endfunction()
 
 function(swift_android_tools_path arch path_var_name)
   if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
-    swift_android_prebuilt_host_name(prebuilt_build)
-    if("${arch}" STREQUAL "i686")
-      set(ndk_prebuilt_path
-        "${SWIFT_ANDROID_NDK_PATH}/toolchains/x86-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${prebuilt_build}")
-    elseif("${arch}" STREQUAL "x86_64")
-      set(ndk_prebuilt_path
-        "${SWIFT_ANDROID_NDK_PATH}/toolchains/x86_64-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${prebuilt_build}")
-    else()
-      set(ndk_prebuilt_path
-        "${SWIFT_ANDROID_NDK_PATH}/toolchains/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${prebuilt_build}")
-    endif()
-
-    set(${path_var_name} "${ndk_prebuilt_path}/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}/bin" PARENT_SCOPE)
+    string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} platform)
+    set(${path_var_name} "${SWIFT_ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/${platform}-x86_64/bin" PARENT_SCOPE)
   elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
     set(${path_var_name} "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/bin" PARENT_SCOPE)
   else()
diff --git a/docs/Android.md b/docs/Android.md
index 644fd9d2f6ef6..6cb1da1a6bf72 100644
--- a/docs/Android.md
+++ b/docs/Android.md
@@ -33,8 +33,8 @@ To follow along with this guide, you'll need:
    Ubuntu 18.04 or Ubuntu 16.04. Before attempting to build for Android,
    please make sure you are able to build for Linux by following the
    instructions in the Swift project README.
-2. The latest version of the Android NDK (r21e at the time of this writing,
-   only r19 or later are supported), available to download here:
+2. The latest version of the Android NDK (r23 at the time of this writing),
+   available to download here:
    https://developer.android.com/ndk/downloads/index.html.
 3. An Android device with remote debugging enabled or the emulator. We require
    remote debugging in order to deploy built stdlib products to the device. You
@@ -73,7 +73,7 @@ Android NDK, as well as the directories that contain the `libicuucswift.so` and
 
 ```
 $ ARM_DIR=path/to/libiconv-libicu-android/armeabi-v7a
-$ NDK_PATH=path/to/android-ndk-r21e
+$ NDK_PATH=path/to/android-ndk-r23
 $ utils/build-script \
     -R \                                       # Build in ReleaseAssert mode.
     --android \                                # Build for Android.
@@ -99,7 +99,7 @@ Then use the built Swift compiler from the previous step to compile a Swift
 source file, targeting Android:
 
 ```
-$ NDK_PATH="path/to/android-ndk-r21e"
+$ NDK_PATH="path/to/android-ndk-r23"
 $ build/Ninja-ReleaseAssert/swift-linux-x86_64/bin/swiftc \          # The Swift compiler built in the previous step
                                                                      # The location of the tools used to build Android binaries
     -tools-directory ${NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/bin/ \
@@ -153,7 +153,7 @@ adb push /path/to/libicu-android/armeabi-v7a/libicuucswift.so /data/local/tmp
 In addition, you'll also need to copy the Android NDK's libc++:
 
 ```
-$ adb push /path/to/android-ndk-r21e/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so /data/local/tmp
+$ adb push /path/to/android-ndk-r23/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so /data/local/tmp
 ```
 
 Finally, you'll need to copy the `hello` executable you built in the
@@ -196,7 +196,7 @@ $ utils/build-script \
   -R \                               # Build in ReleaseAssert mode.
   -T \                               # Run all tests, including on the Android device (add --host-test to only run Android tests on the linux host).
   --android \                        # Build for Android.
-  --android-ndk ~/android-ndk-r21e \ # Path to an Android NDK.
+  --android-ndk ~/android-ndk-r23 \  # Path to an Android NDK.
   --android-arch armv7 \             # Optionally specify Android architecture, alternately aarch64
   --android-ndk-version 21 \
   --android-icu-uc ~/libicu-android/armeabi-v7a/libicuuc.so \
diff --git a/lib/Driver/UnixToolChains.cpp b/lib/Driver/UnixToolChains.cpp
index 1dc32acfd8357..313b04ae3d464 100644
--- a/lib/Driver/UnixToolChains.cpp
+++ b/lib/Driver/UnixToolChains.cpp
@@ -85,6 +85,9 @@ ToolChain::InvocationInfo toolchains::GenericUnix::constructInvocation(
 }
 
 std::string toolchains::GenericUnix::getDefaultLinker() const {
+  if (getTriple().isAndroid())
+    return "lld";
+
   switch (getTriple().getArch()) {
   case llvm::Triple::arm:
   case llvm::Triple::aarch64:
diff --git a/stdlib/cmake/modules/AddSwiftStdlib.cmake b/stdlib/cmake/modules/AddSwiftStdlib.cmake
index 57288b330492b..73ab70240e37b 100644
--- a/stdlib/cmake/modules/AddSwiftStdlib.cmake
+++ b/stdlib/cmake/modules/AddSwiftStdlib.cmake
@@ -94,12 +94,9 @@ function(_add_target_variant_c_compile_link_flags)
   endif()
 
   if("${CFLAGS_SDK}" STREQUAL "ANDROID")
-    # lld can handle targeting the android build.  However, if lld is not
-    # enabled, then fallback to the linker included in the android NDK.
-    if(NOT SWIFT_USE_LINKER STREQUAL "lld")
-      swift_android_tools_path(${CFLAGS_ARCH} tools_path)
-      list(APPEND result "-B" "${tools_path}")
-    endif()
+    # Make sure the Android NDK lld is used.
+    swift_android_tools_path(${CFLAGS_ARCH} tools_path)
+    list(APPEND result "-B" "${tools_path}")
   endif()
 
   if("${CFLAGS_SDK}" IN_LIST SWIFT_DARWIN_PLATFORMS)
@@ -389,8 +386,8 @@ function(_add_target_variant_link_flags)
     MACCATALYST_BUILD_FLAVOR  "${LFLAGS_MACCATALYST_BUILD_FLAVOR}")
   if("${LFLAGS_SDK}" STREQUAL "LINUX")
     list(APPEND link_libraries "pthread" "dl")
-    if("${SWIFT_HOST_VARIANT_ARCH}" MATCHES "armv6|armv7|i686")
-      list(APPEND link_libraries PRIVATE "atomic")
+    if("${LFLAGS_ARCH}" MATCHES "armv6|armv7|i686")
+      list(APPEND link_libraries "atomic")
     endif()
   elseif("${LFLAGS_SDK}" STREQUAL "FREEBSD")
     list(APPEND link_libraries "pthread")
@@ -417,8 +414,14 @@ function(_add_target_variant_link_flags)
     list(APPEND result "-Wl,-Bsymbolic")
   elseif("${LFLAGS_SDK}" STREQUAL "ANDROID")
     list(APPEND link_libraries "dl" "log")
+    if("${LFLAGS_ARCH}" STREQUAL "armv7")
+      list(APPEND link_libraries "atomic")
+    endif()
     # We need to add the math library, which is linked implicitly by libc++
     list(APPEND result "-lm")
+    if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
+      list(APPEND result "-resource-dir=${SWIFT_SDK_ANDROID_ARCH_${LFLAGS_ARCH}_PATH}/../lib64/clang/${SWIFT_ANDROID_NDK_CLANG_VERSION}")
+    endif()
 
     # link against the custom C++ library
     swift_android_cxx_libraries_for_arch(${LFLAGS_ARCH} cxx_link_libraries)
@@ -428,11 +431,6 @@ function(_add_target_variant_link_flags)
     list(APPEND link_libraries
       ${SWIFT_ANDROID_${LFLAGS_ARCH}_ICU_I18N}
       ${SWIFT_ANDROID_${LFLAGS_ARCH}_ICU_UC})
-
-    swift_android_libgcc_for_arch_cross_compile(${LFLAGS_ARCH} ${LFLAGS_ARCH}_LIB)
-    foreach(path IN LISTS ${LFLAGS_ARCH}_LIB)
-      list(APPEND library_search_directories ${path})
-    endforeach()
   else()
     # If lto is enabled, we need to add the object path flag so that the LTO code
     # generator leaves the intermediate object file in a place where it will not
@@ -460,10 +458,17 @@ function(_add_target_variant_link_flags)
   endif()
 
   if(SWIFT_USE_LINKER AND NOT SWIFT_COMPILER_IS_MSVC_LIKE)
+    # The linker is normally chosen based on the host, but the Android NDK only
+    # uses lld now.
+    if("${LFLAGS_SDK}" STREQUAL "ANDROID")
+      set(linker "lld")
+    else()
+      set(linker "${SWIFT_USE_LINKER}")
+    endif()
     if(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
-      list(APPEND result "-fuse-ld=${SWIFT_USE_LINKER}.exe")
+      list(APPEND result "-fuse-ld=${linker}.exe")
     else()
-      list(APPEND result "-fuse-ld=${SWIFT_USE_LINKER}")
+      list(APPEND result "-fuse-ld=${linker}")
     endif()
   endif()
 
diff --git a/stdlib/public/runtime/CMakeLists.txt b/stdlib/public/runtime/CMakeLists.txt
index fdb5472a6d144..85aaf68bc9a68 100644
--- a/stdlib/public/runtime/CMakeLists.txt
+++ b/stdlib/public/runtime/CMakeLists.txt
@@ -228,7 +228,7 @@ foreach(sdk ${SWIFT_SDKS})
       endif()
       set(libpthread -lpthread)
       set(android_libraries)
-      if(sdk STREQUAL ANDROID)
+      if(${sdk} STREQUAL ANDROID)
         set(android_libraries -llog)
         set(libpthread)
       endif()
diff --git a/test/AutoDiff/validation-test/reflection.swift b/test/AutoDiff/validation-test/reflection.swift
index e938506bab687..70a558508c776 100644
--- a/test/AutoDiff/validation-test/reflection.swift
+++ b/test/AutoDiff/validation-test/reflection.swift
@@ -1,4 +1,5 @@
 // REQUIRES: no_asan
+// UNSUPPORTED: OS=linux-android, OS=linux-androideabi
 // RUN: %empty-directory(%t)
 import _Differentiation
 
diff --git a/test/LinkerSections/function_sections-lld.swift b/test/LinkerSections/function_sections-lld.swift
new file mode 100644
index 0000000000000..80d2755c7e365
--- /dev/null
+++ b/test/LinkerSections/function_sections-lld.swift
@@ -0,0 +1,8 @@
+// REQUIRES: OS=linux-androideabi || OS=linux-android
+// RUN: %empty-directory(%t)
+// RUN: %target-build-swift -Xfrontend -function-sections -emit-module -emit-library -static -parse-stdlib %S/Inputs/FunctionSections.swift
+// RUN: %target-build-swift -Xlinker --gc-sections -Xlinker -Map=%t/../../FunctionSections.map -I%t/../.. -L%t/../.. -lFunctionSections %S/Inputs/FunctionSectionsUse.swift
+// RUN: %FileCheck %s < %t/../../FunctionSections.map
+
+// CHECK-NOT: .text.$s16FunctionSections5func2yyF
+// CHECK: .text.$s16FunctionSections5func1yyF
diff --git a/test/LinkerSections/function_sections.swift b/test/LinkerSections/function_sections.swift
index eb01d59563ea7..a2cf2a39a5c34 100644
--- a/test/LinkerSections/function_sections.swift
+++ b/test/LinkerSections/function_sections.swift
@@ -1,4 +1,4 @@
-// REQUIRES: OS=linux-gnu || OS=linux-androideabi || OS=linux-android || OS=freebsd
+// REQUIRES: OS=linux-gnu || OS=freebsd
 // RUN: %empty-directory(%t)
 // RUN: %target-build-swift -Xfrontend -function-sections -emit-module -emit-library -static -parse-stdlib %S/Inputs/FunctionSections.swift
 // RUN: %target-build-swift -Xlinker --gc-sections -Xlinker -Map=%t/../../FunctionSections.map -I%t/../.. -L%t/../.. -lFunctionSections %S/Inputs/FunctionSectionsUse.swift
diff --git a/test/Reflection/capture_descriptors.sil b/test/Reflection/capture_descriptors.sil
index 8857015f81413..ef71fc31dc682 100644
--- a/test/Reflection/capture_descriptors.sil
+++ b/test/Reflection/capture_descriptors.sil
@@ -3,6 +3,7 @@
 
 // SR-12893
 // XFAIL: openbsd
+// UNSUPPORTED: OS=linux-android, OS=linux-androideabi
 
 // RUN: %empty-directory(%t)
 // RUN: %target-build-swift %s -emit-module -emit-library -module-name capture_descriptors -o %t/capture_descriptors%{target-shared-library-suffix} -L%t/../../.. -lBlocksRuntime
diff --git a/test/Reflection/typeref_decoding_imported.swift b/test/Reflection/typeref_decoding_imported.swift
index 634f024c2a32b..4d2c7bcc8a75b 100644
--- a/test/Reflection/typeref_decoding_imported.swift
+++ b/test/Reflection/typeref_decoding_imported.swift
@@ -16,6 +16,7 @@
 // RUN: %target-swift-reflection-dump -binary-filename %t/%target-library-name(TypesToReflect) | %FileCheck %s --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-cpu
 
 // UNSUPPORTED: CPU=arm64e
+// UNSUPPORTED: OS=linux-android, OS=linux-androideabi
 
 // CHECK-32: FIELDS:
 // CHECK-32: =======
diff --git a/test/lit.cfg b/test/lit.cfg
index 06c02e421ea98..8da12645a8ea6 100644
--- a/test/lit.cfg
+++ b/test/lit.cfg
@@ -440,10 +440,7 @@ differentiable_programming = lit_config.params.get('differentiable_programming',
 if differentiable_programming is not None:
     config.available_features.add('differentiable_programming')
 
-# On Android, LLVM LTO is only supported when the driver uses lld.
-# And skip lto tests when driver uses gold linker.
-if not (run_os in ['linux-android', 'linux-androideabi']) or (config.android_linker_name == 'lld'):
-    config.available_features.add('lld_lto')
+config.available_features.add('lld_lto')
 
 test_options = os.environ.get('SWIFT_TEST_OPTIONS')
 if test_options:
@@ -1489,7 +1486,7 @@ elif run_os == 'linux-androideabi' or run_os == 'linux-android':
         config.android_ndk_path, "toolchains", "llvm", "prebuilt",
         prebuilt_directory)
     tools_directory = shell_quote(make_path(
-        toolchain_directory, ndk_platform_triple, "bin"))
+        toolchain_directory, "bin"))
     lit_config.note("Testing Android " + config.variant_triple)
     config.target_object_format = "elf"
     config.target_shared_library_prefix = 'lib'
@@ -1497,10 +1494,6 @@ elif run_os == 'linux-androideabi' or run_os == 'linux-android':
     config.target_runtime = "native"
     config.target_swift_autolink_extract = inferSwiftBinary("swift-autolink-extract")
     config.target_sdk_name = "android"
-    android_link_paths_opt = "-L {}".format(
-        shell_quote(make_path(
-            toolchain_directory, "lib", "gcc", ndk_platform_triple,
-            "{}.x".format(config.android_ndk_gcc_version))))
     config.resource_dir_opt = ("-resource-dir %s" % test_resource_dir)
     # Since NDK r19, the headers and libraries are available in a unified
     # sysroot at $NDK_PATH/toolchains/llvm/prebuilt/$prebuilt_directory/sysroot,
@@ -1511,7 +1504,7 @@ elif run_os == 'linux-androideabi' or run_os == 'linux-android':
         '-sdk', config.variant_sdk, '-Xclang-linker',
         '--target={}{}'.format(config.variant_triple, config.android_api_level),
         '-tools-directory', tools_directory,
-        android_link_paths_opt, '-use-ld=%s' % config.android_linker_name,
+        '-use-ld=%s' % config.android_linker_name,
         config.resource_dir_opt, mcp_opt, config.swift_test_options,
         config.swift_driver_test_options, swift_execution_tests_extra_flags])
     config.target_codesign = "echo"
@@ -1523,7 +1516,7 @@ elif run_os == 'linux-androideabi' or run_os == 'linux-android':
     config.target_swift_frontend = ' '.join([
         config.swift_frontend,
         '-target', config.variant_triple,
-        '-sdk', config.variant_sdk, android_link_paths_opt, config.resource_dir_opt,
+        '-sdk', config.variant_sdk, config.resource_dir_opt,
         mcp_opt, config.swift_test_options, config.swift_frontend_test_options])
     subst_target_swift_frontend_mock_sdk = config.target_swift_frontend
     subst_target_swift_frontend_mock_sdk_after = ""
@@ -1558,7 +1551,7 @@ elif run_os == 'linux-androideabi' or run_os == 'linux-android':
         '-sdk', config.variant_sdk, '-Xclang-linker',
         '--target={}{}'.format(config.variant_triple, config.android_api_level),
         '-tools-directory', tools_directory,
-        android_link_paths_opt, config.resource_dir_opt, mcp_opt,
+        config.resource_dir_opt, mcp_opt,
         '-use-ld=%s' % config.android_linker_name,
         config.swift_driver_test_options])
     config.target_swift_modulewrap = ' '.join([
diff --git a/test/lit.site.cfg.in b/test/lit.site.cfg.in
index b9ed0d1083324..da6618507eccc 100644
--- a/test/lit.site.cfg.in
+++ b/test/lit.site.cfg.in
@@ -42,8 +42,8 @@ config.swift_frontend_test_options = "@SWIFT_FRONTEND_TEST_OPTIONS@"
 config.darwin_xcrun_toolchain = "@SWIFT_DARWIN_XCRUN_TOOLCHAIN@"
 
 # --- android ---
+config.android_linker_name = "lld"
 config.android_ndk_path = "@SWIFT_ANDROID_NDK_PATH@"
-config.android_ndk_gcc_version = "@SWIFT_ANDROID_NDK_GCC_VERSION@"
 config.android_api_level = "@SWIFT_ANDROID_API_LEVEL@"
 
 # --- Windows ---
@@ -127,12 +127,6 @@ if "@SWIFT_ENABLE_SOURCEKIT_TESTS@" == "TRUE":
 if "@SWIFT_HAVE_LIBXML2@" == "TRUE":
     config.available_features.add('libxml2')
 
-if "@SWIFT_USE_LINKER@" == "lld":
-    config.android_linker_name = "lld"
-else:
-    # even if SWIFT_USE_LINKER isn't set, we cannot use BFD for Android
-    config.android_linker_name = "gold"
-
 if '@SWIFT_INCLUDE_TOOLS@' == 'TRUE':
     config.available_features.add('swift_tools_extra')
 
diff --git a/utils/build-script-impl b/utils/build-script-impl
index 3971ac0c5e10a..93efa3811eb76 100755
--- a/utils/build-script-impl
+++ b/utils/build-script-impl
@@ -95,7 +95,6 @@ KNOWN_SETTINGS=(
     android-icu-uc                                ""                "Path to libicuuc.so"
     android-icu-uc-include                        ""                "Path to a directory containing headers for libicuuc"
     android-ndk                                   ""                "An absolute path to the NDK that will be used as a libc implementation for Android builds"
-    android-ndk-gcc-version                       ""                "The GCC version to use when building for Android. Currently only 4.9 is supported"
 
     ## Darwin Options
     darwin-crash-reporter-client                  ""                "whether to enable CrashReporter integration"
@@ -1892,7 +1891,6 @@ for host in "${ALL_HOSTS[@]}"; do
                     cmake_options=(
                         "${cmake_options[@]}"
                         -DSWIFT_ANDROID_NDK_PATH:STRING="${ANDROID_NDK}"
-                        -DSWIFT_ANDROID_NDK_GCC_VERSION:STRING="${ANDROID_NDK_GCC_VERSION}"
                         -DSWIFT_ANDROID_${ANDROID_ARCH}_ICU_UC:STRING="${ANDROID_ICU_UC}"
                         -DSWIFT_ANDROID_${ANDROID_ARCH}_ICU_UC_INCLUDE:STRING="${ANDROID_ICU_UC_INCLUDE}"
                         -DSWIFT_ANDROID_${ANDROID_ARCH}_ICU_I18N:STRING="${ANDROID_ICU_I18N}"
diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py
index 569fd40182172..dbe5597b0a911 100644
--- a/utils/build_swift/build_swift/driver_arguments.py
+++ b/utils/build_swift/build_swift/driver_arguments.py
@@ -1154,15 +1154,6 @@ def create_argument_parser():
            help='The Android API level to target when building for Android. '
                 'Currently only 21 or above is supported')
 
-    option('--android-ndk-gcc-version', store,
-           choices=['4.8', '4.9'],
-           default='4.9',
-           help='The GCC version to use when building for Android. Currently '
-                'only 4.9 is supported. %(default)s is also the default '
-                'value. This option may be used when experimenting with '
-                'versions of the Android NDK not officially supported by '
-                'Swift')
-
     option('--android-icu-uc', store_path,
            help='Path to libicuuc.so')
     option('--android-icu-uc-include', store_path,
diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py
index 4004159d2966d..b4a942a4ad764 100644
--- a/utils/build_swift/tests/expected_options.py
+++ b/utils/build_swift/tests/expected_options.py
@@ -48,7 +48,6 @@
     'android_icu_uc_include': None,
     'android_icu_data': None,
     'android_ndk': None,
-    'android_ndk_gcc_version': '4.9',
     'android_arch': 'armv7',
     'assertions': True,
     'benchmark': False,
@@ -651,8 +650,6 @@ class BuildScriptImplOption(_BaseOption):
     DisableOption('--skip-build-clang-tools-extra',
                   dest='build_clang_tools_extra'),
 
-    ChoicesOption('--android-ndk-gcc-version',
-                  choices=['4.8', '4.9']),
     ChoicesOption('--compiler-vendor',
                   choices=['none', 'apple']),
     ChoicesOption('--swift-analyze-code-coverage',
diff --git a/utils/swift_build_support/swift_build_support/build_script_invocation.py b/utils/swift_build_support/swift_build_support/build_script_invocation.py
index fb1237dd6d633..078bbb671f142 100644
--- a/utils/swift_build_support/swift_build_support/build_script_invocation.py
+++ b/utils/swift_build_support/swift_build_support/build_script_invocation.py
@@ -307,7 +307,6 @@ def convert_to_impl_arguments(self):
                 "--android-arch", args.android_arch,
                 "--android-ndk", args.android_ndk,
                 "--android-api-level", args.android_api_level,
-                "--android-ndk-gcc-version", args.android_ndk_gcc_version,
                 "--android-icu-uc", args.android_icu_uc,
                 "--android-icu-uc-include", args.android_icu_uc_include,
                 "--android-icu-i18n", args.android_icu_i18n,
diff --git a/validation-test/lit.site.cfg.in b/validation-test/lit.site.cfg.in
index 962c633f191e7..9da09c7bd39eb 100644
--- a/validation-test/lit.site.cfg.in
+++ b/validation-test/lit.site.cfg.in
@@ -36,8 +36,8 @@ config.swift_frontend_test_options = "@SWIFT_FRONTEND_TEST_OPTIONS@"
 config.darwin_xcrun_toolchain = "@SWIFT_DARWIN_XCRUN_TOOLCHAIN@"
 
 # --- Android Configuration ---
+config.android_linker_name = "lld"
 config.android_ndk_path = "@SWIFT_ANDROID_NDK_PATH@"
-config.android_ndk_gcc_version = "@SWIFT_ANDROID_NDK_GCC_VERSION@"
 config.android_api_level = "@SWIFT_ANDROID_API_LEVEL@"
 
 # --- Windows MSVC Configuration ---
@@ -110,12 +110,6 @@ if "@CMAKE_GENERATOR@" == "Xcode":
 
 config.available_features.add("CMAKE_GENERATOR=@CMAKE_GENERATOR@")
 
-if "@SWIFT_USE_LINKER@" == "lld":
-    config.android_linker_name = "lld"
-else:
-    # even if SWIFT_USE_LINKER isn't set, we cannot use BFD for Android
-    config.android_linker_name = "gold"
-
 # Let the main config do the real work.
 config.test_exec_root = os.path.dirname(os.path.realpath(__file__))
 lit_config.load_config(config, "@SWIFT_SOURCE_DIR@/validation-test/lit.cfg")