Merge changes Ibf58f981,I2c007222,I23d13c71,I4c1a8be6,I96e4c083, ...

* changes:
  gn2bp: add support for building against Android zlib
  gn2bp: support architecture in builtin_deps
  gn2bp: correctly flatten source_sets under linker unit target
  gn2bp: add is_linker_unit_type helper to Target
  gn2bp: fix include dir denylist
  gn2bp: fix Android.bp.swp
diff --git a/tools/gn2bp/Android.bp.swp b/tools/gn2bp/Android.bp.swp
index 3e521bf..78ae260 100644
--- a/tools/gn2bp/Android.bp.swp
+++ b/tools/gn2bp/Android.bp.swp
@@ -5759,6 +5759,7 @@
         "base/android/java/src/org/chromium/base/RadioUtils.java",
         "base/android/java/src/org/chromium/base/StreamUtil.java",
         "base/android/java/src/org/chromium/base/StrictModeContext.java",
+        "base/android/java/src/org/chromium/base/SysUtils.java",
         "base/android/java/src/org/chromium/base/ThreadUtils.java",
         "base/android/java/src/org/chromium/base/TimeUtils.java",
         "base/android/java/src/org/chromium/base/TimezoneUtils.java",
@@ -5801,6 +5802,8 @@
         "base/android/java/src/org/chromium/base/jank_tracker/JankTracker.java",
         "base/android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java",
         "base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
+        "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
+        "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
         "base/android/java/src/org/chromium/base/library_loader/Linker.java",
         "base/android/java/src/org/chromium/base/library_loader/LinkerJni.java",
         "base/android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
@@ -5831,6 +5834,7 @@
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessConstants.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessLauncher.java",
+        "base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessServiceDelegate.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildServiceConnection.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildServiceConnectionDelegate.java",
@@ -6068,6 +6072,7 @@
         "base/android/java/src/org/chromium/base/RadioUtils.java",
         "base/android/java/src/org/chromium/base/StreamUtil.java",
         "base/android/java/src/org/chromium/base/StrictModeContext.java",
+        "base/android/java/src/org/chromium/base/SysUtils.java",
         "base/android/java/src/org/chromium/base/ThreadUtils.java",
         "base/android/java/src/org/chromium/base/TimeUtils.java",
         "base/android/java/src/org/chromium/base/TimezoneUtils.java",
@@ -6110,6 +6115,8 @@
         "base/android/java/src/org/chromium/base/jank_tracker/JankTracker.java",
         "base/android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java",
         "base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
+        "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
+        "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
         "base/android/java/src/org/chromium/base/library_loader/Linker.java",
         "base/android/java/src/org/chromium/base/library_loader/LinkerJni.java",
         "base/android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
@@ -6140,6 +6147,7 @@
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessConstants.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessLauncher.java",
+        "base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessServiceDelegate.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildServiceConnection.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildServiceConnectionDelegate.java",
@@ -6377,6 +6385,7 @@
         "base/android/java/src/org/chromium/base/RadioUtils.java",
         "base/android/java/src/org/chromium/base/StreamUtil.java",
         "base/android/java/src/org/chromium/base/StrictModeContext.java",
+        "base/android/java/src/org/chromium/base/SysUtils.java",
         "base/android/java/src/org/chromium/base/ThreadUtils.java",
         "base/android/java/src/org/chromium/base/TimeUtils.java",
         "base/android/java/src/org/chromium/base/TimezoneUtils.java",
@@ -6419,6 +6428,8 @@
         "base/android/java/src/org/chromium/base/jank_tracker/JankTracker.java",
         "base/android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java",
         "base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
+        "base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
+        "base/android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
         "base/android/java/src/org/chromium/base/library_loader/Linker.java",
         "base/android/java/src/org/chromium/base/library_loader/LinkerJni.java",
         "base/android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
@@ -6449,6 +6460,7 @@
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessConstants.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessLauncher.java",
+        "base/android/java/src/org/chromium/base/process_launcher/ChildProcessService.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildProcessServiceDelegate.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildServiceConnection.java",
         "base/android/java/src/org/chromium/base/process_launcher/ChildServiceConnectionDelegate.java",
diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp
index 4103270..884a48c 100755
--- a/tools/gn2bp/gen_android_bp
+++ b/tools/gn2bp/gen_android_bp
@@ -96,6 +96,10 @@
 local_include_dirs_denylist = [
 ]
 
+android_include_dirs_denylist = [
+    'third_party/zlib/',
+]
+
 # Name of the module which settings such as compiler flags for all other
 # modules.
 defaults_module = module_prefix + 'defaults'
@@ -140,15 +144,32 @@
     ],
 }
 
+def enable_zlib(module, arch):
+  # Requires crrev/c/4109079
+  if arch is None:
+    module.shared_libs.add('libz')
+  else:
+    module.arch[arch].shared_libs.add('libz')
+
 # Android equivalents for third-party libraries that the upstream project
 # depends on.
 builtin_deps = {
     '//buildtools/third_party/libunwind:libunwind':
-        lambda x: None, # disable libunwind
+        lambda m, a: None, # disable libunwind
     '//net/tools/root_store_tool:root_store_tool':
-        lambda x: None,
+        lambda m, a: None,
 }
 
