Commit 8681920f authored by jdduke's avatar jdduke Committed by Commit bot

Enable libc++ on Android

Switch Chrome on Android to use libc++ instead of stlport. WebView AOSP
builds will continue to use stlport for the time being.

Note that this change is exploratory, and likely to be reverted before
branch point (ensuring WebView and Chrome remain in lockstep with
respect to standard library dependencies).

BUG=427718
TBR=cpu@chromium.org

Review URL: https://codereview.chromium.org/835633003

Cr-Commit-Position: refs/heads/master@{#315085}
parent 4d7bcd64
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include "base/memory/memory_pressure_listener.h" #include "base/memory/memory_pressure_listener.h"
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/pickle.h" #include "base/pickle.h"
#include "base/stl_util.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/supports_user_data.h" #include "base/supports_user_data.h"
#include "components/autofill/content/browser/content_autofill_driver_factory.h" #include "components/autofill/content/browser/content_autofill_driver_factory.h"
...@@ -843,7 +844,7 @@ jboolean AwContents::RestoreFromOpaqueState( ...@@ -843,7 +844,7 @@ jboolean AwContents::RestoreFromOpaqueState(
std::vector<uint8> state_vector; std::vector<uint8> state_vector;
base::android::JavaByteArrayToByteVector(env, state, &state_vector); base::android::JavaByteArrayToByteVector(env, state, &state_vector);
Pickle pickle(reinterpret_cast<const char*>(state_vector.begin()), Pickle pickle(reinterpret_cast<const char*>(vector_as_array(&state_vector)),
state_vector.size()); state_vector.size());
PickleIterator iterator(pickle); PickleIterator iterator(pickle);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/stl_util.h"
namespace base { namespace base {
namespace android { namespace android {
...@@ -53,7 +54,7 @@ ScopedJavaLocalRef<jintArray> ToJavaIntArray( ...@@ -53,7 +54,7 @@ ScopedJavaLocalRef<jintArray> ToJavaIntArray(
ScopedJavaLocalRef<jintArray> ToJavaIntArray( ScopedJavaLocalRef<jintArray> ToJavaIntArray(
JNIEnv* env, const std::vector<int>& ints) { JNIEnv* env, const std::vector<int>& ints) {
return ToJavaIntArray(env, ints.begin(), ints.size()); return ToJavaIntArray(env, vector_as_array(&ints), ints.size());
} }
ScopedJavaLocalRef<jlongArray> ToJavaLongArray( ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
...@@ -72,7 +73,7 @@ ScopedJavaLocalRef<jlongArray> ToJavaLongArray( ...@@ -72,7 +73,7 @@ ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
// Returns a new Java long array converted from the given int64 array. // Returns a new Java long array converted from the given int64 array.
BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray( BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
JNIEnv* env, const std::vector<int64>& longs) { JNIEnv* env, const std::vector<int64>& longs) {
return ToJavaLongArray(env, longs.begin(), longs.size()); return ToJavaLongArray(env, vector_as_array(&longs), longs.size());
} }
ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray( ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
#undef __DEPRECATED #undef __DEPRECATED
#endif #endif
#if defined(OS_ANDROID) #if defined(OS_ANDROID) && defined(USE_STLPORT)
#include <hash_map> #include <hash_map>
#include <hash_set> #include <hash_set>
#define BASE_HASH_IMPL_NAMESPACE std #define BASE_HASH_IMPL_NAMESPACE std
...@@ -84,7 +84,7 @@ struct hash<T*> { ...@@ -84,7 +84,7 @@ struct hash<T*> {
} }
}; };
#if !defined(OS_ANDROID) #if !defined(USE_STLPORT)
// The GNU C++ library provides identity hash functions for many integral types, // The GNU C++ library provides identity hash functions for many integral types,
// but not for |long long|. This hash function will truncate if |size_t| is // but not for |long long|. This hash function will truncate if |size_t| is
// narrower than |long long|. This is probably good enough for what we will // narrower than |long long|. This is probably good enough for what we will
...@@ -102,7 +102,7 @@ DEFINE_TRIVIAL_HASH(long long); ...@@ -102,7 +102,7 @@ DEFINE_TRIVIAL_HASH(long long);
DEFINE_TRIVIAL_HASH(unsigned long long); DEFINE_TRIVIAL_HASH(unsigned long long);
#undef DEFINE_TRIVIAL_HASH #undef DEFINE_TRIVIAL_HASH
#endif // !defined(OS_ANDROID) #endif // !defined(USE_STLPORT)
// Implement string hash functions so that strings of various flavors can // Implement string hash functions so that strings of various flavors can
// be used as keys in STL maps and sets. The hash algorithm comes from the // be used as keys in STL maps and sets. The hash algorithm comes from the
......
...@@ -454,8 +454,8 @@ bool LowerCaseEqualsASCII(string16::const_iterator a_begin, ...@@ -454,8 +454,8 @@ bool LowerCaseEqualsASCII(string16::const_iterator a_begin,
return DoLowerCaseEqualsASCII(a_begin, a_end, b); return DoLowerCaseEqualsASCII(a_begin, a_end, b);
} }
// TODO(port): Resolve wchar_t/iterator issues that require OS_ANDROID here. // TODO(jdduke): Remove guards after complete adoption of libc++ on Android.
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID) || !defined(USE_STLPORT)
bool LowerCaseEqualsASCII(const char* a_begin, bool LowerCaseEqualsASCII(const char* a_begin,
const char* a_end, const char* a_end,
const char* b) { const char* b) {
...@@ -467,8 +467,7 @@ bool LowerCaseEqualsASCII(const char16* a_begin, ...@@ -467,8 +467,7 @@ bool LowerCaseEqualsASCII(const char16* a_begin,
const char* b) { const char* b) {
return DoLowerCaseEqualsASCII(a_begin, a_end, b); return DoLowerCaseEqualsASCII(a_begin, a_end, b);
} }
#endif // !defined(OS_ANDROID) || !defined(USE_STLPORT)
#endif // !defined(OS_ANDROID)
bool EqualsASCII(const string16& a, const base::StringPiece& b) { bool EqualsASCII(const string16& a, const base::StringPiece& b) {
if (a.length() != b.length()) if (a.length() != b.length())
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
{ {
'destination': '<(SHARED_LIB_DIR)/', 'destination': '<(SHARED_LIB_DIR)/',
'files': [ 'files': [
'<(android_stlport_libs_dir)/libstlport_shared.so', '<(android_libcpp_libs_dir)/libc++_shared.so',
], ],
}, },
], ],
......
...@@ -1668,7 +1668,7 @@ ...@@ -1668,7 +1668,7 @@
'android_ndk_root%': '<(android_ndk_root)', 'android_ndk_root%': '<(android_ndk_root)',
'android_sdk_root%': '<(android_sdk_root)', 'android_sdk_root%': '<(android_sdk_root)',
'android_sdk_version%': '<(android_sdk_version)', 'android_sdk_version%': '<(android_sdk_version)',
'android_stlport_root': '<(android_ndk_root)/sources/cxx-stl/stlport', 'android_libcpp_root': '<(android_ndk_root)/sources/cxx-stl/llvm-libc++',
'host_os%': '<(host_os)', 'host_os%': '<(host_os)',
'android_sdk%': '<(android_sdk_root)/platforms/android-<(android_sdk_version)', 'android_sdk%': '<(android_sdk_root)/platforms/android-<(android_sdk_version)',
...@@ -1745,9 +1745,10 @@ ...@@ -1745,9 +1745,10 @@
'android_sdk%': '<(android_sdk)', 'android_sdk%': '<(android_sdk)',
'android_sdk_jar%': '<(android_sdk)/android.jar', 'android_sdk_jar%': '<(android_sdk)/android.jar',
'android_stlport_root': '<(android_stlport_root)', 'android_libcpp_root': '<(android_libcpp_root)',
'android_stlport_include': '<(android_stlport_root)/stlport', 'android_libcpp_include': '<(android_libcpp_root)/libcxx/include',
'android_stlport_libs_dir': '<(android_stlport_root)/libs/<(android_app_abi)', 'android_libcpp_libs_dir': '<(android_libcpp_root)/libs/<(android_app_abi)',
'host_os%': '<(host_os)', 'host_os%': '<(host_os)',
# Location of the "objcopy" binary, used by both gyp and scripts. # Location of the "objcopy" binary, used by both gyp and scripts.
...@@ -4498,9 +4499,9 @@ ...@@ -4498,9 +4499,9 @@
# Figure this out early since it needs symbols from libgcc.a, so it # Figure this out early since it needs symbols from libgcc.a, so it
# has to be before that in the set of libraries. # has to be before that in the set of libraries.
['component=="shared_library"', { ['component=="shared_library"', {
'android_stlport_library': 'stlport_shared', 'android_libcpp_library': 'c++_shared',
}, { }, {
'android_stlport_library': 'stlport_static', 'android_libcpp_library': 'c++_static',
}], }],
], ],
...@@ -4584,8 +4585,6 @@ ...@@ -4584,8 +4585,6 @@
'defines': [ 'defines': [
'ANDROID', 'ANDROID',
'__GNU_SOURCE=1', # Necessary for clone() '__GNU_SOURCE=1', # Necessary for clone()
'USE_STLPORT=1',
'_STLP_USE_PTR_SPECIALIZATIONS=1',
'CHROME_BUILD_ID="<(chrome_build_id)"', 'CHROME_BUILD_ID="<(chrome_build_id)"',
], ],
'ldflags!': [ 'ldflags!': [
...@@ -4659,12 +4658,13 @@ ...@@ -4659,12 +4658,13 @@
'-nostdlib', '-nostdlib',
], ],
'libraries': [ 'libraries': [
'-l<(android_stlport_library)', '-l<(android_libcpp_library)',
'-latomic',
# Manually link the libgcc.a that the cross compiler uses. # Manually link the libgcc.a that the cross compiler uses.
'<!(<(android_toolchain)/*-gcc -print-libgcc-file-name)', '<!(<(android_toolchain)/*-gcc -print-libgcc-file-name)',
'-lm',
'-lc', '-lc',
'-ldl', '-ldl',
'-lm',
], ],
}], }],
['android_webview_build==1', { ['android_webview_build==1', {
...@@ -4716,20 +4716,20 @@ ...@@ -4716,20 +4716,20 @@
'-Wl,--icf=safe', '-Wl,--icf=safe',
], ],
}], }],
# NOTE: The stlport header include paths below are specified in
# cflags rather than include_dirs because they need to come
# after include_dirs. Think of them like system headers, but
# don't use '-isystem' because the arm-linux-androideabi-4.4.3
# toolchain (circa Gingerbread) will exhibit strange errors.
# The include ordering here is important; change with caution.
['android_webview_build==0', { ['android_webview_build==0', {
'cflags': [ 'cflags': [
'-isystem<(android_stlport_include)', '-isystem<(android_libcpp_include)',
'-isystem<(android_ndk_root)/sources/cxx-stl/llvm-libc++abi/libcxxabi/include',
'-isystem<(android_ndk_root)/sources/android/support/include',
], ],
'ldflags': [ 'ldflags': [
'-L<(android_stlport_libs_dir)', '-L<(android_libcpp_libs_dir)',
], ],
}, { # else: android_webview_build!=0 }, { # else: android_webview_build!=0
'defines': [
'USE_STLPORT=1',
'_STLP_USE_PTR_SPECIALIZATIONS=1',
],
'aosp_build_settings': { 'aosp_build_settings': {
# Specify that we want to statically link stlport from the # Specify that we want to statically link stlport from the
# NDK. This will provide all the include and library paths # NDK. This will provide all the include and library paths
......
...@@ -129,14 +129,6 @@ if (is_android) { ...@@ -129,14 +129,6 @@ if (is_android) {
android_gdbserver = android_gdbserver =
"$android_ndk_root/prebuilt/$android_prebuilt_arch/gdbserver/gdbserver" "$android_ndk_root/prebuilt/$android_prebuilt_arch/gdbserver/gdbserver"
# stlport stuff --------------------------------------------------------------
if (component_mode == "shared_library") {
android_stlport_library = "stlport_shared"
} else {
android_stlport_library = "stlport_static"
}
# ABI ------------------------------------------------------------------------ # ABI ------------------------------------------------------------------------
if (cpu_arch == "x86") { if (cpu_arch == "x86") {
......
...@@ -529,7 +529,7 @@ config("runtime_library") { ...@@ -529,7 +529,7 @@ config("runtime_library") {
] ]
} }
# Stlport setup. Android uses a different (smaller) version of the STL. # Android standard library setup.
if (is_android) { if (is_android) {
if (is_clang) { if (is_clang) {
# Work around incompatibilities between bionic and clang headers. # Work around incompatibilities between bionic and clang headers.
...@@ -539,55 +539,44 @@ config("runtime_library") { ...@@ -539,55 +539,44 @@ config("runtime_library") {
] ]
} }
defines += [ defines += [ "__GNU_SOURCE=1" ] # Necessary for clone().
"USE_STLPORT=1",
"_STLP_USE_PTR_SPECIALIZATIONS=1",
"__GNU_SOURCE=1", # Necessary for clone().
]
ldflags += [ ldflags += [
"-Wl,--warn-shared-textrel", "-Wl,--warn-shared-textrel",
"-nostdlib", "-nostdlib",
] ]
# NOTE: The stlport header include paths below are specified in cflags android_libcpp_root = "$android_ndk_root/sources/cxx-stl/llvm-libc++"
# rather than include_dirs because they need to come after include_dirs.
# Think of them like system headers, but don't use '-isystem' because the cflags += [
# arm-linux-androideabi-4.4.3 toolchain (circa Gingerbread) will exhibit "-isystem" +
# strange errors. The include ordering here is important; change with rebase_path("$android_libcpp_root/libcxx/include", root_build_dir),
# caution. "-isystem" + rebase_path(
android_stlport_root = "$android_ndk_root/sources/cxx-stl/stlport" "$android_ndk_root/sources/cxx-stl/llvm-libc++abi/libcxxabi/include",
root_build_dir),
"-isystem" +
rebase_path("$android_ndk_root/sources/android/support/include",
root_build_dir),
]
cflags += [ "-isystem" + lib_dirs += [ "$android_libcpp_root/libs/$android_app_abi" ]
rebase_path("$android_stlport_root/stlport", root_build_dir) ]
lib_dirs += [ "$android_stlport_root/libs/$android_app_abi" ]
if (component_mode == "shared_library") { if (component_mode == "shared_library") {
libs += [ "stlport_shared" ] android_libcpp_library = "c++_shared"
} else { } else {
libs += [ "stlport_static" ] android_libcpp_library = "c++_static"
} }
if (cpu_arch == "mipsel") {
libs += [
# ld linker is used for mips Android, and ld does not accept library
# absolute path prefixed by "-l"; Since libgcc does not exist in mips
# sysroot the proper library will be linked.
# TODO(gordanac): Remove once gold linker is used for mips Android.
"gcc",
]
} else {
libs += [ libs += [
"$android_libcpp_library",
"atomic",
# Manually link the libgcc.a that the cross compiler uses. This is # Manually link the libgcc.a that the cross compiler uses. This is
# absolute because the linker will look inside the sysroot if it's not. # absolute because the linker will look inside the sysroot if it's not.
rebase_path(android_libgcc_file), rebase_path(android_libgcc_file),
] "m",
}
libs += [
"c", "c",
"dl", "dl",
"m",
] ]
} }
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "base/files/scoped_file.h" #include "base/files/scoped_file.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/string_tokenizer.h" #include "base/strings/string_tokenizer.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
...@@ -68,11 +69,7 @@ bool TryConvertNativeToNetIPAttributes(int native_attributes, ...@@ -68,11 +69,7 @@ bool TryConvertNativeToNetIPAttributes(int native_attributes,
namespace internal { namespace internal {
inline const unsigned char* GetIPAddressData(const IPAddressNumber& ip) { inline const unsigned char* GetIPAddressData(const IPAddressNumber& ip) {
#if defined(OS_ANDROID) return vector_as_array(&ip);
return ip.begin();
#else
return ip.data();
#endif
} }
// Gets the connection type for interface |ifname| by checking for wireless // Gets the connection type for interface |ifname| by checking for wireless
......
...@@ -46,13 +46,7 @@ ...@@ -46,13 +46,7 @@
"_GLAPI_NO_EXPORTS", "_GLAPI_NO_EXPORTS",
], ],
'conditions': [ 'conditions': [
['OS=="android"', { ['OS == "linux" or OS == "android"', {
'defines': [
'__GLIBC__',
'_GNU_SOURCE',
],
}],
['OS=="linux"', {
'defines': [ 'defines': [
'_GNU_SOURCE', '_GNU_SOURCE',
], ],
......
...@@ -12,3 +12,12 @@ index 8f54040..de1ef5b 100644 ...@@ -12,3 +12,12 @@ index 8f54040..de1ef5b 100644
#include <tr1/unordered_set> #include <tr1/unordered_set>
using std::tr1::unordered_set; using std::tr1::unordered_set;
@@ -54,7 +55,7 @@ using std::tr1::unordered_set;
#else
#include <unordered_set>
-#if defined(WIN32) || defined(OS_ANDROID)
+#if defined(WIN32) || (defined(OS_ANDROID) && !defined(_LIBCPP_ABI_VERSION))
using std::tr1::unordered_set;
#else
using std::unordered_set;
...@@ -55,7 +55,7 @@ using std::tr1::unordered_set; ...@@ -55,7 +55,7 @@ using std::tr1::unordered_set;
#else #else
#include <unordered_set> #include <unordered_set>
#if defined(WIN32) || defined(OS_ANDROID) #if defined(WIN32) || (defined(OS_ANDROID) && !defined(_LIBCPP_ABI_VERSION))
using std::tr1::unordered_set; using std::tr1::unordered_set;
#else #else
using std::unordered_set; using std::unordered_set;
......
...@@ -18,10 +18,10 @@ ...@@ -18,10 +18,10 @@
'ldflags!': [ 'ldflags!': [
'-pie', '-pie',
], ],
# Don't inherit unneeded dependencies on stlport.so, so the binary remains # Don't inherit unneeded dependencies on libc++, so the binary remains
# self-contained also in component=shared_library builds. # self-contained also in component=shared_library builds.
'libraries!': [ 'libraries!': [
'-l<(android_stlport_library)', '-l<(android_libcpp_library)',
], ],
}, },
{ {
......
...@@ -904,7 +904,7 @@ if [[ -n "${with_android}" ]]; then ...@@ -904,7 +904,7 @@ if [[ -n "${with_android}" ]]; then
--platform=android-14 \ --platform=android-14 \
--install-dir="${LLVM_BUILD_DIR}/android-toolchain" \ --install-dir="${LLVM_BUILD_DIR}/android-toolchain" \
--system=linux-x86_64 \ --system=linux-x86_64 \
--stl=stlport \ --stl=libcxx \
--toolchain=arm-linux-androideabi-4.9 --toolchain=arm-linux-androideabi-4.9
# Android NDK r9d copies a broken unwind.h into the toolchain, see # Android NDK r9d copies a broken unwind.h into the toolchain, see
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment