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."""
