[llvm] e434fc0 - gn build: Support cross-compiling libunwind for Android.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 11 21:47:47 PST 2021


Author: Peter Collingbourne
Date: 2021-02-11T21:47:33-08:00
New Revision: e434fc0dde8c6b11df8c4d68c2758c3b5d69a97f

URL: https://github.com/llvm/llvm-project/commit/e434fc0dde8c6b11df8c4d68c2758c3b5d69a97f
DIFF: https://github.com/llvm/llvm-project/commit/e434fc0dde8c6b11df8c4d68c2758c3b5d69a97f.diff

LOG: gn build: Support cross-compiling libunwind for Android.

- Usual cross-compilation fix: s/target_/current_/g

- Define _LIBUNWIND_IS_NATIVE_ONLY to enable unwinding past
  functions with return pointer authentication.

- Android needs two libunwind static libraries: one with symbols exported and
  one without. These both need to be in the same build tree so
  the libunwind_hermetic_static_library configuration option doesn't
  help here. Replace it with build rules that build both libraries.

- Install the libraries in the location that Android expects them to be.

Differential Revision: https://reviews.llvm.org/D96563

Added: 
    

Modified: 
    llvm/utils/gn/secondary/libunwind/BUILD.gn
    llvm/utils/gn/secondary/libunwind/src/BUILD.gn

Removed: 
    


################################################################################
diff  --git a/llvm/utils/gn/secondary/libunwind/BUILD.gn b/llvm/utils/gn/secondary/libunwind/BUILD.gn
index 07c3cf0da5210..f66246dc7703e 100644
--- a/llvm/utils/gn/secondary/libunwind/BUILD.gn
+++ b/llvm/utils/gn/secondary/libunwind/BUILD.gn
@@ -1,3 +1,16 @@
+import("//llvm/utils/gn/build/toolchain/compiler.gni")
+
+supported_toolchains = [ "//llvm/utils/gn/build/toolchain:stage2_unix" ]
+if (android_ndk_path != "") {
+  supported_toolchains += [
+    "//llvm/utils/gn/build/toolchain:stage2_android_aarch64",
+    "//llvm/utils/gn/build/toolchain:stage2_android_arm",
+  ]
+}
+
 group("libunwind") {
-  deps = [ "//libunwind/src(//llvm/utils/gn/build/toolchain:stage2_unix)" ]
+  deps = []
+  foreach(toolchain, supported_toolchains) {
+    deps += [ "//libunwind/src($toolchain)" ]
+  }
 }

diff  --git a/llvm/utils/gn/secondary/libunwind/src/BUILD.gn b/llvm/utils/gn/secondary/libunwind/src/BUILD.gn
index 6c91b7a5a462c..1eb5fadae298a 100644
--- a/llvm/utils/gn/secondary/libunwind/src/BUILD.gn
+++ b/llvm/utils/gn/secondary/libunwind/src/BUILD.gn
@@ -1,4 +1,5 @@
 import("//clang/runtimes.gni")
