Switch to gdtoa.

This gives us a real strtold for LP64 and fixes various LP64
bugs.

Bug: 13563801
Change-Id: I277858d718ee746e136b6b6308a495ba50dfa488
diff --git a/libc/Android.mk b/libc/Android.mk
index b94e573..fd14232 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -85,7 +85,6 @@
     stdlib/getenv.c \
     stdlib/putenv.c \
     stdlib/setenv.c \
-    stdlib/strtod.c \
     unistd/syslog.c \
 
 # Fortify implementations of libc functions.
@@ -208,7 +207,6 @@
     bionic/strerror.cpp \
     bionic/strerror_r.cpp \
     bionic/strsignal.cpp \
-    bionic/strtof.cpp \
     bionic/strtold.cpp \
     bionic/stubs.cpp \
     bionic/symlink.cpp \
@@ -311,6 +309,33 @@
     upstream-netbsd/lib/libc/thread-stub/__isthreaded.c \
     upstream-netbsd/lib/libc/unistd/killpg.c \
 
+libc_upstream_openbsd_gdtoa_src_files := \
+    upstream-openbsd/gdtoa_support.cpp \
+    upstream-openbsd/lib/libc/gdtoa/dmisc.c \
+    upstream-openbsd/lib/libc/gdtoa/dtoa.c \
+    upstream-openbsd/lib/libc/gdtoa/gdtoa.c \
+    upstream-openbsd/lib/libc/gdtoa/gethex.c \
+    upstream-openbsd/lib/libc/gdtoa/gmisc.c \
+    upstream-openbsd/lib/libc/gdtoa/hd_init.c \
+    upstream-openbsd/lib/libc/gdtoa/hdtoa.c \
+    upstream-openbsd/lib/libc/gdtoa/hexnan.c \
+    upstream-openbsd/lib/libc/gdtoa/ldtoa.c \
+    upstream-openbsd/lib/libc/gdtoa/misc.c \
+    upstream-openbsd/lib/libc/gdtoa/smisc.c \
+    upstream-openbsd/lib/libc/gdtoa/strtod.c \
+    upstream-openbsd/lib/libc/gdtoa/strtodg.c \
+    upstream-openbsd/lib/libc/gdtoa/strtof.c \
+    upstream-openbsd/lib/libc/gdtoa/strtord.c \
+    upstream-openbsd/lib/libc/gdtoa/sum.c \
+    upstream-openbsd/lib/libc/gdtoa/ulp.c \
+
+libc_upstream_openbsd_gdtoa_src_files_32 := \
+    $(libc_upstream_openbsd_gdtoa_src_files) \
+
+libc_upstream_openbsd_gdtoa_src_files_64 := \
+    $(libc_upstream_openbsd_gdtoa_src_files) \
+    upstream-openbsd/lib/libc/gdtoa/strtorQ.c \
+
 libc_upstream_openbsd_src_files := \
     upstream-openbsd/lib/libc/gen/alarm.c \
     upstream-openbsd/lib/libc/gen/exec.c \
@@ -615,6 +640,34 @@
 
 
 # ========================================================
+# libc_gdtoa.a - upstream OpenBSD C library gdtoa code
+# ========================================================
+#
+# These files are built with the openbsd-compat.h header file
+# automatically included.
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES_32 := $(libc_upstream_openbsd_gdtoa_src_files_32)
+LOCAL_SRC_FILES_64 := $(libc_upstream_openbsd_gdtoa_src_files_64)
+LOCAL_CFLAGS := \
+    $(libc_common_cflags) \
+    -I$(LOCAL_PATH)/upstream-openbsd \
+    -I$(LOCAL_PATH)/upstream-openbsd/lib/libc/include \
+    -include upstream-openbsd/openbsd-compat.h \
+
+LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
+LOCAL_CPPFLAGS := $(libc_common_cppflags)
+LOCAL_C_INCLUDES := $(libc_common_c_includes)
+LOCAL_MODULE := libc_gdtoa
+LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
+LOCAL_SYSTEM_SHARED_LIBRARIES :=
+
+$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
+include $(BUILD_STATIC_LIBRARY)
+
+
+# ========================================================
 # libc_bionic.a - home-grown C library code
 # ========================================================
 
@@ -670,12 +723,14 @@
 LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
 LOCAL_CPPFLAGS := $(libc_common_cppflags)
 LOCAL_C_INCLUDES := $(libc_common_c_includes)
+LOCAL_ARM_MODE := arm # Work around arm linker bug http://b/14090368.
 LOCAL_MODULE := libc_common
 LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
 LOCAL_WHOLE_STATIC_LIBRARIES := \
     libc_bionic \
     libc_dns \
     libc_freebsd \
+    libc_gdtoa \
     libc_netbsd \
     libc_openbsd \
     libc_stack_protector \
@@ -773,7 +828,7 @@
     bionic/pthread_debug.cpp \
     bionic/libc_init_dynamic.cpp \
 
-LOCAL_MODULE:= libc
+LOCAL_MODULE := libc
 LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
 LOCAL_REQUIRED_MODULES := tzdata
 
@@ -786,7 +841,7 @@
 # ensures that symbols that are pulled into those new libraries from libgcc.a are not declared
 # external; if that were the case, then libc would not pull those symbols from libgcc.a as it
 # should, instead relying on the external symbols from the dependent libraries.  That would
-# create an "cloaked" dependency on libgcc.a in libc though the libraries, which is not what
+# create a "cloaked" dependency on libgcc.a in libc though the libraries, which is not what
 # you wanted!
 
 LOCAL_SHARED_LIBRARIES := libdl
@@ -834,7 +889,7 @@
     bionic/malloc_debug_leak.cpp \
     bionic/malloc_debug_check.cpp \
 
-LOCAL_MODULE:= libc_malloc_debug_leak
+LOCAL_MODULE := libc_malloc_debug_leak
 LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
 
 LOCAL_SHARED_LIBRARIES := libc libdl
@@ -865,7 +920,7 @@
 LOCAL_SRC_FILES := \
     bionic/malloc_debug_qemu.cpp
 
-LOCAL_MODULE:= libc_malloc_debug_qemu
+LOCAL_MODULE := libc_malloc_debug_qemu
 LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
 
 LOCAL_SHARED_LIBRARIES := libc libdl