Detect if necessary to build inferior with -pie for Android.

Summary:
- Add target_is_android check (with cached results).
- Make android_device_api also cache results.
- Also removes the need to pass --env OS=Android when testing against Android.

Reviewers: sivachandra, tberghammer, clayborg, danalbert

Subscribers: chaoren, tberghammer, danalbert, srhines, lldb-commits

Differential Revision: http://reviews.llvm.org/D11309

llvm-svn: 242580
This commit is contained in:
Chaoren Lin 2015-07-17 22:13:29 +00:00
parent d225595dcf
commit 9070f53079
3 changed files with 38 additions and 24 deletions

View File

@ -39,8 +39,8 @@ set( ANDROID True )
set( __ANDROID_NDK__ True )
# linking lldb-server statically for Android avoids the need to ship two
# binaries (pie for API 21+ and non-pie for API 14-). It's possible to use
# a non-pie shim on API 14-, but that requires lldb-server to dynamically export
# binaries (pie for API 21+ and non-pie for API 16-). It's possible to use
# a non-pie shim on API 16-, but that requires lldb-server to dynamically export
# its symbols, which significantly increases the binary size. Static linking, on
# the other hand, has little to no effect on the binary size.
if ( NOT DEFINED LLVM_BUILD_STATIC )
@ -110,8 +110,8 @@ endif()
if ( NOT LLVM_BUILD_STATIC )
# PIE is required for API 21+ so we enable it if we're not statically linking
# unfortunately, it is not supported before API 14 so we need to do something else there
# see http://llvm.org/pr23457
# unfortunately, it is not supported before API 16 so we need to do something
# else there see http://llvm.org/pr23457
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -pie -fPIE" )
endif()

View File

@ -431,21 +431,30 @@ def run_adb_command(cmd, device_id):
stdout, stderr = p.communicate()
return p.returncode, stdout, stderr
def target_is_android():
if not hasattr(target_is_android, 'result'):
triple = lldb.DBG.GetSelectedPlatform().GetTriple()
match = re.match(".*-.*-.*-android", triple)
target_is_android.result = match is not None
return target_is_android.result
def android_device_api():
assert lldb.platform_url is not None
device_id = None
parsed_url = urlparse.urlparse(lldb.platform_url)
if parsed_url.scheme == "adb":
device_id = parsed_url.netloc.split(":")[0]
retcode, stdout, stderr = run_adb_command(
["shell", "getprop", "ro.build.version.sdk"], device_id)
if retcode == 0:
return int(stdout)
else:
raise LookupError(
">>> Unable to determine the API level of the Android device.\n"
">>> stdout:\n%s\n"
">>> stderr:\n%s\n" % (stdout, stderr))
if not hasattr(android_device_api, 'result'):
assert lldb.platform_url is not None
device_id = None
parsed_url = urlparse.urlparse(lldb.platform_url)
if parsed_url.scheme == "adb":
device_id = parsed_url.netloc.split(":")[0]
retcode, stdout, stderr = run_adb_command(
["shell", "getprop", "ro.build.version.sdk"], device_id)
if retcode == 0:
android_device_api.result = int(stdout)
else:
raise LookupError(
">>> Unable to determine the API level of the Android device.\n"
">>> stdout:\n%s\n"
">>> stderr:\n%s\n" % (stdout, stderr))
return android_device_api.result
#
# Decorators for categorizing test cases.
@ -690,9 +699,7 @@ def expectedFailureAndroid(bugnumber=None, api_levels=None):
for which a test is expected to fail.
"""
def fn(self):
triple = self.dbg.GetSelectedPlatform().GetTriple()
match = re.match(".*-.*-.*-android", triple)
if match:
if target_is_android():
if not api_levels:
return True
device_api = android_device_api()
@ -1036,8 +1043,7 @@ def skipIfTargetAndroid(api_levels=None):
def wrapper(*args, **kwargs):
from unittest2 import case
self = args[0]
triple = self.dbg.GetSelectedPlatform().GetTriple()
if re.match(".*-.*-.*-android", triple):
if target_is_android():
if api_levels:
device_api = android_device_api()
if device_api and (device_api in api_levels):
@ -1984,6 +1990,12 @@ class Base(unittest2.TestCase):
if lldb.skip_build_and_cleanup:
return
module = builder_module()
if target_is_android():
if dictionary is None:
dictionary = {}
dictionary["OS"] = "Android"
if android_device_api() >= 16:
dictionary["PIE"] = 1
if not module.buildDwarf(self, architecture, compiler, dictionary, clean):
raise Exception("Don't know how to build binary with dwarf")

View File

@ -251,7 +251,9 @@ endif
# Android specific options
#----------------------------------------------------------------------
ifeq "$(OS)" "Android"
LDFLAGS += -pie
ifdef PIE
LDFLAGS += -pie
endif
replace_with = $(if $(findstring clang,$(1)), \
$(subst clang,$(2),$(1)), \
$(if $(findstring gcc,$(1)), \