+import("//compiler-rt/target.gni")
 
 declare_args() {
   # Build libunwind as a shared library.
@@ -6,16 +7,13 @@ declare_args() {
 
   # Build libunwind as a static library.
   libunwind_enable_static = true
-
-  # Do not export any symbols from the static library.
-  libunwind_hermetic_static_library = true
 }
 
 unwind_headers = [
   "../include/libunwind.h",
   "../include/unwind.h",
 ]
-if (target_os == "mac") {
+if (current_os == "mac") {
   unwind_headers += [
     # Make `gn format` not collapse this, for sync_source_lists_from_cmake.py.
     "../include/mach-o/compact_unwind_encoding.h",
@@ -44,25 +42,39 @@ unwind_sources = [
   "libunwind.cpp",
   "libunwind_ext.h",
 ]
-if (target_os == "mac") {
+if (current_os == "mac") {
   unwind_sources += [ "Unwind_AppleExtras.cpp" ]
 }
 
+if (current_os == "android") {
+  if (current_cpu == "arm64") {
+    unwind_output_dir = "$crt_current_out_dir/aarch64"
+  } else if (current_cpu == "arm") {
+    unwind_output_dir = "$crt_current_out_dir/arm"
+  }
+} else {
+  unwind_output_dir = runtimes_dir
+}
+
 config("unwind_config") {
   cflags = []
   cflags_c = [ "-std=c99" ]
   cflags_cc = [ "-fno-rtti" ]
+  defines = [ "_LIBUNWIND_IS_NATIVE_ONLY" ]
   include_dirs = [ "//libunwind/include" ]
-  if (target_os == "mac") {
+  if (current_os == "mac") {
     cflags += [ "-U__STRICT_ANSI__" ]
   }
+  if (current_os == "android") {
+    defines += [ "_LIBUNWIND_USE_DLADDR=0" ]
+  }
 }
 
 if (libunwind_enable_shared) {
   shared_library("unwind_shared") {
-    output_dir = runtimes_dir
+    output_dir = unwind_output_dir
     output_name = "unwind"
-    if (target_os == "linux" || target_os == "mac") {
+    if (current_os == "linux" || current_os == "mac") {
       cflags = [ "-fPIC" ]
       ldflags = [ "-nostdlib++" ]
       libs = [
@@ -70,7 +82,7 @@ if (libunwind_enable_shared) {
         "pthread",
       ]
     }
-    if (target_os == "mac") {
+    if (current_os == "mac") {
       ldflags += [
         "-compatibility_version 1",
         "-install_name /usr/lib/libunwind.1.dylib",
@@ -88,24 +100,35 @@ if (libunwind_enable_shared) {
 }
 
 if (libunwind_enable_static) {
-  static_library("unwind_static") {
-    output_dir = runtimes_dir
-    output_name = "unwind"
-    complete_static_lib = true
-    configs -= [ "//llvm/utils/gn/build:thin_archive" ]
-    sources = unwind_sources
-    public = unwind_headers
-    if (libunwind_hermetic_static_library) {
-      cflags = [ "-fvisibility=hidden" ]
-      cflags_cc = [ "-fvisibility-global-new-delete-hidden" ]
-      defines = [ "_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS" ]
+  template("libunwind_static_library") {
+    static_library(target_name) {
+      output_dir = unwind_output_dir
+      output_name = invoker.output_name
+      complete_static_lib = true
+      configs -= [ "//llvm/utils/gn/build:thin_archive" ]
+      sources = unwind_sources
+      public = unwind_headers
+      if (!invoker.export) {
+        cflags = [ "-fvisibility=hidden" ]
+        cflags_cc = [ "-fvisibility-global-new-delete-hidden" ]
+        defines = [ "_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS" ]
+      }
+      deps = [ "//compiler-rt/lib/builtins" ]
+      configs += [ ":unwind_config" ]
+      configs -= [
+        "//llvm/utils/gn/build:no_exceptions",
+        "//llvm/utils/gn/build:no_rtti",
+      ]
     }
-    deps = [ "//compiler-rt/lib/builtins" ]
-    configs += [ ":unwind_config" ]
-    configs -= [
-      "//llvm/utils/gn/build:no_exceptions",
-      "//llvm/utils/gn/build:no_rtti",
-    ]
+  }
+
+  libunwind_static_library("unwind_static_exported") {
+    output_name = "unwind-exported"
+    export = true
+  }
+  libunwind_static_library("unwind_static") {
+    output_name = "unwind"
+    export = false
   }
 }
 
@@ -115,6 +138,9 @@ group("src") {
     deps += [ ":unwind_shared" ]
   }
   if (libunwind_enable_static) {
-    deps += [ ":unwind_static" ]
+    deps += [
+      ":unwind_static",
+      ":unwind_static_exported",
+    ]
   }
 }


        


More information about the llvm-commits mailing list