[PATCH 1/2] malloc: change --enable-memory-tagging configure flag

Yury Khrustalev yury.khrustalev@arm.com
Fri Mar 20 11:36:56 GMT 2026


The --enable-memory-tagging configure flag was added as a generic
option although memory tagging is only implemented for the aarch64
target. This flag was added as blanket on/off switch and at the
time it did not allow to select each of different types of memory
tagging.

This commit extends the behaviour of the --enable-memory-tagging
configure flag adding a value to it. The accepted values are:

 - '--enable-memory-tagging=none'
    (the default): no optional memtag features are enabled

 - '--enable-memory-tagging=no'
   '--disable-memory-tagging'
    same as 'none' (for backward compatibility)

 - '--enable-memory-tagging=all'
    all optional memtag features that are supported by the
    target architecture are enabled

 - '--enable-memory-tagging=yes'
   '--enable-memory-tagging':
    same as 'all' (for backward compatibility)

 - '--enable-memory-tagging=feature1,feature2,...'
    target-dependent selection of optional memtag features
    that should be enabled.

Each supported memtag feature should add a defined target macro
that should be used in the code to guard code that implements
corresponding optional feature. Also, a corresponding makefile
variable is set to 'yes' or 'no' to help with conditional enabling
of tests.

On aarch64 two feature flags are supported: 'heap' and 'stack'.
There is experimental implementation for 'heap' but no code for
'stack' yet.

The meaning of this flags also changes: it is supposed to control
only optional features related to memory tagging: in theory it is
possible that some of the memory tagging features can be always
enabled on some target.

Install documentation and the Glibc manual updated accordingly.
---
 INSTALL                                       | 30 +++++++++-------
 config.h.in                                   |  5 +--
 config.make.in                                |  2 --
 configure                                     | 31 +++++++++--------
 configure.ac                                  | 28 ++++++++-------
 malloc/arena.c                                |  4 +--
 malloc/malloc.c                               |  4 +--
 manual/install.texi                           | 34 ++++++++++++-------
 sysdeps/aarch64/__mtag_tag_region.S           |  4 +--
 sysdeps/aarch64/__mtag_tag_zero_region.S      |  4 +--
 sysdeps/aarch64/configure                     | 30 ++++++++++++++++
 sysdeps/aarch64/configure.ac                  | 26 ++++++++++++++
 sysdeps/aarch64/libc-mtag.h                   |  4 +--
 .../unix/sysv/linux/aarch64/cpu-features.c    |  4 +--
 14 files changed, 143 insertions(+), 67 deletions(-)

diff --git a/INSTALL b/INSTALL
index 4174c9661f..0d367315ad 100644
--- a/INSTALL
+++ b/INSTALL
@@ -154,19 +154,23 @@ passed to 'configure'.  For example:
 
      NOTE: '--enable-cet' is only supported on x86_64 and x32.
 
-'--enable-memory-tagging'
-     Enable memory tagging support if the architecture supports it.
-     When the GNU C Library is built with this option then the resulting
-     library will be able to control the use of tagged memory when
-     hardware support is present by use of the tunable
-     'glibc.mem.tagging'.  This includes the generation of tagged memory
-     when using the 'malloc' APIs.
-
-     At present only AArch64 platforms with MTE provide this
-     functionality, although the library will still operate (without
-     memory tagging) on older versions of the architecture.
-
-     The default is to disable support for memory tagging.
+'--enable-memory-tagging=none'
+'--enable-memory-tagging=all'
+'--enable-memory-tagging=feature1,feature2,...'
+     Enable support for the selected optional memory tagging features if the
+     architecture supports it.
+
+     'none': (the default) means that no optional memory tagging
+     features should be enabled.
+     'all': means that all optional memory tagging features that are
+     supported by the architecture should be enabled.
+
+     The full list of supported values depends on the architecture.
+
+     At present only AArch64 platforms with MTE provide this functionality.
+     The following values are supported on AArch64 platforms with MTE:
+
+     'heap': enables experimental support for memory tagging in malloc.
 
 '--disable-profile'
      Don't build libraries with profiling information.  You may want to
diff --git a/config.h.in b/config.h.in
index b53731c393..2f51a40de1 100644
--- a/config.h.in
+++ b/config.h.in
@@ -182,8 +182,9 @@
 /* Define if inlined system calls are available.  */
 #undef HAVE_INLINED_SYSCALLS
 
-/* Define if memory tagging support should be enabled.  */
-#undef USE_MTAG
+/* Define if AArch64 memory tagging features should be enabled.  */
+#undef USE_AARCH64_MTAG_HEAP
+#undef USE_AARCH64_MTAG_STACK
 
 /* Package description.  */
 #undef PKGVERSION
