Merge "vndk-def: Add regex matching to tag file reader"
diff --git a/vndk/tools/definition-tool/datasets/eligible-list-o-release.csv b/vndk/tools/definition-tool/datasets/eligible-list-o-release.csv
index 3c3159f..4e0a8c72 100644
--- a/vndk/tools/definition-tool/datasets/eligible-list-o-release.csv
+++ b/vndk/tools/definition-tool/datasets/eligible-list-o-release.csv
@@ -505,3 +505,14 @@
 /vendor/${LIB}/librilutils.so,VND-ONLY,
 /vendor/${LIB}/libtinycompress.so,VND-ONLY,
 /vendor/${LIB}/libwebrtc_audio_preprocessing.so,VND-ONLY,
+[regex]^.*/android\.hardware\.graphics\.mapper@\d+\.\d+-impl\.so$,SP-HAL,
+[regex]^.*/android\.hardware\.renderscript@1\.0-impl\.so$,SP-HAL,
+[regex]^.*/gralloc\..*\.so$,SP-HAL,
+[regex]^/vendor/.*/libEGL_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libGLES_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libGLESv1_CM_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libGLESv2_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libGLESv3_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libPVRRS\.so$,SP-HAL,
+[regex]^/vendor/.*/libRSDriver.*\.so$,SP-HAL,
+[regex]^/vendor/.*/vulkan.*\.so$,SP-HAL,
diff --git a/vndk/tools/definition-tool/datasets/minimum_tag_file.csv b/vndk/tools/definition-tool/datasets/minimum_tag_file.csv
index 563f870..2fa6ad8 100644
--- a/vndk/tools/definition-tool/datasets/minimum_tag_file.csv
+++ b/vndk/tools/definition-tool/datasets/minimum_tag_file.csv
@@ -1,45 +1,56 @@
-Path,Tag
-/system/${LIB}/libEGL.so,SP-NDK
-/system/${LIB}/libGLESv1_CM.so,SP-NDK
-/system/${LIB}/libGLESv2.so,SP-NDK
-/system/${LIB}/libGLESv3.so,SP-NDK
-/system/${LIB}/libandroid_net.so,LL-NDK
-/system/${LIB}/libc.so,LL-NDK
-/system/${LIB}/libdl.so,LL-NDK
-/system/${LIB}/libft2.so,FWK-ONLY-RS
-/system/${LIB}/liblog.so,LL-NDK
-/system/${LIB}/libm.so,LL-NDK
-/system/${LIB}/libmediandk.so,FWK-ONLY-RS
-/system/${LIB}/libnativewindow.so,SP-NDK
-/system/${LIB}/libstdc++.so,LL-NDK
-/system/${LIB}/libsync.so,SP-NDK
-/system/${LIB}/libvndksupport.so,LL-NDK
-/system/${LIB}/libvulkan.so,SP-NDK
-/system/${LIB}/libz.so,LL-NDK
-/system/${LIB}/vndk-sp/android.hardware.graphics.allocator@2.0.so,VNDK-SP
-/system/${LIB}/vndk-sp/android.hardware.graphics.common@1.0.so,VNDK-SP
-/system/${LIB}/vndk-sp/android.hardware.graphics.mapper@2.0.so,VNDK-SP
-/system/${LIB}/vndk-sp/android.hardware.renderscript@1.0.so,VNDK-SP
-/system/${LIB}/vndk-sp/android.hidl.base@1.0.so,VNDK-SP
-/system/${LIB}/vndk-sp/android.hidl.memory@1.0.so,VNDK-SP
-/system/${LIB}/vndk-sp/libRSCpuRef.so,VNDK-SP
-/system/${LIB}/vndk-sp/libRSDriver.so,VNDK-SP
-/system/${LIB}/vndk-sp/libRS_internal.so,VNDK-SP
-/system/${LIB}/vndk-sp/libbacktrace.so,VNDK-SP-Indirect
-/system/${LIB}/vndk-sp/libbase.so,VNDK-SP
-/system/${LIB}/vndk-sp/libbcinfo.so,VNDK-SP
-/system/${LIB}/vndk-sp/libblas.so,VNDK-SP-Indirect-Private
-/system/${LIB}/vndk-sp/libc++.so,VNDK-SP
-/system/${LIB}/vndk-sp/libcompiler_rt.so,VNDK-SP-Indirect-Private
-/system/${LIB}/vndk-sp/libcutils.so,VNDK-SP
-/system/${LIB}/vndk-sp/libft2.so,FWK-ONLY-RS
-/system/${LIB}/vndk-sp/libhardware.so,VNDK-SP
-/system/${LIB}/vndk-sp/libhidlbase.so,VNDK-SP
-/system/${LIB}/vndk-sp/libhidlmemory.so,VNDK-SP
-/system/${LIB}/vndk-sp/libhidltransport.so,VNDK-SP
-/system/${LIB}/vndk-sp/libhwbinder.so,VNDK-SP
-/system/${LIB}/vndk-sp/libion.so,VNDK-SP
-/system/${LIB}/vndk-sp/liblzma.so,VNDK-SP-Indirect
-/system/${LIB}/vndk-sp/libmediandk.so,FWK-ONLY-RS
-/system/${LIB}/vndk-sp/libunwind.so,VNDK-SP-Indirect
-/system/${LIB}/vndk-sp/libutils.so,VNDK-SP
+Path,Tag,Comments
+/system/${LIB}/libEGL.so,SP-NDK,
+/system/${LIB}/libGLESv1_CM.so,SP-NDK,
+/system/${LIB}/libGLESv2.so,SP-NDK,
+/system/${LIB}/libGLESv3.so,SP-NDK,
+/system/${LIB}/libandroid_net.so,LL-NDK,
+/system/${LIB}/libc.so,LL-NDK,
+/system/${LIB}/libdl.so,LL-NDK,
+/system/${LIB}/libft2.so,FWK-ONLY-RS,
+/system/${LIB}/liblog.so,LL-NDK,
+/system/${LIB}/libm.so,LL-NDK,
+/system/${LIB}/libmediandk.so,FWK-ONLY-RS,
+/system/${LIB}/libnativewindow.so,SP-NDK,
+/system/${LIB}/libstdc++.so,LL-NDK,
+/system/${LIB}/libsync.so,SP-NDK,
+/system/${LIB}/libvndksupport.so,LL-NDK,
+/system/${LIB}/libvulkan.so,SP-NDK,
+/system/${LIB}/libz.so,LL-NDK,
+/system/${LIB}/vndk-sp/android.hardware.graphics.allocator@2.0.so,VNDK-SP,
+/system/${LIB}/vndk-sp/android.hardware.graphics.common@1.0.so,VNDK-SP,
+/system/${LIB}/vndk-sp/android.hardware.graphics.mapper@2.0.so,VNDK-SP,
+/system/${LIB}/vndk-sp/android.hardware.renderscript@1.0.so,VNDK-SP,
+/system/${LIB}/vndk-sp/android.hidl.base@1.0.so,VNDK-SP,
+/system/${LIB}/vndk-sp/android.hidl.memory@1.0.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libRSCpuRef.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libRSDriver.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libRS_internal.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libbacktrace.so,VNDK-SP-Indirect,
+/system/${LIB}/vndk-sp/libbase.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libbcinfo.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libblas.so,VNDK-SP-Indirect-Private,
+/system/${LIB}/vndk-sp/libc++.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libcompiler_rt.so,VNDK-SP-Indirect-Private,
+/system/${LIB}/vndk-sp/libcutils.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libft2.so,FWK-ONLY-RS,
+/system/${LIB}/vndk-sp/libhardware.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libhidlbase.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libhidlmemory.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libhidltransport.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libhwbinder.so,VNDK-SP,
+/system/${LIB}/vndk-sp/libion.so,VNDK-SP,
+/system/${LIB}/vndk-sp/liblzma.so,VNDK-SP-Indirect,
+/system/${LIB}/vndk-sp/libmediandk.so,FWK-ONLY-RS,
+/system/${LIB}/vndk-sp/libunwind.so,VNDK-SP-Indirect,
+/system/${LIB}/vndk-sp/libutils.so,VNDK-SP,
+[regex]^.*/android\.hardware\.graphics\.mapper@\d+\.\d+-impl\.so$,SP-HAL,
+[regex]^.*/android\.hardware\.renderscript@1\.0-impl\.so$,SP-HAL,
+[regex]^.*/gralloc\..*\.so$,SP-HAL,
+[regex]^/vendor/.*/libEGL_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libGLES_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libGLESv1_CM_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libGLESv2_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libGLESv3_.*\.so$,SP-HAL,
+[regex]^/vendor/.*/libPVRRS\.so$,SP-HAL,
+[regex]^/vendor/.*/libRSDriver.*\.so$,SP-HAL,
+[regex]^/vendor/.*/vulkan.*\.so$,SP-HAL,
diff --git a/vndk/tools/definition-tool/tools/update_dataset.py b/vndk/tools/definition-tool/tools/update_dataset.py
index 63053a6..383a207 100755
--- a/vndk/tools/definition-tool/tools/update_dataset.py
+++ b/vndk/tools/definition-tool/tools/update_dataset.py
@@ -67,8 +67,12 @@
         reader = csv.reader(fp)
         header = next(reader)
         data = dict()
