MIPS support to the libc Makefile

Change-Id: Ia1f3f545ca61a5abb235e99046cb3cdaf24d4205
diff --git a/libc/Android.mk b/libc/Android.mk
index 88225d6..04b8ed1 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -410,7 +410,7 @@
 
 libc_arch_dynamic_src_files := \
 	arch-arm/bionic/exidx_dynamic.c
-else # !arm
+endif # arm
 
 ifeq ($(TARGET_ARCH),x86)
 libc_common_src_files += \
@@ -447,10 +447,54 @@
 	bionic/dl_iterate_phdr_static.c
 
 libc_arch_dynamic_src_files :=
-else # !x86
+endif # x86
 
-endif # !x86
-endif # !arm
+ifeq ($(TARGET_ARCH),mips)
+libc_common_src_files += \
+	bionic/bionic_clone.c \
+	arch-mips/bionic/__get_sp.S \
+	arch-mips/bionic/__get_tls.c \
+	arch-mips/bionic/__set_tls.c \
+	arch-mips/bionic/_exit_with_stack_teardown.S \
+	arch-mips/bionic/_setjmp.S \
+	arch-mips/bionic/futex_mips.S \
+	arch-mips/bionic/bzero.S \
+	arch-mips/bionic/cacheflush.c \
+	arch-mips/bionic/clone.S \
+	arch-mips/bionic/ffs.S \
+	arch-mips/bionic/memcmp16.S \
+	arch-mips/bionic/memmove.c \
+	arch-mips/bionic/pipe.S \
+	arch-mips/bionic/setjmp.S \
+	arch-mips/bionic/sigsetjmp.S \
+	arch-mips/bionic/vfork.S
+
+libc_common_src_files += \
+	arch-mips/string/memset.S \
+	arch-mips/string/memcpy.S \
+	arch-mips/string/mips_strlen.c
+
+libc_common_src_files += \
+	string/bcopy.c \
+	string/memcmp.c \
+	string/strcmp.c \
+	string/strcpy.c \
+	string/strncmp.c
+
+libc_common_src_files += \
+	bionic/pthread-atfork.c \
+	bionic/pthread-rwlocks.c \
+	bionic/pthread-timers.c \
+	bionic/ptrace.c
+
+libc_static_common_src_files += \
+	bionic/pthread.c
+
+libc_arch_static_src_files := \
+	bionic/dl_iterate_phdr_static.c
+
+libc_arch_dynamic_src_files :=
+endif # mips
 
 # Define some common cflags
 # ========================================================
@@ -460,7 +504,6 @@
     -DUSE_LOCKS \
     -DREALLOC_ZERO_BYTES_FREES \
     -D_LIBC=1 \
-    -DSOFTFLOAT \
     -DFLOATING_POINT \
     -DINET6 \
     -I$(LOCAL_PATH)/private \
@@ -489,6 +532,7 @@
 endif
 
 ifeq ($(TARGET_ARCH),arm)
+  libc_common_cflags += -DSOFTFLOAT
   libc_common_cflags += -fstrict-aliasing
   libc_crt_target_cflags := -mthumb-interwork
   #
@@ -512,18 +556,27 @@
   ifeq ($(ARCH_ARM_USE_NON_NEON_MEMCPY),true)
     libc_common_cflags += -DARCH_ARM_USE_NON_NEON_MEMCPY
   endif
-else # !arm
-  ifeq ($(TARGET_ARCH),x86)
-    libc_crt_target_cflags :=
-    ifeq ($(ARCH_X86_HAVE_SSE2),true)
-        libc_crt_target_cflags += -DUSE_SSE2=1
-    endif
-    ifeq ($(ARCH_X86_HAVE_SSSE3),true)
-        libc_crt_target_cflags += -DUSE_SSSE3=1
-    endif
-  endif # x86
 endif # !arm
 
+ifeq ($(TARGET_ARCH),x86)
+  libc_common_cflags += -DSOFTFLOAT
+  libc_crt_target_cflags :=
+  ifeq ($(ARCH_X86_HAVE_SSE2),true)
+      libc_crt_target_cflags += -DUSE_SSE2=1
+  endif
+  ifeq ($(ARCH_X86_HAVE_SSSE3),true)
+      libc_crt_target_cflags += -DUSE_SSSE3=1
+  endif
+endif # x86
+
+ifeq ($(TARGET_ARCH),mips)
+  ifneq ($(ARCH_MIPS_HAS_FPU),true)
+    libc_common_cflags += -DSOFTFLOAT
+  endif
+  libc_common_cflags += -fstrict-aliasing
+  libc_crt_target_cflags := $(TARGET_GLOBAL_CFLAGS)
+endif # mips
+
 # Define ANDROID_SMP appropriately.
 ifeq ($(TARGET_CPU_SMP),true)
     libc_common_cflags += -DANDROID_SMP=1
@@ -558,28 +611,34 @@
 # which are needed to build all other objects (shared/static libs and
 # executables)
 # ==========================================================================
-
-ifneq ($(filter arm x86,$(TARGET_ARCH)),)
-# ARM and x86 need crtbegin_so/crtend_so.
+# ARM, MIPS, and x86 all need crtbegin_so/crtend_so.
 #
 # For x86, the .init section must point to a function that calls all
 # entries in the .ctors section. (on ARM this is done through the
 # .init_array section instead).
 #
-# For both platforms, the .fini_array section must point to a function
+# For all the platforms, the .fini_array section must point to a function
 # that will call __cxa_finalize(&__dso_handle) in order to ensure that
 # static C++ destructors are properly called on dlclose().
 #
-
-libc_crt_target_so_cflags := $(libc_crt_target_cflags)
-libc_crt_target_crtstart_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin.c
-libc_crt_target_crtstart_so_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.c
-ifeq ($(TARGET_ARCH),x86)
-    # This flag must be added for x86 targets, but not for ARM
-    libc_crt_target_so_cflags += -fPIC
-    libc_crt_target_crtstart_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin.S
-    libc_crt_target_crtstart_so_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S
+ifeq ($(TARGET_ARCH),arm)
+    libc_crtstart_extension := c
+    libc_crt_target_so_cflags :=
 endif
+ifeq ($(TARGET_ARCH),mips)
+    libc_crtstart_extension := S
+    libc_crt_target_so_cflags := -fPIC
+endif
+ifeq ($(TARGET_ARCH),x86)
+    libc_crtstart_extension := S
+    libc_crt_target_so_cflags := -fPIC
+endif
+ifeq ($(libc_crtstart_extension),)
+    $(error $(TARGET_ARCH) not supported)
+endif
+libc_crt_target_so_cflags += $(libc_crt_target_cflags)
+libc_crt_target_crtstart_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin.$(libc_crtstart_extension)
+libc_crt_target_crtstart_so_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.$(libc_crtstart_extension)
 
 # See the comment in crtbrand.c for the reason why we need to generate
 # crtbrand.s before generating crtbrand.o.
@@ -619,7 +678,6 @@
 	@mkdir -p $(dir $@)
 	$(TARGET_CC) $(libc_crt_target_so_cflags) -o $@ -c $<
 ALL_GENERATED_SOURCES += $(GEN)
-endif # TARGET_ARCH == x86 || TARGET_ARCH == arm
 
 
 GEN := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_static1.o