PKGDIR          ?= ../..
L4DIR           ?= $(PKGDIR)/../..

include $(L4DIR)/mk/Makeconf

TARGET          = libunwind.a libunwind.so
CONTRIB_INCDIR  = libunwind
REQUIRES_LIBS   = l4re_c l4re_c-util libbacktrace
PRIVATE_INCDIR  = $(SRC_DIR)

SRC_C          += libunwind-l4.c elf-image-cache.c helper.c

ARCH_MAP-x86   = x86
ARCH_MAP-amd64 = x86_64
ARCH_MAP-arm   = arm
ARCH_MAP-arm64 = aarch64
ARCH_MAP-mips  = mips
ARCH_MAP-riscv = riscv
ARCH_MAP-ppc32 = ppc32
# no sparc

PRIVATE_INCDIR += $(SRC_DIR)/../contrib/include
PRIVATE_INCDIR += $(SRC_DIR)/../contrib/src
PRIVATE_INCDIR += $(SRC_DIR)/../contrib/include/tdep
PRIVATE_INCDIR += $(SRC_DIR)/../contrib/include/tdep-$(ARCH_MAP-$(ARCH))

vpath %.c $(SRC_DIR)/../contrib/src
vpath %.S $(SRC_DIR)/../contrib/src
vpath %.c $(SRC_DIR)/../contrib/src/$(ARCH_MAP-$(ARCH))
vpath %.S $(SRC_DIR)/../contrib/src/$(ARCH_MAP-$(ARCH))
# ppc has a shared dir for ppc32+ppc64, for others we just have the include
# paths twice
vpath %.c $(SRC_DIR)/../contrib/src/$(if $(filter ppc32,$(ARCH)),ppc) 
vpath %.S $(SRC_DIR)/../contrib/src/$(if $(filter ppc32,$(ARCH)),ppc))
vpath %.c $(SRC_DIR)/../contrib/src/dwarf
vpath %.c $(SRC_DIR)/../contrib/src/mi

SRC_C_UNWIND = os-l4.c Gapply_reg_state.c Gcreate_addr_space.c \
               Gget_proc_info.c Gget_save_loc.c Gglobal.c \
               Ginit_local.c Ginit.c Ginit_remote.c Gregs.c Greg_states_iterate.c \
               Gresume.c Gstep.c is_fpreg.c regname.c Gexpr.c \
               Gfde.c Gfind_proc_info-lsb.c Gfind_unwind_table.c global.c Gparser.c Gpe.c \
               flush_cache.c Gdestroy_addr_space.c Gdyn-extract.c Gdyn-remote.c \
               Gfind_dynamic_proc_info.c Gget_accessors.c Gget_fpreg.c \
               Gget_proc_info_by_ip.c Gget_proc_name.c Gget_reg.c \
               Gput_dynamic_unwind_info.c Gset_cache_size.c Gset_caching_policy.c \
               Gaddress_validator.c \
               Gset_fpreg.c Gset_reg.c init.c mempool.c strerror.c \
               elf$(BITS).c

SRC_C_UNWIND-x86   = Gos-l4.c
SRC_C_UNWIND-amd64 = Gos-l4.c Gstash_frame.c Gtrace.c
SRC_C_UNWIND-arm   = Gos-l4.c Gex_tables.c Gstash_frame.c Gtrace.c
SRC_C_UNWIND-arm64 = Gos-l4.c Gis_signal_frame.c Gstash_frame.c Gtrace.c Gstrip_ptrauth_insn_mask.c
SRC_C_UNWIND-mips  = Gis_signal_frame.c
SRC_C_UNWIND-riscv = Gis_signal_frame.c
SRC_C_UNWIND-ppc32 = Gis_signal_frame.c get_func_addr.c

SRC_S_UNWIND-x86   = getcontext-linux.S
SRC_S_UNWIND-amd64 = getcontext.S setcontext.S
SRC_S_UNWIND-riscv = getcontext.S setcontext.S

SRC_C += $(SRC_C_UNWIND) $(SRC_C_UNWIND-$(ARCH))
SRC_S += $(SRC_S_UNWIND) $(SRC_S_UNWIND-$(ARCH))

NOT_HAVE_SYNC_FUNCTIONS-sparc = y
DEFINES         = $(if $(NOT_HAVE_SYNC_FUNCTIONS-$(ARCH)),,-DHAVE_SYNC_FUNCTIONS=1)
DEFINES        += -D__L4RE__
DEFINES        += -DHAVE_CONFIG_H -D_GNU_SOURCE
DEFINES        += -D__UCLIBC_HAS_CONTEXT_FUNCS__
#DEFINES        += -DDEBUG

CFLAGS_MSHSTK := $(call checkcc,-mshstk)
CFLAGS_amd64 += $(CFLAGS_MSHSTK)

include $(L4DIR)/mk/lib.mk

# target_is_big_endian() in libunwind triggers this warning
CFLAGS := $(filter-out -Wstrict-prototypes, $(CFLAGS))
CFLAGS += -Wno-strict-prototypes
# libunwind triggers this warning a lot
CFLAGS += -Wno-unused-parameter