+        regex_patterns = []
         for path, tag, comments in reader:
-            data[path] = [path, tag, comments]
+            if path.startswith('[regex]'):
+                regex_patterns.append([path, tag, comments])
+            else:
+                data[path] = [path, tag, comments]
 
     # Delete non-existing libraries.
     installed_paths = load_install_paths(args.module_info)
@@ -100,6 +104,9 @@
         update_tag('/system/${LIB}/' + name + '.so', 'VNDK')
         update_tag('/system/${LIB}/vndk/' + name + '.so', 'VNDK')
 
+    for regex in regex_patterns:
+        data[regex[0]] = regex
+
     # Write updated eligible list file.
     with open(args.output, 'w') as fp:
         writer = csv.writer(fp, lineterminator='\n')
diff --git a/vndk/tools/definition-tool/vndk_definition_tool.py b/vndk/tools/definition-tool/vndk_definition_tool.py
index 29510fd..8613e85 100755
--- a/vndk/tools/definition-tool/vndk_definition_tool.py
+++ b/vndk/tools/definition-tool/vndk_definition_tool.py
@@ -700,17 +700,27 @@
         self._path_tag = dict()
         for tag in self.TAGS:
             setattr(self, tag, set())
+        self._regex_patterns = []
 
     def add(self, tag, lib):
         lib_set = getattr(self, tag)
         lib_set.add(lib)
         self._path_tag[lib] = tag
 
