long-double-fcts = yes

ifeq ($(subdir),elf)
sysdep-dl-routines += \
  dl-bti \
  dl-gcs \
  # sysdep-dl-routines

tests += \
  tst-audit26 \
  tst-audit27 \
  # tests

modules-names += \
  tst-audit26mod \
  tst-audit27mod \
  tst-auditmod26 \
  tst-auditmod27 \
  # modules-names

$(objpfx)tst-audit26: $(objpfx)tst-audit26mod.so \
		      $(objpfx)tst-auditmod26.so
LDFLAGS-tst-audit26 += -Wl,-z,lazy
tst-audit26-ENV = LD_AUDIT=$(objpfx)tst-auditmod26.so

$(objpfx)tst-audit27: $(objpfx)tst-audit27mod.so \
		      $(objpfx)tst-auditmod27.so
$(objpfx)tst-audit27mod.so: $(libsupport)
LDFLAGS-tst-audit27 += -Wl,-z,lazy
tst-audit27-ENV = LD_AUDIT=$(objpfx)tst-auditmod27.so
endif

ifeq ($(subdir),elf)
sysdep-rtld-routines += dl-start
sysdep-dl-routines += tlsdesc dl-tlsdesc
gen-as-const-headers += \
  dl-link.sym \
  rtld-global-offsets.sym

tests-internal += \
  tst-ifunc-arg-1 \
  tst-ifunc-arg-2 \
  tst-ifunc-arg-3 \
  tst-ifunc-arg-4 \
  # tests-internal

tests += tst-vpcs
modules-names += tst-vpcs-mod
LDFLAGS-tst-vpcs-mod.so = -Wl,-z,lazy
$(objpfx)tst-vpcs: $(objpfx)tst-vpcs-mod.so
endif

ifeq ($(subdir),csu)
gen-as-const-headers += \
  tlsdesc.sym \
  rtld-global-offsets.sym
endif

ifeq ($(subdir),gmon)
CFLAGS-mcount.c += -mgeneral-regs-only
endif

ifeq ($(subdir),math)
CPPFLAGS += -I../soft-fp
endif

ifeq ($(subdir),misc)
sysdep_headers += sys/ifunc.h
sysdep_routines += \
  __mtag_tag_zero_region \
  __mtag_tag_region \
  __arm_za_disable \
  __alloc_gcs

tests += \
  tst-sme-jmp \
  tst-sme-signal \
  tst-sme-za-state \
  # tests
tests-internal += \
  tst-sme-clone \
  tst-sme-clone3 \
  tst-sme-fork \
  tst-sme-vfork \
  # tests-internal

$(objpfx)tst-sme-clone3: $(objpfx)clone3.o $(objpfx)__arm_za_disable.o

ifeq (yes,$(have-test-bti))

tests += \
  tst-bti-abort-imm \
  tst-bti-abort-static \
  tst-bti-abort-transitive \
  tst-bti-abort-unprot \
  tst-bti-abort-unprot-preload \
  tst-bti-dep-prot \
  tst-bti-dep-prot-preload \
  tst-bti-dlopen-imm \
  tst-bti-dlopen-prot \
  tst-bti-dlopen-transitive \
  tst-bti-ld-debug-both \
  tst-bti-ld-debug-dlopen \
  tst-bti-ld-debug-exe \
  tst-bti-ld-debug-shared \
  tst-bti-permissive-audit \
  tst-bti-permissive-dlopen \
  tst-bti-permissive-imm \
  tst-bti-permissive-preload \
  tst-bti-permissive-transitive \
  tst-bti-prot-audit \
  tst-bti-unprot-audit \
  # tests

modules-names += \
  tst-bti-mod \
  tst-bti-mod-prot \
  tst-bti-mod-prot-audit \
  tst-bti-mod-prot-preload \
  tst-bti-mod-unprot \
  tst-bti-mod-unprot-audit \
  tst-bti-mod-unprot-preload \
  # modules-names

$(objpfx)tst-bti-abort-imm: $(objpfx)tst-bti-mod-unprot.so
$(objpfx)tst-bti-abort-transitive: $(objpfx)tst-bti-mod.so
$(objpfx)tst-bti-abort-unprot: $(objpfx)tst-bti-mod-prot.so
$(objpfx)tst-bti-dep-prot: $(objpfx)tst-bti-mod-prot.so
$(objpfx)tst-bti-mod.so: $(objpfx)tst-bti-mod-unprot.so
$(objpfx)tst-bti-permissive-imm: $(objpfx)tst-bti-mod-unprot.so
$(objpfx)tst-bti-permissive-transitive: $(objpfx)tst-bti-mod.so
$(objpfx)tst-bti-ld-debug-shared: $(objpfx)tst-bti-mod.so
$(objpfx)tst-bti-ld-debug-both: $(objpfx)tst-bti-mod-unprot.so

