Add assembly support for -fsanitize=hwaddress tagged globals.

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
This commit is contained in:
Peter Collingbourne 2019-08-21 11:55:25 -07:00 committed by Carl Eugen Hoyos
parent c87237d105
commit 9bcb1cb6ed
1 changed files with 8 additions and 0 deletions

View File

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