+    def add_regex(self, tag, pattern):
+        self._regex_patterns.append((re.compile(pattern), tag))
+
     def get_path_tag(self, lib):
         try:
             return self._path_tag[lib]
         except KeyError:
-            return self.get_path_tag_default(lib)
+            pass
+
+        for pattern, tag in self._regex_patterns:
+            if pattern.match(lib):
+                return tag
+
+        return self.get_path_tag_default(lib)
 
     def get_path_tag_default(self, lib):
         raise NotImplementedError()
@@ -750,6 +760,10 @@
     def is_fwk_only_rs(tag_bit):
         return bool(tag_bit & TaggedDict.FWK_ONLY_RS)
 
+    @staticmethod
+    def is_sp_hal(tag_bit):
+        return bool(tag_bit & TaggedDict.SP_HAL)
+
 
 class TaggedPathDict(TaggedDict):
     def load_from_csv(self, fp):
@@ -793,6 +807,9 @@
             yield pattern
 
     def add(self, tag, path):
+        if path.startswith('[regex]'):
+            super(TaggedPathDict, self).add_regex(tag, path[7:])
+            return
         for path in self._enumerate_paths(path):
             super(TaggedPathDict, self).add(tag, path)
 
@@ -800,7 +817,17 @@
         return 'vnd_only' if path.startswith('/vendor') else 'fwk_only'
 
 
-class TaggedLibDict(TaggedDict):
+class TaggedLibDict(object):
+    def __init__(self):
+        self._path_tag = dict()
+        for tag in TaggedDict.TAGS:
+            setattr(self, tag, set())
+
+    def add(self, tag, lib):
+        lib_set = getattr(self, tag)
+        lib_set.add(lib)
+        self._path_tag[lib] = tag
+
     @staticmethod
     def create_from_graph(graph, tagged_paths, generic_refs=None):
         d = TaggedLibDict()
@@ -818,6 +845,12 @@
                 d.add('vnd_only', lib)
         return d
 
+    def get_path_tag(self, lib):
+        try:
+            return self._path_tag[lib]
+        except KeyError:
+            return self.get_path_tag_default(lib)
+
     def get_path_tag_default(self, lib):
         return 'vnd_only' if lib.path.startswith('/vendor') else 'fwk_only'
 
@@ -939,6 +972,10 @@
     def is_fwk_only_rs(self):
         return TaggedDict.is_fwk_only_rs(self._tag_bit)
 
+    @property
+    def is_sp_hal(self):
+        return TaggedDict.is_sp_hal(self._tag_bit)
+
     def add_needed_dep(self, dst):
         assert dst not in self.deps_needed_hidden
         assert self not in dst.users_needed_hidden
@@ -1353,30 +1390,9 @@
         self._resolve_elf_class_deps(ELF.ELFCLASS32, generic_refs)
         self._resolve_elf_class_deps(ELF.ELFCLASS64, generic_refs)
 
-    def compute_path_matched_lib(self, path_patterns):
-        patt = re.compile('|'.join('(?:' + p + ')' for p in path_patterns))
-        return set(lib for lib in self.all_libs() if patt.match(lib.path))
-
     def compute_predefined_sp_hal(self):
         """Find all same-process HALs."""
-        path_patterns = (
-            # OpenGL-related
-            '^/vendor/.*/libEGL_.*\\.so$',
-            '^/vendor/.*/libGLES_.*\\.so$',
-            '^/vendor/.*/libGLESv1_CM_.*\\.so$',
-            '^/vendor/.*/libGLESv2_.*\\.so$',
-            '^/vendor/.*/libGLESv3_.*\\.so$',
-            # Vulkan
-            '^/vendor/.*/vulkan.*\\.so$',
-            # libRSDriver
-            '^.*/android\\.hardware\\.renderscript@1\\.0-impl\\.so$',
-            '^/vendor/.*/libPVRRS\\.so$',
-            '^/vendor/.*/libRSDriver.*\\.so$',
-            # Gralloc mapper
-            '^.*/gralloc\\..*\\.so$',
-            '^.*/android\\.hardware\\.graphics\\.mapper@\\d+\\.\\d+-impl\\.so$',
-        )
-        return self.compute_path_matched_lib(path_patterns)
+        return set(lib for lib in self.all_libs() if lib.is_sp_hal)
 
     def compute_sp_ndk(self):
         """Find all SP-NDK libraries."""