$(objpfx)tst-bti-abort-unprot-preload.out: $(objpfx)tst-bti-mod-unprot-preload.so
tst-bti-abort-unprot-preload-ENV = \
  GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1 \
  LD_PRELOAD=$(objpfx)tst-bti-mod-unprot-preload.so

$(objpfx)tst-bti-dep-prot-preload.out: $(objpfx)tst-bti-mod-prot-preload.so
# The 'fun' function will be provided by the preload library
LDFLAGS-tst-bti-dep-prot-preload = -Wl,--unresolved-symbols=ignore-all
tst-bti-dep-prot-preload-ENV = \
  GLIBC_TUNABLES=glibc.cpu.aarch64_bti=0 \
  LD_PRELOAD=$(objpfx)tst-bti-mod-prot-preload.so

$(objpfx)tst-bti-permissive-preload.out: $(objpfx)tst-bti-mod-unprot-preload.so
tst-bti-permissive-preload-ENV = \
  GLIBC_TUNABLES=glibc.cpu.aarch64_bti=0 \
  LD_PRELOAD=$(objpfx)tst-bti-mod-unprot-preload.so

CFLAGS-tst-bti-abort-unprot.o += -mbranch-protection=none
CFLAGS-tst-bti-ld-debug-exe.o += -mbranch-protection=none
CFLAGS-tst-bti-ld-debug-both.o += -mbranch-protection=none
CFLAGS-tst-bti-mod-unprot.os += -mbranch-protection=none
CFLAGS-tst-bti-mod-unprot-preload.os += -mbranch-protection=none
CFLAGS-tst-bti-mod-unprot-audit.os += -mbranch-protection=none

tst-bti-abort-imm-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1
tst-bti-abort-transitive-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1
tst-bti-abort-unprot-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1
tst-bti-dep-prot-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1
tst-bti-dlopen-imm-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1
tst-bti-dlopen-prot-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1
tst-bti-dlopen-transitive-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1

tst-bti-permissive-imm-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=0
tst-bti-permissive-transitive-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=0
tst-bti-permissive-dlopen-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=0

$(objpfx)tst-bti-unprot-audit.out: $(objpfx)tst-bti-mod-unprot-audit.so
tst-bti-unprot-audit-ARGS = -- $(host-test-program-cmd)

$(objpfx)tst-bti-prot-audit.out: $(objpfx)tst-bti-mod-prot-audit.so
$(objpfx)tst-bti-prot-audit: $(objpfx)tst-bti-mod-prot.so
tst-bti-prot-audit-ARGS = -- $(host-test-program-cmd)

tst-bti-permissive-audit-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=0
$(objpfx)tst-bti-permissive-audit.out: $(objpfx)tst-bti-mod-unprot-audit.so
$(objpfx)tst-bti-permissive-audit: $(objpfx)tst-bti-mod.so
tst-bti-permissive-audit-ARGS = -- $(host-test-program-cmd)

define run-bti-abort-test
  $(test-wrapper-env) $(run-program-env) \
  $(tst-bti-abort-$*-ENV) $(host-test-program-cmd)
endef

$(objpfx)tst-bti-abort-%.out: $(..)sysdeps/aarch64/tst-bti-abort.sh \
	$(objpfx)tst-bti-abort-%
	$(SHELL) $< $(common-objpfx) $(test-name) '$(run-bti-abort-test)'; \
	$(evaluate-test)

tests-static += \
  tst-bti-abort-static \
  # tests-static

tst-bti-abort-static-ENV = GLIBC_TUNABLES=glibc.cpu.aarch64_bti=1
CFLAGS-tst-bti-abort-static.o += -mbranch-protection=none

$(objpfx)tst-bti-ld-debug-%.out: $(..)elf/tst-dl-debug-protect.sh $(objpfx)tst-bti-ld-debug-%
	$(SHELL) $< $(objpfx) '$(test-wrapper-env)' '$(rtld-prefix)' \
	  '$(run-program-env) GLIBC_TUNABLES=glibc.cpu.aarch64_bti=0' \
	  'security: not compatible with AArch64 BTI: $(objpfx)' \
	  $(objpfx)tst-bti-ld-debug-$* > $@; $(evaluate-test)

endif # ifeq (yes,$(have-test-bti))

endif

ifeq ($(subdir),malloc)
sysdep_malloc_debug_routines = __mtag_tag_zero_region __mtag_tag_region
endif # malloc directory
