vndk-def: Add sp-both-vndk-stable

This commit extracts sp-both-vndk-stable from sp-ndk-vndk-stable.
If a vndk-stable library is used by both SP-NDK and SP-HAL, then it
will belong to sp-both-vndk-stable.

Separating these libraries into another set makes it easier to:

1. Check whether a library is used by SP-HAL.
2. Estimate how many libraries will be loaded twice.

Test: Run vndk_definition_tool.py against sailfish image and only
sp-ndk-vndk-stable set is changed.

Change-Id: I2272086417c7dca515544520df5877bf6804a5e9
diff --git a/vndk/tools/definition-tool/tests/test_elf_linker.py b/vndk/tools/definition-tool/tests/test_elf_linker.py
index 358a4c5..7b5930b 100755
--- a/vndk/tools/definition-tool/tests/test_elf_linker.py
+++ b/vndk/tools/definition-tool/tests/test_elf_linker.py
@@ -389,10 +389,14 @@
         # LL-NDK (should be excluded from result)
         gb.add_multilib(PT_SYSTEM, 'libc')
 
+        # SP-Both VNDK-stable
+        gb.add_multilib(PT_SYSTEM, 'libsp_both_vs')
+
         # SP-NDK VNDK-stable
         gb.add_multilib(PT_SYSTEM, 'libcutils_dep', dt_needed=['libc.so'])
         gb.add_multilib(PT_SYSTEM, 'libcutils',
-                        dt_needed=['libc.so', 'libcutils_dep.so'])
+                        dt_needed=['libc.so', 'libcutils_dep.so',
+                                   'libsp_both_vs.so'])
 
         # SP-NDK dependencies
         gb.add_multilib(PT_SYSTEM, 'libutils',
@@ -410,7 +414,7 @@
         # SP-HAL VNDK-stable
         gb.add_multilib(PT_SYSTEM, 'libhidlbase')
         gb.add_multilib(PT_SYSTEM, 'libhidlmemory',
-                        dt_needed=['libhidlbase.so'])
+                        dt_needed=['libhidlbase.so', 'libsp_both_vs.so'])
 
         # SP-HAL
         gb.add_multilib(PT_VENDOR, 'libEGL_chipset', extra_dir='egl',
@@ -433,6 +437,7 @@
         self.assertEqual(2 * 2, len(sp_lib.sp_hal_vndk_stable))
         self.assertEqual(2 * 1, len(sp_lib.sp_ndk))
         self.assertEqual(2 * 3, len(sp_lib.sp_ndk_vndk_stable))
+        self.assertEqual(2 * 1, len(sp_lib.sp_both_vndk_stable))
 
         sp_hal = self._get_paths_from_nodes(sp_lib.sp_hal)
         sp_hal_dep = self._get_paths_from_nodes(sp_lib.sp_hal_dep)
@@ -443,7 +448,14 @@
         sp_ndk_vndk_stable = self._get_paths_from_nodes(
                 sp_lib.sp_ndk_vndk_stable)
 
+        sp_both_vndk_stable = self._get_paths_from_nodes(
+                sp_lib.sp_both_vndk_stable)
+
         for lib_dir in ('lib', 'lib64'):
+            # SP-Both
+            self.assertIn('/system/{}/libsp_both_vs.so'.format(lib_dir),
+                          sp_both_vndk_stable)
+
             # SP-NDK dependencies
             self.assertIn('/system/{}/libcutils.so'.format(lib_dir),
                           sp_ndk_vndk_stable)
diff --git a/vndk/tools/definition-tool/tests/test_vndk.py b/vndk/tools/definition-tool/tests/test_vndk.py
index 5908e5e..f03a45e 100755
--- a/vndk/tools/definition-tool/tests/test_vndk.py
+++ b/vndk/tools/definition-tool/tests/test_vndk.py
@@ -43,7 +43,7 @@
         graph, generic_refs = self._create_graph_gr(input_dir, generic_refs_dir)
 
         vndk = graph._compute_vndk(
-                sp_lib=SPLibResult(set(), set(), set(), set(), set()),
+                sp_lib=SPLibResult(set(), set(), set(), set(), set(), set()),
                 vndk_customized_for_system=set(),
                 vndk_customized_for_vendor=set(),
                 generic_refs=generic_refs,
@@ -98,7 +98,7 @@
 
         # Compute vndk sets and move libraries to the correct directories.
         vndk = graph._compute_vndk(
-                sp_lib=SPLibResult(set(), set(), set(), set(), set()),
+                sp_lib=SPLibResult(set(), set(), set(), set(), set(), set()),
                 vndk_customized_for_system=set(),
                 vndk_customized_for_vendor=set(),
                 generic_refs=generic_refs,
diff --git a/vndk/tools/definition-tool/vndk_definition_tool.py b/vndk/tools/definition-tool/vndk_definition_tool.py
index b77d16a..75b8f79 100755
--- a/vndk/tools/definition-tool/vndk_definition_tool.py
+++ b/vndk/tools/definition-tool/vndk_definition_tool.py
@@ -622,6 +622,7 @@
 VNDKResult = collections.namedtuple(
         'VNDKResult',
         'sp_hal sp_hal_dep sp_hal_vndk_stable sp_ndk sp_ndk_vndk_stable '
+        'sp_both_vndk_stable '
         'extra_vendor_lib vndk_core vndk_indirect vndk_fwk_ext vndk_vnd_ext')
 
 def print_vndk_lib(vndk_lib, file=sys.stdout):
@@ -645,7 +646,8 @@
 
 SPLibResult = collections.namedtuple(
         'SPLibResult',
-        'sp_hal sp_hal_dep sp_hal_vndk_stable sp_ndk sp_ndk_vndk_stable')
+        'sp_hal sp_hal_dep sp_hal_vndk_stable sp_ndk sp_ndk_vndk_stable '
+        'sp_both_vndk_stable')
 
 def print_sp_lib(sp_lib, file=sys.stdout):
     # SP-NDK
@@ -662,6 +664,10 @@
     for lib in sorted_lib_path_list(sp_lib.sp_hal_vndk_stable):
         print('sp-hal-vndk-stable:', lib, file=file)
 
+    # SP-both
+    for lib in sorted_lib_path_list(sp_lib.sp_both_vndk_stable):
+        print('sp-both-vndk-stable:', lib, file=file)
+
 
 class ELFResolver(object):
     def __init__(self, lib_set, default_search_path):
@@ -1037,6 +1043,7 @@
 
         sp_ndk = self.compute_sp_ndk()
         sp_ndk_closure = self.compute_closure(sp_ndk, is_ndk)
+        sp_ndk_vndk_stable = sp_ndk_closure - sp_ndk
 
         sp_hal = self.compute_predefined_sp_hal()
         sp_hal_closure = self.compute_closure(sp_hal, is_ndk)
@@ -1053,11 +1060,12 @@
             else:
                 sp_hal_dep.add(lib)
 
-        sp_ndk_vndk_stable = sp_ndk_closure - sp_ndk
-        sp_hal_vndk_stable = sp_hal_vndk_stable - sp_ndk - sp_ndk_vndk_stable
+        sp_both_vndk_stable = sp_ndk_vndk_stable & sp_hal_vndk_stable
+        sp_ndk_vndk_stable -= sp_both_vndk_stable
+        sp_hal_vndk_stable -= sp_both_vndk_stable
 
         return SPLibResult(sp_hal, sp_hal_dep, sp_hal_vndk_stable, sp_ndk,
-                           sp_ndk_vndk_stable)
+                           sp_ndk_vndk_stable, sp_both_vndk_stable)
 
     def _po_component_sorted(self, lib_set, get_successors,
                              get_strong_successors):
@@ -1196,7 +1204,8 @@
     def _compute_vndk(self, sp_lib, vndk_customized_for_system,
                       vndk_customized_for_vendor, generic_refs, banned_libs):
         # Compute sp-hal and vndk-stable.
-        vndk_stable = sp_lib.sp_hal_vndk_stable | sp_lib.sp_ndk_vndk_stable
+        vndk_stable = sp_lib.sp_hal_vndk_stable | sp_lib.sp_ndk_vndk_stable | \
+                      sp_lib.sp_both_vndk_stable
         sp_hal_closure = sp_lib.sp_hal | sp_lib.sp_hal_dep
 
         # Normalize partition tags.  We expect many violations from the
@@ -1501,6 +1510,7 @@
         return VNDKResult(
                 sp_lib.sp_hal, sp_lib.sp_hal_dep, sp_lib.sp_hal_vndk_stable,
                 sp_lib.sp_ndk, sp_lib.sp_ndk_vndk_stable,
+                sp_lib.sp_both_vndk_stable,
                 extra_vendor_lib, vndk_core, vndk_indirect,
                 vndk_fwk_ext, vndk_vnd_ext)