Home | History | Annotate | Download | only in compiler-rt
      1 #
      2 # Copyright (C) 2012 The Android Open Source Project
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 #
     16 #
     17 
     18 LOCAL_PATH := $(call my-dir)
     19 
     20 # The following list contains platform-independent functionalities.
     21 #
     22 # Skip apple_versioning.c since it is unused.
     23 # Skip atomic.c since it needs to be built separately according to the docs.
     24 # Skip clear_cache.c since it redefines a system function on Android.
     25 # Skip gcc_personality_v0.c since it depends on libunwind.
     26 libcompiler_rt_common_SRC_FILES := \
     27   lib/absvdi2.c \
     28   lib/absvsi2.c \
     29   lib/absvti2.c \
     30   lib/adddf3.c \
     31   lib/addsf3.c \
     32   lib/addvdi3.c \
     33   lib/addvsi3.c \
     34   lib/addvti3.c \
     35   lib/ashldi3.c \
     36   lib/ashlti3.c \
     37   lib/ashrdi3.c \
     38   lib/ashrti3.c \
     39   lib/clzdi2.c \
     40   lib/clzsi2.c \
     41   lib/clzti2.c \
     42   lib/cmpdi2.c \
     43   lib/cmpti2.c \
     44   lib/comparedf2.c \
     45   lib/comparesf2.c \
     46   lib/ctzdi2.c \
     47   lib/ctzsi2.c \
     48   lib/ctzti2.c \
     49   lib/divdc3.c \
     50   lib/divdf3.c \
     51   lib/divdi3.c \
     52   lib/divmoddi4.c \
     53   lib/divmodsi4.c \
     54   lib/divsc3.c \
     55   lib/divsf3.c \
     56   lib/divsi3.c \
     57   lib/divti3.c \
     58   lib/divxc3.c \
     59   lib/enable_execute_stack.c \
     60   lib/eprintf.c \
     61   lib/extendsfdf2.c \
     62   lib/ffsdi2.c \
     63   lib/ffsti2.c \
     64   lib/fixdfdi.c \
     65   lib/fixdfsi.c \
     66   lib/fixdfti.c \
     67   lib/fixsfdi.c \
     68   lib/fixsfsi.c \
     69   lib/fixsfti.c \
     70   lib/fixunsdfdi.c \
     71   lib/fixunsdfsi.c \
     72   lib/fixunsdfti.c \
     73   lib/fixunssfdi.c \
     74   lib/fixunssfsi.c \
     75   lib/fixunssfti.c \
     76   lib/fixunsxfdi.c \
     77   lib/fixunsxfsi.c \
     78   lib/fixunsxfti.c \
     79   lib/fixxfdi.c \
     80   lib/fixxfti.c \
     81   lib/floatdidf.c \
     82   lib/floatdisf.c \
     83   lib/floatdixf.c \
     84   lib/floatsidf.c \
     85   lib/floatsisf.c \
     86   lib/floattidf.c \
     87   lib/floattisf.c \
     88   lib/floattixf.c \
     89   lib/floatundidf.c \
     90   lib/floatundisf.c \
     91   lib/floatundixf.c \
     92   lib/floatunsidf.c \
     93   lib/floatunsisf.c \
     94   lib/floatuntidf.c \
     95   lib/floatuntisf.c \
     96   lib/floatuntixf.c \
     97   lib/int_util.c \
     98   lib/lshrdi3.c \
     99   lib/lshrti3.c \
    100   lib/moddi3.c \
    101   lib/modsi3.c \
    102   lib/modti3.c \
    103   lib/muldc3.c \
    104   lib/muldf3.c \
    105   lib/muldi3.c \
    106   lib/mulodi4.c \
    107   lib/mulosi4.c \
    108   lib/muloti4.c \
    109   lib/mulsc3.c \
    110   lib/mulsf3.c \
    111   lib/multi3.c \
    112   lib/mulvdi3.c \
    113   lib/mulvsi3.c \
    114   lib/mulvti3.c \
    115   lib/mulxc3.c \
    116   lib/negdf2.c \
    117   lib/negdi2.c \
    118   lib/negsf2.c \
    119   lib/negti2.c \
    120   lib/negvdi2.c \
    121   lib/negvsi2.c \
    122   lib/negvti2.c \
    123   lib/paritydi2.c \
    124   lib/paritysi2.c \
    125   lib/parityti2.c \
    126   lib/popcountdi2.c \
    127   lib/popcountsi2.c \
    128   lib/popcountti2.c \
    129   lib/powidf2.c \
    130   lib/powisf2.c \
    131   lib/powitf2.c \
    132   lib/powixf2.c \
    133   lib/subdf3.c \
    134   lib/subsf3.c \
    135   lib/subvdi3.c \
    136   lib/subvsi3.c \
    137   lib/subvti3.c \
    138   lib/trampoline_setup.c \
    139   lib/truncdfsf2.c \
    140   lib/ucmpdi2.c \
    141   lib/ucmpti2.c \
    142   lib/udivdi3.c \
    143   lib/udivmoddi4.c \
    144   lib/udivmodsi4.c \
    145   lib/udivmodti4.c \
    146   lib/udivsi3.c \
    147   lib/udivti3.c \
    148   lib/umoddi3.c \
    149   lib/umodsi3.c \
    150   lib/umodti3.c
    151 
    152 # ARM-specific runtimes
    153 libcompiler_rt_arm_SRC_FILES := \
    154   lib/arm/aeabi_dcmp.S \
    155   lib/arm/aeabi_fcmp.S \
    156   lib/arm/aeabi_idivmod.S \
    157   lib/arm/aeabi_ldivmod.S \
    158   lib/arm/aeabi_memcmp.S \
    159   lib/arm/aeabi_memcpy.S \
    160   lib/arm/aeabi_memmove.S \
    161   lib/arm/aeabi_memset.S \
    162   lib/arm/aeabi_uidivmod.S \
    163   lib/arm/aeabi_uldivmod.S \
    164   lib/arm/comparesf2.S \
    165   lib/arm/divmodsi4.S \
    166   lib/arm/divsi3.S \
    167   lib/arm/modsi3.S \
    168   lib/arm/udivmodsi4.S \
    169   lib/arm/udivsi3.S \
    170   lib/arm/umodsi3.S
    171 
    172 # MIPS-specific runtimes
    173 libcompiler_rt_mips_SRC_FILES := # nothing to add
    174 
    175 # X86-specific runtimes
    176 #
    177 # We don't support x86-64 right now
    178 libcompiler_rt_x86_SRC_FILES := \
    179   lib/i386/ashldi3.S \
    180   lib/i386/ashrdi3.S \
    181   lib/i386/divdi3.S \
    182   lib/i386/floatdidf.S \
    183   lib/i386/floatdisf.S \
    184   lib/i386/floatdixf.S \
    185   lib/i386/floatundidf.S \
    186   lib/i386/floatundisf.S \
    187   lib/i386/floatundixf.S \
    188   lib/i386/lshrdi3.S \
    189   lib/i386/moddi3.S \
    190   lib/i386/muldi3.S \
    191   lib/i386/udivdi3.S \
    192   lib/i386/umoddi3.S
    193 
    194 # The following list contains functions that are not available in libgcc.a, so
    195 # we potentially need them when using a Clang-built component (e.g., -ftrapv
    196 # with 64-bit integer multiplies. See http://llvm.org/bugs/show_bug.cgi?id=14469.)
    197 libcompiler_rt_extras_SRC_FILES := \
    198   lib/mulodi4.c
    199 
    200 # $(1): arch
    201 define get-libcompiler-rt-source-files
    202   $(if $(findstring $(1),arm),$(call get-libcompiler-rt-arm-source-files),
    203       $(if $(findstring $(1),mips),$(call get-libcompiler-rt-mips-source-files),
    204           $(if $(findstring $(1),x86),$(call get-libcompiler-rt-x86-source-files),
    205   $(error Unsupported ARCH $(1)))))
    206 endef
    207 
    208 # $(1): source list
    209 # $(2): arch
    210 #
    211 # If lib/<arch>/X.S is included in the source list, we should filter out lib/X.c
    212 # in the result source list (i.e., use the one optimized for the arch.) Otherwise
    213 # there'll be multiple definitions for one symbol.
    214 define filter-libcompiler-rt-common-source-files
    215   $(filter-out $(patsubst lib/$(strip $(2))/%.S,lib/%.c,$(filter %.S,$(1))),$(1))
    216 endef
    217 
    218 define get-libcompiler-rt-arm-common-source-files
    219   $(call filter-libcompiler-rt-common-source-files,
    220       $(libcompiler_rt_common_SRC_FILES) \
    221       $(libcompiler_rt_arm_SRC_FILES), arm)
    222 endef
    223 
    224 # $(1): common runtime list
    225 #
    226 # Add ARM runtimes implemented in VFP
    227 define add-libcompiler-rt-arm-vfp-source-files
    228   $(filter-out $(addprefix lib/,adddf3.c addsf3.c comparedf2.c comparesf2.c         \
    229                                 arm/comparesf2.S divdf3.c divsf3.c extendsfdf2.c    \
    230                                 fixdfsi.c fixsfsi.c fixunsdfsi.c fixunssfsi.c       \
    231                                 floatsidf.c floatsisf.c floatunsidf.c floatunsisf.c \
    232                                 muldf3.c mulsf3.c negdf2.c negsf2.c subdf3.c        \
    233                                 subsf3.c truncdfsf2.c),$(1)) lib/arm/vfp_alias.S
    234 endef
    235 
    236 define get-libcompiler-rt-arm-source-files
    237   $(if $(findstring $(ARCH_ARM_HAVE_VFP),true),
    238       $(call add-libcompiler-rt-arm-vfp-source-files,
    239           $(call get-libcompiler-rt-arm-common-source-files)),
    240       $(call get-libcompiler-rt-arm-common-source-files))
    241 endef
    242 
    243 define get-libcompiler-rt-mips-source-files
    244   $(call filter-libcompiler-rt-common-source-files,
    245       $(libcompiler_rt_common_SRC_FILES) \
    246       $(libcompiler_rt_mips_SRC_FILES),mips)
    247 endef
    248 
    249 define get-libcompiler-rt-x86-source-files
    250   $(call filter-libcompiler-rt-common-source-files,
    251       $(libcompiler_rt_common_SRC_FILES) \
    252       $(libcompiler_rt_x86_SRC_FILES),i386)
    253 endef
    254 
    255 # $(1): target or host
    256 # $(2): static or shared
    257 define build-libcompiler-rt
    258   ifneq ($(1),target)
    259     ifneq ($(1),host)
    260       $$(error expected target or host for argument 1, received $(1))
    261     endif
    262   endif
    263   ifneq ($(2),static)
    264     ifneq ($(2),shared)
    265       $$(error expected static or shared for argument 2, received $(2))
    266     endif
    267   endif
    268 
    269   target_or_host := $(1)
    270   static_or_shared := $(2)
    271 
    272   arch :=
    273   ifeq ($$(target_or_host),target)
    274     arch := $(TARGET_ARCH)
    275   else
    276     arch := $(HOST_ARCH)
    277   endif
    278 
    279   include $(CLEAR_VARS)
    280 
    281   LOCAL_MODULE := libcompiler_rt
    282   LOCAL_MODULE_TAGS := optional
    283 
    284   ifeq ($$(static_or_shared),static)
    285     LOCAL_MODULE_CLASS := STATIC_LIBRARIES
    286   else
    287     LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    288   endif
    289 
    290   # TODO: Fix -integrated-as
    291   # LOCAL_CFLAGS := -integrated-as
    292 
    293   # Add -D__ARM_EABI__ for ARM
    294   ifeq ($$(arch),arm)
    295     LOCAL_CFLAGS += -D__ARM_EABI__
    296   endif
    297 
    298   # Use MC assembler to compile assembly
    299   LOCAL_ASFLAGS += -integrated-as
    300 
    301   # Use Clang to compile libcompiler_rt
    302   LOCAL_CLANG := true
    303   LOCAL_SRC_FILES := $$(call get-libcompiler-rt-source-files,$$(arch))
    304   LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
    305 
    306   ifeq ($$(target_or_host),target)
    307     ifeq ($$(static_or_shared),static)
    308       include $(BUILD_STATIC_LIBRARY)
    309     else
    310       include $(BUILD_SHARED_LIBRARY)
    311     endif
    312   else
    313     LOCAL_IS_HOST_MODULE := true
    314     ifeq ($$(static_or_shared),static)
    315       include $(BUILD_HOST_STATIC_LIBRARY)
    316     else
    317       include $(BUILD_HOST_SHARED_LIBRARY)
    318     endif
    319   endif
    320 endef
    321 
    322 #=====================================================================
    323 # Device Static Library: libcompiler_rt-extras
    324 #=====================================================================
    325 
    326 include $(CLEAR_VARS)
    327 
    328 LOCAL_MODULE := libcompiler_rt-extras
    329 LOCAL_MODULE_TAGS := optional
    330 LOCAL_MODULE_CLASS := STATIC_LIBRARIES
    331 LOCAL_CLANG := true
    332 LOCAL_SRC_FILES := $(libcompiler_rt_extras_SRC_FILES)
    333 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
    334 
    335 include $(BUILD_STATIC_LIBRARY)
    336 
    337 #=====================================================================
    338 # Device Static Library: libcompiler_rt
    339 #=====================================================================
    340 $(eval $(call build-libcompiler-rt,target,static))
    341 
    342 #=====================================================================
    343 # Device Shared Library: libcompiler_rt
    344 #=====================================================================
    345 $(eval $(call build-libcompiler-rt,target,shared))
    346 
    347 # Build ASan
    348 include $(LOCAL_PATH)/lib/asan/Android.mk
    349