diff --git a/config.make.in b/config.make.in
index 856363d0cd..12ccb55e53 100644
--- a/config.make.in
+++ b/config.make.in
@@ -78,8 +78,6 @@ multi-arch = @multi_arch@
 
 mach-interface-list = @mach_interface_list@
 
-memory-tagging = @memory_tagging@
-
 # Configuration options.
 build-shared = @shared@
 build-profile = @profile@
diff --git a/configure b/configure
index c84d283bd5..70bb48b181 100755
--- a/configure
+++ b/configure
@@ -703,7 +703,6 @@ INSTALL_PROGRAM
 base_machine
 build_pt_chown
 build_nscd
-memory_tagging
 enable_werror
 force_install
 bindnow
@@ -1490,8 +1489,9 @@ Optional Features:
   --disable-werror        do not build with -Werror
   --enable-multi-arch     enable single DSO with optimizations for multiple
                           architectures
-  --enable-memory-tagging enable memory tagging if supported by the
-                          architecture [default=no]
+  --enable-memory-tagging=[none|all|feature1,feature2,...]
+                          enable memory tagging if supported by the
+                          architecture [default=none]
   --enable-systemtap      enable systemtap static probe points [default=no]
   --disable-build-nscd    disable building and installing the nscd daemon
   --disable-nscd          library functions will not contact the nscd daemon
@@ -4690,25 +4690,28 @@ esac
 fi
 
 
+# Supported values for this option are target-specific.  This option should
+# accept either 'none', 'all', or a comma-delimited list of optional memory
+# tagging features that should be enabled (target-specific) where 'all' means
+# that all supported optional features should be enabled.
 # Check whether --enable-memory-tagging was given.
 if test ${enable_memory_tagging+y}
 then :
   enableval=$enable_memory_tagging; memory_tagging=$enableval
 else case e in #(
-  e) memory_tagging=no ;;
+  e) memory_tagging=none ;;
 esac
 fi
 
-if test "$memory_tagging" = yes; then
-  # Only enable this on architectures that support it.
-  case $host_cpu in
-    aarch64)
-      printf "%s\n" "#define USE_MTAG 1" >>confdefs.h
-
-      ;;
-  esac
-fi
-
+# convert 'yes' to 'all' and 'no' to 'none' for backward compat
+case $memory_tagging in
+  yes) memory_tagging=all ;;
+  no) memory_tagging=none ;;
+esac
+case $memory_tagging in
+  all) memory_tagging_default=yes; ;;
+  *) memory_tagging_default=no; ;;
+esac
 
 # Check whether --enable-systemtap was given.
 if test ${enable_systemtap+y}
diff --git a/configure.ac b/configure.ac
index 280ec8e5b3..0ac1f2d4d0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -328,20 +328,24 @@ AC_ARG_ENABLE([multi-arch],
 	      [multi_arch=$enableval],
 	      [multi_arch=default])
 