+android_deps = {
+    '//third_party/zlib:zlib':
+        enable_zlib,
+}
+
+# Uncomment the following lines to use Android deps rather than their Chromium
+# equivalent:
+#builtin_deps.update(android_deps)
+#local_include_dirs_denylist.extend(android_include_dirs_denylist)
+
 # Name of tethering apex module
 tethering_apex = "com.android.tethering"
 
@@ -1086,6 +1107,10 @@
   module.local_include_dirs.update([gn_utils.label_to_path(d)
                                  for d in include_dirs
                                  if not re.match('^//out/.*', d)])
+  # Remove prohibited include directories
+  module.local_include_dirs = [d for d in module.local_include_dirs
+                               if d not in local_include_dirs_denylist]
+
 
 def create_modules_from_target(blueprint, gn, gn_target_name):
   """Generate module(s) for a given GN target.
@@ -1192,10 +1217,6 @@
       if lib in static_library_allowlist:
         module.add_android_static_lib(android_lib)
 
-    # Remove prohibited include directories
-    module.local_include_dirs = [d for d in module.local_include_dirs
-                                 if d not in local_include_dirs_denylist]
-
   # If the module is a static library, export all the generated headers.
   if module.type == 'cc_library_static':
     module.export_generated_headers = module.generated_headers
@@ -1216,7 +1237,7 @@
     # |builtin_deps| override GN deps with Android-specific ones. See the
     # config in the top of this file.
     if dep_name in builtin_deps:
-      builtin_deps[dep_name](module)
+      builtin_deps[dep_name](module, None)
       continue
 
     dep_module = create_modules_from_target(blueprint, gn, dep_name)
@@ -1269,6 +1290,11 @@
 
   for arch_name, arch in target.arch.items():
     for dep_name in arch.deps:
+      # |builtin_deps| override GN deps with Android-specific ones. See the
+      # config in the top of this file.
+      if dep_name in builtin_deps:
+        builtin_deps[dep_name](module, arch_name)
+        continue
       dep_module = create_modules_from_target(blueprint, gn, dep_name)
       # Arch-specific dependencies currently only include cc_library_static.
       # Revisit this approach once we need to support more target types.
@@ -1283,19 +1309,11 @@
           if module.type not in ["cc_object"]:
             module.target[arch_name].export_generated_headers.update(
               dep_module.genrule_headers)
-      else:
-        raise Error('Unsupported arch-specific dependency %s of target %s with type %s' %
-                    (dep_module.name, target.name, dep_module.type))
-    for dep_name in arch.source_set_deps:
-      dep_module = create_modules_from_target(blueprint, gn, dep_name)
-      if dep_module.type == 'cc_object':
-        if module.type != 'cc_object':
-          # We only want to bubble up cc_objects for modules that are not cc_objects
-          # otherwise they'd be recompiled and that would cause multiple symbol redefinitions.
-          if dep_module.has_input_files():
-            # Only add it as part of srcs if the dep_module has input files otherwise
-            # this would throw an error.
-            module.target[arch_name].srcs.add(":" + dep_module.name)
+      elif dep_module.type == 'cc_object':
+        if dep_module.has_input_files():
+          # Only add it as part of srcs if the dep_module has input files otherwise
+          # this would throw an error.
+          module.target[arch_name].srcs.add(":" + dep_module.name)
       else:
         raise Error('Unsupported arch-specific dependency %s of target %s with type %s' %
                     (dep_module.name, target.name, dep_module.type))
diff --git a/tools/gn2bp/gn_utils.py b/tools/gn2bp/gn_utils.py
index b3f51c9..349723e 100644
--- a/tools/gn2bp/gn_utils.py
+++ b/tools/gn2bp/gn_utils.py
@@ -182,6 +182,9 @@
     def device_supported(self):
       return any([name.startswith('android') for name in self.arch.keys()])
 
+    def is_linker_unit_type(self):
+      return self.type in LINKER_UNIT_TYPES
+
     def __lt__(self, other):
       if isinstance(other, self.__class__):
         return self.name < other.name
@@ -344,7 +347,7 @@
     elif target.type == 'source_set':
       self.source_sets[gn_target_name] = target
       target.arch[arch].sources.update(desc.get('sources', []))
-    elif target.type in LINKER_UNIT_TYPES:
+    elif target.is_linker_unit_type():
       self.linker_units[gn_target_name] = target
       target.arch[arch].sources.update(desc.get('sources', []))
     elif (desc.get("script", "") in JAVA_BANNED_SCRIPTS
@@ -400,12 +403,15 @@
       elif dep.type == 'source_set':
         target.arch[arch].source_set_deps.add(dep.name)
         target.arch[arch].source_set_deps.update(dep.arch[arch].source_set_deps)
+        # flatten source_set deps
+        if target.is_linker_unit_type():
+          target.arch[arch].deps.update(target.arch[arch].source_set_deps)
       elif dep.type == 'group':
         target.update(dep, arch)  # Bubble up groups's cflags/ldflags etc.
       elif dep.type in ['action', 'action_foreach', 'copy']:
         if proto_target_type is None:
           target.arch[arch].deps.add(dep.name)
-      elif dep.type in LINKER_UNIT_TYPES:
+      elif dep.is_linker_unit_type():
         target.arch[arch].deps.add(dep.name)
       elif dep.type == 'java_group':
         # Explicitly break dependency chain when a java_group is added.