# Copyright (C) 2013 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

LOCAL_PATH := $(call my-dir)

LIBDW_SRC_FILES := \
    cfi.c \
    cie.c \
    dwarf_abbrevhaschildren.c \
    dwarf_abbrev_hash.c \
    dwarf_addrdie.c \
    dwarf_aggregate_size.c \
    dwarf_arrayorder.c \
    dwarf_attr.c \
    dwarf_attr_integrate.c \
    dwarf_begin.c \
    dwarf_begin_elf.c \
    dwarf_bitoffset.c \
    dwarf_bitsize.c \
    dwarf_bytesize.c \
    dwarf_cfi_addrframe.c \
    dwarf_cfi_end.c \
    dwarf_child.c \
    dwarf_cu_die.c \
    dwarf_cu_getdwarf.c \
    dwarf_cuoffset.c \
    dwarf_decl_column.c \
    dwarf_decl_file.c \
    dwarf_decl_line.c \
    dwarf_diecu.c \
    dwarf_diename.c \
    dwarf_dieoffset.c \
    dwarf_end.c \
    dwarf_entry_breakpoints.c \
    dwarf_entrypc.c \
    dwarf_error.c \
    dwarf_filesrc.c \
    dwarf_formaddr.c \
    dwarf_formblock.c \
    dwarf_formflag.c \
    dwarf_formref.c \
    dwarf_formref_die.c \
    dwarf_formsdata.c \
    dwarf_formstring.c \
    dwarf_formudata.c \
    dwarf_frame_cfa.c \
    dwarf_frame_info.c \
    dwarf_frame_register.c \
    dwarf_func_inline.c \
    dwarf_getabbrevattr.c \
    dwarf_getabbrev.c \
    dwarf_getabbrevcode.c \
    dwarf_getabbrevtag.c \
    dwarf_getalt.c \
    dwarf_getarange_addr.c \
    dwarf_getarangeinfo.c \
    dwarf_getaranges.c \
    dwarf_getattrcnt.c \
    dwarf_getattrs.c \
    dwarf_getcfi.c \
    dwarf_getcfi_elf.c \
    dwarf_getelf.c \
    dwarf_getfuncs.c \
    dwarf_getlocation_attr.c \
    dwarf_getlocation.c \
    dwarf_getlocation_die.c \
    dwarf_getlocation_implicit_pointer.c \
    dwarf_getmacros.c \
    dwarf_getpubnames.c \
    dwarf_getscopes.c \
    dwarf_getscopes_die.c \
    dwarf_getscopevar.c \
    dwarf_getsrc_die.c \
    dwarf_getsrcdirs.c \
    dwarf_getsrc_file.c \
    dwarf_getsrcfiles.c \
    dwarf_getsrclines.c \
    dwarf_getstring.c \
    dwarf_hasattr.c \
    dwarf_hasattr_integrate.c \
    dwarf_haschildren.c \
    dwarf_hasform.c \
    dwarf_haspc.c \
    dwarf_highpc.c \
    dwarf_lineaddr.c \
    dwarf_linebeginstatement.c \
    dwarf_lineblock.c \
    dwarf_linecol.c \
    dwarf_linediscriminator.c \
    dwarf_lineendsequence.c \
    dwarf_lineepiloguebegin.c \
    dwarf_lineisa.c \
    dwarf_lineno.c \
    dwarf_lineop_index.c \
    dwarf_lineprologueend.c \
    dwarf_linesrc.c \
    dwarf_lowpc.c \
    dwarf_macro_getparamcnt.c \
    dwarf_macro_getsrcfiles.c \
    dwarf_macro_opcode.c \
    dwarf_macro_param1.c \
    dwarf_macro_param2.c \
    dwarf_macro_param.c \
    dwarf_next_cfi.c \
    dwarf_nextcu.c \
    dwarf_offabbrev.c \
    dwarf_offdie.c \
    dwarf_onearange.c \
    dwarf_onesrcline.c \
    dwarf_peel_type.c \
    dwarf_ranges.c \
    dwarf_setalt.c \
    dwarf_siblingof.c \
    dwarf_sig8_hash.c \
    dwarf_srclang.c \
    dwarf_tag.c \
    dwarf_whatattr.c \
    dwarf_whatform.c \
    fde.c \
    frame-cache.c \
    libdw_alloc.c \
    libdw_findcu.c \
    libdw_form.c \
    libdw_visit_scopes.c \


ifeq ($(HOST_OS),linux)

#
# host libdw
#

include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(LIBDW_SRC_FILES)

LOCAL_C_INCLUDES := \
	$(LOCAL_PATH)/.. \
	$(LOCAL_PATH)/../lib \
	$(LOCAL_PATH)/../libdw \
	$(LOCAL_PATH)/../libelf

LOCAL_CFLAGS += -DHAVE_CONFIG_H -std=gnu99 -D_GNU_SOURCE -D_BSD_SOURCE -DIS_LIBDW

# to suppress the "pointer of type ‘void *’ used in arithmetic" warning
LOCAL_CFLAGS += -Wno-pointer-arith

LOCAL_MODULE:= libdw

LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)

LOCAL_STATIC_LIBRARIES := libz

include $(BUILD_HOST_STATIC_LIBRARY)

endif # linux

#
# target libdw
#

include $(CLEAR_VARS)

# b/25642296, local __thread variable does not work with arm64 clang/llvm.
LOCAL_CLANG_arm64 := false

LOCAL_SRC_FILES := $(LIBDW_SRC_FILES)

LOCAL_C_INCLUDES := \
	$(LOCAL_PATH)/.. \
	$(LOCAL_PATH)/../lib \
	$(LOCAL_PATH)/../libdw \
	$(LOCAL_PATH)/../libelf

LOCAL_C_INCLUDES += $(LOCAL_PATH)/../bionic-fixup

LOCAL_CFLAGS += -include $(LOCAL_PATH)/../bionic-fixup/AndroidFixup.h

LOCAL_CFLAGS += -DHAVE_CONFIG_H -std=gnu99 -D_GNU_SOURCE -D_BSD_SOURCE -DIS_LIBDW -Werror

# to suppress the "pointer of type ‘void *’ used in arithmetic" warning
LOCAL_CFLAGS += -Wno-pointer-arith

LOCAL_MODULE_TAGS := eng

LOCAL_MODULE:= libdw

LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)

LOCAL_STATIC_LIBRARIES := libz

include $(BUILD_STATIC_LIBRARY)