+# Supported values for this option are target-specific.  This option should
+# accept either 'none', 'all', or a comma-delimited list of optional memory
+# tagging features that should be enabled (target-specific) where 'all' means
+# that all supported optional features should be enabled.
 AC_ARG_ENABLE([memory-tagging],
-	      AS_HELP_STRING([--enable-memory-tagging],
-			     [enable memory tagging if supported by the architecture @<:@default=no@:>@]),
+	      AS_HELP_STRING([--enable-memory-tagging=@<:@none|all|feature1,feature2,...@:>@],
+			     [enable memory tagging if supported by the architecture @<:@default=none@:>@]),
 	      [memory_tagging=$enableval],
-	      [memory_tagging=no])
-if test "$memory_tagging" = yes; then
-  # Only enable this on architectures that support it.
-  case $host_cpu in
-    aarch64)
-      AC_DEFINE(USE_MTAG)
-      ;;
-  esac
-fi
-AC_SUBST(memory_tagging)
+	      [memory_tagging=none])
+# convert 'yes' to 'all' and 'no' to 'none' for backward compat
+case $memory_tagging in
+  yes) memory_tagging=all ;;
+  no) memory_tagging=none ;;
+esac
+case $memory_tagging in
+  all) memory_tagging_default=yes; ;;
+  *) memory_tagging_default=no; ;;
+esac
 
 AC_ARG_ENABLE([systemtap],
               [AS_HELP_STRING([--enable-systemtap],
diff --git a/malloc/arena.c b/malloc/arena.c
index 03a812f54d..2f894d21e9 100644
--- a/malloc/arena.c
+++ b/malloc/arena.c
@@ -252,7 +252,7 @@ __ptmalloc_init (void)
   tcache_key_initialize ();
 #endif
 
-#ifdef USE_MTAG
+#ifdef USE_AARCH64_MTAG_HEAP
   if ((TUNABLE_GET_FULL (glibc, mem, tagging, int32_t, NULL) & 1) != 0)
     {
       /* If the tunable says that we should be using tagged memory
@@ -264,7 +264,7 @@ __ptmalloc_init (void)
       mtag_enabled = true;
       mtag_mmap_flags = __MTAG_MMAP_FLAGS;
     }
-#endif
+#endif /* USE_AARCH64_MTAG_HEAP */
 
 #if defined SHARED && IS_IN (libc)
   /* In case this libc copy is in a non-default namespace, never use
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 6455a1b0e0..7de6599d30 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -405,13 +405,13 @@ verify (PTRDIFF_MAX <= SIZE_MAX / 2);
    tagging is not enabled, it simply returns the original pointer.
 */
 
-#ifdef USE_MTAG
+#ifdef USE_AARCH64_MTAG_HEAP
 static bool mtag_enabled = false;
 static int mtag_mmap_flags = 0;
 #else
 # define mtag_enabled false
 # define mtag_mmap_flags 0
-#endif
+#endif /* USE_AARCH64_MTAG_HEAP */
 
 static __always_inline void *
 tag_region (void *ptr, size_t size)
diff --git a/manual/install.texi b/manual/install.texi
index 073cda0530..8d14565d34 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -185,18 +185,28 @@ non CET enabled shared library in CET enabled application.
 
 NOTE: @option{--enable-cet} is only supported on x86_64 and x32.
 
-@item --enable-memory-tagging
-Enable memory tagging support if the architecture supports it.  When
-@theglibc{} is built with this option then the resulting library will
-be able to control the use of tagged memory when hardware support is
-present by use of the tunable @samp{glibc.mem.tagging}.  This includes
-the generation of tagged memory when using the @code{malloc} APIs.
-
-At present only AArch64 platforms with MTE provide this functionality,
-although the library will still operate (without memory tagging) on
-older versions of the architecture.
-
-The default is to disable support for memory tagging.
+@item --enable-memory-tagging=none
+@itemx --enable-memory-tagging=all
+@itemx --enable-memory-tagging=@var{feature1},@var{feature2},...
+Enable support for the selected optional memory tagging features if the
+architecture supports it.
+
+@itemize @bullet
+@item @option{none}: (the default) means that no optional memory tagging
+      features should be enabled.
+@item @option{all}: means that all optional memory tagging features that are
+      supported by the architecture should be enabled.
+@end itemize
+
+The full list of supported values depends on the architecture.
+
+At present only AArch64 platforms with MTE provide this functionality.
+The following values are supported on AArch64 platforms with MTE:
+
+@itemize @bullet
+@item @option{heap}: enables experimental support for memory tagging in
+      malloc.
+@end itemize
 
 @item --disable-profile
 Don't build libraries with profiling information.  You may want to use
diff --git a/sysdeps/aarch64/__mtag_tag_region.S b/sysdeps/aarch64/__mtag_tag_region.S
index bad3193bfe..b75e732269 100644
--- a/sysdeps/aarch64/__mtag_tag_region.S
+++ b/sysdeps/aarch64/__mtag_tag_region.S
@@ -18,7 +18,7 @@
 
 #include <sysdep.h>
 
-#ifdef USE_MTAG
+#ifdef USE_AARCH64_MTAG_HEAP
 
 /* Assumptions:
  *
@@ -107,4 +107,4 @@ L(no_zva_loop):
 	ret
 
 END (__libc_mtag_tag_region)
-#endif /* USE_MTAG */
+#endif /* USE_AARCH64_MTAG_HEAP */
diff --git a/sysdeps/aarch64/__mtag_tag_zero_region.S b/sysdeps/aarch64/__mtag_tag_zero_region.S
index 3bc6e7301f..fcb647e131 100644
--- a/sysdeps/aarch64/__mtag_tag_zero_region.S
+++ b/sysdeps/aarch64/__mtag_tag_zero_region.S
@@ -18,7 +18,7 @@
 
 #include <sysdep.h>
 
-#ifdef USE_MTAG
+#ifdef USE_AARCH64_MTAG_HEAP
 
 /* Assumptions:
  *
@@ -107,4 +107,4 @@ L(no_zva_loop):
 	ret
 
 END (__libc_mtag_tag_zero_region)
-#endif /* USE_MTAG */
+#endif /* USE_AARCH64_MTAG_HEAP */
diff --git a/sysdeps/aarch64/configure b/sysdeps/aarch64/configure
index 44b833ea1d..309d04f5fb 100755
--- a/sysdeps/aarch64/configure
+++ b/sysdeps/aarch64/configure
@@ -484,3 +484,33 @@ else
 have-test-gcs = no"
 fi
 
+# Memory tagging
+memory_tagging_heap=$memory_tagging_default
+memory_tagging_stack=$memory_tagging_default
+case $memory_tagging in
+  all|none) ;;
+  *) OLD_IFS=$IFS
+    IFS=,
+    for feature in $memory_tagging; do
+      case $feature in
+        heap) memory_tagging_heap=yes; ;;
+        stack) memory_tagging_stack=yes; ;;
+        *) as_fn_error $? "Not a valid argument for --enable-memory-tagging: \"$feature\"" "$LINENO" 5 ;;
+      esac
+    done
+    IFS=$OLD_IFS
+    ;;
+esac
+config_vars="$config_vars
+memory-tagging-heap = $memory_tagging_heap"
+if test $memory_tagging_heap = yes; then
+  printf "%s\n" "#define USE_AARCH64_MTAG_HEAP 1" >>confdefs.h
+
+fi
+config_vars="$config_vars
+memory-tagging-stack = $memory_tagging_stack"
+if test $memory_tagging_stack = yes; then
+  printf "%s\n" "#define USE_AARCH64_MTAG_STACK 1" >>confdefs.h
+
+fi
+
diff --git a/sysdeps/aarch64/configure.ac b/sysdeps/aarch64/configure.ac
index b9981861f6..66cd4bf51e 100644
--- a/sysdeps/aarch64/configure.ac
+++ b/sysdeps/aarch64/configure.ac
@@ -105,3 +105,29 @@ then
 else
   LIBC_CONFIG_VAR([have-test-gcs], [no])
 fi
