LOCAL_DIR := $(GET_LOCAL_DIR)

ifndef ARCH_arm_TOOLCHAIN_PREFIX
$(error Please run envsetup.sh to set ARCH_arm_TOOLCHAIN_PREFIX)
endif

ARCH_arm_COMPILEFLAGS :=

# Arch
ifeq ($(ARM_CPU),armv8-a)
ARCH_arm_COMPILEFLAGS += -march=$(ARM_CPU)
else
ARCH_arm_COMPILEFLAGS += -mcpu=$(ARM_CPU)
endif

# Floating point support
ifneq ($(ARM_WITHOUT_VFP_NEON),true)
# ARM_WITHOUT_VFP_NEON = false
ifeq (false,$(call TOBOOL,$(ALLOW_FP_USE)))
# This is likely kernel space.
# Don't use neon registers but still support FP ASM.
# The kernel will not save NEON register on interrupt.
ARCH_arm_COMPILEFLAGS += -mfpu=vfpv3 -mfloat-abi=softfp -DWITH_NO_FP=1
else # ALLOW_FP_USE = true
# This is likely userspace.
ifeq ($(ARM_CPU),cortex-a7)
ARCH_arm_COMPILEFLAGS += -mfpu=neon-vfpv4 -mfloat-abi=softfp
endif
ifeq ($(ARM_CPU),cortex-a15)
ARCH_arm_COMPILEFLAGS += -mfpu=neon-vfpv4 -mfloat-abi=softfp
endif
ifeq ($(ARM_CPU),armv8-a)
ARCH_arm_COMPILEFLAGS += -mfpu=crypto-neon-fp-armv8 -mfloat-abi=softfp
endif
endif # ALLOW_FP_USE
else # ARM_WITHOUT_VFP_NEON = true
ARCH_arm_COMPILEFLAGS += -mfloat-abi=soft
endif # ARM_WITHOUT_VFP_NEON

CLANG_ARM_TARGET_SYS ?= linux
CLANG_ARM_TARGET_ABI ?= gnu

ARCH_arm_THUMBCFLAGS :=
ifeq ($(ENABLE_THUMB),true)
ARCH_arm_THUMBCFLAGS := -mthumb -D__thumb__
endif

ARCH_arm_COMPILEFLAGS += -target arm-$(CLANG_ARM_TARGET_SYS)-$(CLANG_ARM_TARGET_ABI)

# Set up custom Rust target to match clang target
ARCH_arm_SUPPORTS_RUST := true
ifeq (true,$(call TOBOOL,$(TRUSTY_USERSPACE)))
ARCH_arm_RUSTFLAGS := --target=armv7-unknown-trusty
else
# Save the path to custom toolchain so Rust targets targets can depend on it
ARCH_arm_RUST_TARGET := $(LOCAL_DIR)/armv7-unknown-trusty-kernel.json
ARCH_arm_RUSTFLAGS := --target=$(ARCH_arm_RUST_TARGET)
ARCH_arm_SUPPORTS_RUST_CFI := true
endif
