Add assembly support for -fsanitize=hwaddress tagged globals.
authorPeter Collingbourne <pcc-at-google.com@ffmpeg.org>
Wed, 21 Aug 2019 18:55:25 +0000 (11:55 -0700)
committerCarl Eugen Hoyos <ceffmpeg@gmail.com>
Thu, 22 Aug 2019 09:22:07 +0000 (11:22 +0200)
As of LLVM r368102, Clang will set a pointer tag in bits 56-63 of the
address of a global when compiling with -fsanitize=hwaddress. This requires
an adjustment to assembly code that takes the address of such globals: the
code cannot use the regular R_AARCH64_ADR_PREL_PG_HI21 relocation to refer
to the global, since the tag would take the address out of range. Instead,
the code must use the non-checking (_NC) variant of the relocation (the
link-time check is substituted by a runtime check).

This change makes the necessary adjustment in the movrel macro, where it is
needed when compiling with -fsanitize=hwaddress.

Signed-off-by: Peter Collingbourne <pcc@google.com>
Reviewed-by: Martin Storsjö
Reviewed-by: Janne Grunau
libavutil/aarch64/asm.S

index 5c32943..3ac2ba0 100644 (file)
 #   define FUNC #
 #endif
 
+#ifndef __has_feature
+#   define __has_feature(x) 0
+#endif
+
 .macro  function name, export=0, align=2
     .macro endfunc
 ELF     .size   \name, . - \name
@@ -94,7 +98,11 @@ ELF     .size   \name, . - \name
         add             \rd, \rd, :lo12:\val+(\offset)
     .endif
 #elif CONFIG_PIC
+#   if __has_feature(hwaddress_sanitizer)
+        adrp            \rd, :pg_hi21_nc:\val+(\offset)
+#   else
         adrp            \rd, \val+(\offset)
+#   endif
         add             \rd, \rd, :lo12:\val+(\offset)
 #else
         ldr             \rd, =\val+\offset