+
+# Memory tagging
+memory_tagging_heap=$memory_tagging_default
+memory_tagging_stack=$memory_tagging_default
+case $memory_tagging in
+  all|none) ;;
+  *) OLD_IFS=$IFS
+    IFS=,
+    for feature in $memory_tagging; do
+      case $feature in
+        heap) memory_tagging_heap=yes; ;;
+        stack) memory_tagging_stack=yes; ;;
+        *) AC_MSG_ERROR([Not a valid argument for --enable-memory-tagging: "$feature"]) ;;
+      esac
+    done
+    IFS=$OLD_IFS
+    ;;
+esac
+LIBC_CONFIG_VAR([memory-tagging-heap], [$memory_tagging_heap])
+if test $memory_tagging_heap = yes; then
+  AC_DEFINE(USE_AARCH64_MTAG_HEAP)
+fi
+LIBC_CONFIG_VAR([memory-tagging-stack], [$memory_tagging_stack])
+if test $memory_tagging_stack = yes; then
+  AC_DEFINE(USE_AARCH64_MTAG_STACK)
+fi
diff --git a/sysdeps/aarch64/libc-mtag.h b/sysdeps/aarch64/libc-mtag.h
index 1d7368b806..f821a2087e 100644
--- a/sysdeps/aarch64/libc-mtag.h
+++ b/sysdeps/aarch64/libc-mtag.h
@@ -19,7 +19,7 @@
 #ifndef _AARCH64_LIBC_MTAG_H
 #define _AARCH64_LIBC_MTAG_H 1
 
-#ifndef USE_MTAG
+#ifndef USE_AARCH64_MTAG_HEAP
 /* Generic bindings for systems that do not support memory tagging.  */
 #include_next "libc-mtag.h"
 #else
@@ -64,6 +64,6 @@ __libc_mtag_new_tag (void *p)
   return x0;
 }
 
-#endif /* USE_MTAG */
+#endif /* USE_AARCH64_MTAG_HEAP */
 
 #endif /* _AARCH64_LIBC_MTAG_H */
diff --git a/sysdeps/unix/sysv/linux/aarch64/cpu-features.c b/sysdeps/unix/sysv/linux/aarch64/cpu-features.c
index 1e4f8a86b1..62dcea3f94 100644
--- a/sysdeps/unix/sysv/linux/aarch64/cpu-features.c
+++ b/sysdeps/unix/sysv/linux/aarch64/cpu-features.c
@@ -105,7 +105,7 @@ init_cpu_features (struct cpu_features *cpu_features)
      the user has requested it.  */
   cpu_features->mte_state = 0;
 
-#ifdef USE_MTAG
+#ifdef USE_AARCH64_MTAG_HEAP
   int mte_state = TUNABLE_GET (glibc, mem, tagging, unsigned, 0);
   cpu_features->mte_state = (GLRO (dl_hwcap2) & HWCAP2_MTE) ? mte_state : 0;
   /* If we lack the MTE feature, disable the tunable, since it will
@@ -126,7 +126,7 @@ init_cpu_features (struct cpu_features *cpu_features)
     __prctl (PR_SET_TAGGED_ADDR_CTRL,
 	     (PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_ASYNC | MTE_ALLOWED_TAGS),
 	     0, 0, 0);
-#endif
+#endif /* USE_AARCH64_MTAG_HEAP */
 
   /* Check if SVE is supported.  */
   cpu_features->sve = GLRO (dl_hwcap) & HWCAP_SVE;
-- 
2.47.3



More information about the Libc-alpha mailing list