diff --git a/tests/lldb/.gitignore b/tests/lldb/.gitignore
new file mode 100644
index 0000000..b79973f
--- /dev/null
+++ b/tests/lldb/.gitignore
@@ -0,0 +1,65 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+*.swp
+
+*~
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+
+results.xml
+LLDBTestsuiteLog.txt
diff --git a/tests/lldb/Android.mk b/tests/lldb/Android.mk
new file mode 100644
index 0000000..95904a8
--- /dev/null
+++ b/tests/lldb/Android.mk
@@ -0,0 +1,4 @@
+LOCAL_PATH:=$(call my-dir)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
+
diff --git a/tests/lldb/README.txt b/tests/lldb/README.txt
new file mode 100644
index 0000000..4631f9c
--- /dev/null
+++ b/tests/lldb/README.txt
@@ -0,0 +1,308 @@
+- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
+-   LLDB for Renderscript Test Suite
+-
+-   16/03/2016
+- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
+
+Overview:
+
+    The LLDB for Renderscript test suite is written in python and relies on
+    LLDB's python bindings.  The test suite will push several test app's onto
+    a target device, and makes coordinated use of LLDB and ADB to run automated
+    debug sessions.
+
+Set up the test suite:
+
+    Check out the AOSP and build it for your target. Navigate to
+    /frameworks/rs/test/lldb and type mm.  This should successfully build the
+    binaries that the testsuite uses. They will be placed in
+    <path to out folder>/target/product/<product code name>/data/app, system/lib
+    and system/bin.
+
+Prerequisite:
+
+    An lldb-server executable must be present on your device/emulator.
+    LLDB must be compiled on your host machine along with its python interface.
+    lldb-server and lldb should be built from the same source revisions.
+
+Running the test suite:
+
+    The test suite can be run via the following command:
+
+        > python run_tests.py [-h]
+                              [--config path]
+                              [--device DEVICE]
+                              [--test path]
+                              [--install-only]
+                              [--no-install]
+                              [--no-uninstall]
+                              [--print-to-stdout]
+                              [--verbose]
+                              [--wimpy]
+                              [--run-emu]
+                              [--adb-path ADB_PATH]
+                              [--aosp-product-path AOSP_PRODUCT_PATH]
+                              [--blacklist BLACKLIST [BLACKLIST ...]]
+                              [--device-port DEVICE_PORT]
+                              [--emu-cmd EMU_CMD]
+                              [--host-port HOST_PORT]
+                              [--lldb-path LLDB_PATH]
+                              [--lldb-server-path-device LLDB_SERVER_PATH_DEVICE]
+                              [--lldb-server-path-host LLDB_SERVER_PATH_HOST]
+                              [--log-file-path LOG_FILE_PATH]
+                              [--results-file-path RESULTS_FILE_PATH]
+                              [--timeout TIMEOUT]
+
+        optional arguments:
+          -h, --help            show this help message and exit
+          --config path, -c path
+                                Path to a custom config file.
+          --device DEVICE, -d DEVICE
+                                Specify the device id of the device to test on.
+          --test path, -t path  Specify a specific test to run.
+          --install-only        It only runs the pre-run stage of the test suite. It
+                                installs the required APKs but does not execute the
+                                tests.
+          --no-install, -n      Stop the test suite installing apks to device.
+          --no-uninstall        Stop the test suite uninstalling apks after
+                                completion.
+          --print-to-stdout     Print all logging information to standard out.
+          --verbose, -v         Store extra info in the log.
+          --wimpy, -w           Test only a core subset of features.
+          --run-emu             Spawn an emulator and run the test suite on that.
+                                Specify the emulator command line in the config file
+                                or with -emu-cmd.
+          --adb-path ADB_PATH   Path to android debug bridge on the host.
+          --aosp-product-path AOSP_PRODUCT_PATH
+                                The path to the "out" folder of the AOSP repository.
+          --blacklist BLACKLIST [BLACKLIST ...]
+                                Provide a test blacklist for skipping specific tests.
+                                To specify the blacklist from the command line the
+                                following can be used: --blacklist test1.py test2.py
+                                ...
+          --device-port DEVICE_PORT
+                                Specify the port number that lldb-server (on the
+                                device) listens on. When lldb-server is spawned on the
+                                device it will listen on this port. Each successive
+                                test will increment onwards from this port.
+          --emu-cmd EMU_CMD     The command line for the emulator (if using -run-emu).
+          --host-port HOST_PORT
+                                Specify host port which lldb-server will be forwarded
+                                to. Specify the starting host port number that lldb-
+                                server (on the target) will be forwarded to on the
+                                host. Each successive test will increment onwards from
+                                this initial port.
+          --lldb-path LLDB_PATH
+                                The path to lldb executable on the host.
+          --lldb-server-path-device LLDB_SERVER_PATH_DEVICE
+                                Path to the lldb-server executable on the device.
+          --lldb-server-path-host LLDB_SERVER_PATH_HOST
+                                Path to the lldb-server executable on host (if using
+                                -run-emu).
+          --log-file-path LOG_FILE_PATH
+                                The path to the folder where the log file will be
+                                placed.
+          --results-file-path RESULTS_FILE_PATH
+                                Output folder where junit results.xml file will be
+                                placed.
+          --timeout TIMEOUT     Timeout period for a single command, expressed in
+                                seconds
+
+    An optional config file can be passed to the test suite which will provide
+    details of your specific environment. The user file should define a custom
+    class inheriting from Config in config.py. The class Config presents the
+    default set of options, available to be overridden.
+
+    All options in the config file can also be specified on the command line.
+
+    If your config and command line do not specify a path to the host lldb,
+    the PYTHONPATH environment variable must be set.  The appropriate value to
+    set this to can be obtained by running the following command:
+
+        > lldb -P
+
+    This will print out a path to the lldb python bindings on your local machine.
+
+Build Requirements:
+
+
+    The following revisions are from the llvm git mirror:
+
+    llvm : 5786b73
+    clang: b6d0b32
+    lldb : 98712eb
+
+    lldb has the following dependencies:
+
+      Python2.7.6
+      swig2.0
+      lldb-server
+
+Building LLDB python bindings:
+
+    Linux:
+
+        Build instructions for Linux lldb can be found on the official lldb web
+        page:
+
+          http://lldb.llvm.org/build.html
+
+        The following CMake variables should be enabled when generating:
+
+          LLDB_ENABLE_PYTHON_SCRIPTS_SWIG_API_GENERATION = True
+
+        As a post build step, swig will generate the python bindings for lldb.
+
+    Windows:
+
+        Prerequisites:
+
+            Visual Studio 2015
+            Custom x64 Python2.7.10 package:
+                http://p-nand-q.com/python/2015.08.07-Python2710-x64-vs2015.7z
+            Swig Version 3.0.5 (Added to the $PATH)
+            Cmake 3.4.0 (So we can generate Visual Studio 2015 solutions)
+
+        Build Python for Windows:
+
+            http://p-nand-q.com/python/building-python-27-with-vs2010.html
+
+            The important thing here is that the above python distribution
+            contains debug versions of the libraries and is built with the same
+            Visual Studio version we are using so the runtimes do not conflict.
+
+        Build LLDB on Windows:
+
+            Select the Cmake generator "Microsoft Visual Studio 2015 Win64".
+            The following CMake variables should be enabled when generating:
+
+                LLDB_DISABLE_PYTHON=False
+                LLDB_RELOCATABLE_PYTHON=False
+                PYTHON_HOME=<path to the above python release>
+
+            Using cmake-gui is a good idea and lets you make sure that swig has
+            been correctly detected.
+
+            In the CMake configure step, you should see something similar to the
+            following:
+            -- Found Python version 2.7.9
+            -- LLDB Found PythonExecutable: E:/Python27/python.exe and
+            E:/Python27/python_d.exe
+            -- LLDB Found PythonLibs: E:/Python27/libs/python27.lib and
+            E:/Python27/libs/python27_d.lib
+            -- LLDB Found PythonDLL: E:/Python27/python27.dll and
+            E:/Python27/python27_d.dll
+            -- LLDB Found PythonIncludeDirs: E:/Python27/Include
+            LLDB version: 3.8.0
+            Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE)
+            Found PythonInterp:
+            $<$<CONFIG:Debug>:E:/Python27/python_d.exe>$<$<NOT:$<CONFIG:Debug>>:E:/Python27/python.exe>
+            (found version "1.4")
+
+            Build LLDB as a RelWithDebInfo build, because debug builds of lldb
+            produce an lldb_d.pyd file, but the __init__.py still refers to
+            lldb.pyd.
+
+            The LLDB python bindings should have built in
+            "llvm_build\RelWithDebInfo\lib\site-packages\lldb". Point the test
+            suite towards "llvm_build\RelWithDebInfo\bin\lldb.exe".
+            When running the test suite itself, make sure to use the python
+            executable from the custom package.
+
+A typical test transcript:
+
+    Located ADB
+    Located device ZX1G427S2S
+    Pushing all tests...
+    Pushed all tests
+    Pre run complete
+    Found 86 tests
+    Running test_allocation_dump_2_cpp.py: PASS
+    Running test_breakpoint_fileline_multiple_rs_files_cpp.py: PASS
+    Running test_read_local_cpp.py: PASS
+    Running test_breakpoint_kernel_multiple_rs_files_cpp.py: PASS
+    Running test_multiple_rs_files_cpp.py: PASS
+    Running test_breakpoint_kernel_all_multiple_rs_files_cpp.py: PASS
+    Running test_dwarf_lang_cpp.py: PASS
+    Running test_write_global_element_cpp.py: PASS
+    Running test_allocation_list_cpp.py: PASS
+    Running test_breakpoint_coordinate_cpp.py: PASS
+    Running test_rs_consts_cpp.py: PASS
+    Running test_allocation_file_cpp.py: PASS
+    Running test_allocation_dump_1_cpp.py: PASS
+    Running test_source_step_cpp.py: PASS
+    Running test_breakpoint_kernel_2_cpp.py: PASS
+    Running test_backtrace_cpp.py: PASS
+    Running test_language_subcmds_no_debug_cpp.py: PASS
+    Running test_breakpoint_kernel_1_cpp.py: PASS
+    Running test_language_subcmds_cpp.py: PASS
+    Running test_write_global_cpp.py: PASS
+    Running test_invoke_fun_cpp.py: PASS
+    Running test_breakpoint_fileline_cpp.py: PASS
+    Running test_write_local_cpp.py: PASS
+    Running test_breakpoint_kernel_all_cpp.py: PASS
+    Running test_write_local_element_cpp.py: PASS
+    Running test_call_api_funs_cpp.py: PASS
+    Running test_coordinates_cpp.py: PASS
+    Running test_read_global_cpp.py: PASS
+    Running test_language_subcmds.py: PASS
+    Running test_coordinates.py: PASS
+    Running test_language_subcmds_no_debug.py: PASS
+    Running test_read_local.py: PASS
+    Running test_call_api_funs.py: PASS
+    Running test_breakpoint_kernel_1.py: PASS
+    Running test_breakpoint_fileline.py: PASS
+    Running test_breakpoint_fileline_multiple_rs_files.py: PASS
+    Running test_rs_consts.py: PASS
+    Running test_invoke_fun.py: PASS
+    Running test_write_local_element.py: PASS
+    Running test_source_step.py: PASS
+    Running test_allocation_file.py: PASS
+    Running test_allocation_list.py: PASS
+    Running test_breakpoint_kernel_multiple_rs_files.py: PASS
+    Running test_allocation_dump_1.py: PASS
+    Running test_breakpoint_kernel_all.py: PASS
+    Running test_allocation_dump_2.py: PASS
+    Running test_allocation_dump_struct.py: PASS
+    Running test_read_global.py: PASS
+    Running test_language.py: PASS
+    Running test_dwarf_lang.py: PASS
+    Running test_breakpoint_coordinate.py: PASS
+    Running test_write_global.py: PASS
+    Running test_multiple_rs_files.py: PASS
+    Running test_write_global_element.py: PASS
+    Running test_breakpoint_kernel_all_multiple_rs_files.py: PASS
+    Running test_breakpoint_kernel_2.py: PASS
+    Running test_write_local.py: PASS
+    Running test_backtrace.py: PASS
+    Running test_call_api_funs_jni.py: PASS
+    Running test_invoke_fun_jni.py: PASS
+    Running test_allocation_dump_1_jni.py: PASS
+    Running test_breakpoint_fileline_multiple_rs_files_jni.py: PASS
+    Running test_allocation_file_jni.py: PASS
+    Running test_breakpoint_fileline_jni.py: PASS
+    Running test_source_step_jni.py: PASS
+    Running test_coordinates_jni.py: PASS
+    Running test_rs_consts_jni.py: PASS
+    Running test_breakpoint_kernel_all_multiple_rs_files_jni.py: PASS
+    Running test_multiple_rs_files_jni.py: PASS
+    Running test_allocation_dump_2_jni.py: PASS
+    Running test_allocation_list_jni.py: PASS
+    Running test_write_local_element_jni.py: PASS
+    Running test_breakpoint_kernel_all_jni.py: PASS
+    Running test_breakpoint_coordinate_jni.py: PASS
+    Running test_language_subcmds_no_debug_jni.py: PASS
+    Running test_read_local_jni.py: PASS
+    Running test_dwarf_lang_jni.py: PASS
+    Running test_breakpoint_kernel_2_jni.py: PASS
+    Running test_breakpoint_kernel_multiple_rs_files_jni.py: PASS
+    Running test_write_global_element_jni.py: PASS
+    Running test_breakpoint_kernel_1_jni.py: PASS
+    Running test_read_global_jni.py: PASS
+    Running test_language_subcmds_jni.py: PASS
+    Running test_write_global_jni.py: PASS
+    Running test_backtrace_jni.py: PASS
+    Running test_write_local_jni.py: PASS
+    Uninstalled/Deleted all tests
+    86 of 86 passed
+    100% rate
diff --git a/tests/lldb/config.py b/tests/lldb/config.py
new file mode 100644
index 0000000..db003a5
--- /dev/null
+++ b/tests/lldb/config.py
@@ -0,0 +1,99 @@
+'''LLDB-Renderscript test suite configuration file.
+
+This file contains the default test suite config which will be used in the
+case a developer did not supply a custom one.'''
+
+import os
+
+class Config(object):
+    '''Test suite configuration object.
+
+    The Config class is used by the test suite to abstract the specifics of a
+    user's local setup.  This config can be overridden by specifying a custom
+    config on the command line.'''
+    # pylint: disable=no-self-use
+
+    @property
+    def adb_path(self):
+        '''Path to android debug bridge on the host.'''
+        return 'adb'
+
+    @property
+    def host_port(self):
+        '''Specify host port which lldb-server will be forwarded to.
+
+        Specify the starting host port number that lldb-server (on the target)
+        will be forwarded to on the host. Each successive test will increment
+        onwards from this initial port.'''
+        return 1234
+
+    @property
+    def device_port(self):
+        '''Specify the port number that lldb-server (on the device) listens on.
+
+        When lldb-server is spawned on the device it will listen on this port.
+        Each successive test will increment onwards from this port.'''
+        return 1234
+
+    @property
+    def lldb_server_path_device(self):
+        '''Path to the lldb-server executable on the device.'''
+        return '/data/lldb-server'
+
+    @property
+    def lldb_server_path_host(self):
+        '''Path to the lldb-server executable on host (if using -run-emu).'''
+        return 'lldb-server'
+
+    @property
+    def aosp_product_path(self):
+        '''The path to the "out" folder of the AOSP repository.'''
+        return os.getenv('ANDROID_PRODUCT_OUT')
+
+    @property
+    def log_file_path(self):
+        '''The path to the folder where the log file will be placed.'''
+        return os.path.join(os.getcwd(), 'LLDBTestsuiteLog.txt')
+
+    @property
+    def results_file_path(self):
+        '''Output folder where junit results.xml file will be placed.'''
+        return os.path.join(os.getcwd(), 'results.xml')
+
+    @property
+    def lldb_path(self):
+        '''The path to lldb executable on the host.'''
+        return 'lldb'
+
+    @property
+    def blacklist(self):
+        '''Provide a test blacklist for skipping specific tests.
+
+        To specify the blacklist from the command line the following can be
+        used: --blacklist test1.py test2.py ...'''
+        return []
+
+    @property
+    def verbose(self):
+        '''Flag to indicate whether to store extra output in the logs.'''
+        return False
+
+    @property
+    def device(self):
+        '''Specify the device id of the device to run on.
+
+        When multiple devices or emulators are present, a specific device to
+        use while testing can be indicated here.'''
+        return os.environ.get('ANDROID_SERIAL', None)
+
+    @property
+    def timeout(self):
+        '''Timeout period for a single command, expressed in seconds'''
+        return 60 * 15
+
+    @property
+    def emu_cmd(self):
+        '''The command line for the emulator (if using -run-emu).'''
+        return os.path.join(os.path.dirname(__file__), '..', '..', '..', '..',
+                            'prebuilts', 'android-emulator', 'linux-x86_64',
+                            'emulator')
diff --git a/tests/lldb/cpp/Allocations/Allocations.cpp b/tests/lldb/cpp/Allocations/Allocations.cpp
new file mode 100644
index 0000000..d6fc6ae
--- /dev/null
+++ b/tests/lldb/cpp/Allocations/Allocations.cpp
@@ -0,0 +1,403 @@
+#include <RenderScript.h>
+
+#include "ScriptC_allocs.h"
+
+using namespace android;
+using namespace RSC;
+
+sp<RS> mRS;
+sp<Allocation> mBoolAllocation;  // boolean
+
+sp<Allocation> mCharAllocation;  // char
+sp<Allocation> mChar2Allocation;   // char2
+sp<Allocation> mChar3Allocation;   // char3
+sp<Allocation> mChar4Allocation;   // char4
+
+sp<Allocation> mUCharAllocation;   // uchar
+sp<Allocation> mUChar2Allocation;  // uchar2
+sp<Allocation> mUChar3Allocation;  // uchar3
+sp<Allocation> mUChar4Allocation;  // uchar4
+
+sp<Allocation> mShortAllocation;   // short
+sp<Allocation> mShort2Allocation;  // short2
+sp<Allocation> mShort3Allocation;  // short3
+sp<Allocation> mShort4Allocation;  // short4
+
+sp<Allocation> mUShortAllocation;  // ushort
+sp<Allocation> mUShort2Allocation; // ushort2
+sp<Allocation> mUShort3Allocation; // ushort3
+sp<Allocation> mUShort4Allocation; // ushort4
+
+sp<Allocation> mIntAllocation;   // int
+sp<Allocation> mInt2Allocation;  // int2
+sp<Allocation> mInt3Allocation;  // int3
+sp<Allocation> mInt4Allocation;  // int4
+
+sp<Allocation> mUIntAllocation;  // uint
+sp<Allocation> mUInt2Allocation;   // uint2
+sp<Allocation> mUInt3Allocation;   // uint3
+sp<Allocation> mUInt4Allocation;   // uint4
+
+sp<Allocation> mLongAllocation;  // long
+sp<Allocation> mLong2Allocation;   // long2
+sp<Allocation> mLong3Allocation;   // long3
+sp<Allocation> mLong4Allocation;   // long4
+
+sp<Allocation> mULongAllocation;   // ulong
+sp<Allocation> mULong2Allocation;  // ulong2
+sp<Allocation> mULong3Allocation;  // ulong3
+sp<Allocation> mULong4Allocation;  // ulong4
+
+sp<Allocation> mHalfAllocation;  // half
+sp<Allocation> mHalf2Allocation;   // half2
+sp<Allocation> mHalf3Allocation;   // half3
+sp<Allocation> mHalf4Allocation;   // half4
+
+sp<Allocation> mFloatAllocation;   // float
+sp<Allocation> mFloat2Allocation;  // float2
+sp<Allocation> mFloat3Allocation;  // float3
+sp<Allocation> mFloat4Allocation;  // float4
+
+sp<Allocation> mDoubleAllocation;  // double
+sp<Allocation> mDouble2Allocation; // double2
+sp<Allocation> mDouble3Allocation; // double3
+sp<Allocation> mDouble4Allocation; // double4
+
+const int mAllocSize = 24; // Needs to be < CHAR_MAX and divisible by 4.
+const int mBitmapSize = 64;
+
+void createSignedAllocations() {
+    Type::Builder typeI8Builder(mRS, Element::I8(mRS));
+    typeI8Builder.setX(1); // One element here to test 16 byte memory alignment
+    typeI8Builder.setY(3);
+    typeI8Builder.setZ(8);
+
+    mCharAllocation = Allocation::createTyped(mRS, typeI8Builder.create());
+    mChar2Allocation = Allocation::createSized(mRS, Element::I8_2(mRS), mAllocSize / 2);
+    mChar3Allocation = Allocation::createSized(mRS, Element::I8_3(mRS), mAllocSize / 4);
+    mChar4Allocation = Allocation::createSized(mRS, Element::I8_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeI16_2Builder(mRS, Element::I16_2(mRS));
+    typeI16_2Builder.setX(6);
+    typeI16_2Builder.setY(1);
+    typeI16_2Builder.setZ(2);
+
+    mShortAllocation = Allocation::createSized(mRS, Element::I16(mRS), mAllocSize);
+    mShort2Allocation = Allocation::createTyped(mRS, typeI16_2Builder.create());
+    mShort3Allocation = Allocation::createSized(mRS, Element::I16_3(mRS), mAllocSize / 4);
+    mShort4Allocation = Allocation::createSized(mRS, Element::I16_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeI32_3Builder(mRS, Element::I32_3(mRS));
+    typeI32_3Builder.setX(3);
+    typeI32_3Builder.setY(2);
+
+    mIntAllocation = Allocation::createSized(mRS, Element::I32(mRS), mAllocSize);
+    mInt2Allocation = Allocation::createSized(mRS, Element::I32_2(mRS), mAllocSize / 2);
+    mInt3Allocation = Allocation::createTyped(mRS, typeI32_3Builder.create());
+    mInt4Allocation = Allocation::createSized(mRS, Element::I32_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeI64_4Builder(mRS, Element::I64_4(mRS));
+    typeI64_4Builder.setX(1);
+    typeI64_4Builder.setY(6);
+
+    mLongAllocation = Allocation::createSized(mRS, Element::I64(mRS), mAllocSize);
+    mLong2Allocation = Allocation::createSized(mRS, Element::I64_2(mRS), mAllocSize / 2);
+    mLong3Allocation = Allocation::createSized(mRS, Element::I64_3(mRS), mAllocSize / 4);
+    mLong4Allocation = Allocation::createTyped(mRS, typeI64_4Builder.create());
+
+    mBoolAllocation = Allocation::createSized(mRS, Element::BOOLEAN(mRS), mAllocSize);
+}
+
+void initSignedAllocations() {
+    char *buffer_char = new char[mAllocSize];
+    short *buffer_short = new short[mAllocSize];
+    int *buffer_int = new int[mAllocSize];
+    int64_t *buffer_long = new int64_t[mAllocSize];
+    char *buffer_bool = new char[mAllocSize];
+
+    for(int i = 0; i < mAllocSize; ++i) {
+        buffer_char[i] = (char) i;
+        buffer_short[i] = (short) i;
+        buffer_int[i] = (int) i;
+        buffer_long[i] = (int64_t) i;
+        buffer_bool[i] =  (char) (0x01 & i);
+    }
+
+    mCharAllocation->copy3DRangeFrom(0, 0, 0, 1, 3, 8, buffer_char);
+    mChar2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_char);
+    mChar3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_char);
+    mChar4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_char);
+
+    delete [] buffer_char;
+
+    mShortAllocation->copy1DRangeFrom(0, mAllocSize, buffer_short);
+    mShort2Allocation->copy3DRangeFrom(0, 0, 0, 6, 1, 2, buffer_short);
+    mShort3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_short);
+    mShort4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_short);
+
+    delete [] buffer_short;
+
+    mIntAllocation->copy1DRangeFrom(0, mAllocSize, buffer_int);
+    mInt2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_int);
+    mInt3Allocation->copy2DRangeFrom(0, 0, 3, 2, buffer_int);
+    mInt4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_int);
+
+    delete [] buffer_int;
+
+    mLongAllocation->copy1DRangeFrom(0, mAllocSize, buffer_long);
+    mLong2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_long);
+    mLong3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_long);
+    mLong4Allocation->copy2DRangeFrom(0, 0, 1, 6, buffer_long);
+
+    delete [] buffer_long;
+
+    mBoolAllocation->copy1DRangeFrom(0, mAllocSize, buffer_bool);
+
+    delete [] buffer_bool;
+}
+
+void createUnsignedAllocations() {
+    Type::Builder typeU8_2Builder(mRS, Element::U8_2(mRS));
+    typeU8_2Builder.setX(2);
+    typeU8_2Builder.setY(6);
+
+    mUCharAllocation = Allocation::createSized(mRS, Element::U8(mRS), mAllocSize);
+    mUChar2Allocation = Allocation::createTyped(mRS, typeU8_2Builder.create());
+    mUChar3Allocation = Allocation::createSized(mRS, Element::U8_3(mRS), mAllocSize / 4);
+    mUChar4Allocation = Allocation::createSized(mRS, Element::U8_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeU16_3Builder(mRS, Element::U16_3(mRS));
+    typeU16_3Builder.setX(1);
+    typeU16_3Builder.setY(6);
+
+    mUShortAllocation = Allocation::createSized(mRS, Element::U16(mRS), mAllocSize);
+    mUShort2Allocation = Allocation::createSized(mRS, Element::U16_2(mRS), mAllocSize / 2);
+    mUShort3Allocation = Allocation::createTyped(mRS, typeU16_3Builder.create());
+    mUShort4Allocation = Allocation::createSized(mRS, Element::U16_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeU32_4Builder(mRS, Element::U32_4(mRS));
+    typeU32_4Builder.setX(1);
+    typeU32_4Builder.setY(1);
+    typeU32_4Builder.setZ(6);
+
+    mUIntAllocation = Allocation::createSized(mRS, Element::U32(mRS), mAllocSize);
+    mUInt2Allocation = Allocation::createSized(mRS, Element::U32_2(mRS), mAllocSize / 2);
+    mUInt3Allocation = Allocation::createSized(mRS, Element::U32_3(mRS), mAllocSize / 4);
+    mUInt4Allocation = Allocation::createTyped(mRS, typeU32_4Builder.create());
+
+    Type::Builder typeU64Builder(mRS, Element::U64(mRS));
+    typeU64Builder.setX(4);
+    typeU64Builder.setY(3);
+    typeU64Builder.setZ(2);
+
+    mULongAllocation = Allocation::createTyped(mRS, typeU64Builder.create());
+    mULong2Allocation = Allocation::createSized(mRS, Element::U64_2(mRS), mAllocSize / 2);
+    mULong3Allocation = Allocation::createSized(mRS, Element::U64_3(mRS), mAllocSize / 4);
+    mULong4Allocation = Allocation::createSized(mRS, Element::U64_4(mRS), mAllocSize / 4);
+}
+
+void initUnsignedAllocations() {
+    char *buffer_char = new char[mAllocSize];
+    short *buffer_short = new short[mAllocSize];
+    int *buffer_int = new int[mAllocSize];
+    uint64_t *buffer_long = new uint64_t[mAllocSize];
+
+    for(int i = 0; i < mAllocSize; ++i) {
+        buffer_char[i] = (char) i;
+        buffer_short[i] = (short) i;
+        buffer_int[i] = (int) i;
+        buffer_long[i] = (uint64_t) i;
+    }
+
+    mUCharAllocation->copy1DRangeFrom(0, mAllocSize, buffer_char);
+    mUChar2Allocation->copy2DRangeFrom(0, 0, 2, 6, buffer_char);
+    mUChar3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_char);
+    mUChar4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_char);
+
+    delete [] buffer_char;
+
+    mUShortAllocation->copy1DRangeFrom(0, mAllocSize, buffer_short);
+    mUShort2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_short);
+    mUShort3Allocation->copy2DRangeFrom(0, 0, 1, 6, buffer_short);
+    mUShort4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_short);
+
+    delete [] buffer_short;
+
+    mUIntAllocation->copy1DRangeFrom(0, mAllocSize, buffer_int);
+    mUInt2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_int);
+    mUInt3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_int);
+    mUInt4Allocation->copy3DRangeFrom(0, 0, 0, 1, 1, 6, buffer_int);
+
+    delete [] buffer_int;
+
+    mULongAllocation->copy3DRangeFrom(0, 0, 0, 4, 3, 2, buffer_long);
+    mULong2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_long);
+    mULong3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_long);
+    mULong4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_long);
+
+    delete [] buffer_long;
+}
+
+void createFloatAllocations() {
+    Type::Builder typeF16_3Builder(mRS, Element::F16_3(mRS));
+    typeF16_3Builder.setX(1);
+    typeF16_3Builder.setY(6);
+
+    mHalfAllocation = Allocation::createSized(mRS, Element::F16(mRS), mAllocSize);
+    mHalf2Allocation = Allocation::createSized(mRS, Element::F16_2(mRS), mAllocSize / 2);
+    mHalf3Allocation = Allocation::createTyped(mRS, typeF16_3Builder.create());
+    mHalf4Allocation = Allocation::createSized(mRS, Element::F16_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeF32_4Builder(mRS, Element::F32_4(mRS));
+    typeF32_4Builder.setX(3);
+    typeF32_4Builder.setY(2);
+
+    mFloatAllocation = Allocation::createSized(mRS, Element::F32(mRS), mAllocSize);
+    mFloat2Allocation = Allocation::createSized(mRS, Element::F32_2(mRS), mAllocSize / 2);
+    mFloat3Allocation = Allocation::createSized(mRS, Element::F32_3(mRS), mAllocSize / 4);
+    mFloat4Allocation = Allocation::createTyped(mRS, typeF32_4Builder.create());
+
+    Type::Builder typeF64_2Builder(mRS, Element::F64_2(mRS));
+    typeF64_2Builder.setX(4);
+    typeF64_2Builder.setY(1);
+    typeF64_2Builder.setZ(3);
+
+    mDoubleAllocation = Allocation::createSized(mRS, Element::F64(mRS), mAllocSize);
+    mDouble2Allocation = Allocation::createTyped(mRS, typeF64_2Builder.create());
+
+    Type::Builder typeF64_3Builder(mRS, Element::F64_3(mRS));
+    typeF64_3Builder.setX(1);
+    typeF64_3Builder.setY(2);
+    typeF64_3Builder.setZ(3);
+
+    Type::Builder typeF64_4Builder(mRS, Element::F64_4(mRS));
+    typeF64_4Builder.setX(1);
+    typeF64_4Builder.setY(2);
+    typeF64_4Builder.setZ(3);
+
+    mDouble3Allocation = Allocation::createTyped(mRS, typeF64_3Builder.create());
+    mDouble4Allocation = Allocation::createTyped(mRS, typeF64_4Builder.create());
+}
+
+void initFloatAllocations() {
+    __fp16 *buffer_half = new __fp16[mAllocSize];
+    float *buffer_float = new float[mAllocSize];
+    double *buffer_double = new double[mAllocSize];
+
+    for(int i = 0; i < mAllocSize; ++i) {
+        buffer_half[i] = (__fp16) 1 / i;
+        buffer_float[i] = (float) 1 / i;
+        buffer_double[i] = (double) 1 / i;
+    }
+
+    mHalfAllocation->copy1DRangeFrom(0, mAllocSize, buffer_half);
+    mHalf2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_half);
+    mHalf3Allocation->copy2DRangeFrom(0, 0, 1, 6, buffer_half);
+    mHalf4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_half);
+
+    delete [] buffer_half;
+
+    mFloatAllocation->copy1DRangeFrom(0, mAllocSize, buffer_float);
+    mFloat2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_float);
+    mFloat3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_float);
+    mFloat4Allocation->copy2DRangeFrom(0, 0, 3, 2, buffer_float);
+
+    delete [] buffer_float;
+
+    mDoubleAllocation->copy1DRangeFrom(0, mAllocSize, buffer_double);
+    mDouble2Allocation->copy3DRangeFrom(0, 0, 0, 4, 1, 3, buffer_double);
+    mDouble3Allocation->copy3DRangeFrom(0, 0, 0, 1, 2, 3, buffer_double);
+    mDouble4Allocation->copy3DRangeFrom(0, 0, 0, 1, 2, 3, buffer_double);
+
+    delete [] buffer_double;
+}
+
+int main()
+{
+    mRS = new RS();
+
+    mRS->init("/data/rscache", RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+
+    sp<ScriptC_allocs> mScript = new ScriptC_allocs(mRS);
+
+    Type::Builder typeRGBA_888Builder(mRS, Element::RGBA_8888(mRS));
+    typeRGBA_888Builder.setX(mBitmapSize);
+    typeRGBA_888Builder.setY(mBitmapSize);
+
+    sp<Allocation> mInAllocation = Allocation::createTyped(mRS, typeRGBA_888Builder.create());
+
+    const int image_area = mBitmapSize*mBitmapSize;
+    const int image_size = image_area*sizeof(int);
+
+    char *zero_buffer = new char[image_size];
+    memset(zero_buffer, 0, image_size);
+    mInAllocation->copy1DRangeFrom(0, image_area, zero_buffer);
+    delete [] zero_buffer;
+
+    sp<Allocation> mOutAllocation = Allocation::createTyped(mRS, typeRGBA_888Builder.create());
+    createSignedAllocations();
+    initSignedAllocations();
+
+    mRS->finish();
+    mScript->forEach_swizzle_kernel(mInAllocation, mOutAllocation);
+    mRS->finish();
+
+    mCharAllocation.clear();
+    mChar2Allocation.clear();
+    mChar3Allocation.clear();
+    mChar4Allocation.clear();
+
+    mShort2Allocation.clear();
+    mShort3Allocation.clear();
+    mShort4Allocation.clear();
+
+    mIntAllocation.clear();
+    mInt2Allocation.clear();
+    mInt3Allocation.clear();
+    mInt4Allocation.clear();
+
+    mLongAllocation.clear();
+    mLong2Allocation.clear();
+    mLong3Allocation.clear();
+    mLong4Allocation.clear();
+
+    mBoolAllocation.clear();
+
+    createUnsignedAllocations();
+    initUnsignedAllocations();
+
+    mInAllocation = mUShortAllocation; // Host side assignment
+
+    mRS->finish();
+    mScript->forEach_square_kernel(mInAllocation, mUIntAllocation);
+    mRS->finish();
+
+    mUCharAllocation.clear();
+    mUChar2Allocation.clear();
+    mUChar3Allocation.clear();
+    mUChar4Allocation.clear();
+
+    mUShortAllocation.clear();
+    mUShort2Allocation.clear();
+    mUShort3Allocation.clear();
+    mUShort4Allocation.clear();
+
+    mUInt2Allocation.clear();
+    mUInt3Allocation.clear();
+    mUInt4Allocation.clear();
+
+    mULongAllocation.clear();
+    mULong2Allocation.clear();
+    mULong3Allocation.clear();
+    mULong4Allocation.clear();
+
+    createFloatAllocations();
+    initFloatAllocations();
+
+    mRS->finish();
+    mScript->forEach_add_half_kernel(mDouble4Allocation, mDouble3Allocation);
+    mRS->finish();
+
+    return 0;
+}
+
diff --git a/tests/lldb/cpp/Allocations/Android.mk b/tests/lldb/cpp/Allocations/Android.mk
new file mode 100644
index 0000000..dec733b
--- /dev/null
+++ b/tests/lldb/cpp/Allocations/Android.mk
@@ -0,0 +1,27 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := CppAllocations
+
+LOCAL_SRC_FILES := \
+	Allocations.cpp \
+	allocs.rs
+
+LOCAL_STATIC_LIBRARIES := libRScpp_static libcompiler_rt
+LOCAL_CFLAGS := --std=c++11
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_LDFLAGS := \
+	-ldl \
+	-llog
+
+intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
+
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += $(intermediates)
+
+include $(BUILD_EXECUTABLE)
diff --git a/tests/lldb/cpp/Allocations/allocs.rs b/tests/lldb/cpp/Allocations/allocs.rs
new file mode 100644
index 0000000..f4ff5c1
--- /dev/null
+++ b/tests/lldb/cpp/Allocations/allocs.rs
@@ -0,0 +1,31 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.cppallocations)
+
+// Kernel performs basic vector swizzle
+uchar4 __attribute__((kernel)) swizzle_kernel(uchar4 in)
+{
+    return in.wzyx;
+}
+
+// Kernel squares every element in allocation
+uint __attribute__((kernel)) square_kernel(ushort in)
+{
+    uint result = (uint)in * (uint)in;
+    return result;
+}
+
+// Helper function adding 1/2 to passed in double
+static double half_helper(double in)
+{
+    return (in + 0.5);
+}
+
+// Kernel returns first 3 elements of a double4 plus 1/2
+double3 __attribute__((kernel)) add_half_kernel(double4 in)
+{
+    double3 result;
+    result.x = half_helper(in.x);
+    result.y = half_helper(in.y);
+    result.z = half_helper(in.z);
+    return result;
+}
diff --git a/tests/lldb/cpp/Android.mk b/tests/lldb/cpp/Android.mk
new file mode 100644
index 0000000..8338432
--- /dev/null
+++ b/tests/lldb/cpp/Android.mk
@@ -0,0 +1,2 @@
+include $(call all-subdir-makefiles)
+
diff --git a/tests/lldb/cpp/BranchingFunCalls/Android.mk b/tests/lldb/cpp/BranchingFunCalls/Android.mk
new file mode 100644
index 0000000..5bc597f
--- /dev/null
+++ b/tests/lldb/cpp/BranchingFunCalls/Android.mk
@@ -0,0 +1,27 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := CppBranchingFunCalls
+
+LOCAL_SRC_FILES := \
+	BranchingFunCalls.cpp \
+	simple.rs
+
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+LOCAL_CFLAGS := --std=c++11
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_LDFLAGS := \
+	-ldl \
+	-llog
+
+intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
+
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += $(intermediates)
+
+include $(BUILD_EXECUTABLE)
diff --git a/tests/lldb/cpp/BranchingFunCalls/BranchingFunCalls.cpp b/tests/lldb/cpp/BranchingFunCalls/BranchingFunCalls.cpp
new file mode 100644
index 0000000..df51382
--- /dev/null
+++ b/tests/lldb/cpp/BranchingFunCalls/BranchingFunCalls.cpp
@@ -0,0 +1,42 @@
+#include <RenderScript.h>
+
+#include "ScriptC_simple.h"
+
+using namespace android;
+using namespace RSC;
+
+int main()
+{
+    static const int size = 64;
+    sp<RS> rs = new RS();
+
+    rs->init("/data/rscache", RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+
+    auto e = Element::I32(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    int * input = new int[size*size];
+    for(int i = 0; i < size*size; ++i) {
+        input[i] = i - (size*size / 2);
+    }
+    a->copy2DRangeFrom(0, 0, size, size, input);
+    delete [] input;
+
+    // Script is executed once, then the data is copied back when finished
+    sp<ScriptC_simple> s = new ScriptC_simple(rs);
+    s->invoke_addToGlobal(234);
+    s->forEach_simple_kernel(a, b);
+    rs->finish();
+    int32_t * output = new int32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+
+    return 0;
+}
+
diff --git a/tests/lldb/cpp/BranchingFunCalls/simple.rs b/tests/lldb/cpp/BranchingFunCalls/simple.rs
new file mode 100644
index 0000000..9b6dfe3
--- /dev/null
+++ b/tests/lldb/cpp/BranchingFunCalls/simple.rs
@@ -0,0 +1,60 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.cppbranchingfuncalls)
+
+static bool is_neg(int a)
+{
+    if(a < 0)
+        return true;
+    else
+        return false;
+}
+
+static bool is_pos(int a)
+{
+    if(a > 0)
+        return true;
+    else
+        return false;
+}
+
+static void set_i(int * a, int b)
+{
+    int tmp = b;
+    *a = tmp;
+}
+
+static void modify_f(float * f)
+{
+    *f *= 0.5f;
+}
+
+static void modify_i(int * i)
+{
+    int j = *i;
+    int cutoff = 2 << 6;
+    if(j > cutoff)
+        j = cutoff;
+    if(is_neg(j))
+        set_i(i, 0);
+    else if(is_pos(j))
+        set_i(i, j);
+    else
+        set_i(i, cutoff);
+}
+
+int __attribute__((kernel)) simple_kernel(int in)
+{
+    int i = in;
+    float f = (float) i;
+    modify_f(&f);
+    modify_i(&i);
+    int ret = (int) f;
+    return in * ret;
+}
+
+int glob = 123;
+
+void addToGlobal(int arg)
+{
+    glob += arg;
+}
diff --git a/tests/lldb/cpp/InfiniteLoop/Android.mk b/tests/lldb/cpp/InfiniteLoop/Android.mk
new file mode 100644
index 0000000..e4910bb
--- /dev/null
+++ b/tests/lldb/cpp/InfiniteLoop/Android.mk
@@ -0,0 +1,28 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := CppInfiniteLoop
+
+LOCAL_SRC_FILES := \
+	InfiniteLoop.cpp \
+	simple.rs
+
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+LOCAL_CFLAGS := --std=c++11
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_LDFLAGS := \
+	-ldl \
+	-llog
+
+intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
+
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += $(intermediates)
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/tests/lldb/cpp/InfiniteLoop/InfiniteLoop.cpp b/tests/lldb/cpp/InfiniteLoop/InfiniteLoop.cpp
new file mode 100644
index 0000000..505fad5
--- /dev/null
+++ b/tests/lldb/cpp/InfiniteLoop/InfiniteLoop.cpp
@@ -0,0 +1,44 @@
+#include <thread>
+#include <chrono>
+
+#include <RenderScript.h>
+
+#include "ScriptC_simple.h"
+
+using namespace android;
+using namespace RSC;
+
+int main()
+{
+    static const int size = 64;
+    sp<RS> rs = new RS();
+
+    rs->init("/data/rscache", RS_INIT_LOW_LATENCY);
+
+    auto e = Element::RGBA_8888(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    sp<ScriptC_simple> s = new ScriptC_simple(rs);
+
+    // Test is designed to loop forever, waits for two seconds
+    // between each invocation of the kernel
+    bool forever = true;
+    while(forever)
+    {
+        s->forEach_simple_kernel(a, b);
+        std::this_thread::sleep_for(std::chrono::seconds(2));
+    }
+
+    uint32_t * output = new uint32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+
+    return 0;
+}
+
diff --git a/tests/lldb/cpp/InfiniteLoop/simple.rs b/tests/lldb/cpp/InfiniteLoop/simple.rs
new file mode 100644
index 0000000..a93d3a4
--- /dev/null
+++ b/tests/lldb/cpp/InfiniteLoop/simple.rs
@@ -0,0 +1,22 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.cppinfiniteloop)
+
+float4 gColor = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) simple_kernel(uchar4 in)
+{
+    float4 out = rsUnpackColor8888(in);
+
+    out.r = gColor.r;
+    out.g = gColor.g;
+    out.b = gColor.b;
+    out.a = gColor.a;
+
+    uchar4 result = rsPackColorTo8888(out);
+    return result;
+}
+
diff --git a/tests/lldb/cpp/KernelVariables/Android.mk b/tests/lldb/cpp/KernelVariables/Android.mk
new file mode 100644
index 0000000..52ed88f
--- /dev/null
+++ b/tests/lldb/cpp/KernelVariables/Android.mk
@@ -0,0 +1,27 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := CppKernelVariables
+
+LOCAL_SRC_FILES := \
+	KernelVariables.cpp \
+	simple.rs
+
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+LOCAL_CFLAGS := --std=c++11
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_LDFLAGS := \
+	-ldl \
+	-llog
+
+intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
+
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += $(intermediates)
+
+include $(BUILD_EXECUTABLE)
diff --git a/tests/lldb/cpp/KernelVariables/KernelVariables.cpp b/tests/lldb/cpp/KernelVariables/KernelVariables.cpp
new file mode 100644
index 0000000..25f7575
--- /dev/null
+++ b/tests/lldb/cpp/KernelVariables/KernelVariables.cpp
@@ -0,0 +1,74 @@
+#include <RenderScript.h>
+
+#include "ScriptC_simple.h"
+
+using namespace android;
+using namespace RSC;
+
+int main()
+{
+    static const int size = 64;
+    sp<RS> rs = new RS();
+
+    rs->init("/data/rscache", RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+
+    auto e = Element::RGBA_8888(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    sp<ScriptC_simple> s = new ScriptC_simple(rs);
+
+    static const int buffer_int[] = {1, 2, 3, 4};
+    sp<Allocation> int_allocation = Allocation::createSized(rs, Element::I32(rs), 4);
+    int_allocation->copy1DRangeFrom(0, 4, buffer_int);
+    s->set_allocation_1D_global(int_allocation);
+
+    static const int buffer_int2[] = {5, 6, 7, 8};
+
+    Type::Builder typeI32Builder2D(rs, Element::I32(rs));
+    typeI32Builder2D.setX(2);
+    typeI32Builder2D.setY(2);
+
+    sp<Allocation> int_allocation2 = Allocation::createTyped(rs, typeI32Builder2D.create());
+    int_allocation2->copy2DRangeFrom(0, 0, 2, 2, buffer_int2);
+    s->set_allocation_1D_global2(int_allocation2);
+
+    s->set_allocation_2D_global(a);
+    s->set_allocation_2D_global2(b);
+
+    static const int buffer_int3[] = {9, 10, 11, 12, 13, 14, 15, 16};
+
+    Type::Builder typeI32Builder3D(rs, Element::I32(rs));
+    typeI32Builder3D.setX(2);
+    typeI32Builder3D.setY(2);
+    typeI32Builder3D.setZ(2);
+
+    sp<Allocation> int_allocation3 = Allocation::createTyped(rs, typeI32Builder3D.create());
+    int_allocation3->copy3DRangeFrom(0, 0, 0, 2, 2, 2, buffer_int3);
+    s->set_allocation_3D_global(int_allocation3);
+
+    Type::Builder yuvTypeBuilder(rs, Element::YUV(rs));
+    yuvTypeBuilder.setX(4);
+    yuvTypeBuilder.setY(4);
+    yuvTypeBuilder.setYuvFormat(RS_YUV_YV12);
+
+    sp<Allocation> yuv_allocation = Allocation::createTyped(rs, yuvTypeBuilder.create());
+    s->set_allocation_YUV_2D_global(yuv_allocation);
+
+    s->set_sampler_global(Sampler::CLAMP_LINEAR(rs));
+
+    // Script is executed once, then the data is copied back when finished
+    s->forEach_kernel(a, b);
+    rs->finish();
+    uint32_t * output = new uint32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+
+    return 0;
+}
+
diff --git a/tests/lldb/cpp/KernelVariables/simple.rs b/tests/lldb/cpp/KernelVariables/simple.rs
new file mode 100644
index 0000000..572e1f4
--- /dev/null
+++ b/tests/lldb/cpp/KernelVariables/simple.rs
@@ -0,0 +1,160 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.cppkernelvariables)
+
+char char_global = 12;
+uchar uchar_global = 234;
+short short_global = -321;
+ushort ushort_global = 432;
+int int_global = 1234;
+uint uint_global = 2345;
+float float_global = 4.5f;
+long long_global = -77777;
+ulong ulong_global = 8888;
+double double_global = -456.5f;
+
+char2 char2_global = {11, -22};
+uchar2 uchar2_global = {33, 44};
+short2 short2_global = {-555, 666};
+ushort2 ushort2_global = {777, 888};
+int2 int2_global = {999, -1111};
+uint2 uint2_global = {2222, 3333};
+float2 float2_global = {4.5f, -5.0f};
+long2 long2_global = {-4444, 5555};
+ulong2 ulong2_global = {6666, 7777};
+double2 double2_global = {88.5f, -99.0f};
+
+char3 char3_global = {11, -22, -33};
+uchar3 uchar3_global = {33, 44, 55};
+short3 short3_global = {-555, 666, 777};
+ushort3 ushort3_global = {777, 888, 999};
+int3 int3_global = {999, -1111, 2222};
+uint3 uint3_global = {2222, 3333, 4444};
+float3 float3_global = {4.5f, -5.0f, -6.5f};
+long3 long3_global = {-4444, 5555, 6666};
+ulong3 ulong3_global = {6666, 7777, 8888};
+double3 double3_global = {88.5f, -99.0f, 111.5f};
+
+char4 char4_global = {55, 11, -22, -33};
+uchar4 uchar4_global = {222, 33, 44, 55};
+short4 short4_global = {-444, -555, 666, 777};
+ushort4 ushort4_global = {666, 777, 888, 999};
+int4 int4_global = {888, 999, -1111, 2222};
+uint4 uint4_global = {1111, 2222, 3333, 4444};
+float4 float4_global = {3.0f, 4.5f, -5.0f, -6.5f};
+long4 long4_global = {-3333, -4444, 5555, 6666};
+ulong4 ulong4_global = {5555, 6666, 7777, 8888};
+double4 double4_global = {-77.0f, 88.5f, -99.0f, 111.5f};
+
+rs_matrix2x2 matrix2x2_global;
+rs_matrix3x3 matrix3x3_global;
+rs_matrix4x4 matrix4x4_global;
+
+rs_quaternion quaternion_global;
+
+rs_allocation allocation_1D_global;
+rs_allocation allocation_1D_global2;
+rs_allocation allocation_2D_global;
+rs_allocation allocation_2D_global2;
+rs_allocation allocation_3D_global;
+rs_allocation allocation_YUV_2D_global;
+
+rs_allocation_cubemap_face cubemap_face_global;
+rs_sampler sampler_global;
+
+uchar4 __attribute__((kernel)) kernel(uchar4 in)
+{
+    char char_local = 'a';
+    uchar uchar_local = 'b';
+    short short_local = -321;
+    ushort ushort_local = 432;
+    int int_local = 1234;
+    uint uint_local = 2345;
+    float float_local = 4.5f;
+    long long_local = -77777;
+    ulong ulong_local = 8888;
+    double double_local = -456.5f;
+
+    char2 char2_local = {-11, -22};
+    uchar2 uchar2_local = {33, 44};
+    short2 short2_local = {-555, 666};
+    ushort2 ushort2_local = {777, 888};
+    int2 int2_local = {999, -1111};
+    uint2 uint2_local = {2222, 3333};
+    float2 float2_local = {4.5f, -5.0f};
+    long2 long2_local = {-4444, 5555};
+    ulong2 ulong2_local = {6666, 7777};
+    double2 double2_local = {88.5f, -99.0f};
+
+    char3 char3_local = {11, -22, -33};
+    uchar3 uchar3_local = {33, 44, 55};
+    short3 short3_local = {-555, 666, 777};
+    ushort3 ushort3_local = {777, 888, 999};
+    int3 int3_local = {999, -1111, 2222};
+    uint3 uint3_local = {2222, 3333, 4444};
+    float3 float3_local = {4.5f, -5.0f, -6.5f};
+    long3 long3_local = {-4444, 5555, 6666};
+    ulong3 ulong3_local = {6666, 7777, 8888};
+    double3 double3_local = {88.5f, -99.0f, 111.5f};
+
+    char4 char4_local = {55, 11, -22, -33};
+    uchar4 uchar4_local = {22, 33, 44, 55};
+    short4 short4_local = {-444, -555, 666, 777};
+    ushort4 ushort4_local = {666, 777, 888, 999};
+    int4 int4_local = {888, 999, -1111, 2222};
+    uint4 uint4_local = {1111, 2222, 3333, 4444};
+    float4 float4_local = {3.0f, 4.5f, -5.0f, -6.5f};
+    long4 long4_local = {-3333, -4444, 5555, 6666};
+    ulong4 ulong4_local = {5555, 6666, 7777, 8888};
+    double4 double4_local = {-77.0f, 88.5f, -99.0f, 111.5f};
+
+    rs_matrix2x2 matrix2x2_local = {{1., 2.5,
+                                     3., 4.5}};
+    rs_matrix3x3 matrix3x3_local = {{5., 6.5, 7.,
+                                     8.5, 9., 1.5,
+                                     2., 3.5, 4.}};
+    rs_matrix4x4 matrix4x4_local = {{5.5, 6., 7.5, 8.,
+                                     9., 1.5, 2., 3.5,
+                                     4.5, 5.5, 6.5, 7.,
+                                     8., 9.5, 1.5, 2.5}};
+
+    matrix2x2_global = matrix2x2_local;
+    matrix3x3_global = matrix3x3_local;
+    matrix4x4_global = matrix4x4_local;
+
+    rsQuaternionSet(&quaternion_global, 3.0, 4.5, 5.5, 6.0);
+
+    rs_quaternion quaternion_local;
+    rsQuaternionSet(&quaternion_local, 7.5, 8.0, 9.0, 0.5);
+
+    char char_combined = char_local + (char)uchar_local + char2_local.x +
+        (char)uchar2_local.x + char3_local.x - (char)uchar3_local.x +
+        char4_local.x + (char)uchar4_local.x;
+
+    short short_combined = short_local + (short)ushort_local + short2_local.x +
+        (short)ushort2_local.x + short3_local.x + (short)ushort3_local.x +
+        short4_local.x + (short)ushort4_local.x;
+
+    int int_combined = int_local + (int)uint_local + int2_local.x +
+        (int)uint2_local.x + int3_local.x + (int)uint3_local.x + int4_local.x +
+        (int)uint4_local.x;
+
+    float float_combined = float_local + float2_local.x + float3_local.x +
+        float4_local.x;
+
+    long long_combined = long_local + (long)ulong_local + long2_local.x +
+        (long)ulong2_local.x + long3_local.x + (long)ulong3_local.x +
+        long4_local.x + (long)ulong4_local.x;
+
+    double double_combined = double_local + double2_local.x + double3_local.x +
+        double4_local.x;
+
+    char_global = char_combined;
+    short_global = short_combined;
+    int_global = int_combined;
+    float_global = float_combined;
+    long_global = long_combined;
+    double_global = double_combined;
+
+    uchar4 result = {1,2,3,4};
+    return result;
+}
diff --git a/tests/lldb/cpp/MultipleRSFiles/Android.mk b/tests/lldb/cpp/MultipleRSFiles/Android.mk
new file mode 100644
index 0000000..f75ab9b
--- /dev/null
+++ b/tests/lldb/cpp/MultipleRSFiles/Android.mk
@@ -0,0 +1,28 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := CppMultipleRSFiles
+
+LOCAL_SRC_FILES := \
+	MultipleRSFiles.cpp \
+	first.rs \
+	second.rs
+
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+LOCAL_CFLAGS := --std=c++11
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_LDFLAGS := \
+	-ldl \
+	-llog
+
+intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
+
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += $(intermediates)
+
+include $(BUILD_EXECUTABLE)
diff --git a/tests/lldb/cpp/MultipleRSFiles/MultipleRSFiles.cpp b/tests/lldb/cpp/MultipleRSFiles/MultipleRSFiles.cpp
new file mode 100644
index 0000000..c009710
--- /dev/null
+++ b/tests/lldb/cpp/MultipleRSFiles/MultipleRSFiles.cpp
@@ -0,0 +1,38 @@
+#include <RenderScript.h>
+
+#include "ScriptC_first.h"
+#include "ScriptC_second.h"
+
+using namespace android;
+using namespace RSC;
+
+int main()
+{
+    static const int size = 64;
+    sp<RS> rs = new RS();
+
+    rs->init("/data/rscache", RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+
+    auto e = Element::RGBA_8888(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    // Script is executed once, then the data is copied back when finished
+    sp<ScriptC_first> s1 = new ScriptC_first(rs);
+    sp<ScriptC_second> s2 = new ScriptC_second(rs);
+
+    s1->forEach_first_kernel(a, b);
+    uint32_t * output = new uint32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+
+    s2->forEach_second_kernel(a, b);
+
+    rs->finish();
+    return 0;
+}
diff --git a/tests/lldb/cpp/MultipleRSFiles/first.rs b/tests/lldb/cpp/MultipleRSFiles/first.rs
new file mode 100644
index 0000000..b86ec8c
--- /dev/null
+++ b/tests/lldb/cpp/MultipleRSFiles/first.rs
@@ -0,0 +1,16 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.cppmultiplersfiles)
+
+float4 gColor = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) first_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColor;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
diff --git a/tests/lldb/cpp/MultipleRSFiles/second.rs b/tests/lldb/cpp/MultipleRSFiles/second.rs
new file mode 100644
index 0000000..d414ae5
--- /dev/null
+++ b/tests/lldb/cpp/MultipleRSFiles/second.rs
@@ -0,0 +1,9 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.cppmultiplersfiles)
+
+/* RenderScript kernel that just returns the swizzled input. */
+uchar4 __attribute__((kernel)) second_kernel(uchar4 in)
+{
+    uchar4 result = in.wzyx;
+    return result;
+}
diff --git a/tests/lldb/cpp/WaitAttach/Android.mk b/tests/lldb/cpp/WaitAttach/Android.mk
new file mode 100644
index 0000000..8edd8a1
--- /dev/null
+++ b/tests/lldb/cpp/WaitAttach/Android.mk
@@ -0,0 +1,53 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := CppDebugWaitAttach
+
+LOCAL_SRC_FILES := \
+	WaitAttach.cpp \
+	simple.rs
+
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+LOCAL_CFLAGS := --std=c++11
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_LDFLAGS := \
+	-ldl \
+	-llog
+
+intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
+
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += $(intermediates)
+
+include $(BUILD_EXECUTABLE)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := CppNoDebugWaitAttach
+
+LOCAL_SRC_FILES := \
+	WaitAttach.cpp \
+	simple.rs
+
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+LOCAL_CFLAGS := --std=c++11
+
+LOCAL_RENDERSCRIPT_FLAGS := -O0 -target-api 0
+
+LOCAL_LDFLAGS := \
+	-ldl \
+	-llog
+
+intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
+
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += $(intermediates)
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/tests/lldb/cpp/WaitAttach/WaitAttach.cpp b/tests/lldb/cpp/WaitAttach/WaitAttach.cpp
new file mode 100644
index 0000000..4da5e97
--- /dev/null
+++ b/tests/lldb/cpp/WaitAttach/WaitAttach.cpp
@@ -0,0 +1,35 @@
+#include <RenderScript.h>
+
+#include "ScriptC_simple.h"
+
+using namespace android;
+using namespace RSC;
+
+int main()
+{
+    static const int size = 8;
+    sp<RS> rs = new RS();
+
+    rs->init("/data/rscache", RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+
+    auto e = Element::RGBA_8888(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    // Script is executed once, then the data is copied back when finished
+    sp<ScriptC_simple> s = new ScriptC_simple(rs);
+    s->forEach_simple_kernel(a, b);
+    uint32_t * output = new uint32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+
+    s->forEach_other_kernel(a, b);
+
+    rs->finish();
+    return 0;
+}
diff --git a/tests/lldb/cpp/WaitAttach/simple.rs b/tests/lldb/cpp/WaitAttach/simple.rs
new file mode 100644
index 0000000..97e17cf
--- /dev/null
+++ b/tests/lldb/cpp/WaitAttach/simple.rs
@@ -0,0 +1,23 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.cppwaitattach)
+
+float4 gColor = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) simple_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColor;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
+
+// Extra kernel to test lldb setting breakpoints on all the RS kernels.
+uchar4 __attribute__((kernel)) other_kernel(uchar4 in)
+{
+    uchar4 result = in.wzyx;
+    return result;
+}
diff --git a/tests/lldb/java/Allocations/Android.mk b/tests/lldb/java/Allocations/Android.mk
new file mode 100644
index 0000000..a62d3a6
--- /dev/null
+++ b/tests/lldb/java/Allocations/Android.mk
@@ -0,0 +1,15 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := \
+	$(call all-java-files-under, src) \
+	$(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := Allocations
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -Wno-unused -target-api 0
+
+include $(BUILD_PACKAGE)
+
diff --git a/tests/lldb/java/Allocations/AndroidManifest.xml b/tests/lldb/java/Allocations/AndroidManifest.xml
new file mode 100644
index 0000000..8650cb0
--- /dev/null
+++ b/tests/lldb/java/Allocations/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.allocations">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="Allocations"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
+
diff --git a/tests/lldb/java/Allocations/res/layout/main_layout.xml b/tests/lldb/java/Allocations/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/java/Allocations/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/java/Allocations/src/com/android/rs/allocations/MainActivity.java b/tests/lldb/java/Allocations/src/com/android/rs/allocations/MainActivity.java
new file mode 100644
index 0000000..7cff9ae
--- /dev/null
+++ b/tests/lldb/java/Allocations/src/com/android/rs/allocations/MainActivity.java
@@ -0,0 +1,536 @@
+package com.android.rs.allocations;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.graphics.Bitmap;
+import android.renderscript.*;
+
+public class MainActivity extends Activity {
+    private RenderScript mRS;
+
+    private Allocation mInAllocation;      // script input
+    private Allocation mOutAllocation;     // script output
+
+    private Allocation mStructInAlloc;     // complexStruct input
+    private Allocation mStructOutAlloc;    // complexStruct output
+
+    private Allocation mBoolAllocation;    // boolean
+
+    private Allocation mCharAllocation;    // char
+    private Allocation mChar2Allocation;   // char2
+    private Allocation mChar3Allocation;   // char3
+    private Allocation mChar4Allocation;   // char4
+
+    private Allocation mUCharAllocation;   // uchar
+    private Allocation mUChar2Allocation;  // uchar2
+    private Allocation mUChar3Allocation;  // uchar3
+    private Allocation mUChar4Allocation;  // uchar4
+
+    private Allocation mShortAllocation;   // short
+    private Allocation mShort2Allocation;  // short2
+    private Allocation mShort3Allocation;  // short3
+    private Allocation mShort4Allocation;  // short4
+
+    private Allocation mUShortAllocation;  // ushort
+    private Allocation mUShort2Allocation; // ushort2
+    private Allocation mUShort3Allocation; // ushort3
+    private Allocation mUShort4Allocation; // ushort4
+
+    private Allocation mIntAllocation;     // int
+    private Allocation mInt2Allocation;    // int2
+    private Allocation mInt3Allocation;    // int3
+    private Allocation mInt4Allocation;    // int4
+
+    private Allocation mUIntAllocation;    // uint
+    private Allocation mUInt2Allocation;   // uint2
+    private Allocation mUInt3Allocation;   // uint3
+    private Allocation mUInt4Allocation;   // uint4
+
+    private Allocation mLongAllocation;    // long
+    private Allocation mLong2Allocation;   // long2
+    private Allocation mLong3Allocation;   // long3
+    private Allocation mLong4Allocation;   // long4
+
+    private Allocation mULongAllocation;   // ulong
+    private Allocation mULong2Allocation;  // ulong2
+    private Allocation mULong3Allocation;  // ulong3
+    private Allocation mULong4Allocation;  // ulong4
+
+    private Allocation mHalfAllocation;    // half
+    private Allocation mHalf2Allocation;   // half2
+    private Allocation mHalf3Allocation;   // half3
+    private Allocation mHalf4Allocation;   // half4
+
+    private Allocation mFloatAllocation;   // float
+    private Allocation mFloat2Allocation;  // float2
+    private Allocation mFloat3Allocation;  // float3
+    private Allocation mFloat4Allocation;  // float4
+
+    private Allocation mDoubleAllocation;  // double
+    private Allocation mDouble2Allocation; // double2
+    private Allocation mDouble3Allocation; // double3
+    private Allocation mDouble4Allocation; // double4
+
+    private ScriptC_allocs mScript;
+
+    private int mAllocSize = 24; // Chosen as allocation size since it's easily divisible
+
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.main_layout);
+
+        mBitmapIn = Bitmap.createBitmap(64, 64, Bitmap.Config.ARGB_8888);
+        mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(), mBitmapIn.getHeight(), mBitmapIn.getConfig());
+
+        createScript();
+        runScript();
+    }
+
+    private void createScript() {
+        mRS = RenderScript.create(this,
+            RenderScript.ContextType.NORMAL,
+            RenderScript.CREATE_FLAG_LOW_LATENCY |
+            RenderScript.CREATE_FLAG_WAIT_FOR_ATTACH);
+
+        mScript = new ScriptC_allocs(mRS);
+    }
+
+    private void createSignedAllocations() {
+        Type.Builder typeI8Builder = new Type.Builder(mRS, Element.I8(mRS));
+        typeI8Builder.setX(1); // One element here to test 16 byte memory alignment
+        typeI8Builder.setY(3);
+        typeI8Builder.setZ(8);
+
+        mCharAllocation = Allocation.createTyped(mRS, typeI8Builder.create());
+        mRS.finish();
+        mChar2Allocation = Allocation.createSized(mRS, Element.I8_2(mRS), mAllocSize / 2);
+        mRS.finish();
+        mChar3Allocation = Allocation.createSized(mRS, Element.I8_3(mRS), mAllocSize / 4);
+        mRS.finish();
+        mChar4Allocation = Allocation.createSized(mRS, Element.I8_4(mRS), mAllocSize / 4);
+        mRS.finish();
+
+        Type.Builder typeI16_2Builder = new Type.Builder(mRS, Element.I16_2(mRS));
+        typeI16_2Builder.setX(6);
+        typeI16_2Builder.setY(1);
+        typeI16_2Builder.setZ(2);
+
+        mShortAllocation = Allocation.createSized(mRS, Element.I16(mRS), mAllocSize);
+        mRS.finish();
+        mShort2Allocation = Allocation.createTyped(mRS, typeI16_2Builder.create());
+        mRS.finish();
+        mShort3Allocation = Allocation.createSized(mRS, Element.I16_3(mRS), mAllocSize / 4);
+        mRS.finish();
+        mShort4Allocation = Allocation.createSized(mRS, Element.I16_4(mRS), mAllocSize / 4);
+        mRS.finish();
+
+        Type.Builder typeI32_3Builder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeI32_3Builder.setX(3);
+        typeI32_3Builder.setY(2);
+
+        mIntAllocation = Allocation.createSized(mRS, Element.I32(mRS), mAllocSize);
+        mRS.finish();
+        mInt2Allocation = Allocation.createSized(mRS, Element.I32_2(mRS), mAllocSize / 2);
+        mRS.finish();
+        mInt3Allocation = Allocation.createTyped(mRS, typeI32_3Builder.create());
+        mRS.finish();
+        mInt4Allocation = Allocation.createSized(mRS, Element.I32_4(mRS), mAllocSize / 4);
+        mRS.finish();
+
+        Type.Builder typeI64_4Builder = new Type.Builder(mRS, Element.I64_4(mRS));
+        typeI64_4Builder.setX(1);
+        typeI64_4Builder.setY(6);
+
+        mLongAllocation = Allocation.createSized(mRS, Element.I64(mRS), mAllocSize);
+        mRS.finish();
+        mLong2Allocation = Allocation.createSized(mRS, Element.I64_2(mRS), mAllocSize / 2);
+        mRS.finish();
+        mLong3Allocation = Allocation.createSized(mRS, Element.I64_3(mRS), mAllocSize / 4);
+        mRS.finish();
+        mLong4Allocation = Allocation.createTyped(mRS, typeI64_4Builder.create());
+        mRS.finish();
+
+        mBoolAllocation = Allocation.createSized(mRS, Element.BOOLEAN(mRS), mAllocSize);
+        mRS.finish();
+    }
+
+    private void initSignedAllocations() {
+        byte[] buffer_char = new byte[mAllocSize];
+        short[] buffer_short = new short[mAllocSize];
+        int[] buffer_int = new int[mAllocSize];
+        long[] buffer_long = new long[mAllocSize];
+        byte[] buffer_bool = new byte[mAllocSize];
+
+        for(int i = 0; i < mAllocSize; ++i) {
+            buffer_char[i] = (byte) i;
+            buffer_short[i] = (short) i;
+            buffer_int[i] = (int) i;
+            buffer_long[i] = (long) i;
+            buffer_bool[i] =  (byte) (0x01 & i);
+        }
+
+        mCharAllocation.copyFrom(buffer_char);
+        mChar2Allocation.copyFrom(buffer_char);
+        mChar3Allocation.copyFrom(buffer_char);
+        mChar4Allocation.copyFrom(buffer_char);
+
+        mShortAllocation.copyFrom(buffer_short);
+        mShort2Allocation.copyFrom(buffer_short);
+        mShort3Allocation.copyFrom(buffer_short);
+        mShort4Allocation.copyFrom(buffer_short);
+
+        mIntAllocation.copyFrom(buffer_int);
+        mInt2Allocation.copyFrom(buffer_int);
+        mInt3Allocation.copyFrom(buffer_int);
+        mInt4Allocation.copyFrom(buffer_int);
+
+        mLongAllocation.copyFrom(buffer_long);
+        mLong2Allocation.copyFrom(buffer_long);
+        mLong3Allocation.copyFrom(buffer_long);
+        mLong4Allocation.copyFrom(buffer_long);
+
+        mBoolAllocation.copyFromUnchecked(buffer_bool);
+    }
+
+    private void createUnsignedAllocations() {
+        Type.Builder typeU8_2Builder = new Type.Builder(mRS, Element.U8_2(mRS));
+        typeU8_2Builder.setX(2);
+        typeU8_2Builder.setY(6);
+
+        mUCharAllocation = Allocation.createSized(mRS, Element.U8(mRS), mAllocSize);
+        mRS.finish();
+        mUChar2Allocation = Allocation.createTyped(mRS, typeU8_2Builder.create());
+        mRS.finish();
+        mUChar3Allocation = Allocation.createSized(mRS, Element.U8_3(mRS), mAllocSize / 4);
+        mRS.finish();
+        mUChar4Allocation = Allocation.createSized(mRS, Element.U8_4(mRS), mAllocSize / 4);
+        mRS.finish();
+
+        Type.Builder typeU16_3Builder = new Type.Builder(mRS, Element.U16_3(mRS));
+        typeU16_3Builder.setX(1);
+        typeU16_3Builder.setY(6);
+
+        mUShortAllocation = Allocation.createSized(mRS, Element.U16(mRS), mAllocSize);
+        mRS.finish();
+        mUShort2Allocation = Allocation.createSized(mRS, Element.U16_2(mRS), mAllocSize / 2);
+        mRS.finish();
+        mUShort3Allocation = Allocation.createTyped(mRS, typeU16_3Builder.create());
+        mRS.finish();
+        mUShort4Allocation = Allocation.createSized(mRS, Element.U16_4(mRS), mAllocSize / 4);
+        mRS.finish();
+
+        Type.Builder typeU32_4Builder = new Type.Builder(mRS, Element.U32_4(mRS));
+        typeU32_4Builder.setX(1);
+        typeU32_4Builder.setY(1);
+        typeU32_4Builder.setZ(6);
+
+        mUIntAllocation = Allocation.createSized(mRS, Element.U32(mRS), mAllocSize);
+        mRS.finish();
+        mUInt2Allocation = Allocation.createSized(mRS, Element.U32_2(mRS), mAllocSize / 2);
+        mRS.finish();
+        mUInt3Allocation = Allocation.createSized(mRS, Element.U32_3(mRS), mAllocSize / 4);
+        mRS.finish();
+        mUInt4Allocation = Allocation.createTyped(mRS, typeU32_4Builder.create());
+        mRS.finish();
+
+        Type.Builder typeU64Builder = new Type.Builder(mRS, Element.U64(mRS));
+        typeU64Builder.setX(4);
+        typeU64Builder.setY(3);
+        typeU64Builder.setZ(2);
+
+        mULongAllocation = Allocation.createTyped(mRS, typeU64Builder.create());
+        mRS.finish();
+        mULong2Allocation = Allocation.createSized(mRS, Element.U64_2(mRS), mAllocSize / 2);
+        mRS.finish();
+        mULong3Allocation = Allocation.createSized(mRS, Element.U64_3(mRS), mAllocSize / 4);
+        mRS.finish();
+        mULong4Allocation = Allocation.createSized(mRS, Element.U64_4(mRS), mAllocSize / 4);
+        mRS.finish();
+    }
+
+    private void initUnsignedAllocations() {
+        byte[] buffer_char = new byte[mAllocSize];
+        short[] buffer_short = new short[mAllocSize];
+        int[] buffer_int = new int[mAllocSize];
+        long[] buffer_long = new long[mAllocSize];
+
+        for(int i = 0; i < mAllocSize; ++i) {
+            buffer_char[i] = (byte) i;
+            buffer_short[i] = (short) i;
+            buffer_int[i] = (int) i;
+            buffer_long[i] = (long) i;
+        }
+
+        mUCharAllocation.copyFrom(buffer_char);
+        mUChar2Allocation.copyFrom(buffer_char);
+        mUChar3Allocation.copyFrom(buffer_char);
+        mUChar4Allocation.copyFrom(buffer_char);
+
+        mUShortAllocation.copyFrom(buffer_short);
+        mUShort2Allocation.copyFrom(buffer_short);
+        mUShort3Allocation.copyFrom(buffer_short);
+        mUShort4Allocation.copyFrom(buffer_short);
+
+        mUIntAllocation.copyFrom(buffer_int);
+        mUInt2Allocation.copyFrom(buffer_int);
+        mUInt3Allocation.copyFrom(buffer_int);
+        mUInt4Allocation.copyFrom(buffer_int);
+
+        mULongAllocation.copyFrom(buffer_long);
+        mULong2Allocation.copyFrom(buffer_long);
+        mULong3Allocation.copyFrom(buffer_long);
+        mULong4Allocation.copyFrom(buffer_long);
+    }
+
+    private void createFloatAllocations() {
+        Type.Builder typeF16_3Builder = new Type.Builder(mRS, Element.F16_3(mRS));
+        typeF16_3Builder.setX(1);
+        typeF16_3Builder.setY(6);
+
+        mHalfAllocation = Allocation.createSized(mRS, Element.F16(mRS), mAllocSize);
+        mRS.finish();
+        mHalf2Allocation = Allocation.createSized(mRS, Element.F16_2(mRS), mAllocSize / 2);
+        mRS.finish();
+        mHalf3Allocation = Allocation.createTyped(mRS, typeF16_3Builder.create());
+        mRS.finish();
+        mHalf4Allocation = Allocation.createSized(mRS, Element.F16_4(mRS), mAllocSize / 4);
+        mRS.finish();
+
+        Type.Builder typeF32_4Builder = new Type.Builder(mRS, Element.F32_4(mRS));
+        typeF32_4Builder.setX(3);
+        typeF32_4Builder.setY(2);
+
+        mFloatAllocation = Allocation.createSized(mRS, Element.F32(mRS), mAllocSize);
+        mRS.finish();
+        mFloat2Allocation = Allocation.createSized(mRS, Element.F32_2(mRS), mAllocSize / 2);
+        mRS.finish();
+        mFloat3Allocation = Allocation.createSized(mRS, Element.F32_3(mRS), mAllocSize / 4);
+        mRS.finish();
+        mFloat4Allocation = Allocation.createTyped(mRS, typeF32_4Builder.create());
+        mRS.finish();
+
+        Type.Builder typeF64_2Builder = new Type.Builder(mRS, Element.F64_2(mRS));
+        typeF64_2Builder.setX(4);
+        typeF64_2Builder.setY(1);
+        typeF64_2Builder.setZ(3);
+
+        mDoubleAllocation = Allocation.createSized(mRS, Element.F64(mRS), mAllocSize);
+        mRS.finish();
+        mDouble2Allocation = Allocation.createTyped(mRS, typeF64_2Builder.create());
+        mRS.finish();
+
+        Type.Builder typeF64_3Builder = new Type.Builder(mRS, Element.F64_3(mRS));
+        typeF64_3Builder.setX(1);
+        typeF64_3Builder.setY(2);
+        typeF64_3Builder.setZ(3);
+
+        Type.Builder typeF64_4Builder = new Type.Builder(mRS, Element.F64_4(mRS));
+        typeF64_4Builder.setX(1);
+        typeF64_4Builder.setY(2);
+        typeF64_4Builder.setZ(3);
+
+        mDouble3Allocation = Allocation.createTyped(mRS, typeF64_3Builder.create());
+        mRS.finish();
+        mDouble4Allocation = Allocation.createTyped(mRS, typeF64_4Builder.create());
+        mRS.finish();
+    }
+
+    private void initFloatAllocations() {
+        // No java type for half precision float, so bitcast 16-bit int
+        short[] buffer_half = new short[mAllocSize];
+        float[] buffer_float = new float[mAllocSize];
+        double[] buffer_double = new double[mAllocSize];
+
+        for(int i = 0; i < mAllocSize; ++i) {
+            // Construct IEEE 754 half with increasing fraction.
+            byte mantissa = (byte)(i);
+            byte exponent = 0b00111100; // keep exponent constant at one
+            buffer_half[i] = (short)((exponent << 8) | mantissa);
+
+            buffer_float[i] = (float) 1 / i;
+            buffer_double[i] = (double) 1 / i;
+        }
+
+        mHalfAllocation.copyFromUnchecked(buffer_half);
+        mHalf2Allocation.copyFromUnchecked(buffer_half);
+        mHalf3Allocation.copyFromUnchecked(buffer_half);
+        mHalf4Allocation.copyFromUnchecked(buffer_half);
+
+        mFloatAllocation.copyFrom(buffer_float);
+        mFloat2Allocation.copyFrom(buffer_float);
+        mFloat3Allocation.copyFrom(buffer_float);
+        mFloat4Allocation.copyFrom(buffer_float);
+
+        mDoubleAllocation.copyFrom(buffer_double);
+        mDouble2Allocation.copyFrom(buffer_double);
+        mDouble3Allocation.copyFrom(buffer_double);
+        mDouble4Allocation.copyFrom(buffer_double);
+    }
+
+    private void createStructAllocations() {
+        ScriptField_complexStruct complex_struct;
+
+        complex_struct = new ScriptField_complexStruct(mRS, mAllocSize);
+        mRS.finish();
+        mScript.bind_g_complexStruct_in(complex_struct);
+        mRS.finish();
+        mStructInAlloc = complex_struct.getAllocation();
+        mRS.finish();
+
+        complex_struct = new ScriptField_complexStruct(mRS, mAllocSize);
+        mRS.finish();
+        mScript.bind_g_complexStruct_out(complex_struct);
+        mRS.finish();
+        mStructOutAlloc = complex_struct.getAllocation();
+        mRS.finish();
+    }
+
+    private void overwriteFloatAllocations() {
+        float[] buffer_float = new float[mAllocSize];
+
+        // Set float allocations to -1/n
+        for(int i = 0; i < mAllocSize; ++i) {
+            buffer_float[i] = -1f / i;
+        }
+
+        mFloatAllocation.copyFrom(buffer_float);
+        mFloat2Allocation.copyFrom(buffer_float);
+        mFloat3Allocation.copyFrom(buffer_float);
+        mFloat4Allocation.copyFrom(buffer_float);
+    }
+
+    private void runScript() {
+        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn);
+        mRS.finish();
+        mOutAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
+        mRS.finish();
+
+
+        createSignedAllocations();
+        initSignedAllocations();
+
+        mRS.finish();
+        mScript.forEach_swizzle_kernel(mInAllocation, mOutAllocation);
+        mRS.finish();
+
+        mOutAllocation.copyTo(mBitmapOut);
+
+        mCharAllocation.destroy();
+        mRS.finish();
+        mChar2Allocation.destroy();
+        mRS.finish();
+        mChar3Allocation.destroy();
+        mRS.finish();
+        mChar4Allocation.destroy();
+        mRS.finish();
+
+        mShort2Allocation.destroy();
+        mRS.finish();
+        mShort3Allocation.destroy();
+        mRS.finish();
+        mShort4Allocation.destroy();
+        mRS.finish();
+
+        mIntAllocation.destroy();
+        mRS.finish();
+        mInt2Allocation.destroy();
+        mRS.finish();
+        mInt3Allocation.destroy();
+        mRS.finish();
+        mInt4Allocation.destroy();
+        mRS.finish();
+
+        mLongAllocation.destroy();
+        mRS.finish();
+        mLong2Allocation.destroy();
+        mRS.finish();
+        mLong3Allocation.destroy();
+        mRS.finish();
+        mLong4Allocation.destroy();
+        mRS.finish();
+
+        mBoolAllocation.destroy();
+        mRS.finish();
+
+
+        createUnsignedAllocations();
+        initUnsignedAllocations();
+
+        mInAllocation = mUShortAllocation; // Host side assignment
+
+        mRS.finish();
+        mScript.forEach_square_kernel(mInAllocation, mUIntAllocation);
+        mRS.finish();
+
+        mUCharAllocation.destroy();
+        mRS.finish();
+        mUChar2Allocation.destroy();
+        mRS.finish();
+        mUChar3Allocation.destroy();
+        mRS.finish();
+        mUChar4Allocation.destroy();
+        mRS.finish();
+
+        mUShortAllocation.destroy();
+        mRS.finish();
+        mUShort2Allocation.destroy();
+        mRS.finish();
+        mUShort3Allocation.destroy();
+        mRS.finish();
+        mUShort4Allocation.destroy();
+        mRS.finish();
+
+        mUInt2Allocation.destroy();
+        mRS.finish();
+        mUInt3Allocation.destroy();
+        mRS.finish();
+        mUInt4Allocation.destroy();
+        mRS.finish();
+
+        mULongAllocation.destroy();
+        mRS.finish();
+        mULong2Allocation.destroy();
+        mRS.finish();
+        mULong3Allocation.destroy();
+        mRS.finish();
+        mULong4Allocation.destroy();
+        mRS.finish();
+
+
+        createFloatAllocations();
+        initFloatAllocations();
+
+        mRS.finish();
+        mScript.forEach_add_half_kernel(mDouble4Allocation, mDouble3Allocation);
+        mRS.finish();
+
+        mHalfAllocation.destroy();
+        mRS.finish();
+        mHalf2Allocation.destroy();
+        mRS.finish();
+        mHalf3Allocation.destroy();
+        mRS.finish();
+        mHalf4Allocation.destroy();
+        mRS.finish();
+
+        mDoubleAllocation.destroy();
+        mRS.finish();
+        mDouble2Allocation.destroy();
+        mRS.finish();
+        mDouble4Allocation.destroy();
+        mRS.finish();
+
+        overwriteFloatAllocations();
+
+        createStructAllocations();
+
+        mRS.finish();
+        mScript.forEach_struct_kernel(mStructInAlloc, mStructOutAlloc);
+        mRS.finish();
+    }
+}
diff --git a/tests/lldb/java/Allocations/src/rs/allocs.rs b/tests/lldb/java/Allocations/src/rs/allocs.rs
new file mode 100644
index 0000000..361f091
--- /dev/null
+++ b/tests/lldb/java/Allocations/src/rs/allocs.rs
@@ -0,0 +1,66 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.allocations)
+
+struct simpleStruct {
+   int i;
+   unsigned int j;
+};
+
+struct complexStruct {
+    struct simpleStruct s;
+    uchar4 c;
+    float f[2];
+};
+
+struct complexStruct *g_complexStruct_in;
+struct complexStruct *g_complexStruct_out;
+
+// Kernel performs basic vector swizzle
+uchar4 __attribute__((kernel)) swizzle_kernel(uchar4 in)
+{
+    return in.wzyx;
+}
+
+// Kernel squares every element in allocation
+uint __attribute__((kernel)) square_kernel(ushort in)
+{
+    uint result = (uint)(in) * (uint)in;
+    return result;
+}
+
+// Helper function adding 1/2 to passed in double
+static double half_helper(double in)
+{
+    return (in + 0.5);
+}
+
+// Kernel returns first 3 elements of a double4 plus 1/2
+double3 __attribute__((kernel)) add_half_kernel(double4 in)
+{
+    double3 result;
+    result.x = half_helper(in.x);
+    result.y = half_helper(in.y);
+    result.z = half_helper(in.z);
+    return result;
+}
+
+// Kernel for testing structs
+struct complexStruct __attribute__((kernel))
+struct_kernel(struct complexStruct in, uint32_t x)
+{
+   struct complexStruct complex_out;
+   struct simpleStruct simple_out;
+   simple_out.i = (int) x;
+   simple_out.j = x;
+   complex_out.s = simple_out;
+
+   complex_out.f[0] = (float) x;
+   complex_out.f[1] = (float) x + 0.5;
+
+   complex_out.c.x = (uchar) (x % 128);
+   complex_out.c.y = 'A';
+   complex_out.c.z = 'B';
+   complex_out.c.w = 'C';
+
+   return complex_out;
+}
diff --git a/tests/lldb/java/Android.mk b/tests/lldb/java/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/tests/lldb/java/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/tests/lldb/java/BranchingFunCalls/Android.mk b/tests/lldb/java/BranchingFunCalls/Android.mk
new file mode 100644
index 0000000..ce6ebce
--- /dev/null
+++ b/tests/lldb/java/BranchingFunCalls/Android.mk
@@ -0,0 +1,15 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := \
+	$(call all-java-files-under, src) \
+	$(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := BranchingFunCalls
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+
diff --git a/tests/lldb/java/BranchingFunCalls/AndroidManifest.xml b/tests/lldb/java/BranchingFunCalls/AndroidManifest.xml
new file mode 100644
index 0000000..fb83a04
--- /dev/null
+++ b/tests/lldb/java/BranchingFunCalls/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.branchingfuncalls">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="BranchingFunCalls"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
+
diff --git a/tests/lldb/java/BranchingFunCalls/res/layout/main_layout.xml b/tests/lldb/java/BranchingFunCalls/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/java/BranchingFunCalls/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/java/BranchingFunCalls/src/com/android/rs/branchingfuncalls/MainActivity.java b/tests/lldb/java/BranchingFunCalls/src/com/android/rs/branchingfuncalls/MainActivity.java
new file mode 100644
index 0000000..8263f57
--- /dev/null
+++ b/tests/lldb/java/BranchingFunCalls/src/com/android/rs/branchingfuncalls/MainActivity.java
@@ -0,0 +1,47 @@
+package com.android.rs.branchingfuncalls;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.renderscript.*;
+
+public class MainActivity extends Activity {
+    private RenderScript mRS;
+    private Allocation mInAllocation;
+    private Allocation mOutAllocation;
+    private ScriptC_scalars mScript;
+    private int mAllocSize = 256;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.main_layout);
+        createScript();
+        runScript();
+    }
+
+    private void createScript() {
+        mRS = RenderScript.create(this,
+            RenderScript.ContextType.NORMAL,
+            RenderScript.CREATE_FLAG_LOW_LATENCY |
+            RenderScript.CREATE_FLAG_WAIT_FOR_ATTACH);
+
+        Element e = Element.I32(mRS);
+        mInAllocation = Allocation.createSized(mRS, e, mAllocSize);
+        mOutAllocation = Allocation.createSized(mRS, e, mAllocSize);
+
+        mScript = new ScriptC_scalars(mRS);
+    }
+
+    private void runScript() {
+        mScript.invoke_addToGlobal(234);
+
+        int[] init = new int[mAllocSize];
+        for(int i = 0; i < mAllocSize; ++i) {
+            init[i] = i - (mAllocSize / 2);
+        }
+        mInAllocation.copy1DRangeFrom(0, mAllocSize, init);
+        mScript.forEach_simple_kernel(mInAllocation, mOutAllocation);
+    }
+}
+
diff --git a/tests/lldb/java/BranchingFunCalls/src/rs/scalars.rs b/tests/lldb/java/BranchingFunCalls/src/rs/scalars.rs
new file mode 100644
index 0000000..743b5b0
--- /dev/null
+++ b/tests/lldb/java/BranchingFunCalls/src/rs/scalars.rs
@@ -0,0 +1,60 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.branchingfuncalls)
+
+static bool is_neg(int a)
+{
+    if(a < 0)
+        return true;
+    else
+        return false;
+}
+
+static bool is_pos(int a)
+{
+    if(a > 0)
+        return true;
+    else
+        return false;
+}
+
+static void set_i(int * a, int b)
+{
+    int tmp = b;
+    *a = tmp;
+}
+
+static void modify_f(float * f)
+{
+    *f *= 0.5f;
+}
+
+static void modify_i(int * i)
+{
+    int j = *i;
+    int cutoff = 2 << 6;
+    if(j > cutoff)
+        j = cutoff;
+    if(is_neg(j))
+        set_i(i, 0);
+    else if(is_pos(j))
+        set_i(i, j);
+    else
+        set_i(i, cutoff);
+}
+
+int __attribute__((kernel)) simple_kernel(int in)
+{
+    int i = in;
+    float f = (float) i;
+    modify_f(&f);
+    modify_i(&i);
+    int ret = (int) f;
+    return in * ret;
+}
+
+int glob = 123;
+
+void addToGlobal(int arg)
+{
+    glob += arg;
+}
diff --git a/tests/lldb/java/DebugWaitAttach/Android.mk b/tests/lldb/java/DebugWaitAttach/Android.mk
new file mode 100644
index 0000000..15f1dbc
--- /dev/null
+++ b/tests/lldb/java/DebugWaitAttach/Android.mk
@@ -0,0 +1,13 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JavaDebugWaitAttach
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+
diff --git a/tests/lldb/java/DebugWaitAttach/AndroidManifest.xml b/tests/lldb/java/DebugWaitAttach/AndroidManifest.xml
new file mode 100644
index 0000000..862af28
--- /dev/null
+++ b/tests/lldb/java/DebugWaitAttach/AndroidManifest.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.waitattachdebug">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="JavaDebugWaitAttach"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/lldb/java/DebugWaitAttach/res/layout/main_layout.xml b/tests/lldb/java/DebugWaitAttach/res/layout/main_layout.xml
new file mode 100644
index 0000000..4ef172f
--- /dev/null
+++ b/tests/lldb/java/DebugWaitAttach/res/layout/main_layout.xml
@@ -0,0 +1,14 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
diff --git a/tests/lldb/java/DebugWaitAttach/src/com/android/rs/waitattachdebug/MainActivity.java b/tests/lldb/java/DebugWaitAttach/src/com/android/rs/waitattachdebug/MainActivity.java
new file mode 100644
index 0000000..16dd43e
--- /dev/null
+++ b/tests/lldb/java/DebugWaitAttach/src/com/android/rs/waitattachdebug/MainActivity.java
@@ -0,0 +1,56 @@
+package com.android.rs.waitattachdebug;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.widget.ImageView;
+import android.renderscript.*;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+    private ImageView mImageView;
+
+    private RenderScript mRS;
+    private Allocation mInAllocation;
+    private Allocation mOutAllocation;
+    private ScriptC_simple mScript;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.main_layout);
+
+        mBitmapIn = Bitmap.createBitmap(8, 8, Bitmap.Config.ARGB_8888);
+        mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(),
+                    mBitmapIn.getHeight(), mBitmapIn.getConfig());
+
+        mImageView = (ImageView) findViewById(R.id.imageView);
+        mImageView.setImageBitmap(mBitmapOut);
+
+        createScript();
+        updateImage(1.0f);
+    }
+
+    private void createScript() {
+        mRS = RenderScript.create(this,
+            RenderScript.ContextType.NORMAL,
+            RenderScript.CREATE_FLAG_LOW_LATENCY |
+            RenderScript.CREATE_FLAG_WAIT_FOR_ATTACH);
+
+        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn);
+        mOutAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
+
+        mScript = new ScriptC_simple(mRS);
+    }
+
+
+    private void updateImage(final float f) {
+        mScript.set_gColor(new Float4(0.9f, 0.8f, 0.5f, 1.0f));
+        mScript.forEach_simple_kernel(mInAllocation, mOutAllocation);
+        mOutAllocation.copyTo(mBitmapOut);
+        mScript.forEach_other_kernel(mInAllocation, mOutAllocation);
+    }
+}
+
diff --git a/tests/lldb/java/DebugWaitAttach/src/rs/simple.rs b/tests/lldb/java/DebugWaitAttach/src/rs/simple.rs
new file mode 100644
index 0000000..26e11c4
--- /dev/null
+++ b/tests/lldb/java/DebugWaitAttach/src/rs/simple.rs
@@ -0,0 +1,23 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.waitattachdebug)
+
+float4 gColor = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) simple_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColor;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
+
+// Extra kernel to test lldb setting breakpoints on all the RS kernels.
+uchar4 __attribute__((kernel)) other_kernel(uchar4 in)
+{
+    uchar4 result = in.wzyx;
+    return result;
+}
diff --git a/tests/lldb/java/InfiniteLoop/Android.mk b/tests/lldb/java/InfiniteLoop/Android.mk
new file mode 100644
index 0000000..d8bb4e1
--- /dev/null
+++ b/tests/lldb/java/InfiniteLoop/Android.mk
@@ -0,0 +1,12 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JavaInfiniteLoop
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
diff --git a/tests/lldb/java/InfiniteLoop/AndroidManifest.xml b/tests/lldb/java/InfiniteLoop/AndroidManifest.xml
new file mode 100644
index 0000000..ba846cd
--- /dev/null
+++ b/tests/lldb/java/InfiniteLoop/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.infiniteloop">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="InfiniteLoop"
+                 android:hardwareAccelerated="true">
+
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/lldb/java/InfiniteLoop/res/layout/main_layout.xml b/tests/lldb/java/InfiniteLoop/res/layout/main_layout.xml
new file mode 100755
index 0000000..4ef172f
--- /dev/null
+++ b/tests/lldb/java/InfiniteLoop/res/layout/main_layout.xml
@@ -0,0 +1,14 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
diff --git a/tests/lldb/java/InfiniteLoop/src/com/android/rs/infiniteloop/MainActivity.java b/tests/lldb/java/InfiniteLoop/src/com/android/rs/infiniteloop/MainActivity.java
new file mode 100644
index 0000000..91fca6f
--- /dev/null
+++ b/tests/lldb/java/InfiniteLoop/src/com/android/rs/infiniteloop/MainActivity.java
@@ -0,0 +1,158 @@
+package com.android.rs.infiniteloop;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.widget.ImageView;
+import android.renderscript.*;
+
+import java.util.Random;
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class MainActivity extends Activity {
+    /* Number of bitmaps that are used for renderScript thread and UI thread synchronization.
+       Ideally, this can be reduced to 2, however in some devices, 2 buffers still showing tearing on UI.
+     */
+    private final int NUM_BITMAPS = 3;
+    private int mCurrentBitmap = 0;
+    private Bitmap mBitmapIn;
+    private Bitmap[] mBitmapsOut;
+    private ImageView mImageView;
+    private Random mRand;
+
+    private RenderScript mRS;
+    private Allocation mInAllocation;
+    private Allocation[] mOutAllocations;
+    private ScriptC_infiniteloop mScript;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.main_layout);
+        mRand = new Random();
+
+        /*
+         * Initialize UI
+         */
+        mBitmapIn = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
+        mBitmapsOut = new Bitmap[NUM_BITMAPS];
+        for (int i = 0; i < NUM_BITMAPS; ++i) {
+            mBitmapsOut[i] = Bitmap.createBitmap(mBitmapIn.getWidth(),
+                    mBitmapIn.getHeight(), mBitmapIn.getConfig());
+        }
+
+        mImageView = (ImageView) findViewById(R.id.imageView);
+        mImageView.setImageBitmap(mBitmapsOut[mCurrentBitmap]);
+        mCurrentBitmap += (mCurrentBitmap + 1) % NUM_BITMAPS;
+
+        /*
+         * Create renderScript
+         */
+        createScript();
+
+        /*
+         * Invoke renderScript kernel and update imageView
+         */
+        updateImage(1.0f);
+
+        Timer t = new Timer();
+        t.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                updateImage(1.f);
+            }
+        }, 2000, 2000);
+    }
+
+    /*
+     * Initialize RenderScript
+     * In the sample, it creates RenderScript kernel that performs saturation manipulation.
+     */
+    private void createScript() {
+        // Initialize RS
+        mRS = RenderScript.create(this,
+            RenderScript.ContextType.NORMAL,
+            RenderScript.CREATE_FLAG_LOW_LATENCY);
+
+        // Allocate buffers
+        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn);
+        mOutAllocations = new Allocation[NUM_BITMAPS];
+        for (int i = 0; i < NUM_BITMAPS; ++i) {
+            mOutAllocations[i] = Allocation.createFromBitmap(mRS, mBitmapsOut[i]);
+        }
+
+        // Load script
+        mScript = new ScriptC_infiniteloop(mRS);
+    }
+
+    /*
+     * In the AsyncTask, it invokes a simple RenderScript kernel.
+     * After the kernel is done, an operation blocks at Allocation.copyTo() in AsyncTask thread.
+     * Once operations are finished and we reach onPostExecute() in the UI thread,
+     * it can invalidate and update the ImageView UI.
+     */
+    private class RenderScriptTask extends AsyncTask<Float, Integer, Integer> {
+        Boolean issued = false;
+
+        protected Integer doInBackground(Float... values) {
+            int index = -1;
+            if (isCancelled() == false) {
+                issued = true;
+                index = mCurrentBitmap;
+
+                /*
+                 * Set global variable in RS
+                 */
+                mScript.set_gColour(new Float4(mRand.nextFloat(), mRand.nextFloat(),
+                        mRand.nextFloat(), 1.f));
+
+                /*
+                 * Invoke saturation filter kernel
+                 */
+                mScript.forEach_simple_kernel(mInAllocation, mOutAllocations[index]);
+
+                /*
+                 * Copy to bitmap and invalidate image view
+                 */
+                mOutAllocations[index].copyTo(mBitmapsOut[index]);
+                mCurrentBitmap = (mCurrentBitmap + 1) % NUM_BITMAPS;
+            }
+            return index;
+        }
+
+        void updateView(Integer result) {
+            if (result != -1) {
+                // Request UI update
+                mImageView.setImageBitmap(mBitmapsOut[result]);
+                mImageView.invalidate();
+            }
+        }
+
+        protected void onPostExecute(Integer result) {
+            updateView(result);
+        }
+
+        protected void onCancelled(Integer result) {
+            if (issued) {
+                updateView(result);
+            }
+        }
+    }
+
+    RenderScriptTask currentTask = null;
+
+    /*
+     * Invoke AsyncTask and cancel the previous task.
+     * When AsyncTasks are piled up (typically in slow device with heavy kernel),
+     * only the latest (and already started) task invokes RenderScript operation.
+     */
+    private void updateImage(final float f) {
+        if (currentTask != null)
+            currentTask.cancel(false);
+        currentTask = new RenderScriptTask();
+        currentTask.execute(f);
+    }
+}
diff --git a/tests/lldb/java/InfiniteLoop/src/com/android/rs/infiniteloop/infiniteloop.rs b/tests/lldb/java/InfiniteLoop/src/com/android/rs/infiniteloop/infiniteloop.rs
new file mode 100644
index 0000000..8866dd9
--- /dev/null
+++ b/tests/lldb/java/InfiniteLoop/src/com/android/rs/infiniteloop/infiniteloop.rs
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.infiniteloop)
+#pragma rs_fp_relaxed
+
+float4 gColour = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) simple_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColour;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
diff --git a/tests/lldb/java/KernelVariables/Android.mk b/tests/lldb/java/KernelVariables/Android.mk
new file mode 100644
index 0000000..c562e76
--- /dev/null
+++ b/tests/lldb/java/KernelVariables/Android.mk
@@ -0,0 +1,13 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := KernelVariables
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+
diff --git a/tests/lldb/java/KernelVariables/AndroidManifest.xml b/tests/lldb/java/KernelVariables/AndroidManifest.xml
new file mode 100644
index 0000000..a1e2a74
--- /dev/null
+++ b/tests/lldb/java/KernelVariables/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.kernelvariables">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="KernelVariables"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
+
diff --git a/tests/lldb/java/KernelVariables/res/layout/main_layout.xml b/tests/lldb/java/KernelVariables/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/java/KernelVariables/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/java/KernelVariables/src/com/android/rs/kernelvariables/MainActivity.java b/tests/lldb/java/KernelVariables/src/com/android/rs/kernelvariables/MainActivity.java
new file mode 100644
index 0000000..3f167b4
--- /dev/null
+++ b/tests/lldb/java/KernelVariables/src/com/android/rs/kernelvariables/MainActivity.java
@@ -0,0 +1,94 @@
+package com.android.rs.kernelvariables;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.ImageFormat;
+import android.os.Bundle;
+import android.widget.ImageView;
+import android.renderscript.*;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+    private ImageView mImageView;
+
+    private RenderScript mRS;
+    private Allocation mInAllocation;
+    private Allocation mOutAllocation;
+    private ScriptC_simple mScript;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.main_layout);
+
+        mBitmapIn = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
+        mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(),
+                    mBitmapIn.getHeight(), mBitmapIn.getConfig());
+
+        mImageView = (ImageView) findViewById(R.id.imageView);
+        mImageView.setImageBitmap(mBitmapOut);
+
+        createScript();
+        updateImage();
+    }
+
+    private void createScript() {
+        mRS = RenderScript.create(this,
+            RenderScript.ContextType.NORMAL,
+            RenderScript.CREATE_FLAG_LOW_LATENCY |
+            RenderScript.CREATE_FLAG_WAIT_FOR_ATTACH);
+
+        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn);
+        mOutAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
+
+        mScript = new ScriptC_simple(mRS);
+    }
+
+    private void updateImage() {
+        int[] buffer_int = {1, 2, 3, 4};
+        Allocation int_allocation = Allocation.createSized(mRS, Element.I32(mRS), 4);
+        int_allocation.copyFrom(buffer_int);
+        mScript.set_allocation_1D_global(int_allocation);
+
+        int[] buffer_int2 = {5, 6, 7, 8};
+
+        Type.Builder typeI32Builder2D = new Type.Builder(mRS, Element.I32(mRS));
+        typeI32Builder2D.setX(2);
+        typeI32Builder2D.setY(2);
+
+        Allocation int_allocation2 = Allocation.createTyped(mRS, typeI32Builder2D.create());
+        int_allocation2.copyFrom(buffer_int2);
+        mScript.set_allocation_1D_global2(int_allocation2);
+
+        mScript.set_allocation_2D_global(mInAllocation);
+        mScript.set_allocation_2D_global2(mOutAllocation);
+
+        int[] buffer_int3 = new int[64];
+
+        for (int i=0; i<4*4*4; ++i)
+            buffer_int3[i] = 9 + i;
+
+        Type.Builder typeI32Builder3D = new Type.Builder(mRS, Element.I32(mRS));
+        typeI32Builder3D.setX(4);
+        typeI32Builder3D.setY(4);
+        typeI32Builder3D.setZ(4);
+
+        Allocation int_allocation3 = Allocation.createTyped(mRS, typeI32Builder3D.create());
+        int_allocation3.copyFrom(buffer_int3);
+        mScript.set_allocation_3D_global(int_allocation3);
+
+        Type.Builder yuvTypeBuilder = new Type.Builder(mRS, Element.YUV(mRS));
+        yuvTypeBuilder.setX(4);
+        yuvTypeBuilder.setY(4);
+        yuvTypeBuilder.setYuvFormat(ImageFormat.YV12);
+        Allocation yuv_allocation = Allocation.createTyped(mRS, yuvTypeBuilder.create());
+        mScript.set_allocation_YUV_2D_global(yuv_allocation);
+
+        mScript.set_sampler_global(Sampler.CLAMP_LINEAR(mRS));
+
+        mScript.forEach_kernel(mInAllocation, mOutAllocation);
+        mOutAllocation.copyTo(mBitmapOut);
+    }
+}
diff --git a/tests/lldb/java/KernelVariables/src/rs/simple.rs b/tests/lldb/java/KernelVariables/src/rs/simple.rs
new file mode 100644
index 0000000..5f55ae8
--- /dev/null
+++ b/tests/lldb/java/KernelVariables/src/rs/simple.rs
@@ -0,0 +1,160 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.kernelvariables)
+
+char char_global = 12;
+uchar uchar_global = 234;
+short short_global = -321;
+ushort ushort_global = 432;
+int int_global = 1234;
+uint uint_global = 2345;
+float float_global = 4.5f;
+long long_global = -77777;
+ulong ulong_global = 8888;
+double double_global = -456.5f;
+
+char2 char2_global = {11, -22};
+uchar2 uchar2_global = {33, 44};
+short2 short2_global = {-555, 666};
+ushort2 ushort2_global = {777, 888};
+int2 int2_global = {999, -1111};
+uint2 uint2_global = {2222, 3333};
+float2 float2_global = {4.5f, -5.0f};
+long2 long2_global = {-4444, 5555};
+ulong2 ulong2_global = {6666, 7777};
+double2 double2_global = {88.5f, -99.0f};
+
+char3 char3_global = {11, -22, -33};
+uchar3 uchar3_global = {33, 44, 55};
+short3 short3_global = {-555, 666, 777};
+ushort3 ushort3_global = {777, 888, 999};
+int3 int3_global = {999, -1111, 2222};
+uint3 uint3_global = {2222, 3333, 4444};
+float3 float3_global = {4.5f, -5.0f, -6.5f};
+long3 long3_global = {-4444, 5555, 6666};
+ulong3 ulong3_global = {6666, 7777, 8888};
+double3 double3_global = {88.5f, -99.0f, 111.5f};
+
+char4 char4_global = {55, 11, -22, -33};
+uchar4 uchar4_global = {222, 33, 44, 55};
+short4 short4_global = {-444, -555, 666, 777};
+ushort4 ushort4_global = {666, 777, 888, 999};
+int4 int4_global = {888, 999, -1111, 2222};
+uint4 uint4_global = {1111, 2222, 3333, 4444};
+float4 float4_global = {3.0f, 4.5f, -5.0f, -6.5f};
+long4 long4_global = {-3333, -4444, 5555, 6666};
+ulong4 ulong4_global = {5555, 6666, 7777, 8888};
+double4 double4_global = {-77.0f, 88.5f, -99.0f, 111.5f};
+
+rs_matrix2x2 matrix2x2_global;
+rs_matrix3x3 matrix3x3_global;
+rs_matrix4x4 matrix4x4_global;
+
+rs_quaternion quaternion_global;
+
+rs_allocation allocation_1D_global;
+rs_allocation allocation_1D_global2;
+rs_allocation allocation_2D_global;
+rs_allocation allocation_2D_global2;
+rs_allocation allocation_3D_global;
+rs_allocation allocation_YUV_2D_global;
+
+rs_allocation_cubemap_face cubemap_face_global;
+rs_sampler sampler_global;
+
+uchar4 __attribute__((kernel)) kernel(uchar4 in)
+{
+    char char_local = 'a';
+    uchar uchar_local = 'b';
+    short short_local = -321;
+    ushort ushort_local = 432;
+    int int_local = 1234;
+    uint uint_local = 2345;
+    float float_local = 4.5f;
+    long long_local = -77777;
+    ulong ulong_local = 8888;
+    double double_local = -456.5f;
+
+    char2 char2_local = {-11, -22};
+    uchar2 uchar2_local = {33, 44};
+    short2 short2_local = {-555, 666};
+    ushort2 ushort2_local = {777, 888};
+    int2 int2_local = {999, -1111};
+    uint2 uint2_local = {2222, 3333};
+    float2 float2_local = {4.5f, -5.0f};
+    long2 long2_local = {-4444, 5555};
+    ulong2 ulong2_local = {6666, 7777};
+    double2 double2_local = {88.5f, -99.0f};
+
+    char3 char3_local = {11, -22, -33};
+    uchar3 uchar3_local = {33, 44, 55};
+    short3 short3_local = {-555, 666, 777};
+    ushort3 ushort3_local = {777, 888, 999};
+    int3 int3_local = {999, -1111, 2222};
+    uint3 uint3_local = {2222, 3333, 4444};
+    float3 float3_local = {4.5f, -5.0f, -6.5f};
+    long3 long3_local = {-4444, 5555, 6666};
+    ulong3 ulong3_local = {6666, 7777, 8888};
+    double3 double3_local = {88.5f, -99.0f, 111.5f};
+
+    char4 char4_local = {55, 11, -22, -33};
+    uchar4 uchar4_local = {22, 33, 44, 55};
+    short4 short4_local = {-444, -555, 666, 777};
+    ushort4 ushort4_local = {666, 777, 888, 999};
+    int4 int4_local = {888, 999, -1111, 2222};
+    uint4 uint4_local = {1111, 2222, 3333, 4444};
+    float4 float4_local = {3.0f, 4.5f, -5.0f, -6.5f};
+    long4 long4_local = {-3333, -4444, 5555, 6666};
+    ulong4 ulong4_local = {5555, 6666, 7777, 8888};
+    double4 double4_local = {-77.0f, 88.5f, -99.0f, 111.5f};
+
+    rs_matrix2x2 matrix2x2_local = {{1., 2.5,
+                                     3., 4.5}};
+    rs_matrix3x3 matrix3x3_local = {{5., 6.5, 7.,
+                                     8.5, 9., 1.5,
+                                     2., 3.5, 4.}};
+    rs_matrix4x4 matrix4x4_local = {{5.5, 6., 7.5, 8.,
+                                     9., 1.5, 2., 3.5,
+                                     4.5, 5.5, 6.5, 7.,
+                                     8., 9.5, 1.5, 2.5}};
+
+    matrix2x2_global = matrix2x2_local;
+    matrix3x3_global = matrix3x3_local;
+    matrix4x4_global = matrix4x4_local;
+
+    rsQuaternionSet(&quaternion_global, 3.0, 4.5, 5.5, 6.0);
+
+    rs_quaternion quaternion_local;
+    rsQuaternionSet(&quaternion_local, 7.5, 8.0, 9.0, 0.5);
+
+    char char_combined = char_local + (char)uchar_local + char2_local.x +
+        (char)uchar2_local.x + char3_local.x - (char)uchar3_local.x +
+        char4_local.x + (char)uchar4_local.x;
+
+    short short_combined = short_local + (short)ushort_local + short2_local.x +
+        (short)ushort2_local.x + short3_local.x + (short)ushort3_local.x +
+        short4_local.x + (short)ushort4_local.x;
+
+    int int_combined = int_local + (int)uint_local + int2_local.x +
+        (int)uint2_local.x + int3_local.x + (int)uint3_local.x + int4_local.x +
+        (int)uint4_local.x;
+
+    float float_combined = float_local + float2_local.x + float3_local.x +
+        float4_local.x;
+
+    long long_combined = long_local + (long)ulong_local + long2_local.x +
+        (long)ulong2_local.x + long3_local.x + (long)ulong3_local.x +
+        long4_local.x + (long)ulong4_local.x;
+
+    double double_combined = double_local + double2_local.x + double3_local.x +
+        double4_local.x;
+
+    char_global = char_combined;
+    short_global = short_combined;
+    int_global = int_combined;
+    float_global = float_combined;
+    long_global = long_combined;
+    double_global = double_combined;
+
+    uchar4 result = {1,2,3,4};
+    return result;
+}
diff --git a/tests/lldb/java/MultipleRSFiles/Android.mk b/tests/lldb/java/MultipleRSFiles/Android.mk
new file mode 100644
index 0000000..cd2295b
--- /dev/null
+++ b/tests/lldb/java/MultipleRSFiles/Android.mk
@@ -0,0 +1,13 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := MultipleRSFiles
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+
diff --git a/tests/lldb/java/MultipleRSFiles/AndroidManifest.xml b/tests/lldb/java/MultipleRSFiles/AndroidManifest.xml
new file mode 100644
index 0000000..5a83901
--- /dev/null
+++ b/tests/lldb/java/MultipleRSFiles/AndroidManifest.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.multiplersfiles">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="MultipleRSFiles"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/lldb/java/MultipleRSFiles/res/layout/main_layout.xml b/tests/lldb/java/MultipleRSFiles/res/layout/main_layout.xml
new file mode 100644
index 0000000..4ef172f
--- /dev/null
+++ b/tests/lldb/java/MultipleRSFiles/res/layout/main_layout.xml
@@ -0,0 +1,14 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
diff --git a/tests/lldb/java/MultipleRSFiles/src/com/android/rs/multiplersfiles/MainActivity.java b/tests/lldb/java/MultipleRSFiles/src/com/android/rs/multiplersfiles/MainActivity.java
new file mode 100644
index 0000000..522adce
--- /dev/null
+++ b/tests/lldb/java/MultipleRSFiles/src/com/android/rs/multiplersfiles/MainActivity.java
@@ -0,0 +1,58 @@
+package com.android.rs.multiplersfiles;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.widget.ImageView;
+import android.renderscript.*;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+    private ImageView mImageView;
+
+    private RenderScript mRS;
+    private Allocation mInAllocation;
+    private Allocation mOutAllocation;
+    private ScriptC_first mFirstScript;
+    private ScriptC_second mSecondScript;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.main_layout);
+
+        mBitmapIn = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
+        mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(),
+                    mBitmapIn.getHeight(), mBitmapIn.getConfig());
+
+        mImageView = (ImageView) findViewById(R.id.imageView);
+        mImageView.setImageBitmap(mBitmapOut);
+
+        createScript();
+        updateImage(1.0f);
+    }
+
+    private void createScript() {
+        mRS = RenderScript.create(this,
+            RenderScript.ContextType.NORMAL,
+            RenderScript.CREATE_FLAG_LOW_LATENCY |
+            RenderScript.CREATE_FLAG_WAIT_FOR_ATTACH);
+
+        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn);
+        mOutAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
+
+        mFirstScript = new ScriptC_first(mRS);
+        mSecondScript = new ScriptC_second(mRS);
+    }
+
+
+    private void updateImage(final float f) {
+        mFirstScript.set_gColor(new Float4(0.9f, 0.8f, 0.5f, 1.0f));
+        mFirstScript.forEach_first_kernel(mInAllocation, mOutAllocation);
+        mOutAllocation.copyTo(mBitmapOut);
+        mSecondScript.forEach_second_kernel(mInAllocation, mOutAllocation);
+    }
+}
+
diff --git a/tests/lldb/java/MultipleRSFiles/src/rs/first.rs b/tests/lldb/java/MultipleRSFiles/src/rs/first.rs
new file mode 100644
index 0000000..c0c37d5
--- /dev/null
+++ b/tests/lldb/java/MultipleRSFiles/src/rs/first.rs
@@ -0,0 +1,16 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.multiplersfiles)
+
+float4 gColor = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) first_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColor;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
diff --git a/tests/lldb/java/MultipleRSFiles/src/rs/second.rs b/tests/lldb/java/MultipleRSFiles/src/rs/second.rs
new file mode 100644
index 0000000..6b33289
--- /dev/null
+++ b/tests/lldb/java/MultipleRSFiles/src/rs/second.rs
@@ -0,0 +1,9 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.multiplersfiles)
+
+/* RenderScript kernel that just returns the swizzled input. */
+uchar4 __attribute__((kernel)) second_kernel(uchar4 in)
+{
+    uchar4 result = in.wzyx;
+    return result;
+}
diff --git a/tests/lldb/java/NoDebugWaitAttach/Android.mk b/tests/lldb/java/NoDebugWaitAttach/Android.mk
new file mode 100644
index 0000000..64e32ed
--- /dev/null
+++ b/tests/lldb/java/NoDebugWaitAttach/Android.mk
@@ -0,0 +1,11 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JavaNoDebugWaitAttach
+
+include $(BUILD_PACKAGE)
+
diff --git a/tests/lldb/java/NoDebugWaitAttach/AndroidManifest.xml b/tests/lldb/java/NoDebugWaitAttach/AndroidManifest.xml
new file mode 100644
index 0000000..dbc31a5
--- /dev/null
+++ b/tests/lldb/java/NoDebugWaitAttach/AndroidManifest.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.waitattachnodebug">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="JavaNoDebugWaitAttach"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/lldb/java/NoDebugWaitAttach/res/layout/main_layout.xml b/tests/lldb/java/NoDebugWaitAttach/res/layout/main_layout.xml
new file mode 100644
index 0000000..4ef172f
--- /dev/null
+++ b/tests/lldb/java/NoDebugWaitAttach/res/layout/main_layout.xml
@@ -0,0 +1,14 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
diff --git a/tests/lldb/java/NoDebugWaitAttach/src/com/android/rs/waitattachnodebug/MainActivity.java b/tests/lldb/java/NoDebugWaitAttach/src/com/android/rs/waitattachnodebug/MainActivity.java
new file mode 100644
index 0000000..3b69f05
--- /dev/null
+++ b/tests/lldb/java/NoDebugWaitAttach/src/com/android/rs/waitattachnodebug/MainActivity.java
@@ -0,0 +1,55 @@
+package com.android.rs.waitattachnodebug;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.widget.ImageView;
+import android.renderscript.*;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+    private ImageView mImageView;
+
+    private RenderScript mRS;
+    private Allocation mInAllocation;
+    private Allocation mOutAllocation;
+    private ScriptC_simple mScript;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.main_layout);
+
+        mBitmapIn = Bitmap.createBitmap(8, 8, Bitmap.Config.ARGB_8888);
+        mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(),
+                    mBitmapIn.getHeight(), mBitmapIn.getConfig());
+
+        mImageView = (ImageView) findViewById(R.id.imageView);
+        mImageView.setImageBitmap(mBitmapOut);
+
+        createScript();
+        updateImage(1.0f);
+    }
+
+    private void createScript() {
+        mRS = RenderScript.create(this,
+            RenderScript.ContextType.NORMAL,
+            RenderScript.CREATE_FLAG_LOW_LATENCY |
+            RenderScript.CREATE_FLAG_WAIT_FOR_ATTACH);
+
+        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn);
+        mOutAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
+
+        mScript = new ScriptC_simple(mRS);
+    }
+
+
+    private void updateImage(final float f) {
+        mScript.set_gColor(new Float4(0.9f, 0.8f, 0.5f, 1.0f));
+        mScript.forEach_simple_kernel(mInAllocation, mOutAllocation);
+        mOutAllocation.copyTo(mBitmapOut);
+    }
+}
+
diff --git a/tests/lldb/java/NoDebugWaitAttach/src/rs/simple.rs b/tests/lldb/java/NoDebugWaitAttach/src/rs/simple.rs
new file mode 100644
index 0000000..bacbd23
--- /dev/null
+++ b/tests/lldb/java/NoDebugWaitAttach/src/rs/simple.rs
@@ -0,0 +1,17 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.waitattachnodebug)
+
+float4 gColor = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) simple_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColor;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
+
diff --git a/tests/lldb/jni/Allocations/Android.mk b/tests/lldb/jni/Allocations/Android.mk
new file mode 100644
index 0000000..81695a0
--- /dev/null
+++ b/tests/lldb/jni/Allocations/Android.mk
@@ -0,0 +1,17 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+                   $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JNIAllocations
+
+LOCAL_JNI_SHARED_LIBRARIES := libjniallocations
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+include $(LOCAL_PATH)/jniallocations/Android.mk
+
diff --git a/tests/lldb/jni/Allocations/AndroidManifest.xml b/tests/lldb/jni/Allocations/AndroidManifest.xml
new file mode 100644
index 0000000..e73799f
--- /dev/null
+++ b/tests/lldb/jni/Allocations/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.jniallocations">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="JNIAllocations"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
+
diff --git a/tests/lldb/jni/Allocations/jniallocations/Android.mk b/tests/lldb/jni/Allocations/jniallocations/Android.mk
new file mode 100644
index 0000000..5fc1580
--- /dev/null
+++ b/tests/lldb/jni/Allocations/jniallocations/Android.mk
@@ -0,0 +1,26 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := libjniallocations
+
+LOCAL_SRC_FILES := jniallocations.cpp allocs.rs
+
+LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+
+LOCAL_CFLAGS := --std=c++11
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_CPP_FEATURES += exceptions
+
+LOCAL_SHARED_LIBRARIES := libdl liblog
+LOCAL_STATIC_LIBRARIES := libRScpp_static libcompiler_rt
+
+LOCAL_SDK_VERSION := 23
+LOCAL_NDK_STL_VARIANT := c++_static
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/tests/lldb/jni/Allocations/jniallocations/allocs.rs b/tests/lldb/jni/Allocations/jniallocations/allocs.rs
new file mode 100644
index 0000000..65d98f4
--- /dev/null
+++ b/tests/lldb/jni/Allocations/jniallocations/allocs.rs
@@ -0,0 +1,31 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.jniallocations)
+
+// Kernel performs basic vector swizzle
+uchar4 __attribute__((kernel)) swizzle_kernel(uchar4 in)
+{
+    return in.wzyx;
+}
+
+// Kernel squares every element in allocation
+uint __attribute__((kernel)) square_kernel(ushort in)
+{
+    uint result = (uint)(in) * (uint)in;
+    return result;
+}
+
+// Helper function adding 1/2 to passed in double
+static double half_helper(double in)
+{
+    return (in + 0.5);
+}
+
+// Kernel returns first 3 elements of a double4 plus 1/2
+double3 __attribute__((kernel)) add_half_kernel(double4 in)
+{
+    double3 result;
+    result.x = half_helper(in.x);
+    result.y = half_helper(in.y);
+    result.z = half_helper(in.z);
+    return result;
+}
diff --git a/tests/lldb/jni/Allocations/jniallocations/jniallocations.cpp b/tests/lldb/jni/Allocations/jniallocations/jniallocations.cpp
new file mode 100644
index 0000000..ef66237
--- /dev/null
+++ b/tests/lldb/jni/Allocations/jniallocations/jniallocations.cpp
@@ -0,0 +1,411 @@
+#include <memory>
+
+#include <jni.h>
+#include <RenderScript.h>
+
+#include "ScriptC_allocs.h"
+
+using namespace android;
+using namespace RSC;
+
+sp<RS> mRS;
+
+sp<Allocation> mBoolAllocation;  // boolean
+
+sp<Allocation> mCharAllocation;  // char
+sp<Allocation> mChar2Allocation;   // char2
+sp<Allocation> mChar3Allocation;   // char3
+sp<Allocation> mChar4Allocation;   // char4
+
+sp<Allocation> mUCharAllocation;   // uchar
+sp<Allocation> mUChar2Allocation;  // uchar2
+sp<Allocation> mUChar3Allocation;  // uchar3
+sp<Allocation> mUChar4Allocation;  // uchar4
+
+sp<Allocation> mShortAllocation;   // short
+sp<Allocation> mShort2Allocation;  // short2
+sp<Allocation> mShort3Allocation;  // short3
+sp<Allocation> mShort4Allocation;  // short4
+
+sp<Allocation> mUShortAllocation;  // ushort
+sp<Allocation> mUShort2Allocation; // ushort2
+sp<Allocation> mUShort3Allocation; // ushort3
+sp<Allocation> mUShort4Allocation; // ushort4
+
+sp<Allocation> mIntAllocation;   // int
+sp<Allocation> mInt2Allocation;  // int2
+sp<Allocation> mInt3Allocation;  // int3
+sp<Allocation> mInt4Allocation;  // int4
+
+sp<Allocation> mUIntAllocation;  // uint
+sp<Allocation> mUInt2Allocation;   // uint2
+sp<Allocation> mUInt3Allocation;   // uint3
+sp<Allocation> mUInt4Allocation;   // uint4
+
+sp<Allocation> mLongAllocation;  // long
+sp<Allocation> mLong2Allocation;   // long2
+sp<Allocation> mLong3Allocation;   // long3
+sp<Allocation> mLong4Allocation;   // long4
+
+sp<Allocation> mULongAllocation;   // ulong
+sp<Allocation> mULong2Allocation;  // ulong2
+sp<Allocation> mULong3Allocation;  // ulong3
+sp<Allocation> mULong4Allocation;  // ulong4
+
+sp<Allocation> mHalfAllocation;  // half
+sp<Allocation> mHalf2Allocation;   // half2
+sp<Allocation> mHalf3Allocation;   // half3
+sp<Allocation> mHalf4Allocation;   // half4
+
+sp<Allocation> mFloatAllocation;   // float
+sp<Allocation> mFloat2Allocation;  // float2
+sp<Allocation> mFloat3Allocation;  // float3
+sp<Allocation> mFloat4Allocation;  // float4
+
+sp<Allocation> mDoubleAllocation;  // double
+sp<Allocation> mDouble2Allocation; // double2
+sp<Allocation> mDouble3Allocation; // double3
+sp<Allocation> mDouble4Allocation; // double4
+
+const int mAllocSize = 24; // Needs to be < CHAR_MAX and divisible by 4.
+const int mBitmapSize = 64;
+
+void createSignedAllocations() {
+    Type::Builder typeI8Builder(mRS, Element::I8(mRS));
+    typeI8Builder.setX(1); // One element here to test 16 byte memory alignment
+    typeI8Builder.setY(3);
+    typeI8Builder.setZ(8);
+
+    mCharAllocation = Allocation::createTyped(mRS, typeI8Builder.create());
+    mChar2Allocation = Allocation::createSized(mRS, Element::I8_2(mRS), mAllocSize / 2);
+    mChar3Allocation = Allocation::createSized(mRS, Element::I8_3(mRS), mAllocSize / 4);
+    mChar4Allocation = Allocation::createSized(mRS, Element::I8_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeI16_2Builder(mRS, Element::I16_2(mRS));
+    typeI16_2Builder.setX(6);
+    typeI16_2Builder.setY(1);
+    typeI16_2Builder.setZ(2);
+
+    mShortAllocation = Allocation::createSized(mRS, Element::I16(mRS), mAllocSize);
+    mShort2Allocation = Allocation::createTyped(mRS, typeI16_2Builder.create());
+    mShort3Allocation = Allocation::createSized(mRS, Element::I16_3(mRS), mAllocSize / 4);
+    mShort4Allocation = Allocation::createSized(mRS, Element::I16_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeI32_3Builder(mRS, Element::I32_3(mRS));
+    typeI32_3Builder.setX(3);
+    typeI32_3Builder.setY(2);
+
+    mIntAllocation = Allocation::createSized(mRS, Element::I32(mRS), mAllocSize);
+    mInt2Allocation = Allocation::createSized(mRS, Element::I32_2(mRS), mAllocSize / 2);
+    mInt3Allocation = Allocation::createTyped(mRS, typeI32_3Builder.create());
+    mInt4Allocation = Allocation::createSized(mRS, Element::I32_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeI64_4Builder(mRS, Element::I64_4(mRS));
+    typeI64_4Builder.setX(1);
+    typeI64_4Builder.setY(6);
+
+    mLongAllocation = Allocation::createSized(mRS, Element::I64(mRS), mAllocSize);
+    mLong2Allocation = Allocation::createSized(mRS, Element::I64_2(mRS), mAllocSize / 2);
+    mLong3Allocation = Allocation::createSized(mRS, Element::I64_3(mRS), mAllocSize / 4);
+    mLong4Allocation = Allocation::createTyped(mRS, typeI64_4Builder.create());
+
+    mBoolAllocation = Allocation::createSized(mRS, Element::BOOLEAN(mRS), mAllocSize);
+}
+
+void initSignedAllocations() {
+    char *buffer_char = new char[mAllocSize];
+    short *buffer_short = new short[mAllocSize];
+    int *buffer_int = new int[mAllocSize];
+    int64_t *buffer_long = new int64_t[mAllocSize];
+    char *buffer_bool = new char[mAllocSize];
+
+    for(int i = 0; i < mAllocSize; ++i) {
+        buffer_char[i] = (char) i;
+        buffer_short[i] = (short) i;
+        buffer_int[i] = (int) i;
+        buffer_long[i] = (int64_t) i;
+        buffer_bool[i] =  (char) (0x01 & i);
+    }
+
+    mCharAllocation->copy3DRangeFrom(0, 0, 0, 1, 3, 8, buffer_char);
+    mChar2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_char);
+    mChar3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_char);
+    mChar4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_char);
+
+    delete [] buffer_char;
+
+    mShortAllocation->copy1DRangeFrom(0, mAllocSize, buffer_short);
+    mShort2Allocation->copy3DRangeFrom(0, 0, 0, 6, 1, 2, buffer_short);
+    mShort3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_short);
+    mShort4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_short);
+
+    delete [] buffer_short;
+
+    mIntAllocation->copy1DRangeFrom(0, mAllocSize, buffer_int);
+    mInt2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_int);
+    mInt3Allocation->copy2DRangeFrom(0, 0, 3, 2, buffer_int);
+    mInt4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_int);
+
+    delete [] buffer_int;
+
+    mLongAllocation->copy1DRangeFrom(0, mAllocSize, buffer_long);
+    mLong2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_long);
+    mLong3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_long);
+    mLong4Allocation->copy2DRangeFrom(0, 0, 1, 6, buffer_long);
+
+    delete [] buffer_long;
+
+    mBoolAllocation->copy1DRangeFrom(0, mAllocSize, buffer_bool);
+
+    delete [] buffer_bool;
+}
+
+void createUnsignedAllocations() {
+    Type::Builder typeU8_2Builder(mRS, Element::U8_2(mRS));
+    typeU8_2Builder.setX(2);
+    typeU8_2Builder.setY(6);
+
+    mUCharAllocation = Allocation::createSized(mRS, Element::U8(mRS), mAllocSize);
+    mUChar2Allocation = Allocation::createTyped(mRS, typeU8_2Builder.create());
+    mUChar3Allocation = Allocation::createSized(mRS, Element::U8_3(mRS), mAllocSize / 4);
+    mUChar4Allocation = Allocation::createSized(mRS, Element::U8_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeU16_3Builder(mRS, Element::U16_3(mRS));
+    typeU16_3Builder.setX(1);
+    typeU16_3Builder.setY(6);
+
+    mUShortAllocation = Allocation::createSized(mRS, Element::U16(mRS), mAllocSize);
+    mUShort2Allocation = Allocation::createSized(mRS, Element::U16_2(mRS), mAllocSize / 2);
+    mUShort3Allocation = Allocation::createTyped(mRS, typeU16_3Builder.create());
+    mUShort4Allocation = Allocation::createSized(mRS, Element::U16_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeU32_4Builder(mRS, Element::U32_4(mRS));
+    typeU32_4Builder.setX(1);
+    typeU32_4Builder.setY(1);
+    typeU32_4Builder.setZ(6);
+
+    mUIntAllocation = Allocation::createSized(mRS, Element::U32(mRS), mAllocSize);
+    mUInt2Allocation = Allocation::createSized(mRS, Element::U32_2(mRS), mAllocSize / 2);
+    mUInt3Allocation = Allocation::createSized(mRS, Element::U32_3(mRS), mAllocSize / 4);
+    mUInt4Allocation = Allocation::createTyped(mRS, typeU32_4Builder.create());
+
+    Type::Builder typeU64Builder(mRS, Element::U64(mRS));
+    typeU64Builder.setX(4);
+    typeU64Builder.setY(3);
+    typeU64Builder.setZ(2);
+
+    mULongAllocation = Allocation::createTyped(mRS, typeU64Builder.create());
+    mULong2Allocation = Allocation::createSized(mRS, Element::U64_2(mRS), mAllocSize / 2);
+    mULong3Allocation = Allocation::createSized(mRS, Element::U64_3(mRS), mAllocSize / 4);
+    mULong4Allocation = Allocation::createSized(mRS, Element::U64_4(mRS), mAllocSize / 4);
+}
+
+void initUnsignedAllocations() {
+    char *buffer_char = new char[mAllocSize];
+    short *buffer_short = new short[mAllocSize];
+    int *buffer_int = new int[mAllocSize];
+    uint64_t *buffer_long = new uint64_t[mAllocSize];
+
+    for(int i = 0; i < mAllocSize; ++i) {
+        buffer_char[i] = (char) i;
+        buffer_short[i] = (short) i;
+        buffer_int[i] = (int) i;
+        buffer_long[i] = (uint64_t) i;
+    }
+
+    mUCharAllocation->copy1DRangeFrom(0, mAllocSize, buffer_char);
+    mUChar2Allocation->copy2DRangeFrom(0, 0, 2, 6, buffer_char);
+    mUChar3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_char);
+    mUChar4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_char);
+
+    delete [] buffer_char;
+
+    mUShortAllocation->copy1DRangeFrom(0, mAllocSize, buffer_short);
+    mUShort2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_short);
+    mUShort3Allocation->copy2DRangeFrom(0, 0, 1, 6, buffer_short);
+    mUShort4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_short);
+
+    delete [] buffer_short;
+
+    mUIntAllocation->copy1DRangeFrom(0, mAllocSize, buffer_int);
+    mUInt2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_int);
+    mUInt3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_int);
+    mUInt4Allocation->copy3DRangeFrom(0, 0, 0, 1, 1, 6, buffer_int);
+
+    delete [] buffer_int;
+
+    mULongAllocation->copy3DRangeFrom(0, 0, 0, 4, 3, 2, buffer_long);
+    mULong2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_long);
+    mULong3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_long);
+    mULong4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_long);
+
+    delete [] buffer_long;
+}
+
+void createFloatAllocations() {
+    Type::Builder typeF16_3Builder(mRS, Element::F16_3(mRS));
+    typeF16_3Builder.setX(1);
+    typeF16_3Builder.setY(6);
+
+    mHalfAllocation = Allocation::createSized(mRS, Element::F16(mRS), mAllocSize);
+    mHalf2Allocation = Allocation::createSized(mRS, Element::F16_2(mRS), mAllocSize / 2);
+    mHalf3Allocation = Allocation::createTyped(mRS, typeF16_3Builder.create());
+    mHalf4Allocation = Allocation::createSized(mRS, Element::F16_4(mRS), mAllocSize / 4);
+
+    Type::Builder typeF32_4Builder(mRS, Element::F32_4(mRS));
+    typeF32_4Builder.setX(3);
+    typeF32_4Builder.setY(2);
+
+    mFloatAllocation = Allocation::createSized(mRS, Element::F32(mRS), mAllocSize);
+    mFloat2Allocation = Allocation::createSized(mRS, Element::F32_2(mRS), mAllocSize / 2);
+    mFloat3Allocation = Allocation::createSized(mRS, Element::F32_3(mRS), mAllocSize / 4);
+    mFloat4Allocation = Allocation::createTyped(mRS, typeF32_4Builder.create());
+
+    Type::Builder typeF64_2Builder(mRS, Element::F64_2(mRS));
+    typeF64_2Builder.setX(4);
+    typeF64_2Builder.setY(1);
+    typeF64_2Builder.setZ(3);
+
+    mDoubleAllocation = Allocation::createSized(mRS, Element::F64(mRS), mAllocSize);
+    mDouble2Allocation = Allocation::createTyped(mRS, typeF64_2Builder.create());
+
+    Type::Builder typeF64_3Builder(mRS, Element::F64_3(mRS));
+    typeF64_3Builder.setX(1);
+    typeF64_3Builder.setY(2);
+    typeF64_3Builder.setZ(3);
+
+    Type::Builder typeF64_4Builder(mRS, Element::F64_4(mRS));
+    typeF64_4Builder.setX(1);
+    typeF64_4Builder.setY(2);
+    typeF64_4Builder.setZ(3);
+
+    mDouble3Allocation = Allocation::createTyped(mRS, typeF64_3Builder.create());
+    mDouble4Allocation = Allocation::createTyped(mRS, typeF64_4Builder.create());
+}
+
+void initFloatAllocations() {
+    __fp16 *buffer_half = new __fp16[mAllocSize];
+    float *buffer_float = new float[mAllocSize];
+    double *buffer_double = new double[mAllocSize];
+
+    for(int i = 0; i < mAllocSize; ++i) {
+        buffer_half[i] = (__fp16) 1 / i;
+        buffer_float[i] = (float) 1 / i;
+        buffer_double[i] = (double) 1 / i;
+    }
+
+    mHalfAllocation->copy1DRangeFrom(0, mAllocSize, buffer_half);
+    mHalf2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_half);
+    mHalf3Allocation->copy2DRangeFrom(0, 0, 1, 6, buffer_half);
+    mHalf4Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_half);
+
+    delete [] buffer_half;
+
+    mFloatAllocation->copy1DRangeFrom(0, mAllocSize, buffer_float);
+    mFloat2Allocation->copy1DRangeFrom(0, mAllocSize/2, buffer_float);
+    mFloat3Allocation->copy1DRangeFrom(0, mAllocSize/4, buffer_float);
+    mFloat4Allocation->copy2DRangeFrom(0, 0, 3, 2, buffer_float);
+
+    delete [] buffer_float;
+
+    mDoubleAllocation->copy1DRangeFrom(0, mAllocSize, buffer_double);
+    mDouble2Allocation->copy3DRangeFrom(0, 0, 0, 4, 1, 3, buffer_double);
+    mDouble3Allocation->copy3DRangeFrom(0, 0, 0, 1, 2, 3, buffer_double);
+    mDouble4Allocation->copy3DRangeFrom(0, 0, 0, 1, 2, 3, buffer_double);
+
+    delete [] buffer_double;
+}
+
+extern "C" void JNICALL
+Java_com_android_rs_jniallocations_MainActivity_nativeRS(
+	JNIEnv * env,
+	jclass,
+	jstring pathObj)
+{
+    mRS = new RS();
+
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    mRS->init(path, RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    sp<ScriptC_allocs> mScript = new ScriptC_allocs(mRS);
+
+    Type::Builder typeRGBA_888Builder(mRS, Element::RGBA_8888(mRS));
+    typeRGBA_888Builder.setX(mBitmapSize);
+    typeRGBA_888Builder.setY(mBitmapSize);
+
+    sp<Allocation> mInAllocation = Allocation::createTyped(mRS, typeRGBA_888Builder.create());
+
+    const int image_area = mBitmapSize*mBitmapSize;
+    const int image_size = image_area*sizeof(int);
+
+    char *zero_buffer = new char[image_size];
+    memset(zero_buffer, 0, image_size);
+    mInAllocation->copy1DRangeFrom(0, image_area, zero_buffer);
+    delete [] zero_buffer;
+
+    sp<Allocation> mOutAllocation = Allocation::createTyped(mRS, typeRGBA_888Builder.create());
+    createSignedAllocations();
+    initSignedAllocations();
+
+    mRS->finish();
+    mScript->forEach_swizzle_kernel(mInAllocation, mOutAllocation);
+    mRS->finish();
+
+    mCharAllocation.clear();
+    mChar2Allocation.clear();
+    mChar3Allocation.clear();
+    mChar4Allocation.clear();
+
+    mShort2Allocation.clear();
+    mShort3Allocation.clear();
+    mShort4Allocation.clear();
+
+    mIntAllocation.clear();
+    mInt2Allocation.clear();
+    mInt3Allocation.clear();
+    mInt4Allocation.clear();
+
+    mLongAllocation.clear();
+    mLong2Allocation.clear();
+    mLong3Allocation.clear();
+    mLong4Allocation.clear();
+
+    mBoolAllocation.clear();
+
+    createUnsignedAllocations();
+    initUnsignedAllocations();
+
+    mInAllocation = mUShortAllocation; // Host side assignment
+
+    mRS->finish();
+    mScript->forEach_square_kernel(mInAllocation, mUIntAllocation);
+    mRS->finish();
+
+    mUCharAllocation.clear();
+    mUChar2Allocation.clear();
+    mUChar3Allocation.clear();
+    mUChar4Allocation.clear();
+
+    mUShortAllocation.clear();
+    mUShort2Allocation.clear();
+    mUShort3Allocation.clear();
+    mUShort4Allocation.clear();
+
+    mUInt2Allocation.clear();
+    mUInt3Allocation.clear();
+    mUInt4Allocation.clear();
+
+    mULongAllocation.clear();
+    mULong2Allocation.clear();
+    mULong3Allocation.clear();
+    mULong4Allocation.clear();
+
+    createFloatAllocations();
+    initFloatAllocations();
+
+    mRS->finish();
+    mScript->forEach_add_half_kernel(mDouble4Allocation, mDouble3Allocation);
+    mRS->finish();
+}
+
diff --git a/tests/lldb/jni/Allocations/res/layout/main_layout.xml b/tests/lldb/jni/Allocations/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/jni/Allocations/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/jni/Allocations/src/com/android/rs/jniallocations/MainActivity.java b/tests/lldb/jni/Allocations/src/com/android/rs/jniallocations/MainActivity.java
new file mode 100644
index 0000000..c6d741c
--- /dev/null
+++ b/tests/lldb/jni/Allocations/src/com/android/rs/jniallocations/MainActivity.java
@@ -0,0 +1,27 @@
+package com.android.rs.jniallocations;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.widget.ImageView;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+
+    static {
+        System.loadLibrary("RS");
+        System.loadLibrary("jniallocations");
+    }
+
+    native void nativeRS(String cacheDir);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main_layout);
+        nativeRS(this.getCacheDir().toString());
+    }
+}
+
diff --git a/tests/lldb/jni/Android.mk b/tests/lldb/jni/Android.mk
new file mode 100644
index 0000000..5053e7d
--- /dev/null
+++ b/tests/lldb/jni/Android.mk
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/tests/lldb/jni/BranchingFunCalls/Android.mk b/tests/lldb/jni/BranchingFunCalls/Android.mk
new file mode 100644
index 0000000..48fa26c
--- /dev/null
+++ b/tests/lldb/jni/BranchingFunCalls/Android.mk
@@ -0,0 +1,17 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+                   $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JNIBranchingFunCalls
+
+LOCAL_JNI_SHARED_LIBRARIES := libjnibranchingfuncalls
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+include $(LOCAL_PATH)/jnibranchingfuncalls/Android.mk
+
diff --git a/tests/lldb/jni/BranchingFunCalls/AndroidManifest.xml b/tests/lldb/jni/BranchingFunCalls/AndroidManifest.xml
new file mode 100644
index 0000000..3b616fa
--- /dev/null
+++ b/tests/lldb/jni/BranchingFunCalls/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.jnibranchingfuncalls">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="JNIBranchingFunCalls"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
+
diff --git a/tests/lldb/jni/BranchingFunCalls/jnibranchingfuncalls/Android.mk b/tests/lldb/jni/BranchingFunCalls/jnibranchingfuncalls/Android.mk
new file mode 100644
index 0000000..3024195
--- /dev/null
+++ b/tests/lldb/jni/BranchingFunCalls/jnibranchingfuncalls/Android.mk
@@ -0,0 +1,26 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := libjnibranchingfuncalls
+
+LOCAL_SRC_FILES := jnibranchingfuncalls.cpp simple.rs
+
+LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+
+LOCAL_CFLAGS := --std=c++11
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_CPP_FEATURES += exceptions
+
+LOCAL_SHARED_LIBRARIES := libdl liblog
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+
+LOCAL_SDK_VERSION := 23
+LOCAL_NDK_STL_VARIANT := c++_static
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/tests/lldb/jni/BranchingFunCalls/jnibranchingfuncalls/jnibranchingfuncalls.cpp b/tests/lldb/jni/BranchingFunCalls/jnibranchingfuncalls/jnibranchingfuncalls.cpp
new file mode 100644
index 0000000..e16724b
--- /dev/null
+++ b/tests/lldb/jni/BranchingFunCalls/jnibranchingfuncalls/jnibranchingfuncalls.cpp
@@ -0,0 +1,49 @@
+#include <memory>
+
+#include <jni.h>
+#include <RenderScript.h>
+
+#include "ScriptC_simple.h"
+
+using namespace android;
+using namespace RSC;
+
+extern "C" void JNICALL
+Java_com_android_rs_jnibranchingfuncalls_MainActivity_nativeRS(
+    JNIEnv * env,
+    jclass,
+    jstring pathObj)
+{
+    static const int size = 64;
+    sp<RS> rs = new RS();
+
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    rs->init(path, RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    auto e = Element::I32(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    int * input = new int[size*size];
+    for(int i = 0; i < size*size; ++i) {
+        input[i] = i - (size*size / 2);
+    }
+    a->copy2DRangeFrom(0, 0, size, size, input);
+    delete [] input;
+
+    // Script is executed once, then the data is copied back when finished
+    sp<ScriptC_simple> s = new ScriptC_simple(rs);
+    s->invoke_addToGlobal(234);
+    s->forEach_simple_kernel(a, b);
+    rs->finish();
+    int32_t * output = new int32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+}
+
diff --git a/tests/lldb/jni/BranchingFunCalls/jnibranchingfuncalls/simple.rs b/tests/lldb/jni/BranchingFunCalls/jnibranchingfuncalls/simple.rs
new file mode 100644
index 0000000..1596ed9
--- /dev/null
+++ b/tests/lldb/jni/BranchingFunCalls/jnibranchingfuncalls/simple.rs
@@ -0,0 +1,60 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.jnibranchingfuncalls)
+
+static bool is_neg(int a)
+{
+    if(a < 0)
+        return true;
+    else
+        return false;
+}
+
+static bool is_pos(int a)
+{
+    if(a > 0)
+        return true;
+    else
+        return false;
+}
+
+static void set_i(int * a, int b)
+{
+    int tmp = b;
+    *a = tmp;
+}
+
+static void modify_f(float * f)
+{
+    *f *= 0.5f;
+}
+
+static void modify_i(int * i)
+{
+    int j = *i;
+    int cutoff = 2 << 6;
+    if(j > cutoff)
+        j = cutoff;
+    if(is_neg(j))
+        set_i(i, 0);
+    else if(is_pos(j))
+        set_i(i, j);
+    else
+        set_i(i, cutoff);
+}
+
+int __attribute__((kernel)) simple_kernel(int in)
+{
+    int i = in;
+    float f = (float) i;
+    modify_f(&f);
+    modify_i(&i);
+    int ret = (int) f;
+    return in * ret;
+}
+
+int glob = 123;
+
+void addToGlobal(int arg)
+{
+    glob += arg;
+}
diff --git a/tests/lldb/jni/BranchingFunCalls/res/layout/main_layout.xml b/tests/lldb/jni/BranchingFunCalls/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/jni/BranchingFunCalls/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/jni/BranchingFunCalls/src/com/android/rs/jnibranchingfuncalls/MainActivity.java b/tests/lldb/jni/BranchingFunCalls/src/com/android/rs/jnibranchingfuncalls/MainActivity.java
new file mode 100644
index 0000000..a1a5be3
--- /dev/null
+++ b/tests/lldb/jni/BranchingFunCalls/src/com/android/rs/jnibranchingfuncalls/MainActivity.java
@@ -0,0 +1,27 @@
+package com.android.rs.jnibranchingfuncalls;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.widget.ImageView;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+
+    static {
+        System.loadLibrary("RS");
+        System.loadLibrary("jnibranchingfuncalls");
+    }
+
+    native void nativeRS(String cacheDir);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main_layout);
+        nativeRS(this.getCacheDir().toString());
+    }
+}
+
diff --git a/tests/lldb/jni/DebugWaitAttach/Android.mk b/tests/lldb/jni/DebugWaitAttach/Android.mk
new file mode 100644
index 0000000..5e57728
--- /dev/null
+++ b/tests/lldb/jni/DebugWaitAttach/Android.mk
@@ -0,0 +1,17 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+                   $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JNIDebugWaitAttach
+
+LOCAL_JNI_SHARED_LIBRARIES := libjnidebugwaitattach
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+include $(LOCAL_PATH)/jnidebugwaitattach/Android.mk
+
diff --git a/tests/lldb/jni/DebugWaitAttach/AndroidManifest.xml b/tests/lldb/jni/DebugWaitAttach/AndroidManifest.xml
new file mode 100644
index 0000000..12e544b
--- /dev/null
+++ b/tests/lldb/jni/DebugWaitAttach/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.jnidebugwaitattach">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="JNIDebugWaitAttach"
+                 android:hardwareAccelerated="true">
+
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/lldb/jni/DebugWaitAttach/jnidebugwaitattach/Android.mk b/tests/lldb/jni/DebugWaitAttach/jnidebugwaitattach/Android.mk
new file mode 100644
index 0000000..519a32d
--- /dev/null
+++ b/tests/lldb/jni/DebugWaitAttach/jnidebugwaitattach/Android.mk
@@ -0,0 +1,26 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := libjnidebugwaitattach
+
+LOCAL_SRC_FILES := jnidebugwaitattach.cpp simple.rs
+
+LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+
+LOCAL_CFLAGS := --std=c++11
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_CPP_FEATURES += exceptions
+
+LOCAL_SHARED_LIBRARIES := libdl liblog
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+
+LOCAL_SDK_VERSION := 23
+LOCAL_NDK_STL_VARIANT := c++_static
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/tests/lldb/jni/DebugWaitAttach/jnidebugwaitattach/jnidebugwaitattach.cpp b/tests/lldb/jni/DebugWaitAttach/jnidebugwaitattach/jnidebugwaitattach.cpp
new file mode 100644
index 0000000..2de68a5
--- /dev/null
+++ b/tests/lldb/jni/DebugWaitAttach/jnidebugwaitattach/jnidebugwaitattach.cpp
@@ -0,0 +1,44 @@
+#include <memory>
+
+#include <jni.h>
+#include <RenderScript.h>
+
+#include "ScriptC_simple.h"
+
+using namespace android;
+using namespace RSC;
+
+extern "C" void JNICALL
+Java_com_android_rs_jnidebugwaitattach_MainActivity_nativeRS(
+    JNIEnv * env,
+    jclass,
+    jstring pathObj)
+{
+    static const int size = 8;
+    sp<RS> rs = new RS();
+
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    rs->init(path, RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    auto e = Element::RGBA_8888(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    // Script is executed once, then the data is copied back when finished
+    sp<ScriptC_simple> s = new ScriptC_simple(rs);
+    s->forEach_simple_kernel(a, b);
+    uint32_t * output = new uint32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+
+    s->forEach_other_kernel(a, b);
+
+    rs->finish();
+}
+
diff --git a/tests/lldb/jni/DebugWaitAttach/jnidebugwaitattach/simple.rs b/tests/lldb/jni/DebugWaitAttach/jnidebugwaitattach/simple.rs
new file mode 100644
index 0000000..99a42e8
--- /dev/null
+++ b/tests/lldb/jni/DebugWaitAttach/jnidebugwaitattach/simple.rs
@@ -0,0 +1,23 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.jnidebugwaitattach)
+
+float4 gColor = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) simple_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColor;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
+
+// Extra kernel to test lldb setting breakpoints on all the RS kernels.
+uchar4 __attribute__((kernel)) other_kernel(uchar4 in)
+{
+    uchar4 result = in.wzyx;
+    return result;
+}
diff --git a/tests/lldb/jni/DebugWaitAttach/res/layout/main_layout.xml b/tests/lldb/jni/DebugWaitAttach/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/jni/DebugWaitAttach/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/jni/DebugWaitAttach/src/com/android/rs/jniwaitattachdebug/MainActivity.java b/tests/lldb/jni/DebugWaitAttach/src/com/android/rs/jniwaitattachdebug/MainActivity.java
new file mode 100644
index 0000000..923a3e8
--- /dev/null
+++ b/tests/lldb/jni/DebugWaitAttach/src/com/android/rs/jniwaitattachdebug/MainActivity.java
@@ -0,0 +1,27 @@
+package com.android.rs.jnidebugwaitattach;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.widget.ImageView;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+
+    static {
+        System.loadLibrary("RS");
+        System.loadLibrary("jnidebugwaitattach");
+    }
+
+    native void nativeRS(String cacheDir);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main_layout);
+        nativeRS(this.getCacheDir().toString());
+    }
+}
+
diff --git a/tests/lldb/jni/InfiniteLoop/Android.mk b/tests/lldb/jni/InfiniteLoop/Android.mk
new file mode 100644
index 0000000..4d37171
--- /dev/null
+++ b/tests/lldb/jni/InfiniteLoop/Android.mk
@@ -0,0 +1,17 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+                   $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JNIInfiniteLoop
+
+LOCAL_JNI_SHARED_LIBRARIES := libjniinfiniteloop
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+include $(LOCAL_PATH)/jniinfiniteloop/Android.mk
+
diff --git a/tests/lldb/jni/InfiniteLoop/AndroidManifest.xml b/tests/lldb/jni/InfiniteLoop/AndroidManifest.xml
new file mode 100644
index 0000000..23031f0
--- /dev/null
+++ b/tests/lldb/jni/InfiniteLoop/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.jniinfiniteloop">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="JNIInfiniteLoop"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
+
diff --git a/tests/lldb/jni/InfiniteLoop/jniinfiniteloop/Android.mk b/tests/lldb/jni/InfiniteLoop/jniinfiniteloop/Android.mk
new file mode 100644
index 0000000..ef5ba12
--- /dev/null
+++ b/tests/lldb/jni/InfiniteLoop/jniinfiniteloop/Android.mk
@@ -0,0 +1,26 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := libjniinfiniteloop
+
+LOCAL_SRC_FILES := jniinfiniteloop.cpp infiniteLoop.rs
+
+LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+
+LOCAL_CFLAGS := --std=c++11
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_CPP_FEATURES += exceptions
+
+LOCAL_SHARED_LIBRARIES := libdl liblog
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+
+LOCAL_SDK_VERSION := 23
+LOCAL_NDK_STL_VARIANT := c++_static
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/tests/lldb/jni/InfiniteLoop/jniinfiniteloop/infiniteLoop.rs b/tests/lldb/jni/InfiniteLoop/jniinfiniteloop/infiniteLoop.rs
new file mode 100644
index 0000000..ac05bb8
--- /dev/null
+++ b/tests/lldb/jni/InfiniteLoop/jniinfiniteloop/infiniteLoop.rs
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.jniinfiniteLoop)
+#pragma rs_fp_relaxed
+
+float4 gColour = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) simple_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColour;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
diff --git a/tests/lldb/jni/InfiniteLoop/jniinfiniteloop/jniinfiniteloop.cpp b/tests/lldb/jni/InfiniteLoop/jniinfiniteloop/jniinfiniteloop.cpp
new file mode 100644
index 0000000..2b58339
--- /dev/null
+++ b/tests/lldb/jni/InfiniteLoop/jniinfiniteloop/jniinfiniteloop.cpp
@@ -0,0 +1,49 @@
+#include <memory>
+#include <unistd.h>
+
+#include <jni.h>
+#include <RenderScript.h>
+
+#include "ScriptC_infiniteLoop.h"
+
+using namespace android;
+using namespace RSC;
+
+extern "C" void JNICALL
+Java_com_android_rs_jniinfiniteloop_MainActivity_nativeRS(
+    JNIEnv * env,
+    jclass,
+    jstring pathObj)
+{
+    static const int size = 64;
+    sp<RS> rs = new RS();
+
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    rs->init(path, RS_INIT_LOW_LATENCY);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    auto e = Element::RGBA_8888(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    sp<ScriptC_infiniteLoop> s = new ScriptC_infiniteLoop(rs);
+
+    // Test is designed to loop forever, waits for two seconds
+    // between each invocation of the kernel
+    bool forever = true;
+    while(forever)
+    {
+        s->forEach_simple_kernel(a, b);
+        sleep(2);
+    }
+
+    uint32_t * output = new uint32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+}
+
diff --git a/tests/lldb/jni/InfiniteLoop/res/layout/main_layout.xml b/tests/lldb/jni/InfiniteLoop/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/jni/InfiniteLoop/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/jni/InfiniteLoop/src/com/android/rs/jniinfiniteloop/MainActivity.java b/tests/lldb/jni/InfiniteLoop/src/com/android/rs/jniinfiniteloop/MainActivity.java
new file mode 100644
index 0000000..94478f2
--- /dev/null
+++ b/tests/lldb/jni/InfiniteLoop/src/com/android/rs/jniinfiniteloop/MainActivity.java
@@ -0,0 +1,27 @@
+package com.android.rs.jniinfiniteloop;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.widget.ImageView;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+
+    static {
+        System.loadLibrary("RS");
+        System.loadLibrary("jniinfiniteloop");
+    }
+
+    native void nativeRS(String cacheDir);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main_layout);
+        nativeRS(this.getCacheDir().toString());
+    }
+}
+
diff --git a/tests/lldb/jni/KernelVariables/Android.mk b/tests/lldb/jni/KernelVariables/Android.mk
new file mode 100644
index 0000000..2d47134
--- /dev/null
+++ b/tests/lldb/jni/KernelVariables/Android.mk
@@ -0,0 +1,17 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+                   $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JNIKernelVariables
+
+LOCAL_JNI_SHARED_LIBRARIES := libjnikernelvariables
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+include $(LOCAL_PATH)/jnikernelvariables/Android.mk
+
diff --git a/tests/lldb/jni/KernelVariables/AndroidManifest.xml b/tests/lldb/jni/KernelVariables/AndroidManifest.xml
new file mode 100644
index 0000000..b719892
--- /dev/null
+++ b/tests/lldb/jni/KernelVariables/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.jnikernelvariables">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="JNIKernelVariables"
+                 android:hardwareAccelerated="true">
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
+
diff --git a/tests/lldb/jni/KernelVariables/jnikernelvariables/Android.mk b/tests/lldb/jni/KernelVariables/jnikernelvariables/Android.mk
new file mode 100644
index 0000000..9862a5b
--- /dev/null
+++ b/tests/lldb/jni/KernelVariables/jnikernelvariables/Android.mk
@@ -0,0 +1,26 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := libjnikernelvariables
+
+LOCAL_SRC_FILES := jnikernelvariables.cpp simple.rs
+
+LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+
+LOCAL_CFLAGS := --std=c++11
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_CPP_FEATURES += exceptions
+
+LOCAL_SHARED_LIBRARIES := libdl liblog
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+
+LOCAL_SDK_VERSION := 23
+LOCAL_NDK_STL_VARIANT := c++_static
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/tests/lldb/jni/KernelVariables/jnikernelvariables/jnikernelvariables.cpp b/tests/lldb/jni/KernelVariables/jnikernelvariables/jnikernelvariables.cpp
new file mode 100644
index 0000000..9a17fdc
--- /dev/null
+++ b/tests/lldb/jni/KernelVariables/jnikernelvariables/jnikernelvariables.cpp
@@ -0,0 +1,81 @@
+#include <memory>
+
+#include <jni.h>
+#include <RenderScript.h>
+
+#include "ScriptC_simple.h"
+
+using namespace android;
+using namespace RSC;
+
+extern "C" void JNICALL
+Java_com_android_rs_jnikernelvariables_MainActivity_nativeRS(
+    JNIEnv * env,
+    jclass,
+    jstring pathObj)
+{
+    static const int size = 64;
+    sp<RS> rs = new RS();
+
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    rs->init(path, RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    auto e = Element::RGBA_8888(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    sp<ScriptC_simple> s = new ScriptC_simple(rs);
+
+    static const int buffer_int[] = {1, 2, 3, 4};
+    sp<Allocation> int_allocation = Allocation::createSized(rs, Element::I32(rs), 4);
+    int_allocation->copy1DRangeFrom(0, 4, buffer_int);
+    s->set_allocation_1D_global(int_allocation);
+
+    static const int buffer_int2[] = {5, 6, 7, 8};
+
+    Type::Builder typeI32Builder2D(rs, Element::I32(rs));
+    typeI32Builder2D.setX(2);
+    typeI32Builder2D.setY(2);
+
+    sp<Allocation> int_allocation2 = Allocation::createTyped(rs, typeI32Builder2D.create());
+    int_allocation2->copy2DRangeFrom(0, 0, 2, 2, buffer_int2);
+    s->set_allocation_1D_global2(int_allocation2);
+
+    s->set_allocation_2D_global(a);
+    s->set_allocation_2D_global2(b);
+
+    static const int buffer_int3[] = {9, 10, 11, 12, 13, 14, 15, 16};
+
+    Type::Builder typeI32Builder3D(rs, Element::I32(rs));
+    typeI32Builder3D.setX(2);
+    typeI32Builder3D.setY(2);
+    typeI32Builder3D.setZ(2);
+
+    sp<Allocation> int_allocation3 = Allocation::createTyped(rs, typeI32Builder3D.create());
+    int_allocation3->copy3DRangeFrom(0, 0, 0, 2, 2, 2, buffer_int3);
+    s->set_allocation_3D_global(int_allocation3);
+
+    Type::Builder yuvTypeBuilder(rs, Element::YUV(rs));
+    yuvTypeBuilder.setX(4);
+    yuvTypeBuilder.setY(4);
+    yuvTypeBuilder.setYuvFormat(RS_YUV_YV12);
+
+    sp<Allocation> yuv_allocation = Allocation::createTyped(rs, yuvTypeBuilder.create());
+    s->set_allocation_YUV_2D_global(yuv_allocation);
+
+    s->set_sampler_global(Sampler::CLAMP_LINEAR(rs));
+
+    // Script is executed once, then the data is copied back when finished
+    s->forEach_kernel(a, b);
+    rs->finish();
+    uint32_t * output = new uint32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+}
+
diff --git a/tests/lldb/jni/KernelVariables/jnikernelvariables/simple.rs b/tests/lldb/jni/KernelVariables/jnikernelvariables/simple.rs
new file mode 100644
index 0000000..592b37b
--- /dev/null
+++ b/tests/lldb/jni/KernelVariables/jnikernelvariables/simple.rs
@@ -0,0 +1,160 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.jnikernelvariables)
+
+char char_global = 12;
+uchar uchar_global = 234;
+short short_global = -321;
+ushort ushort_global = 432;
+int int_global = 1234;
+uint uint_global = 2345;
+float float_global = 4.5f;
+long long_global = -77777;
+ulong ulong_global = 8888;
+double double_global = -456.5f;
+
+char2 char2_global = {11, -22};
+uchar2 uchar2_global = {33, 44};
+short2 short2_global = {-555, 666};
+ushort2 ushort2_global = {777, 888};
+int2 int2_global = {999, -1111};
+uint2 uint2_global = {2222, 3333};
+float2 float2_global = {4.5f, -5.0f};
+long2 long2_global = {-4444, 5555};
+ulong2 ulong2_global = {6666, 7777};
+double2 double2_global = {88.5f, -99.0f};
+
+char3 char3_global = {11, -22, -33};
+uchar3 uchar3_global = {33, 44, 55};
+short3 short3_global = {-555, 666, 777};
+ushort3 ushort3_global = {777, 888, 999};
+int3 int3_global = {999, -1111, 2222};
+uint3 uint3_global = {2222, 3333, 4444};
+float3 float3_global = {4.5f, -5.0f, -6.5f};
+long3 long3_global = {-4444, 5555, 6666};
+ulong3 ulong3_global = {6666, 7777, 8888};
+double3 double3_global = {88.5f, -99.0f, 111.5f};
+
+char4 char4_global = {55, 11, -22, -33};
+uchar4 uchar4_global = {222, 33, 44, 55};
+short4 short4_global = {-444, -555, 666, 777};
+ushort4 ushort4_global = {666, 777, 888, 999};
+int4 int4_global = {888, 999, -1111, 2222};
+uint4 uint4_global = {1111, 2222, 3333, 4444};
+float4 float4_global = {3.0f, 4.5f, -5.0f, -6.5f};
+long4 long4_global = {-3333, -4444, 5555, 6666};
+ulong4 ulong4_global = {5555, 6666, 7777, 8888};
+double4 double4_global = {-77.0f, 88.5f, -99.0f, 111.5f};
+
+rs_matrix2x2 matrix2x2_global;
+rs_matrix3x3 matrix3x3_global;
+rs_matrix4x4 matrix4x4_global;
+
+rs_quaternion quaternion_global;
+
+rs_allocation allocation_1D_global;
+rs_allocation allocation_1D_global2;
+rs_allocation allocation_2D_global;
+rs_allocation allocation_2D_global2;
+rs_allocation allocation_3D_global;
+rs_allocation allocation_YUV_2D_global;
+
+rs_allocation_cubemap_face cubemap_face_global;
+rs_sampler sampler_global;
+
+uchar4 __attribute__((kernel)) kernel(uchar4 in)
+{
+    char char_local = 'a';
+    uchar uchar_local = 'b';
+    short short_local = -321;
+    ushort ushort_local = 432;
+    int int_local = 1234;
+    uint uint_local = 2345;
+    float float_local = 4.5f;
+    long long_local = -77777;
+    ulong ulong_local = 8888;
+    double double_local = -456.5f;
+
+    char2 char2_local = {-11, -22};
+    uchar2 uchar2_local = {33, 44};
+    short2 short2_local = {-555, 666};
+    ushort2 ushort2_local = {777, 888};
+    int2 int2_local = {999, -1111};
+    uint2 uint2_local = {2222, 3333};
+    float2 float2_local = {4.5f, -5.0f};
+    long2 long2_local = {-4444, 5555};
+    ulong2 ulong2_local = {6666, 7777};
+    double2 double2_local = {88.5f, -99.0f};
+
+    char3 char3_local = {11, -22, -33};
+    uchar3 uchar3_local = {33, 44, 55};
+    short3 short3_local = {-555, 666, 777};
+    ushort3 ushort3_local = {777, 888, 999};
+    int3 int3_local = {999, -1111, 2222};
+    uint3 uint3_local = {2222, 3333, 4444};
+    float3 float3_local = {4.5f, -5.0f, -6.5f};
+    long3 long3_local = {-4444, 5555, 6666};
+    ulong3 ulong3_local = {6666, 7777, 8888};
+    double3 double3_local = {88.5f, -99.0f, 111.5f};
+
+    char4 char4_local = {55, 11, -22, -33};
+    uchar4 uchar4_local = {22, 33, 44, 55};
+    short4 short4_local = {-444, -555, 666, 777};
+    ushort4 ushort4_local = {666, 777, 888, 999};
+    int4 int4_local = {888, 999, -1111, 2222};
+    uint4 uint4_local = {1111, 2222, 3333, 4444};
+    float4 float4_local = {3.0f, 4.5f, -5.0f, -6.5f};
+    long4 long4_local = {-3333, -4444, 5555, 6666};
+    ulong4 ulong4_local = {5555, 6666, 7777, 8888};
+    double4 double4_local = {-77.0f, 88.5f, -99.0f, 111.5f};
+
+    rs_matrix2x2 matrix2x2_local = {{1., 2.5,
+                                     3., 4.5}};
+    rs_matrix3x3 matrix3x3_local = {{5., 6.5, 7.,
+                                     8.5, 9., 1.5,
+                                     2., 3.5, 4.}};
+    rs_matrix4x4 matrix4x4_local = {{5.5, 6., 7.5, 8.,
+                                     9., 1.5, 2., 3.5,
+                                     4.5, 5.5, 6.5, 7.,
+                                     8., 9.5, 1.5, 2.5}};
+
+    matrix2x2_global = matrix2x2_local;
+    matrix3x3_global = matrix3x3_local;
+    matrix4x4_global = matrix4x4_local;
+
+    rsQuaternionSet(&quaternion_global, 3.0, 4.5, 5.5, 6.0);
+
+    rs_quaternion quaternion_local;
+    rsQuaternionSet(&quaternion_local, 7.5, 8.0, 9.0, 0.5);
+
+    char char_combined = char_local + (char)uchar_local + char2_local.x +
+        (char)uchar2_local.x + char3_local.x - (char)uchar3_local.x +
+        char4_local.x + (char)uchar4_local.x;
+
+    short short_combined = short_local + (short)ushort_local + short2_local.x +
+        (short)ushort2_local.x + short3_local.x + (short)ushort3_local.x +
+        short4_local.x + (short)ushort4_local.x;
+
+    int int_combined = int_local + (int)uint_local + int2_local.x +
+        (int)uint2_local.x + int3_local.x + (int)uint3_local.x + int4_local.x +
+        (int)uint4_local.x;
+
+    float float_combined = float_local + float2_local.x + float3_local.x +
+        float4_local.x;
+
+    long long_combined = long_local + (long)ulong_local + long2_local.x +
+        (long)ulong2_local.x + long3_local.x + (long)ulong3_local.x +
+        long4_local.x + (long)ulong4_local.x;
+
+    double double_combined = double_local + double2_local.x + double3_local.x +
+        double4_local.x;
+
+    char_global = char_combined;
+    short_global = short_combined;
+    int_global = int_combined;
+    float_global = float_combined;
+    long_global = long_combined;
+    double_global = double_combined;
+
+    uchar4 result = {1,2,3,4};
+    return result;
+}
diff --git a/tests/lldb/jni/KernelVariables/res/layout/main_layout.xml b/tests/lldb/jni/KernelVariables/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/jni/KernelVariables/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/jni/KernelVariables/src/com/android/rs/jnikernelvariables/MainActivity.java b/tests/lldb/jni/KernelVariables/src/com/android/rs/jnikernelvariables/MainActivity.java
new file mode 100644
index 0000000..7e87b9b
--- /dev/null
+++ b/tests/lldb/jni/KernelVariables/src/com/android/rs/jnikernelvariables/MainActivity.java
@@ -0,0 +1,26 @@
+package com.android.rs.jnikernelvariables;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.widget.ImageView;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+
+    static {
+        System.loadLibrary("RS");
+        System.loadLibrary("jnikernelvariables");
+    }
+
+    native void nativeRS(String cacheDir);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main_layout);
+        nativeRS(this.getCacheDir().toString());
+    }
+}
diff --git a/tests/lldb/jni/MultipleRSFiles/Android.mk b/tests/lldb/jni/MultipleRSFiles/Android.mk
new file mode 100644
index 0000000..00fad61
--- /dev/null
+++ b/tests/lldb/jni/MultipleRSFiles/Android.mk
@@ -0,0 +1,17 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+                   $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JNIMultipleRSFiles
+
+LOCAL_JNI_SHARED_LIBRARIES := libjnimultiplersfiles
+
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+include $(LOCAL_PATH)/jnimultiplersfiles/Android.mk
+
diff --git a/tests/lldb/jni/MultipleRSFiles/AndroidManifest.xml b/tests/lldb/jni/MultipleRSFiles/AndroidManifest.xml
new file mode 100644
index 0000000..19bb65c
--- /dev/null
+++ b/tests/lldb/jni/MultipleRSFiles/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.jnimultiplersfiles">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="JNIMultipleRSFiles"
+                 android:hardwareAccelerated="true">
+
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/Android.mk b/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/Android.mk
new file mode 100644
index 0000000..7e61fcb
--- /dev/null
+++ b/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/Android.mk
@@ -0,0 +1,26 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := libjnimultiplersfiles
+
+LOCAL_SRC_FILES := jnimultiplersfiles.cpp first.rs second.rs
+
+LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+
+LOCAL_CFLAGS := --std=c++11
+LOCAL_RENDERSCRIPT_FLAGS := -g -O0 -target-api 0
+
+LOCAL_CPP_FEATURES += exceptions
+
+LOCAL_SHARED_LIBRARIES := libdl liblog
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+
+LOCAL_SDK_VERSION := 23
+LOCAL_NDK_STL_VARIANT := c++_static
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/first.rs b/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/first.rs
new file mode 100644
index 0000000..7104f9c
--- /dev/null
+++ b/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/first.rs
@@ -0,0 +1,16 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.jnimultiplersfiles)
+
+float4 gColor = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) first_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColor;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
diff --git a/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/jnimultiplersfiles.cpp b/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/jnimultiplersfiles.cpp
new file mode 100644
index 0000000..462292e
--- /dev/null
+++ b/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/jnimultiplersfiles.cpp
@@ -0,0 +1,47 @@
+#include <memory>
+
+#include <jni.h>
+#include <RenderScript.h>
+
+#include "ScriptC_first.h"
+#include "ScriptC_second.h"
+
+using namespace android;
+using namespace RSC;
+
+extern "C" void JNICALL
+Java_com_android_rs_jnimultiplersfiles_MainActivity_nativeRS(
+    JNIEnv * env,
+    jclass,
+    jstring pathObj)
+{
+    static const int size = 64;
+    sp<RS> rs = new RS();
+
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    rs->init(path, RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    auto e = Element::RGBA_8888(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    // Script is executed once, then the data is copied back when finished
+    sp<ScriptC_first> s1 = new ScriptC_first(rs);
+    sp<ScriptC_second> s2 = new ScriptC_second(rs);
+
+    s1->forEach_first_kernel(a, b);
+    uint32_t * output = new uint32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+
+    s2->forEach_second_kernel(a, b);
+
+    rs->finish();
+}
+
diff --git a/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/second.rs b/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/second.rs
new file mode 100644
index 0000000..6691f2f
--- /dev/null
+++ b/tests/lldb/jni/MultipleRSFiles/jnimultiplersfiles/second.rs
@@ -0,0 +1,9 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.jnimultiplersfiles)
+
+/* RenderScript kernel that just returns the swizzled input. */
+uchar4 __attribute__((kernel)) second_kernel(uchar4 in)
+{
+    uchar4 result = in.wzyx;
+    return result;
+}
diff --git a/tests/lldb/jni/MultipleRSFiles/res/layout/main_layout.xml b/tests/lldb/jni/MultipleRSFiles/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/jni/MultipleRSFiles/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/jni/MultipleRSFiles/src/com/android/rs/jnimultiplersfiles/MainActivity.java b/tests/lldb/jni/MultipleRSFiles/src/com/android/rs/jnimultiplersfiles/MainActivity.java
new file mode 100644
index 0000000..a2b0cb2
--- /dev/null
+++ b/tests/lldb/jni/MultipleRSFiles/src/com/android/rs/jnimultiplersfiles/MainActivity.java
@@ -0,0 +1,27 @@
+package com.android.rs.jnimultiplersfiles;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.widget.ImageView;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+
+    static {
+        System.loadLibrary("RS");
+        System.loadLibrary("jnimultiplersfiles");
+    }
+
+    native void nativeRS(String cacheDir);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main_layout);
+        nativeRS(this.getCacheDir().toString());
+    }
+}
+
diff --git a/tests/lldb/jni/NoDebugWaitAttach/Android.mk b/tests/lldb/jni/NoDebugWaitAttach/Android.mk
new file mode 100644
index 0000000..835140a
--- /dev/null
+++ b/tests/lldb/jni/NoDebugWaitAttach/Android.mk
@@ -0,0 +1,17 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+                   $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := JNINoDebugWaitAttach
+
+LOCAL_JNI_SHARED_LIBRARIES := libjninodebugwaitattach
+
+LOCAL_RENDERSCRIPT_FLAGS := -O0 -target-api 0
+
+include $(BUILD_PACKAGE)
+include $(LOCAL_PATH)/jninodebugwaitattach/Android.mk
+
diff --git a/tests/lldb/jni/NoDebugWaitAttach/AndroidManifest.xml b/tests/lldb/jni/NoDebugWaitAttach/AndroidManifest.xml
new file mode 100644
index 0000000..846eddd
--- /dev/null
+++ b/tests/lldb/jni/NoDebugWaitAttach/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.rs.jninodebugwaitattach">
+    <uses-sdk android:minSdkVersion="21" />
+    <application android:label="JNINoDebugWaitAttach"
+                 android:hardwareAccelerated="true">
+
+        <activity android:name="MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/lldb/jni/NoDebugWaitAttach/jninodebugwaitattach/Android.mk b/tests/lldb/jni/NoDebugWaitAttach/jninodebugwaitattach/Android.mk
new file mode 100644
index 0000000..e8ee3ce
--- /dev/null
+++ b/tests/lldb/jni/NoDebugWaitAttach/jninodebugwaitattach/Android.mk
@@ -0,0 +1,26 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_MODULE := libjninodebugwaitattach
+
+LOCAL_SRC_FILES := jninodebugwaitattach.cpp simple.rs
+
+LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+
+LOCAL_CFLAGS := --std=c++11
+LOCAL_RENDERSCRIPT_FLAGS := -O0 -target-api 0
+
+LOCAL_CPP_FEATURES += exceptions
+
+LOCAL_SHARED_LIBRARIES := libdl liblog
+LOCAL_STATIC_LIBRARIES := libRScpp_static
+
+LOCAL_SDK_VERSION := 23
+LOCAL_NDK_STL_VARIANT := c++_static
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/tests/lldb/jni/NoDebugWaitAttach/jninodebugwaitattach/jninodebugwaitattach.cpp b/tests/lldb/jni/NoDebugWaitAttach/jninodebugwaitattach/jninodebugwaitattach.cpp
new file mode 100644
index 0000000..6a99f58
--- /dev/null
+++ b/tests/lldb/jni/NoDebugWaitAttach/jninodebugwaitattach/jninodebugwaitattach.cpp
@@ -0,0 +1,42 @@
+#include <memory>
+
+#include <jni.h>
+#include <RenderScript.h>
+
+#include "ScriptC_simple.h"
+
+using namespace android;
+using namespace RSC;
+
+extern "C" void JNICALL
+Java_com_android_rs_jninodebugwaitattach_MainActivity_nativeRS(
+    JNIEnv * env,
+    jclass,
+    jstring pathObj)
+{
+    static const int size = 8;
+    sp<RS> rs = new RS();
+
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    rs->init(path, RS_INIT_LOW_LATENCY | RS_INIT_WAIT_FOR_ATTACH);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    auto e = Element::RGBA_8888(rs);
+    Type::Builder tb(rs, e);
+    tb.setX(size);
+    tb.setY(size);
+    auto t = tb.create();
+
+    auto a = Allocation::createTyped(rs, t);
+    auto b = Allocation::createTyped(rs, t);
+
+    // Script is executed once, then the data is copied back when finished
+    sp<ScriptC_simple> s = new ScriptC_simple(rs);
+    s->forEach_simple_kernel(a, b);
+    uint32_t * output = new uint32_t[size*size];
+    b->copy2DRangeTo(0, 0, size, size, output);
+    delete [] output;
+
+    rs->finish();
+}
+
diff --git a/tests/lldb/jni/NoDebugWaitAttach/jninodebugwaitattach/simple.rs b/tests/lldb/jni/NoDebugWaitAttach/jninodebugwaitattach/simple.rs
new file mode 100644
index 0000000..3ae111b
--- /dev/null
+++ b/tests/lldb/jni/NoDebugWaitAttach/jninodebugwaitattach/simple.rs
@@ -0,0 +1,16 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.jninodebugwaitattach)
+
+float4 gColor = {0.299f, 0.587f, 0.114f, 1.f};
+
+/* RenderScript kernel that just sets the colour of the screen and does some
+ * simple operations so it is not completely empty
+ * (and can therefore be debugged).
+ */
+uchar4 __attribute__((kernel)) simple_kernel(uchar4 in)
+{
+    float4 temp = rsUnpackColor8888(in);
+    temp = gColor;
+    uchar4 result = rsPackColorTo8888(temp);
+    return result;
+}
\ No newline at end of file
diff --git a/tests/lldb/jni/NoDebugWaitAttach/res/layout/main_layout.xml b/tests/lldb/jni/NoDebugWaitAttach/res/layout/main_layout.xml
new file mode 100644
index 0000000..131c3b5
--- /dev/null
+++ b/tests/lldb/jni/NoDebugWaitAttach/res/layout/main_layout.xml
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#0099cc"
+    tools:context=".MainActivity">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitCenter" />
+
+</FrameLayout>
+
diff --git a/tests/lldb/jni/NoDebugWaitAttach/src/com/android/rs/jninodebugwaitattach/MainActivity.java b/tests/lldb/jni/NoDebugWaitAttach/src/com/android/rs/jninodebugwaitattach/MainActivity.java
new file mode 100644
index 0000000..6d96f31
--- /dev/null
+++ b/tests/lldb/jni/NoDebugWaitAttach/src/com/android/rs/jninodebugwaitattach/MainActivity.java
@@ -0,0 +1,27 @@
+package com.android.rs.jninodebugwaitattach;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap;
+import android.widget.ImageView;
+
+public class MainActivity extends Activity {
+    private Bitmap mBitmapIn;
+    private Bitmap mBitmapOut;
+
+    static {
+        System.loadLibrary("RS");
+        System.loadLibrary("jninodebugwaitattach");
+    }
+
+    native void nativeRS(String cacheDir);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main_layout);
+        nativeRS(this.getCacheDir().toString());
+    }
+}
+
diff --git a/tests/lldb/run_tests.py b/tests/lldb/run_tests.py
new file mode 100755
index 0000000..0593c0e
--- /dev/null
+++ b/tests/lldb/run_tests.py
@@ -0,0 +1,797 @@
+#!/usr/bin/env python2.7
+'''Main test suite execution script.'''
+import argparse
+import inspect
+import logging
+import os
+import signal
+import subprocess
+import sys
+import time
+import xml.etree.ElementTree as ET
+
+from config import Config
+from tests.harness import util_constants
+from tests.harness import TestSuiteException
+from tests.harness import UtilAndroid
+from tests.harness import UtilBundle
+from tests.harness import util_log
+from tests.harness.util_functions import load_py_module
+
+# For some reason pylint is not able to understand the class returned by
+# from util_log.get_logger() and generates a lot of false warnings
+#pylint: disable=maybe-no-member
+
+EMU_PROC = None
+
+def _parse_args():
+    '''Parse the command line arguments.
+
+    Returns:
+        A namespace object that contains the options specified to run_tests on
+        the command line.
+    '''
+
+    parser = argparse.ArgumentParser(description='Run the test suite.')
+
+    parser.add_argument('--config', '-c',
+                        metavar='path',
+                        help='Path to a custom config file.')
+    parser.add_argument('--device', '-d',
+                        help='Specify the device id of the device to test on.')
+    parser.add_argument('--test', '-t',
+                        metavar='path',
+                        help='Specify a specific test to run.')
+    parser.add_argument('--install-only',
+                        action='store_true',
+                        default=False,
+                        help='It only runs the pre-run stage of the test suite.'
+                             ' It installs the required APKs but does not '
+                             'execute the tests.',
+                        dest='install_only')
+    parser.add_argument('--no-install', '-n',
+                        action='store_true',
+                        default=False,
+                        help='Stop the test suite installing apks to device.',
+                        dest='noinstall')
+    parser.add_argument('--no-uninstall',
+                        action='store_true',
+                        default=False,
+                        help='Stop the test suite uninstalling apks after '
+                             'completion.',
+                        dest='nouninstall')
+    parser.add_argument('--print-to-stdout',
+                        action='store_true',
+                        default=False,
+                        help='Print all logging information to standard out.',
+                        dest='print_to_stdout')
+    parser.add_argument('--verbose', '-v',
+                        action='store_true',
+                        default=None,
+                        help='Store extra info in the log.')
+    parser.add_argument('--wimpy', '-w',
+                        action='store_true',
+                        default=None,
+                        help='Test only a core subset of features.')
+    parser.add_argument('--run-emu',
+                        action='store_true',
+                        default=None,
+                        help='Spawn an emulator and run the test suite on that.'
+                             ' Specify the emulator command line in the config'
+                             ' file or with -emu-cmd.',
+                        dest='run_emu')
+
+    # Get the properties of the Config class and add a command line argument
+    # for each.
+    this_module = sys.modules[__name__]
+    for member_name, member_obj in inspect.getmembers(Config):
+        if (inspect.isdatadescriptor(member_obj) and
+            member_name not in ['__weakref__', 'device', 'verbose']):
+
+            # List type properties can take one or more arguments
+            num_args = None
+            if (isinstance(member_obj, property)
+                and isinstance(member_obj.fget(Config), list)):
+                num_args = '+'
+
+            opt_name = member_name.replace('_', '-')
+
+            setattr(this_module, opt_name, '')
+
+            parser.add_argument('--' + opt_name,
+                                nargs=num_args,
+                                help=member_obj.__doc__,
+                                dest=member_name)
+
+    return parser.parse_args()
+
+
+def _choice(first_choice, second_choice):
+    '''Return first_choice if it is not None otherwise return second_choice.
+
+    Args:
+        first_choice: The first choice value.
+        second_choice: The alternative value.
+
+    Returns:
+        The first argument if it is not None, and the second otherwise.
+    '''
+    return first_choice if first_choice else second_choice
+
+
+class State(object):
+    '''This class manages all objects required by the test suite.'''
+
+    # pylint: disable=too-many-instance-attributes
+    # Since this is a state class many attributes are expected.
+
+    def __init__(self):
+        '''State constructor.
+
+        Raises:
+            TestSuiteException: When unable to load config file.
+
+            AssertionError: When assertions fail.
+        '''
+
+        # Parse the command line options
+        args = _parse_args()
+
+        # create a config instance
+        if args.config:
+            # use the user supplied
+            config = State.load_user_configuration(args.config)
+        else:
+            # use the default configuration
+            config = Config()
+
+        # save the test blacklist
+        self.blacklist = _choice(args.blacklist, config.blacklist)
+
+        # Allow any of the command line arguments to override the
+        # values in the config file.
+        self.adb_path = _choice(args.adb_path, config.adb_path)
+
+        self.host_port = int(_choice(args.host_port, config.host_port))
+
+        self.device = _choice(args.device, config.device)
+
+        self.user_specified_device = self.device
+
+        self.device_port = int(_choice(args.device_port, config.device_port))
+
+        self.lldb_server_path_device = _choice(args.lldb_server_path_device,
+                                               config.lldb_server_path_device)
+
+        self.lldb_server_path_host = _choice(args.lldb_server_path_host,
+                                             config.lldb_server_path_host)
+
+        self.aosp_product_path = _choice(args.aosp_product_path,
+                                         config.aosp_product_path)
+
+        self.log_file_path = _choice(args.log_file_path, config.log_file_path)
+
+        self.results_file_path = _choice(args.results_file_path,
+                                         config.results_file_path)
+
+        self.lldb_path = _choice(args.lldb_path, config.lldb_path)
+        self.print_to_stdout = args.print_to_stdout
+        self.verbose = _choice(args.verbose, config.verbose)
+        self.timeout = int(_choice(args.timeout, config.timeout))
+        self.wimpy = args.wimpy
+        self.emu_cmd = _choice(args.emu_cmd, config.emu_cmd)
+        self.run_emu = args.run_emu
+
+        # validate the param "verbose"
+        if not isinstance(self.verbose, bool):
+            raise TestSuiteException('The parameter "verbose" should be a '
+                                     'boolean: {0}'.format(self.verbose))
+
+        # create result array
+        self.results = dict()
+        self.single_test = args.test
+
+        # initialise the logging facility
+        log_level = logging.INFO if not self.verbose else logging.DEBUG
+        util_log.initialise("driver",
+                            print_to_stdout=self.print_to_stdout,
+                            level=log_level,
+                            file_mode='w', # open for write
+                            file_path=self.log_file_path
+                            )
+        log = util_log.get_logger()
+
+        if self.run_emu and not self.emu_cmd:
+            log.TestSuiteException('Need to specify --emu-cmd (or specify a'
+                ' value in the config file) if using --run-emu.')
+
+        # create a results file
+        self.results_file = open(self.results_file_path, 'w')
+
+        # create an android helper object
+        self.android = UtilAndroid(self.adb_path,
+                                   self.lldb_server_path_device,
+                                   self.device)
+        assert self.android
+
+        # create a test bundle
+        self.bundle = UtilBundle(self.android,
+                                 self.aosp_product_path)
+        assert self.bundle
+
+        # save the no pushing option
+        assert isinstance(args.noinstall, bool)
+        self.noinstall = args.noinstall
+
+        assert isinstance(args.nouninstall, bool)
+        self.nouninstall = args.nouninstall
+
+        # install only option
+        assert type(args.install_only) is bool
+        self.install_only = args.install_only
+        if self.install_only:
+            log.log_and_print('Option --install-only set. The test APKs will '
+                              'be installed on the device but the tests will '
+                              'not be executed.')
+            if self.noinstall:
+                raise TestSuiteException('Conflicting options given: '
+                                         '--install-only and --no-install')
+
+        # TCP port modifier which is used to increment the port number used for
+        # each test case to avoid collisions.
+        self.port_mod = 0
+
+        # total number of tests that will be executed
+        self.test_count = 0
+
+    def get_android(self):
+        '''Return the android ADB helper instance.
+
+        Returns:
+            The android ADB helper, instance of UtilAndroid.
+        '''
+        assert self.android
+        return self.android
+
+    def get_bundle(self):
+        '''Return the test executable bundle.
+
+        Returns:
+            The test exectable collection, instance of UtilBundle.
+        '''
+        return self.bundle
+
+    def add_result(self, name, result):
+        '''Add a test result to the collection.
+
+        Args:
+            name: String name of the test that has executed.
+            result: String result of the test, "pass", "fail", "error".
+        '''
+        self.results[name] = result
+
+    def get_single_test(self):
+        '''Get the name of the single test to run.
+
+        Returns:
+            A string that is the name of the python file containing the test to
+            be run. If all tests are to be run this returns None.
+        '''
+        return self.single_test
+
+    @staticmethod
+    def load_user_configuration(path):
+        '''Load the test suite config from the give path.
+
+        Instantiate the Config class found in the module at the given path.
+        If no suitable class is available, it raises a TestSuiteException.
+
+        Args:
+            path: String location of the module.
+
+        Returns:
+            an instance of the Config class, defined in the module.
+
+        Raises:
+            TestSuiteException: when unable to import the module or when a
+                                subclass of Config is not found inside it.
+        '''
+
+        # load the module
+        config_module = load_py_module(path)
+        if not config_module:
+            raise TestSuiteException('Unable to import the module from "%s"'
+                                     % (path))
+
+        # look for a subclass of Config
+        for name, value in inspect.getmembers(config_module):
+            if (inspect.isclass(value)
+                and name != 'Config'
+                and issubclass(value, Config)):
+                # that's our candidate
+                return value()
+
+        # otherwise there are no valid candidates
+        raise TestSuiteException('The provided user configuration is not '
+                                 'valid. The module must define a subclass '
+                                 'of Config')
+
+
+def _kill_emulator():
+    ''' Kill the emulator process. '''
+    global EMU_PROC
+    if EMU_PROC:
+        try:
+            EMU_PROC.terminate()
+        except OSError:
+            # can't kill a dead proc
+            log = util_log.get_logger()
+            log.debug('Trying to kill an emulator but it is already dead.')
+
+
+def _check_emulator_terminated():
+    ''' Throw an exception if the emulator process has ended.
+
+    Raises:
+        TestSuiteException: If the emulator process has ended.
+    '''
+    global EMU_PROC
+    assert EMU_PROC
+    if EMU_PROC.poll():
+        stdout, stderr = EMU_PROC.communicate()
+        raise TestSuiteException('The emulator terminated with output:'
+            '\nstderr: {0}\nstdout: {1}.'.format(stderr, stdout))
+
+
+def _launch_emulator(state):
+    '''Launch the emulator and wait for it to boot.
+
+    Args:
+        emu_cmd: The command line to run the emulator.
+
+    Raises:
+        TestSuiteException: If an emulator already exists or the emulator
+                            process terminated before we could connect to it, or
+                            we failed to copy lldb-server to the emulator.
+    '''
+    global EMU_PROC
+    android = state.android
+    if state.user_specified_device:
+        if android.device_with_substring_exists(state.user_specified_device):
+            raise TestSuiteException(
+                'A device with name {0} already exists.',
+                state.user_specified_device)
+    else:
+        if android.device_with_substring_exists('emulator'):
+            raise TestSuiteException('An emulator already exists.')
+
+    assert state.emu_cmd
+    EMU_PROC = subprocess.Popen(state.emu_cmd.split(),
+                                stdout=None,
+                                stderr=subprocess.STDOUT)
+
+    log = util_log.get_logger()
+    log.info('Launching emulator with command line {0}'.format(state.emu_cmd))
+
+    tries_number = 180
+    tries = tries_number
+    found_device = False
+    while not found_device:
+        try:
+            android.validate_device(False, 'emulator')
+            found_device = True
+        except TestSuiteException as ex:
+            tries -= 1
+            if tries == 0:
+                # Avoid infinitely looping if the emulator won't boot
+                log.warning(
+                    'Giving up trying to validate device after {0} tries.'
+                    .format(tries_number))
+                raise ex
+            _check_emulator_terminated()
+            # wait a bit and try again, maybe it has now booted
+            time.sleep(10)
+
+    tries = 500
+    while not android.is_booted():
+        tries -= 1
+        if tries == 0:
+            # Avoid infinitely looping if the emulator won't boot
+            raise TestSuiteException('The emulator has failed to boot.')
+        _check_emulator_terminated()
+        time.sleep(5)
+
+    # Need to be root before we can push lldb-server
+    android.adb_root()
+    android.wait_for_device()
+
+    # Push the lldb-server executable to the device.
+    output = android.adb('push {0} {1}'.format(state.lldb_server_path_host,
+                                               state.lldb_server_path_device))
+
+    if 'failed to copy' in output or 'No such file or directory' in output:
+        raise TestSuiteException(
+            'unable to push lldb-server to the emulator: {0}.'
+            .format(output))
+
+    output = android.shell('chmod a+x {0}'
+                           .format(state.lldb_server_path_device))
+
+    if 'No such file or directory' in output:
+        raise TestSuiteException('Failed to copy lldb-server to the emulator.')
+
+
+def _restart_emulator(state):
+    '''Kill the emulator and start a new instance.
+
+    Args:
+        state: Test suite state collection, instance of State.
+    '''
+    _kill_emulator()
+    _launch_emulator(state)
+
+
+def _run_test(state, name):
+    '''Execute a single test case.
+
+    Args:
+        state: Test suite state collection, instance of State.
+        name: String file name of the test to execute.
+
+    Raises:
+        AssertionError: When assertion fails.
+    '''
+    assert isinstance(name, str)
+
+    try:
+        state.android.check_adb_alive()
+    except TestSuiteException as expt:
+        global EMU_PROC
+        if EMU_PROC:
+            _restart_emulator(state)
+        else:
+            raise expt
+
+    log = util_log.get_logger()
+    sys.stdout.write('Running {0}\r'.format(name))
+    sys.stdout.flush()
+    log.info('Running {0}'.format(name))
+
+    run_tests_dir = os.path.dirname(os.path.realpath(__file__))
+    run_test_path = os.path.join(run_tests_dir, 'tests', 'run_test.py')
+
+    # Forward port for lldb-server on the device to our host
+    hport = int(state.host_port) + state.port_mod
+    dport = int(state.device_port) + state.port_mod
+    state.android.forward_port(hport, dport)
+    state.port_mod += 1
+
+    log.debug('Giving up control to {0}...'.format(name))
+
+    params = [sys.executable,
+              run_test_path,
+              name,
+              state.log_file_path,
+              state.adb_path,
+              state.lldb_server_path_device,
+              state.aosp_product_path,
+              str(dport),
+              state.android.get_device_id(),
+              str(state.print_to_stdout),
+              str(state.verbose),
+              str(state.wimpy),
+              str(state.timeout)]
+
+    return_code = subprocess.call(params)
+
+    state.android.remove_port_forwarding()
+    log.seek_to_end()
+
+    # report in sys.stdout the result
+    print('Running {0}: {1}'.format(name,
+          ('PASS' if return_code == util_constants.RC_TEST_OK else 'FAIL')))
+
+    if return_code == util_constants.RC_TEST_OK:
+        state.add_result(name, 'pass')
+        log.info('Test {0} passed'.format(name))
+    elif return_code == util_constants.RC_TEST_TIMEOUT:
+        state.add_result(name, 'timeout')
+        log.error('Test {0} timed out'.format(name))
+    elif return_code == util_constants.RC_TEST_ERROR:
+        state.add_result(name, 'failure')
+        log.error('Test {0} failed'.format(name))
+    else: # unexpected result
+        state.add_result(name, 'error')
+        log.critical('Test {0} yielded an unexpected return code: {1}'
+                        .format(name, return_code))
+
+    # print a running total pass rate
+    passes = sum(1 for key, value in state.results.iteritems() if value == 'pass')
+    log.info('Current pass rate: {0} of {1}.'.format(passes, len(state.results)))
+    if state.test_count:
+        percent = (len(state.results)*100) / state.test_count
+        log.info('Testing is {0}% complete.'.format(percent))
+
+
+def _check_lldbserver_exists(state):
+    '''Check lldb-server exists on the target device and it is executable.
+
+    Raises:
+        TestSuiteError: If lldb-server does not exist on the target.
+    '''
+    assert state
+
+    message = 'Unable to verify valid lldb-server on target'
+
+    android = state.get_android()
+    assert android
+
+    cmd = state.lldb_server_path_device
+    out = android.shell(cmd, False)
+    if not isinstance(out, str):
+        raise TestSuiteException(message)
+    if out.find('Usage:') < 0:
+        raise TestSuiteException(message)
+
+
+def _suite_pre_run(state):
+    '''This function is executed before the test cases are run (setup).
+
+    Args:
+        state: Test suite state collection, instance of State.
+
+    Return:
+        True if the pre_run step completes without error.
+        Checks made:
+            - Validating that adb exists and runs.
+            - Validating that a device is attached.
+            - We have root access to the device.
+            - All test binaries were pushed to the device.
+            - The port for lldb-server was forwarded correctly.
+
+    Raises:
+        AssertionError: When assertions fail.
+    '''
+    assert state
+    log = util_log.get_logger()
+
+    try:
+        android = state.get_android()
+        bundle = state.get_bundle()
+        assert android
+        assert bundle
+
+        # validate ADB helper class
+        android.validate_adb()
+        log.log_and_print('Located ADB')
+
+        if state.run_emu:
+            log.log_and_print('Launching emulator...')
+            _launch_emulator(state)
+            log.log_and_print('Started emulator ' + android.device)
+        else:
+            android.validate_device()
+            log.log_and_print('Located device ' + android.device)
+
+        if state.noinstall and not state.single_test:
+            bundle.check_apps_installed(state.wimpy)
+
+        # elevate to root user
+        android.adb_root()
+        android.wait_for_device()
+        # check that lldb-server exists on device
+        android.kill_servers()
+        _check_lldbserver_exists(state)
+
+        if not state.noinstall:
+            # push all tests to the device
+            log.log_and_print('Pushing all tests...')
+            bundle.push_all()
+            log.log_and_print('Pushed all tests')
+        log.log_and_print('Pre run complete')
+
+    except TestSuiteException as expt:
+        log.exception('Test suite pre run failure')
+
+        # Even if we are logging the error, it may be helpful and more
+        # immediate to find out the error into the terminal
+        log.log_and_print('ERROR: Unable to set up the test suite: %s\n'
+                          % expt.message, logging.ERROR)
+
+        return False
+    return True
+
+
+def _suite_post_run(state):
+    '''This function is executed after the test cases have run (teardown).
+
+    Args:
+        state: Test suite state collection, instance of State.
+    '''
+    log = util_log.get_logger()
+
+    if not state.noinstall and not state.nouninstall:
+        if state.wimpy:
+            state.bundle.uninstall_all_apk()
+        else:
+            state.bundle.uninstall_all()
+        log.log_and_print('Uninstalled/Deleted all tests')
+
+    total = 0
+    passes = 0
+    failures = 0
+
+    results = ET.Element('testsuite')
+    results.attrib['name'] = 'LLDB RS Test Suite'
+
+    for key, value in state.results.iteritems():
+        total += 1
+        if value == 'pass':
+            passes += 1
+        else:
+            failures += 1
+
+        # test case name, followed by pass, failure or error elements
+        testcase = ET.Element('testcase')
+        testcase.attrib['name'] = key
+        result_element = ET.Element(value)
+        result_element.text = key
+        testcase.append(result_element)
+        results.append(testcase)
+
+    assert passes + failures == total, 'Invalid test results status'
+    if failures:
+        log.log_and_print(
+            'The following failures occurred: \n{}'.format('\n'.join(
+                'failed: ' + name
+                for name, result in state.results.items() if result != 'pass'
+        )))
+
+    log.log_and_print('{0} of {1} passed'.format(passes, total))
+    if total:
+        log.log_and_print('{0}% rate'.format((passes*100)/total))
+
+    results.attrib['tests'] = str(total)
+    state.results_file.write(ET.tostring(results, encoding='iso-8859-1'))
+
+
+def _discover_tests(state):
+    '''Discover all tests in the tests directory.
+
+    Returns:
+        List of strings, test file names from the 'tests' directory.
+    '''
+    tests = []
+
+    single_test = state.get_single_test()
+    if single_test is None:
+        file_dir = os.path.dirname(os.path.realpath(__file__))
+        tests_dir = os.path.join(file_dir, 'tests')
+
+        for sub_dir in os.listdir(tests_dir):
+            current_test_dir = os.path.join(tests_dir, sub_dir)
+            if os.path.isdir(current_test_dir):
+                dir_name = os.path.basename(current_test_dir)
+
+                if dir_name == 'harness':
+                    continue
+
+                if state.wimpy and dir_name != 'java':
+                    continue
+
+                for item in os.listdir(current_test_dir):
+                    if (item.startswith('test')
+                        and item.endswith('.py')
+                        and not item in state.blacklist):
+                        tests.append(item)
+    else:
+        if single_test.endswith('.py'):
+            tests.append(single_test)
+        else:
+            tests.append(single_test + '.py')
+
+    state.test_count = len(tests)
+    return tests
+
+
+def _deduce_python_path(state):
+    '''Try to deduce the PYTHONPATH environment variable via the LLDB binary.
+
+    Args:
+        state: Test suite state collection, instance of State.
+
+    Returns:
+        True if PYTHONPATH has been updated, False otherwise.
+
+    Raises:
+        TestSuiteException: If lldb path provided in the config or command line
+                            is incorrect.
+        AssertionError: If an assertion fails.
+    '''
+
+    lldb_path = state.lldb_path
+    if not lldb_path:
+        # lldb may not be provided in preference of a manual $PYTHONPATH
+        return False
+
+    params = [lldb_path, '-P']
+
+    try:
+        proc = subprocess.Popen(params, stdout=subprocess.PIPE)
+    except OSError as err:
+        error_string = 'Could not run lldb at %s: %s' % (lldb_path, str(err))
+        raise TestSuiteException(error_string)
+
+    stdout = proc.communicate()[0]
+    if stdout:
+        os.environ['PYTHONPATH'] = stdout.strip()
+        return True
+
+    return False
+
+
+def main():
+    '''The lldb-renderscript test suite entry point.'''
+    log = None
+
+    try:
+        # parse the command line
+        state = State()
+        assert state
+
+        # logging is initialised in State()
+        log = util_log.get_logger()
+
+        # if we can, set PYTHONPATH for lldb bindings
+        if not _deduce_python_path(state):
+            log.log_and_print('Unable to deduce PYTHONPATH', logging.WARN)
+
+        # pre run step
+        if not _suite_pre_run(state):
+            raise TestSuiteException('Test suite pre-run step failed')
+        # discover all tests and execute them
+        tests = _discover_tests(state)
+        log.log_and_print('Found {0} tests'.format(len(tests)))
+        if state.install_only:
+            log.log_and_print('Test applications installed. Terminating due to '
+                              '--install-only option')
+        else:
+            # run the tests
+            for item in tests:
+                _run_test(state, item)
+            # post run step
+            _suite_post_run(state)
+
+        # success
+        quit(0)
+
+    except AssertionError:
+        if log:
+            log.exception('Internal test suite error')
+
+        print 'Internal test suite error'
+        quit(1)
+
+    except TestSuiteException as error:
+        if log:
+            log.exception('Test suite exception')
+
+        print '{0}'.format(str(error))
+        quit(2)
+
+    finally:
+        _kill_emulator()
+        logging.shutdown()
+
+def signal_handler(_, _unused):
+    '''Signal handler for SIGINT, caused by the user typing Ctrl-C.'''
+    # pylint: disable=unused-argument
+    # pylint: disable=protected-access
+    print 'Ctrl+C!'
+    os._exit(1)
+
+
+# execution trampoline
+if __name__ == '__main__':
+    signal.signal(signal.SIGINT, signal_handler)
+    main()
diff --git a/tests/lldb/tests/__init__.py b/tests/lldb/tests/__init__.py
new file mode 100644
index 0000000..7bf5dc9
--- /dev/null
+++ b/tests/lldb/tests/__init__.py
@@ -0,0 +1,3 @@
+'''This module contains a test runner, tests and utility code'''
+
+import harness
diff --git a/tests/lldb/tests/cpp/test_allocation_dump_1_cpp.py b/tests/lldb/tests/cpp/test_allocation_dump_1_cpp.py
new file mode 100644
index 0000000..0180d32
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_allocation_dump_1_cpp.py
@@ -0,0 +1,326 @@
+'''Module that contains the test TestAllocationDump1Cpp.'''
+
+import os
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestAllocationDump1Cpp(TestBaseRemote):
+    '''Tests printing the contents of allocations in NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            String that is the name of the binary that this test should be run
+            with.
+        '''
+        return 'CppAllocations'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test dumping large allocations to file
+        output_file_1 = self.get_tmp_file_path()
+        output_file_2 = self.get_tmp_file_path()
+
+        self.try_command('language renderscript allocation dump 1 -f ' +
+                         output_file_1,
+                         ["Results written to '%s'" % output_file_1])
+
+        self.try_command('language renderscript allocation dump 2 -f ' +
+                         output_file_2,
+                         ["Results written to '%s'" % output_file_2])
+
+        # Check files were created
+        self.test_assert(os.path.isfile(output_file_1))
+        self.test_assert(os.path.isfile(output_file_2))
+        os.remove(output_file_1)
+        os.remove(output_file_2)
+
+        # char
+        self.try_command('language renderscript allocation dump 3',
+                         ['(0, 0, 0) = 0',
+                          '(0, 1, 0) = 1',
+                          '(0, 2, 0) = 2',
+                          '(0, 0, 1) = 3',
+                          '(0, 1, 1) = 4',
+                          '(0, 2, 1) = 5',
+                          '(0, 0, 2) = 6',
+                          '(0, 1, 2) = 7',
+                          '(0, 2, 2) = 8',
+                          '(0, 0, 3) = 9',
+                          '(0, 1, 3) = 10',
+                          '(0, 2, 3) = 11',
+                          '(0, 0, 4) = 12',
+                          '(0, 1, 4) = 13',
+                          '(0, 2, 4) = 14',
+                          '(0, 0, 5) = 15',
+                          '(0, 1, 5) = 16',
+                          '(0, 2, 5) = 17',
+                          '(0, 0, 6) = 18',
+                          '(0, 1, 6) = 19',
+                          '(0, 2, 6) = 20',
+                          '(0, 0, 7) = 21',
+                          '(0, 1, 7) = 22',
+                          '(0, 2, 7) = 23'])
+
+        # char2
+        self.try_command('language renderscript allocation dump 4',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(6, 0, 0) = {12 13}',
+                          '(7, 0, 0) = {14 15}',
+                          '(8, 0, 0) = {16 17}',
+                          '(9, 0, 0) = {18 19}',
+                          '(10, 0, 0) = {20 21}',
+                          '(11, 0, 0) = {22 23}'])
+
+        # char3
+        self.try_command('language renderscript allocation dump 5',
+                         ['(0, 0, 0) = {0 1 2}',
+                          '(1, 0, 0) = {4 5 6}',
+                          '(2, 0, 0) = {8 9 10}',
+                          '(3, 0, 0) = {12 13 14}',
+                          '(4, 0, 0) = {16 17 18}',
+                          '(5, 0, 0) = {20 21 22}'])
+
+        # char4
+        self.try_command('language renderscript allocation dump 6',
+                         ['(0, 0, 0) = {0 1 2 3}',
+                          '(1, 0, 0) = {4 5 6 7}',
+                          '(2, 0, 0) = {8 9 10 11}',
+                          '(3, 0, 0) = {12 13 14 15}',
+                          '(4, 0, 0) = {16 17 18 19}',
+                          '(5, 0, 0) = {20 21 22 23}'])
+
+        # short
+        self.try_command('language renderscript allocation dump 7',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # short2
+        self.try_command('language renderscript allocation dump 8',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(0, 0, 1) = {12 13}',
+                          '(1, 0, 1) = {14 15}',
+                          '(2, 0, 1) = {16 17}',
+                          '(3, 0, 1) = {18 19}',
+                          '(4, 0, 1) = {20 21}',
+                          '(5, 0, 1) = {22 23}'])
+
+        # short3
+        self.try_command('language renderscript allocation dump 9',
+                         ['(0, 0, 0) = {0 1 2}',
+                          '(1, 0, 0) = {4 5 6}',
+                          '(2, 0, 0) = {8 9 10}',
+                          '(3, 0, 0) = {12 13 14}',
+                          '(4, 0, 0) = {16 17 18}',
+                          '(5, 0, 0) = {20 21 22}'])
+
+        # short4
+        self.try_command('language renderscript allocation dump 10',
+                         ['(0, 0, 0) = {0 1 2 3}',
+                          '(1, 0, 0) = {4 5 6 7}',
+                          '(2, 0, 0) = {8 9 10 11}',
+                          '(3, 0, 0) = {12 13 14 15}',
+                          '(4, 0, 0) = {16 17 18 19}',
+                          '(5, 0, 0) = {20 21 22 23}'])
+
+        # int
+        self.try_command('language renderscript allocation dump 11',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # int2
+        self.try_command('language renderscript allocation dump 12',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(6, 0, 0) = {12 13}',
+                          '(7, 0, 0) = {14 15}',
+                          '(8, 0, 0) = {16 17}',
+                          '(9, 0, 0) = {18 19}',
+                          '(10, 0, 0) = {20 21}',
+                          '(11, 0, 0) = {22 23}'])
+
+        # int3
+        self.try_command('language renderscript allocation dump 13',
+                         ['(0, 0, 0) = {0 1 2}',
+                          '(1, 0, 0) = {4 5 6}',
+                          '(2, 0, 0) = {8 9 10}',
+                          '(0, 1, 0) = {12 13 14}',
+                          '(1, 1, 0) = {16 17 18}',
+                          '(2, 1, 0) = {20 21 22}'])
+        # int4
+        self.try_command('language renderscript allocation dump 14',
+                         ['(0, 0, 0) = {0 1 2 3}',
+                          '(1, 0, 0) = {4 5 6 7}',
+                          '(2, 0, 0) = {8 9 10 11}',
+                          '(3, 0, 0) = {12 13 14 15}',
+                          '(4, 0, 0) = {16 17 18 19}',
+                          '(5, 0, 0) = {20 21 22 23}'])
+
+        # long
+        self.try_command('language renderscript allocation dump 15',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # long2
+        self.try_command('language renderscript allocation dump 16',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(6, 0, 0) = {12 13}',
+                          '(7, 0, 0) = {14 15}',
+                          '(8, 0, 0) = {16 17}',
+                          '(9, 0, 0) = {18 19}',
+                          '(10, 0, 0) = {20 21}',
+                          '(11, 0, 0) = {22 23}'])
+
+        # long3
+        self.try_command('language renderscript allocation dump 17',
+                         ['(0, 0, 0) = {0 1 2}',
+                          '(1, 0, 0) = {4 5 6}',
+                          '(2, 0, 0) = {8 9 10}',
+                          '(3, 0, 0) = {12 13 14}',
+                          '(4, 0, 0) = {16 17 18}',
+                          '(5, 0, 0) = {20 21 22}'])
+
+        # long4
+        self.try_command('language renderscript allocation dump 18',
+                         ['(0, 0, 0) = {0 1 2 3}',
+                          '(0, 1, 0) = {4 5 6 7}',
+                          '(0, 2, 0) = {8 9 10 11}',
+                          '(0, 3, 0) = {12 13 14 15}',
+                          '(0, 4, 0) = {16 17 18 19}',
+                          '(0, 5, 0) = {20 21 22 23}'])
+
+        # bool
+        self.try_command('language renderscript allocation dump 19',
+                         ['(0, 0, 0) = false',
+                          '(1, 0, 0) = true',
+                          '(2, 0, 0) = false',
+                          '(3, 0, 0) = true',
+                          '(4, 0, 0) = false',
+                          '(5, 0, 0) = true',
+                          '(6, 0, 0) = false',
+                          '(7, 0, 0) = true',
+                          '(8, 0, 0) = false',
+                          '(9, 0, 0) = true',
+                          '(10, 0, 0) = false',
+                          '(11, 0, 0) = true',
+                          '(12, 0, 0) = false',
+                          '(13, 0, 0) = true',
+                          '(14, 0, 0) = false',
+                          '(15, 0, 0) = true',
+                          '(16, 0, 0) = false',
+                          '(17, 0, 0) = true',
+                          '(18, 0, 0) = false',
+                          '(19, 0, 0) = true',
+                          '(20, 0, 0) = false',
+                          '(21, 0, 0) = true',
+                          '(22, 0, 0) = false',
+                          '(23, 0, 0) = true'])
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 2', ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 3', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_allocation_dump_2_cpp.py b/tests/lldb/tests/cpp/test_allocation_dump_2_cpp.py
new file mode 100644
index 0000000..24bd64d
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_allocation_dump_2_cpp.py
@@ -0,0 +1,514 @@
+'''Module that contains the test TestAllocationDump2Cpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestAllocationDump2Cpp(TestBaseRemote):
+    '''Tests printing the contents of allocations in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppAllocations'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint del 1',
+                         ['1 breakpoints deleted'])
+
+        # Hit second kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # uchar
+        self.try_command('language renderscript allocation dump 20',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # uchar2
+        self.try_command('language renderscript allocation dump 21',
+                         ['(0, 0, 0) = {0x00 0x01}',
+                          '(1, 0, 0) = {0x02 0x03}',
+                          '(0, 1, 0) = {0x04 0x05}',
+                          '(1, 1, 0) = {0x06 0x07}',
+                          '(0, 2, 0) = {0x08 0x09}',
+                          '(1, 2, 0) = {0x0a 0x0b}',
+                          '(0, 3, 0) = {0x0c 0x0d}',
+                          '(1, 3, 0) = {0x0e 0x0f}',
+                          '(0, 4, 0) = {0x10 0x11}',
+                          '(1, 4, 0) = {0x12 0x13}',
+                          '(0, 5, 0) = {0x14 0x15}',
+                          '(1, 5, 0) = {0x16 0x17}'])
+
+        # uchar3
+        self.try_command('language renderscript allocation dump 22',
+                         ['(0, 0, 0) = {0x00 0x01 0x02}',
+                          '(1, 0, 0) = {0x04 0x05 0x06}',
+                          '(2, 0, 0) = {0x08 0x09 0x0a}',
+                          '(3, 0, 0) = {0x0c 0x0d 0x0e}',
+                          '(4, 0, 0) = {0x10 0x11 0x12}',
+                          '(5, 0, 0) = {0x14 0x15 0x16}'])
+
+        # uchar4
+        self.try_command('language renderscript allocation dump 23',
+                         ['(0, 0, 0) = {0x00 0x01 0x02 0x03}',
+                          '(1, 0, 0) = {0x04 0x05 0x06 0x07}',
+                          '(2, 0, 0) = {0x08 0x09 0x0a 0x0b}',
+                          '(3, 0, 0) = {0x0c 0x0d 0x0e 0x0f}',
+                          '(4, 0, 0) = {0x10 0x11 0x12 0x13}',
+                          '(5, 0, 0) = {0x14 0x15 0x16 0x17}'])
+
+        # ushort
+        self.try_command('language renderscript allocation dump 24',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # ushort2
+        self.try_command('language renderscript allocation dump 25',
+                         ['(0, 0, 0) = {0x0000 0x0001}',
+                          '(1, 0, 0) = {0x0002 0x0003}',
+                          '(2, 0, 0) = {0x0004 0x0005}',
+                          '(3, 0, 0) = {0x0006 0x0007}',
+                          '(4, 0, 0) = {0x0008 0x0009}',
+                          '(5, 0, 0) = {0x000a 0x000b}',
+                          '(6, 0, 0) = {0x000c 0x000d}',
+                          '(7, 0, 0) = {0x000e 0x000f}',
+                          '(8, 0, 0) = {0x0010 0x0011}',
+                          '(9, 0, 0) = {0x0012 0x0013}',
+                          '(10, 0, 0) = {0x0014 0x0015}',
+                          '(11, 0, 0) = {0x0016 0x0017}'])
+
+        # ushort3
+        self.try_command('language renderscript allocation dump 26',
+                         ['(0, 0, 0) = {0x0000 0x0001 0x0002}',
+                          '(0, 1, 0) = {0x0004 0x0005 0x0006}',
+                          '(0, 2, 0) = {0x0008 0x0009 0x000a}',
+                          '(0, 3, 0) = {0x000c 0x000d 0x000e}',
+                          '(0, 4, 0) = {0x0010 0x0011 0x0012}',
+                          '(0, 5, 0) = {0x0014 0x0015 0x0016}'])
+
+        # ushort4
+        self.try_command('language renderscript allocation dump 27',
+                         ['(0, 0, 0) = {0x0000 0x0001 0x0002 0x0003}',
+                          '(1, 0, 0) = {0x0004 0x0005 0x0006 0x0007}',
+                          '(2, 0, 0) = {0x0008 0x0009 0x000a 0x000b}',
+                          '(3, 0, 0) = {0x000c 0x000d 0x000e 0x000f}',
+                          '(4, 0, 0) = {0x0010 0x0011 0x0012 0x0013}',
+                          '(5, 0, 0) = {0x0014 0x0015 0x0016 0x0017}'])
+
+        # uint
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # uint2
+        self.try_command('language renderscript allocation dump 29',
+                         ['(0, 0, 0) = {0x00000000 0x00000001}',
+                          '(1, 0, 0) = {0x00000002 0x00000003}',
+                          '(2, 0, 0) = {0x00000004 0x00000005}',
+                          '(3, 0, 0) = {0x00000006 0x00000007}',
+                          '(4, 0, 0) = {0x00000008 0x00000009}',
+                          '(5, 0, 0) = {0x0000000a 0x0000000b}',
+                          '(6, 0, 0) = {0x0000000c 0x0000000d}',
+                          '(7, 0, 0) = {0x0000000e 0x0000000f}',
+                          '(8, 0, 0) = {0x00000010 0x00000011}',
+                          '(9, 0, 0) = {0x00000012 0x00000013}',
+                          '(10, 0, 0) = {0x00000014 0x00000015}',
+                          '(11, 0, 0) = {0x00000016 0x00000017}'])
+
+        # uint3
+        self.try_command('language renderscript allocation dump 30',
+                         ['(0, 0, 0) = {0x00000000 0x00000001 0x00000002}',
+                          '(1, 0, 0) = {0x00000004 0x00000005 0x00000006}',
+                          '(2, 0, 0) = {0x00000008 0x00000009 0x0000000a}',
+                          '(3, 0, 0) = {0x0000000c 0x0000000d 0x0000000e}',
+                          '(4, 0, 0) = {0x00000010 0x00000011 0x00000012}',
+                          '(5, 0, 0) = {0x00000014 0x00000015 0x00000016}'])
+
+        # uint4
+        self.try_command('language renderscript allocation dump 31',
+                         ['(0, 0, 0) = {0x00000000 0x00000001 0x00000002 0x00000003}',
+                          '(0, 0, 1) = {0x00000004 0x00000005 0x00000006 0x00000007}',
+                          '(0, 0, 2) = {0x00000008 0x00000009 0x0000000a 0x0000000b}',
+                          '(0, 0, 3) = {0x0000000c 0x0000000d 0x0000000e 0x0000000f}',
+                          '(0, 0, 4) = {0x00000010 0x00000011 0x00000012 0x00000013}',
+                          '(0, 0, 5) = {0x00000014 0x00000015 0x00000016 0x00000017}'])
+
+        # ulong
+        self.try_command('language renderscript allocation dump 32',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(0, 1, 0) = 4',
+                          '(1, 1, 0) = 5',
+                          '(2, 1, 0) = 6',
+                          '(3, 1, 0) = 7',
+                          '(0, 2, 0) = 8',
+                          '(1, 2, 0) = 9',
+                          '(2, 2, 0) = 10',
+                          '(3, 2, 0) = 11',
+                          '(0, 0, 1) = 12',
+                          '(1, 0, 1) = 13',
+                          '(2, 0, 1) = 14',
+                          '(3, 0, 1) = 15',
+                          '(0, 1, 1) = 16',
+                          '(1, 1, 1) = 17',
+                          '(2, 1, 1) = 18',
+                          '(3, 1, 1) = 19',
+                          '(0, 2, 1) = 20',
+                          '(1, 2, 1) = 21',
+                          '(2, 2, 1) = 22',
+                          '(3, 2, 1) = 23'])
+
+        # ulong2
+        self.try_command('language renderscript allocation dump 33',
+                         ['(0, 0, 0) = {0x0000000000000000 0x0000000000000001}',
+                          '(1, 0, 0) = {0x0000000000000002 0x0000000000000003}',
+                          '(2, 0, 0) = {0x0000000000000004 0x0000000000000005}',
+                          '(3, 0, 0) = {0x0000000000000006 0x0000000000000007}',
+                          '(4, 0, 0) = {0x0000000000000008 0x0000000000000009}',
+                          '(5, 0, 0) = {0x000000000000000a 0x000000000000000b}',
+                          '(6, 0, 0) = {0x000000000000000c 0x000000000000000d}',
+                          '(7, 0, 0) = {0x000000000000000e 0x000000000000000f}',
+                          '(8, 0, 0) = {0x0000000000000010 0x0000000000000011}',
+                          '(9, 0, 0) = {0x0000000000000012 0x0000000000000013}',
+                          '(10, 0, 0) = {0x0000000000000014 0x0000000000000015}',
+                          '(11, 0, 0) = {0x0000000000000016 0x0000000000000017}'])
+
+        # ulong3
+        self.try_command('language renderscript allocation dump 34',
+                         ['(0, 0, 0) = {0x0000000000000000 0x0000000000000001 0x0000000000000002}',
+                          '(1, 0, 0) = {0x0000000000000004 0x0000000000000005 0x0000000000000006}',
+                          '(2, 0, 0) = {0x0000000000000008 0x0000000000000009 0x000000000000000a}',
+                          '(3, 0, 0) = {0x000000000000000c 0x000000000000000d 0x000000000000000e}',
+                          '(4, 0, 0) = {0x0000000000000010 0x0000000000000011 0x0000000000000012}',
+                          '(5, 0, 0) = {0x0000000000000014 0x0000000000000015 0x0000000000000016}'])
+
+        # ulong4
+        self.try_command('language renderscript allocation dump 35',
+                         ['(0, 0, 0) = {0x0000000000000000 0x0000000000000001 '
+                                       '0x0000000000000002 0x0000000000000003}',
+                          '(1, 0, 0) = {0x0000000000000004 0x0000000000000005 '
+                                       '0x0000000000000006 0x0000000000000007}',
+                          '(2, 0, 0) = {0x0000000000000008 0x0000000000000009 '
+                                       '0x000000000000000a 0x000000000000000b}',
+                          '(3, 0, 0) = {0x000000000000000c 0x000000000000000d '
+                                       '0x000000000000000e 0x000000000000000f}',
+                          '(4, 0, 0) = {0x0000000000000010 0x0000000000000011 '
+                                       '0x0000000000000012 0x0000000000000013}',
+                          '(5, 0, 0) = {0x0000000000000014 0x0000000000000015 '
+                                       '0x0000000000000016 0x0000000000000017}'])
+
+        self.try_command('breakpoint del 2',
+                         ['1 breakpoints deleted'])
+
+        # Hit third kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test that uint allocation has been squared by square_kernel
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 4',
+                          '(3, 0, 0) = 9',
+                          '(4, 0, 0) = 16',
+                          '(5, 0, 0) = 25',
+                          '(6, 0, 0) = 36',
+                          '(7, 0, 0) = 49',
+                          '(8, 0, 0) = 64',
+                          '(9, 0, 0) = 81',
+                          '(10, 0, 0) = 100',
+                          '(11, 0, 0) = 121',
+                          '(12, 0, 0) = 144',
+                          '(13, 0, 0) = 169',
+                          '(14, 0, 0) = 196',
+                          '(15, 0, 0) = 225',
+                          '(16, 0, 0) = 256',
+                          '(17, 0, 0) = 289',
+                          '(18, 0, 0) = 324',
+                          '(19, 0, 0) = 361',
+                          '(20, 0, 0) = 400',
+                          '(21, 0, 0) = 441',
+                          '(22, 0, 0) = 484',
+                          '(23, 0, 0) = 529'])
+
+        # half
+        self.try_command('language renderscript allocation dump 36',
+                         ['(0, 0, 0) = inf',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 0.5',
+                          '(3, 0, 0) = 0.333252',
+                          '(4, 0, 0) = 0.25',
+                          '(5, 0, 0) = 0.199951',
+                          '(6, 0, 0) = 0.166626',
+                          '(7, 0, 0) = 0.142822',
+                          '(8, 0, 0) = 0.125',
+                          '(9, 0, 0) = 0.111084',
+                          '(10, 0, 0) = 0.0999756',
+                          '(11, 0, 0) = 0.0908813',
+                          '(12, 0, 0) = 0.083313',
+                          '(13, 0, 0) = 0.0769043',
+                          '(14, 0, 0) = 0.0714111',
+                          '(15, 0, 0) = 0.0666504',
+                          '(16, 0, 0) = 0.0625',
+                          '(17, 0, 0) = 0.0588379',
+                          '(18, 0, 0) = 0.055542',
+                          '(19, 0, 0) = 0.0526428',
+                          '(20, 0, 0) = 0.0499878',
+                          '(21, 0, 0) = 0.0476074',
+                          '(22, 0, 0) = 0.0454407',
+                          '(23, 0, 0) = 0.0434875'])
+
+        # half2
+        self.try_command('language renderscript allocation dump 37',
+                         ['(0, 0, 0) = {inf 1}',
+                          '(1, 0, 0) = {0.5 0.333252}',
+                          '(2, 0, 0) = {0.25 0.199951}',
+                          '(3, 0, 0) = {0.166626 0.142822}',
+                          '(4, 0, 0) = {0.125 0.111084}',
+                          '(5, 0, 0) = {0.0999756 0.0908813}',
+                          '(6, 0, 0) = {0.083313 0.0769043}',
+                          '(7, 0, 0) = {0.0714111 0.0666504}',
+                          '(8, 0, 0) = {0.0625 0.0588379}',
+                          '(9, 0, 0) = {0.055542 0.0526428}',
+                          '(10, 0, 0) = {0.0499878 0.0476074}',
+                          '(11, 0, 0) = {0.0454407 0.0434875}'])
+
+        # half3
+        self.try_command('language renderscript allocation dump 38',
+                         ['(0, 0, 0) = {inf 1 0.5}',
+                          '(0, 1, 0) = {0.25 0.199951 0.166626}',
+                          '(0, 2, 0) = {0.125 0.111084 0.0999756}',
+                          '(0, 3, 0) = {0.083313 0.0769043 0.0714111}',
+                          '(0, 4, 0) = {0.0625 0.0588379 0.055542}',
+                          '(0, 5, 0) = {0.0499878 0.0476074 0.0454407}'])
+
+        # half4
+        self.try_command('language renderscript allocation dump 39',
+                         ['(0, 0, 0) = {inf 1 0.5 0.333252}',
+                          '(1, 0, 0) = {0.25 0.199951 0.166626 0.142822}',
+                          '(2, 0, 0) = {0.125 0.111084 0.0999756 0.0908813}',
+                          '(3, 0, 0) = {0.083313 0.0769043 0.0714111 0.0666504}',
+                          '(4, 0, 0) = {0.0625 0.0588379 0.055542 0.0526428}',
+                          '(5, 0, 0) = {0.0499878 0.0476074 0.0454407 0.0434875}'])
+
+        # float
+        self.try_command('language renderscript allocation dump 40',
+                         ['(0, 0, 0) = inf',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 0.5',
+                          '(3, 0, 0) = 0.333333',
+                          '(4, 0, 0) = 0.25',
+                          '(5, 0, 0) = 0.2',
+                          '(6, 0, 0) = 0.166667',
+                          '(7, 0, 0) = 0.142857',
+                          '(8, 0, 0) = 0.125',
+                          '(9, 0, 0) = 0.111111',
+                          '(10, 0, 0) = 0.1',
+                          '(11, 0, 0) = 0.0909091',
+                          '(12, 0, 0) = 0.0833333',
+                          '(13, 0, 0) = 0.0769231',
+                          '(14, 0, 0) = 0.0714286',
+                          '(15, 0, 0) = 0.0666667',
+                          '(16, 0, 0) = 0.0625',
+                          '(17, 0, 0) = 0.0588235',
+                          '(18, 0, 0) = 0.0555556',
+                          '(19, 0, 0) = 0.0526316',
+                          '(20, 0, 0) = 0.05',
+                          '(21, 0, 0) = 0.047619',
+                          '(22, 0, 0) = 0.0454545',
+                          '(23, 0, 0) = 0.0434783'])
+
+        # float2
+        self.try_command('language renderscript allocation dump 41',
+                         ['(0, 0, 0) = {inf 1}',
+                          '(1, 0, 0) = {0.5 0.333333}',
+                          '(2, 0, 0) = {0.25 0.2}',
+                          '(3, 0, 0) = {0.166667 0.142857}',
+                          '(4, 0, 0) = {0.125 0.111111}',
+                          '(5, 0, 0) = {0.1 0.0909091}',
+                          '(6, 0, 0) = {0.0833333 0.0769231}',
+                          '(7, 0, 0) = {0.0714286 0.0666667}',
+                          '(8, 0, 0) = {0.0625 0.0588235}',
+                          '(9, 0, 0) = {0.0555556 0.0526316}',
+                          '(10, 0, 0) = {0.05 0.047619}',
+                          '(11, 0, 0) = {0.0454545 0.0434783}'])
+
+        # float3
+        self.try_command('language renderscript allocation dump 42',
+                         ['(0, 0, 0) = {inf 1 0.5}',
+                          '(1, 0, 0) = {0.25 0.2 0.166667}',
+                          '(2, 0, 0) = {0.125 0.111111 0.1}',
+                          '(3, 0, 0) = {0.0833333 0.0769231 0.0714286}',
+                          '(4, 0, 0) = {0.0625 0.0588235 0.0555556}',
+                          '(5, 0, 0) = {0.05 0.047619 0.0454545}'])
+
+        # float4
+        self.try_command('language renderscript allocation dump 43',
+                         ['(0, 0, 0) = {inf 1 0.5 0.333333}',
+                          '(1, 0, 0) = {0.25 0.2 0.166667 0.142857}',
+                          '(2, 0, 0) = {0.125 0.111111 0.1 0.0909091}',
+                          '(0, 1, 0) = {0.0833333 0.0769231 0.0714286 0.0666667}',
+                          '(1, 1, 0) = {0.0625 0.0588235 0.0555556 0.0526316}',
+                          '(2, 1, 0) = {0.05 0.047619 0.0454545 0.0434783}'])
+
+        # double
+        self.try_command('language renderscript allocation dump 44',
+                         ['(0, 0, 0) = inf',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 0.5',
+                          '(3, 0, 0) = 0.333333333333333',
+                          '(4, 0, 0) = 0.25',
+                          '(5, 0, 0) = 0.2',
+                          '(6, 0, 0) = 0.166666666666667',
+                          '(7, 0, 0) = 0.142857142857143',
+                          '(8, 0, 0) = 0.125',
+                          '(9, 0, 0) = 0.111111111111111',
+                          '(10, 0, 0) = 0.1',
+                          '(11, 0, 0) = 0.0909090909090909',
+                          '(12, 0, 0) = 0.0833333333333333',
+                          '(13, 0, 0) = 0.0769230769230769',
+                          '(14, 0, 0) = 0.0714285714285714',
+                          '(15, 0, 0) = 0.0666666666666667',
+                          '(16, 0, 0) = 0.0625',
+                          '(17, 0, 0) = 0.0588235294117647',
+                          '(18, 0, 0) = 0.0555555555555556',
+                          '(19, 0, 0) = 0.0526315789473684',
+                          '(20, 0, 0) = 0.05',
+                          '(21, 0, 0) = 0.0476190476190476',
+                          '(22, 0, 0) = 0.0454545454545455',
+                          '(23, 0, 0) = 0.0434782608695652'])
+
+        # double2
+        self.try_command('language renderscript allocation dump 45',
+                         ['(0, 0, 0) = {inf 1}',
+                          '(1, 0, 0) = {0.5 0.333333333333333}',
+                          '(2, 0, 0) = {0.25 0.2}',
+                          '(3, 0, 0) = {0.166666666666667 0.142857142857143}',
+                          '(0, 0, 1) = {0.125 0.111111111111111}',
+                          '(1, 0, 1) = {0.1 0.0909090909090909}',
+                          '(2, 0, 1) = {0.0833333333333333 0.0769230769230769}',
+                          '(3, 0, 1) = {0.0714285714285714 0.0666666666666667}',
+                          '(0, 0, 2) = {0.0625 0.0588235294117647}',
+                          '(1, 0, 2) = {0.0555555555555556 0.0526315789473684}',
+                          '(2, 0, 2) = {0.05 0.0476190476190476}',
+                          '(3, 0, 2) = {0.0454545454545455 0.0434782608695652}'])
+
+        # double3
+        self.try_command('language renderscript allocation dump 46',
+                         ['(0, 0, 0) = {inf 1 0.5}',
+                          '(0, 1, 0) = {0.25 0.2 0.166666666666667}',
+                          '(0, 0, 1) = {0.125 0.111111111111111 0.1}',
+                          '(0, 1, 1) = {0.0833333333333333 0.0769230769230769 '
+                                       '0.0714285714285714}',
+                          '(0, 0, 2) = {0.0625 0.0588235294117647 0.0555555555555556}',
+                          '(0, 1, 2) = {0.05 0.0476190476190476 0.0454545454545455}'])
+
+        # double4
+        self.try_command('language renderscript allocation dump 47',
+                         ['(0, 0, 0) = {inf 1 0.5 0.333333333333333}',
+                          '(0, 1, 0) = {0.25 0.2 0.166666666666667 0.142857142857143}',
+                          '(0, 0, 1) = {0.125 0.111111111111111 0.1 0.0909090909090909}',
+                          '(0, 1, 1) = {0.0833333333333333 0.0769230769230769 '
+                                       '0.0714285714285714 0.0666666666666667}',
+                          '(0, 0, 2) = {0.0625 0.0588235294117647 '
+                                       '0.0555555555555556 0.0526315789473684}',
+                          '(0, 1, 2) = {0.05 0.0476190476190476 '
+                                       '0.0454545454545455 0.0434782608695652}'])
+
+        # Delete kernel breakpoint on add_half_kernel
+        self.try_command('breakpoint del 3',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_allocation_file_cpp.py b/tests/lldb/tests/cpp/test_allocation_file_cpp.py
new file mode 100644
index 0000000..f676716
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_allocation_file_cpp.py
@@ -0,0 +1,195 @@
+'''Module that contains the test TestAllocationFileCpp.'''
+
+import os
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestAllocationFileCpp(TestBaseRemote):
+    '''Tests saving the contents of allocs in a NDK app and reloading them.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppAllocations'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Binary file of int2 allocation
+        file_int2 = self.get_tmp_file_path()
+
+        self.try_command('language renderscript allocation save 12 ' +
+                         file_int2,
+                         ["Allocation written to file '%s'" % file_int2])
+
+        # Check file was created
+        self.test_assert(os.path.isfile(file_int2))
+
+        # Load the file we just created, to assert the allocation contents are
+        # the same
+        self.try_command('language renderscript allocation load 12 ' +
+                         file_int2,
+                         ["Contents of file '%s' read into allocation 12" %
+                          file_int2])
+        os.remove(file_int2)
+
+        self.try_command('language renderscript allocation dump 12',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(6, 0, 0) = {12 13}',
+                          '(7, 0, 0) = {14 15}',
+                          '(8, 0, 0) = {16 17}',
+                          '(9, 0, 0) = {18 19}',
+                          '(10, 0, 0) = {20 21}',
+                          '(11, 0, 0) = {22 23}'])
+
+        self.try_command('breakpoint del 1',
+                         ['1 breakpoints deleted'])
+
+        # Hit second kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Binary file of uint allocation
+        file_uint = self.get_tmp_file_path()
+
+        self.try_command('language renderscript allocation save 28 ' +
+                         file_uint,
+                         ["Allocation written to file '%s'" % file_uint])
+
+        # Check file was created
+        self.test_assert(os.path.isfile(file_uint))
+
+        # Test loading file into allocation with an incompatible type 'short'
+        self.try_command('language renderscript allocation load 7 ' + file_uint,
+                         ["Contents of file '%s' read into allocation 7" %
+                          file_uint,
+                          "Warning: Mismatched Element sizes",
+                          "Warning: Mismatched Types",
+                          "Warning: Mismatched allocation sizes"])
+
+        # Check result of size inconsistency, mapping 4-byte unsigned to 2-byte
+        # int
+        self.try_command('language renderscript allocation dump 7',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 0',
+                          '(2, 0, 0) = 1',
+                          '(3, 0, 0) = 0',
+                          '(4, 0, 0) = 2',
+                          '(5, 0, 0) = 0',
+                          '(6, 0, 0) = 3',
+                          '(7, 0, 0) = 0',
+                          '(8, 0, 0) = 4',
+                          '(9, 0, 0) = 0',
+                          '(10, 0, 0) = 5',
+                          '(11, 0, 0) = 0',
+                          '(12, 0, 0) = 6',
+                          '(13, 0, 0) = 0',
+                          '(14, 0, 0) = 7',
+                          '(15, 0, 0) = 0',
+                          '(16, 0, 0) = 8',
+                          '(17, 0, 0) = 0',
+                          '(18, 0, 0) = 9',
+                          '(19, 0, 0) = 0',
+                          '(20, 0, 0) = 10',
+                          '(21, 0, 0) = 0',
+                          '(22, 0, 0) = 11',
+                          '(23, 0, 0) = 0'])
+
+        self.try_command('breakpoint del 2',
+                         ['1 breakpoints deleted'])
+
+        # Hit third kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test that uint allocation has been squared by square_kernel
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 4',
+                          '(3, 0, 0) = 9',
+                          '(4, 0, 0) = 16',
+                          '(5, 0, 0) = 25',
+                          '(6, 0, 0) = 36',
+                          '(7, 0, 0) = 49',
+                          '(8, 0, 0) = 64',
+                          '(9, 0, 0) = 81',
+                          '(10, 0, 0) = 100',
+                          '(11, 0, 0) = 121',
+                          '(12, 0, 0) = 144',
+                          '(13, 0, 0) = 169',
+                          '(14, 0, 0) = 196',
+                          '(15, 0, 0) = 225',
+                          '(16, 0, 0) = 256',
+                          '(17, 0, 0) = 289',
+                          '(18, 0, 0) = 324',
+                          '(19, 0, 0) = 361',
+                          '(20, 0, 0) = 400',
+                          '(21, 0, 0) = 441',
+                          '(22, 0, 0) = 484',
+                          '(23, 0, 0) = 529'])
+
+        # Load uint allocation from save before square_kernel had been run
+        self.try_command('language renderscript allocation load 28 ' +
+                         file_uint,
+                         ["Contents of file '%s' read into allocation 28" %
+                          file_uint])
+        os.remove(file_uint)
+
+        # Check contents are back to original
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        self.try_command('breakpoint delete 3', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_allocation_list_cpp.py b/tests/lldb/tests/cpp/test_allocation_list_cpp.py
new file mode 100644
index 0000000..59b4448
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_allocation_list_cpp.py
@@ -0,0 +1,444 @@
+'''Module that contains the test TestAllocationListCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestAllocationListCpp(TestBaseRemote):
+    '''Tests printing the details of all allocations in an ndk app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppAllocations'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=anomalous-backslash-in-string
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test command line flag for single allocation
+        self.try_command('language renderscript allocation list -i 3',
+                         [],
+                         ['3:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 3, 8\)\n'
+                          '    Data Type: char\n'
+                          '    Data Kind: User'])
+
+        self.try_command('language renderscript allocation list',
+                         [],
+                         ['1:\n'
+                          # Regex for non zero hex number
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '2:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '3:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 3, 8\)\n'
+                          '    Data Type: char\n'
+                          '    Data Kind: User',
+                          '4:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: char2\n'
+                          '    Data Kind: User',
+                          '5:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: char3\n'
+                          '    Data Kind: User',
+                          '6:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: char4\n'
+                          '    Data Kind: User',
+                          '7:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: short\n'
+                          '    Data Kind: User',
+                          '8:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 1, 2\)\n'
+                          '    Data Type: short2\n'
+                          '    Data Kind: User',
+                          '9:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: short3\n'
+                          '    Data Kind: User',
+                          '10:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: short4\n'
+                          '    Data Kind: User',
+                          '11:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: int\n'
+                          '    Data Kind: User',
+                          '12:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: int2\n'
+                          '    Data Kind: User',
+                          '13:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(3, 2, 0\)\n'
+                          '    Data Type: int3\n'
+                          '    Data Kind: User',
+                          '14:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: int4\n'
+                          '    Data Kind: User',
+                          '15:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: long\n'
+                          '    Data Kind: User',
+                          '16:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: long2\n'
+                          '    Data Kind: User',
+                          '17:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: long3\n'
+                          '    Data Kind: User',
+                          '18:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 6, 0\)\n'
+                          '    Data Type: long4\n'
+                          '    Data Kind: User',
+                          '19:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: bool\n'
+                          '    Data Kind: User'
+                         ])
+
+
+        self.try_command('breakpoint del 1',
+                         ['1 breakpoints deleted'])
+
+        # Hit second kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('language renderscript allocation list',
+                         [],
+                         ['2:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '7:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: short\n'
+                          '    Data Kind: User',
+                          '20:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: uchar\n'
+                          '    Data Kind: User',
+                          '21:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(2, 6, 0\)\n'
+                          '    Data Type: uchar2\n'
+                          '    Data Kind: User',
+                          '22:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: uchar3\n'
+                          '    Data Kind: User',
+                          '23:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: User',
+                          '24:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: ushort\n'
+                          '    Data Kind: User',
+                          '25:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: ushort2\n'
+                          '    Data Kind: User',
+                          '26:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 6, 0\)\n'
+                          '    Data Type: ushort3\n'
+                          '    Data Kind: User',
+                          '27:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: ushort4\n'
+                          '    Data Kind: User',
+                          '28:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: uint\n'
+                          '    Data Kind: User',
+                          '29:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: uint2\n'
+                          '    Data Kind: User',
+                          '30:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: uint3\n'
+                          '    Data Kind: User',
+                          '31:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 1, 6\)\n'
+                          '    Data Type: uint4\n'
+                          '    Data Kind: User',
+                          '32:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(4, 3, 2\)\n'
+                          '    Data Type: ulong\n'
+                          '    Data Kind: User',
+                          '33:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: ulong2\n'
+                          '    Data Kind: User',
+                          '34:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: ulong3\n'
+                          '    Data Kind: User',
+                          '35:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: ulong4\n'
+                          '    Data Kind: User'
+                         ])
+
+        self.try_command('breakpoint del 2',
+                         ['1 breakpoints deleted'])
+
+        # Hit third kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('language renderscript allocation list',
+                         [],
+                         ['2:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '7:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: short\n'
+                          '    Data Kind: User',
+                          '28:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: uint\n'
+                          '    Data Kind: User',
+                          '36:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: half\n'
+                          '    Data Kind: User',
+                          '37:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: half2\n'
+                          '    Data Kind: User',
+                          '38:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 6, 0\)\n'
+                          '    Data Type: half3\n'
+                          '    Data Kind: User',
+                          '39:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: half4\n'
+                          '    Data Kind: User',
+                          '40:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: float\n'
+                          '    Data Kind: User',
+                          '41:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: float2\n'
+                          '    Data Kind: User',
+                          '42:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: float3\n'
+                          '    Data Kind: User',
+                          '43:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(3, 2, 0\)\n'
+                          '    Data Type: float4\n'
+                          '    Data Kind: User',
+                          '44:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: double\n'
+                          '    Data Kind: User',
+                          '45:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(4, 1, 3\)\n'
+                          '    Data Type: double2\n'
+                          '    Data Kind: User',
+                          '46:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 2, 3\)\n'
+                          '    Data Type: double3\n'
+                          '    Data Kind: User',
+                          '47:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 2, 3\)\n'
+                          '    Data Type: double4\n'
+                          '    Data Kind: User'
+                         ])
+
+        self.try_command('breakpoint delete 3', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_backtrace_cpp.py b/tests/lldb/tests/cpp/test_backtrace_cpp.py
new file mode 100644
index 0000000..43fbc48
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_backtrace_cpp.py
@@ -0,0 +1,78 @@
+'''Module that contains the test TestBacktraceCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBacktraceCpp(TestBaseRemote):
+    '''Tests viewing the call stack of an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppBranchingFunCalls'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          # We should be able to see three functions in bt:
+                          # libRSCpuRef, kernel.expand and the kernel
+                          'frame #2:',
+                          'librs.simple',
+                          'simple_kernel'],
+                         [r'simple\.rs:4[567]'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('b set_i',
+                         ['Breakpoint 2',
+                          'set_i'],
+                         [r'simple.rs:2[012]'])
+
+        self.try_command('breakpoint list',
+                         ['set_i', 'resolved'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          # We should be able to see five functions in bt:
+                          # libRSCpuRef, kernel.expand, kernel and two functions
+                          'frame #4:',
+                          'librs.simple',
+                          'modify_i',
+                          'set_i'],
+                         [r'simple\.rs:2[012]'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_breakpoint_coordinate_cpp.py b/tests/lldb/tests/cpp/test_breakpoint_coordinate_cpp.py
new file mode 100644
index 0000000..8a581c0
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_breakpoint_coordinate_cpp.py
@@ -0,0 +1,161 @@
+'''Module that contains the test TestBreakpointCoordinateCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointCoordinateCpp(TestBaseRemote):
+    '''Tests breaking on a specific kernel invocation in a NDK app
+
+    Uses the -c option to specify the coordinate.
+    '''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppAllocations'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.pop_prop('debug.rs.max-threads')
+
+    def _check_coordinates(self, (x_coord, y_coord, z_coord), kernel):
+        '''Run lldb commands to check that coordinates match expected values.
+
+        Args:
+            (x_coord, y_coord, z_coord): The expected coordinates.
+            kernel: String that is the name of the kernel function.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          'frame #0:',
+                          'librs.allocs',
+                          kernel])
+
+        self.try_command('language renderscript kernel coordinate',
+                         ['Coordinate: (%d, %d, %d)' % (x_coord, y_coord,
+                                                        z_coord)])
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        # Test conditional coordinate in a two dimensions
+        self.try_command('language renderscript kernel breakpoint set swizzle_kernel -c 3,7',
+                         ['Conditional kernel breakpoint on coordinate 3, 7, 0',
+                          'Breakpoint(s) created'])
+
+        # We will delete this breakpoint before we hit it.
+        self.try_command('language renderscript kernel breakpoint set swizzle_kernel -c 199,199',
+                        ['Conditional kernel breakpoint on coordinate 199, 199, 0',
+                         'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((3, 7, 0), 'swizzle_kernel')
+
+        # Check breakpoints that have been hit are disabled
+        self.try_command('breakpoint list',
+                         ["1: RenderScript kernel breakpoint for 'swizzle_kernel', locations = 1 Options: disabled",
+                          "2: RenderScript kernel breakpoint for 'swizzle_kernel', locations = 1, resolved = 1"])
+
+        # Delete breakpoint on 199,199,0
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        # Test conditional coordinate in a single dimension
+        self.try_command('language renderscript kernel breakpoint set square_kernel -c 8',
+                        ['Conditional kernel breakpoint on coordinate 8, 0, 0',
+                         'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((8, 0, 0), 'square_kernel')
+
+        # Test conditional coordinate in three dimensions
+        self.try_command('language renderscript kernel breakpoint set add_half_kernel -c 0,0,1',
+                        ['Conditional kernel breakpoint on coordinate 0, 0, 1',
+                         'Breakpoint(s) created'])
+
+        # Test we can set more than one conditional kernel breakpoint and both
+        # will be hit
+        self.try_command('language renderscript kernel breakpoint set add_half_kernel -c 0,1,2',
+                        ['Conditional kernel breakpoint on coordinate 0, 1, 2',
+                         'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((0, 0, 1), 'add_half_kernel')
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((0, 1, 2), 'add_half_kernel')
+
+        # Check we can see the coordinate from a function invoked by the kernel
+        self.try_command('break set -n half_helper',
+                         ['librs.allocs.so`half_helper'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((0, 1, 2), 'half_helper')
+
+        # Delete helper function breakpoint
+        self.try_command('breakpoint delete 6',
+                             ['1 breakpoints deleted'])
+
+        # Delete breakpoint which has already been disabled
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        # Check our delete breakpoints have been removed
+        self.try_command('breakpoint list',
+                         ["3: RenderScript kernel breakpoint for 'square_kernel', locations = 1 Options: disabled",
+                          "4: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled",
+                          "5: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled"])
+
+        self.try_command('breakpoint delete 3', ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 4', ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 5', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_breakpoint_fileline_cpp.py b/tests/lldb/tests/cpp/test_breakpoint_fileline_cpp.py
new file mode 100644
index 0000000..89de397
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_breakpoint_fileline_cpp.py
@@ -0,0 +1,52 @@
+'''Module that contains the test TestBreakpointFileLineCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointFileLineCpp(TestBaseRemote):
+    '''Tests the setting of a breakpoint on a specific line of a RS file.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --file simple.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         [])
+
+        self.try_command('bt',
+                         ['librs.simple',
+                          'simple_kernel',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ['simple.rs',
+                          'resolved = 1'])
+
+        self.try_command('process status',
+                         ['stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_breakpoint_fileline_multiple_rs_files_cpp.py b/tests/lldb/tests/cpp/test_breakpoint_fileline_multiple_rs_files_cpp.py
new file mode 100644
index 0000000..f44d7ef
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_breakpoint_fileline_multiple_rs_files_cpp.py
@@ -0,0 +1,68 @@
+'''Module that contains the test TestBreakpointFileLineMultipleRSFilesCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointFileLineMultipleRSFilesCpp(TestBaseRemote):
+    '''Tests setting a breakpoint on one of multiple RS files in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppMultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --file first.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.first.so`first_kernel',
+                          'at first.rs:12',
+                          "name = 'CppMultipleRSFi'",
+                          'stop reason = breakpoint 1'])
+
+        self.try_command('breakpoint set --file second.rs --line 7',
+                         ['Breakpoint 2',
+                          'librs.second.so`second_kernel',
+                          'second.rs:7'])
+
+        self.try_command('breakpoint list',
+                         ['first.rs',
+                          'second.rs',
+                          'resolved = 1',
+                          'first.rs:12',
+                          'second.rs:7'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.second.so`second_kernel',
+                          'at second.rs:7',
+                          "name = 'CppMultipleRSFi'",
+                          'stop reason = breakpoint 2'])
+
+        self.try_command('process status',
+                         ['stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 2', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_breakpoint_kernel_1_cpp.py b/tests/lldb/tests/cpp/test_breakpoint_kernel_1_cpp.py
new file mode 100644
index 0000000..a7d29b3
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_breakpoint_kernel_1_cpp.py
@@ -0,0 +1,80 @@
+'''Module that contains the test TestBreakpointKernel1Cpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernel1Cpp(TestBaseRemote):
+    '''Tests the setting of a breakpoint on a RS kernel on an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        # Try set a breakpoint on a kernel which doesn't exist
+        self.try_command('language renderscript kernel breakpoint set imaginary_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 0 (pending)",
+                          "'imaginary_kernel', locations = 0 (pending)"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          'frame #0:',
+                          'librs.simple',
+                          'simple_kernel'])
+
+        self.try_command('breakpoint list',
+                         ["'imaginary_kernel', locations = 0 (pending)",
+                          "'simple_kernel', locations = 1, resolved = 1"])
+
+        # Delete breakpoint on kernel which doesn't exist
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ['No breakpoints currently set'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_breakpoint_kernel_2_cpp.py b/tests/lldb/tests/cpp/test_breakpoint_kernel_2_cpp.py
new file mode 100644
index 0000000..0a6ddb5
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_breakpoint_kernel_2_cpp.py
@@ -0,0 +1,48 @@
+'''Module that contains the test TestBreakpointKernel2Cpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernel2Cpp(TestBaseRemote):
+    '''Tests the setting of a breakpoint on a RS kernel on an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppInfiniteLoop'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          'frame #0:',
+                          'librs.simple.so',
+                          'simple_kernel'],
+                         [r'simple\.rs:1[01]'])
+
+        self.try_command('breakpoint list',
+                         ['simple_kernel',
+                          'resolved = 1'])
+
+        self.try_command('process status',
+                         ['stopped',
+                          '.so`simple_kernel',
+                          'stop reason = breakpoint'])
diff --git a/tests/lldb/tests/cpp/test_breakpoint_kernel_all_cpp.py b/tests/lldb/tests/cpp/test_breakpoint_kernel_all_cpp.py
new file mode 100644
index 0000000..0f529c6
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_breakpoint_kernel_all_cpp.py
@@ -0,0 +1,81 @@
+'''Module that contains the test TestBreakpointKernelAllCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernelAllCpp(TestBaseRemote):
+    '''Tests setting breakpoints on every RS kernel on an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # Test command works with no kernels currently loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1",
+                          "'other_kernel', locations = 1, resolved = 1"])
+
+        # Check disable doesn't delete breakpoints
+        self.try_command('language renderscript kernel breakpoint all disable',
+                         ['Breakpoints will not be set on any new kernels'])
+
+        # Delete all breakpoints manually
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["No breakpoints currently set"])
+
+        # Test command works when kernels are loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1",
+                          "'other_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 3',
+                         ['1 breakpoints deleted'])
+
+        # Check other_kernel breakpoint gets hit
+        self.try_command('breakpoint list',
+                         ["'other_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 4',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_breakpoint_kernel_all_multiple_rs_files_cpp.py b/tests/lldb/tests/cpp/test_breakpoint_kernel_all_multiple_rs_files_cpp.py
new file mode 100644
index 0000000..d7d9a1c
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_breakpoint_kernel_all_multiple_rs_files_cpp.py
@@ -0,0 +1,80 @@
+'''Module that contains the test TestBreakpointKernelAllMultipleRSFilesCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernelAllMultipleRSFilesCpp(TestBaseRemote):
+    '''Tests setting bp's on all kernels in >1 kernel files in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppMultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # Test command works with no kernels currently loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1",
+                          "'second_kernel', locations = 1, resolved = 1"])
+
+        # Check disable doesn't delete breakpoints
+        self.try_command('language renderscript kernel breakpoint all disable',
+                         ['Breakpoints will not be set on any new kernels'])
+
+        # Delete all breakpoints manually
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["No breakpoints currently set"])
+
+        # Test command works when kernels are loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1",
+                          "'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 3',
+                         ['1 breakpoints deleted'])
+
+        # Check other_kernel breakpoint gets hit
+        self.try_command('breakpoint list',
+                         ["'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 4', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_breakpoint_kernel_multiple_rs_files_cpp.py b/tests/lldb/tests/cpp/test_breakpoint_kernel_multiple_rs_files_cpp.py
new file mode 100644
index 0000000..e5baa29
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_breakpoint_kernel_multiple_rs_files_cpp.py
@@ -0,0 +1,74 @@
+'''Module that contains the test TestBreakpointKernelMultipleRSFilesCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernelMultipleRSFilesCPP(TestBaseRemote):
+    '''Tests setting a breakpoint on kernels in multiple files in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppMultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript kernel breakpoint set first_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 0 (pending)"])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.first',
+                          'first_kernel',
+                          "name = 'CppMultipleRSFi'",
+                          'stop reason = breakpoint 1'],
+                          [r'at first\.rs:1[012]'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('language renderscript kernel breakpoint set second_kernel',
+                         ['Breakpoint(s) created',
+                          'Breakpoint 2',
+                          'Breakpoint(s) created'],
+                          [r"librs\.second\.so`second_kernel at second\.rs:[56]",])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1",
+                          "'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint',
+                          "librs.second.so`second_kernel"],
+                          [r'second\.rs:[56]'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ['No breakpoints currently set'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_call_api_funs_cpp.py b/tests/lldb/tests/cpp/test_call_api_funs_cpp.py
new file mode 100644
index 0000000..0d787ec
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_call_api_funs_cpp.py
@@ -0,0 +1,144 @@
+'''Module that contains the test TestCallApiFunsCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+from harness import RS_funs
+
+
+class TestCallApiFunsCpp(TestBaseRemote):
+    '''Tests calling of some RS API functions in an NDK app.
+
+     This tests that JITing works.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test
+            can be run with.
+        '''
+        return "CppKernelVariables"
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test the atomics separately because we want to check the output
+        # AtomicAdd(1234, 2)
+        self.try_command('expr rsAtomicAdd(&int_global, 2)',
+                         ['1234'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '1236'])
+
+        # AtomicAnd(2345, 333)
+        self.try_command('expr rsAtomicAnd(&uint_global, 333)',
+                         ['2345'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '265'])
+
+        # AtomicCas(1236, 1236, 2345)
+        self.try_command('expr rsAtomicCas(&int_global, 1236, 2345)',
+                         ['1236'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '2345'])
+
+        # AtomicDec(265)
+        self.try_command('expr rsAtomicDec(&uint_global)',
+                         ['265'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '264'])
+
+        # AtomicInc(2345)
+        self.try_command('expr rsAtomicInc(&int_global)',
+                         ['2345'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '2346'])
+
+        # AtomicMax(264, 3456)
+        self.try_command('expr rsAtomicMax(&uint_global, 3456)',
+                         ['264'],
+                         [r'\(uint(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '3456'])
+
+        # AtomicMin(2346, 3)
+        self.try_command('expr rsAtomicMin(&int_global, 3)',
+                         ['2346'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '3'])
+
+        # AtomicOr(3, 456)
+        self.try_command('expr rsAtomicOr(&int_global, 456)',
+                         ['3'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '459'])
+
+        # AtomicSub(3456, 7)
+        self.try_command('expr rsAtomicSub(&uint_global, 7)',
+                         ['3456'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '3449'])
+
+        # AtomicXor(459, 89)
+        self.try_command('expr rsAtomicXor(&int_global, 89)',
+                         ['459'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '402'])
+
+        for line in RS_funs.FUNC_LIST:
+            # build the expression
+            ret, expr = RS_funs.build_expr(line)
+            # query return type table
+            if ret in RS_funs.TYPE_MAP:
+                # evaluate the expression
+                self.try_command(expr, [], [RS_funs.TYPE_MAP[ret]])
+            else:
+                # evaluate the expression
+                self.try_command(expr, '('+ret+')')
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_coordinates_cpp.py b/tests/lldb/tests/cpp/test_coordinates_cpp.py
new file mode 100644
index 0000000..247d8b1
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_coordinates_cpp.py
@@ -0,0 +1,113 @@
+'''Module that contains the test TestCoordinatesCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestCoordinatesCpp(TestBaseRemote):
+    '''Tests the inspection of coordinates in an NDK app.
+
+    Tests the inspection of the range and dimension of coordinates as well
+    as the current coordinates.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppDebugWaitAttach'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        # Check the initial conditions.
+        self._lldb_continue()
+        self._inspect_coordinates((0, 0, 0))
+
+        # Check two more steps.
+        self._lldb_continue()
+        self._inspect_coordinates((1, 0, 0))
+        self._lldb_continue()
+        self._inspect_coordinates((2, 0, 0))
+
+        # After eight more steps we should have advanced one step in the y dimension.
+        for _ in range(8):
+            self._lldb_continue()
+        self._inspect_coordinates((2, 1, 0))
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
+
+    def _lldb_continue(self):
+        '''Try 'continue' lldb command. Expect to hit a breakpoint.'''
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+    def _inspect_coordinates(self, (x_coord, y_coord, z_coord)):
+        '''Run lldb commands to inspect kernel size and coordinates
+        and match against expected values.
+
+        Args:
+            (x_coord, y_coord, z_coord): The expected coordinates (int triple)
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript kernel coordinate',
+                         ['Coordinate: (%d, %d, %d)' % (x_coord, y_coord,
+                                                        z_coord)])
+
+        self.try_command('frame select 1',
+                         ['librs.simple', 'simple_kernel.expand',
+                         'at generated.rs:1'])
+
+        # Inspect the invocation length, should be the same every time.
+        self.try_command('expr p->dim',
+                         ['x = 8',
+                          'y = 8',
+                          'z = 0'])
+
+        # The X coordinate is in the rsIndex variable.
+        self.try_command('expr rsIndex',
+                          ['= ' + str(x_coord)])
+
+        # Inspect the Y and Z coordinates.
+        self.try_command('expr p->current',
+                         ['x = ' + str(0),
+                          'y = ' + str(y_coord),
+                          'z = ' + str(z_coord)])
diff --git a/tests/lldb/tests/cpp/test_dwarf_lang_cpp.py b/tests/lldb/tests/cpp/test_dwarf_lang_cpp.py
new file mode 100644
index 0000000..dd6df64
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_dwarf_lang_cpp.py
@@ -0,0 +1,29 @@
+'''Module that contains the test DWARF language attribute test for NDK.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestDWARFLangCpp(TestBaseRemote):
+    '''Tests the DWARF language attribute is present in RS kernels in a NDK.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status', [])
+        self.try_command('b simple_kernel', [])
+        self.try_command('process continue', [])
+
+        self.assert_lang_renderscript()
diff --git a/tests/lldb/tests/cpp/test_invoke_fun_cpp.py b/tests/lldb/tests/cpp/test_invoke_fun_cpp.py
new file mode 100644
index 0000000..971c31d
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_invoke_fun_cpp.py
@@ -0,0 +1,58 @@
+'''Module that contains the test TestInvokeFunCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestInvokeFunCpp(TestBaseRemote):
+    '''Tests debugging a function executed from C++ using invoke_*.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            String that is the name of the binary that this test should be run
+            with.
+        '''
+        return "CppBranchingFunCalls"
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --name addToGlobal',
+                         ['Breakpoint 1', '(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'stop reason = breakpoint'],
+                         [r'simple\.rs:5[789]'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint 2', 'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'stop reason = breakpoint',
+                          'simple_kernel'],
+                         [r'simple\.rs:4[567]'])
+
+        self.try_command('expr glob',
+                         ['(int)',
+                          '357'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_language_subcmds_cpp.py b/tests/lldb/tests/cpp/test_language_subcmds_cpp.py
new file mode 100644
index 0000000..782c96c
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_language_subcmds_cpp.py
@@ -0,0 +1,138 @@
+'''Module that contains the test TestLanguageSubcmdsCpp.'''
+
+import os
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestLanguageSubcmdsCpp(TestBaseRemote):
+    '''Tests the 'language renderscript' subcommands on an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppDebugWaitAttach'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.'''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.'''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.'''
+        self.try_command('language',
+                         [])
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered',
+                          'Runtime functions hooked',
+                          'rsdAllocationInit',
+                          'rsdAllocationRead2D',
+                          'rsdScriptInit',
+                          'rsdScriptInvokeForEach',
+                          'rsdScriptInvokeForEachMulti',
+                          'rsdScriptSetGlobalVar'])
+
+        self.try_command('breakpoint set --file simple.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         [])
+
+        self.try_command('language renderscript kernel',
+                         ['breakpoint',
+                          'coordinate',
+                          'list'])
+
+        self.try_command('language renderscript kernel breakpoint',
+                         ['all',
+                          'set'])
+
+        self.try_command('language renderscript kernel list',
+                         ['RenderScript Kernels',
+                          "Resource 'simple'",
+                          'root',
+                          'simple_kernel'])
+
+        self.try_command('language renderscript kernel coordinate',
+                         ['Coordinate: (0, 0, 0)'])
+
+        self.try_command('language renderscript context',
+                         ['dump'])
+
+        self.try_command('language renderscript context dump',
+                         ['Inferred RenderScript Contexts',
+                          '1 script instances'])
+
+        self.try_command('language renderscript allocation',
+                         ['list',
+                          'load',
+                          'save',
+                          'dump',
+                          'refresh'])
+
+        self.try_command('language renderscript allocation list',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list -i 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list --id 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation dump 1',
+                         ['Data (X, Y, Z):'])
+
+        output_file = self.get_tmp_file_path()
+        self.try_command('language renderscript allocation dump 1 -f ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        if os.path.isfile(output_file):
+            os.remove(output_file)
+
+        self.try_command('language renderscript allocation dump 1 --file ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        self.try_command('language renderscript allocation save 1 ' +
+                         output_file,
+                         ["Allocation written to file '%s'" % output_file])
+
+        self.try_command('language renderscript allocation load 1 ' +
+                         output_file,
+                         ["Contents of file '%s' read into allocation 1" %
+                          output_file])
+
+        self.try_command('language renderscript allocation refresh',
+                         ['All allocations successfully recomputed'])
+
+        self.try_command('language renderscript module',
+                         ['dump'])
+
+        self.try_command('language renderscript module dump',
+                         ['RenderScript Modules:',
+                          'librs.simple.so',
+                          'Debug info loaded',
+                          'Globals: 1',
+                          'gColor - float4',
+                          'Kernels: 3',
+                          'root',
+                          'simple_kernel',
+                          'other_kernel',
+                          'java_package_name: com.android.rs.cppwaitattach',
+                          'version:'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_language_subcmds_no_debug_cpp.py b/tests/lldb/tests/cpp/test_language_subcmds_no_debug_cpp.py
new file mode 100644
index 0000000..60e0e50
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_language_subcmds_no_debug_cpp.py
@@ -0,0 +1,120 @@
+'''Module that contains the test TestLanguageSubcmdsNoDebugCpp.'''
+
+import os
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestLanguageSubcmdsNoDebugCpp(TestBaseRemote):
+    '''Tests the 'renderscript' subcommands on an NDK app without debug info.
+
+    In particular, module dump should report missing debug info.
+    '''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppNoDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.'''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel'
+                         '',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         [])
+
+        self.try_command('language renderscript kernel',
+                         ['breakpoint',
+                          'coordinate',
+                          'list'])
+
+        self.try_command('language renderscript kernel list',
+                         ['RenderScript Kernels',
+                          "Resource 'simple'",
+                          'root',
+                          'simple_kernel'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('language renderscript context',
+                         ['dump'])
+
+        self.try_command('language renderscript context dump',
+                         ['Inferred RenderScript Contexts',
+                          '1 script instances'])
+
+        self.try_command('language renderscript allocation',
+                         ['list',
+                          'load',
+                          'save',
+                          'dump',
+                          'refresh'])
+
+        self.try_command('language renderscript allocation list',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list -i 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list --id 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation dump 1',
+                         ['Data (X, Y, Z):'])
+
+        output_file = self.get_tmp_file_path()
+        self.try_command('language renderscript allocation dump 1 -f ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        if os.path.isfile(output_file):
+            os.remove(output_file)
+
+        self.try_command('language renderscript allocation dump 1 --file ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        self.try_command('language renderscript allocation save 1 ' +
+                         output_file,
+                         ["Allocation written to file '%s'" % output_file])
+
+        self.try_command('language renderscript allocation load 1 ' +
+                         output_file,
+                         ["Contents of file '%s' read into allocation 1" %
+                          output_file])
+
+        self.try_command('language renderscript allocation refresh',
+                         ['All allocations successfully recomputed'])
+
+
+        self.try_command('language renderscript module',
+                         ['dump'])
+
+        self.try_command('language renderscript module dump',
+                         ['RenderScript Modules:',
+                          'librs.simple.so',
+                          'Debug info does not exist.',
+                          'Globals: 1',
+                          'gColor - variable identified, but not found in '
+                            'binary (symbol exists)',
+                          'Kernels: 3',
+                          'root',
+                          'simple_kernel',
+                          'other_kernel',
+                          'java_package_name: com.android.rs.cppwaitattach',
+                          'version'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_multiple_rs_files_cpp.py b/tests/lldb/tests/cpp/test_multiple_rs_files_cpp.py
new file mode 100644
index 0000000..700b3df
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_multiple_rs_files_cpp.py
@@ -0,0 +1,66 @@
+'''Module that contains the test TestMultipleRSFilesCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestMultipleRSFilesCpp(TestBaseRemote):
+    '''Tests some commands on an apk which has two rs files in a NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'CppMultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.'''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered',
+                          'Runtime functions hooked'])
+
+        self.try_command('breakpoint set --file first.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.first',
+                          'first_kernel',
+                          'at first.rs:12',
+                          "name = 'CppMultipleRSFi'",
+                          'stop reason = breakpoint 1'])
+
+        self.try_command('language renderscript kernel list',
+                         ['RenderScript Kernels',
+                          "Resource 'first'",
+                          "Resource 'second'",
+                          'root',
+                          'first_kernel',
+                          'second_kernel'])
+
+        self.try_command('language renderscript context dump',
+                         ['Inferred RenderScript Contexts',
+                          '2 script instances'])
+
+        self.try_command('language renderscript module dump',
+                         ['RenderScript Modules:',
+                          'librs.first.so',
+                          'librs.second.so',
+                          'Debug info loaded',
+                          'Globals: 1',
+                          'gColor - float4',
+                          'Kernels: 2',
+                          'root',
+                          'first_kernel',
+                          'second_kernel',
+                          'java_package_name: com.android.rs.cppmultiplersfiles',
+                          'version:'])
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_read_global_cpp.py b/tests/lldb/tests/cpp/test_read_global_cpp.py
new file mode 100644
index 0000000..48a3fcf
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_read_global_cpp.py
@@ -0,0 +1,313 @@
+'''Module that contains the test TestReadGlobalCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestReadGlobalCpp(TestBaseRemote):
+    '''Tests inspecting global variables of all types on an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "CppKernelVariables"
+
+    def _try_inspecting_global(self, global_name, expected_output,
+                              expected_regex=None):
+        '''Inspect a global and check for the output.
+
+        Run the "expr" and "target variable" commands on a given global and
+        with a given output. (The commands should be equivalent.)
+
+        Args:
+            global_name: String which is the name of the global to inspect.
+            expected_output: List of strings that should be found in the output.
+            expected_regex: List of regular expressions that should match lldb's
+                            output.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr ' + global_name,
+                         expected_output,
+                         expected_regex)
+
+        self.try_command('target variable ' + global_name,
+                         expected_output,
+                         expected_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        # pylint: disable=too-many-statements
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('target variable',
+                         ['Global variables for',
+                          'librs.simple',
+                          "(uchar) uchar_global = '\\xea'",
+                          '(short) short_global = -321',
+                          '(ushort) ushort_global = 432',
+                          '(int) int_global = 1234',
+                          '(uint) uint_global = 2345',
+                          '(float) float_global = 4.5',
+                          '(ulong) ulong_global = 8888',
+                          '(double) double_global = -456.5',
+                          '(char2) char2_global = (11, -22)',
+                          '(uchar2) uchar2_global = (0x21, 0x2c)',
+                          '(short2) short2_global = (-555, 666)',
+                          '(ushort2) ushort2_global = (777, 888)',
+                          '(int2) int2_global = (999, -1111)',
+                          '(uint2) uint2_global = (2222, 3333)',
+                          '(float2) float2_global = (4.5, -5)',
+                          '(long2) long2_global = (-4444, 5555)',
+                          '(ulong2) ulong2_global = (6666, 7777)',
+                          '(double2) double2_global = (88.5, -99)',
+                          '(char3) char3_global = (11, -22, -33,',
+                          '(uchar3) uchar3_global = (0x21, 0x2c, 0x37,',
+                          '(short3) short3_global = (-555, 666, 777,',
+                          '(ushort3) ushort3_global = (777, 888, 999,',
+                          '(int3) int3_global = (999, -1111, 2222,',
+                          '(uint3) uint3_global = (2222, 3333, 4444,',
+                          '(float3) float3_global = (4.5, -5, -6.5,',
+                          '(long3) long3_global = (-4444, 5555, 6666,',
+                          '(ulong3) ulong3_global = (6666, 7777, 8888,',
+                          '(double3) double3_global = (88.5, -99, 111.5,',
+                          '(char4) char4_global = (55, 11, -22, -33)',
+                          '(uchar4) uchar4_global = (0xde, 0x21, 0x2c, 0x37)',
+                          '(short4) short4_global = (-444, -555, 666, 777)',
+                          '(ushort4) ushort4_global = (666, 777, 888, 999)',
+                          '(int4) int4_global = (888, 999, -1111, 2222)',
+                          '(uint4) uint4_global = (1111, 2222, 3333, 4444)',
+                          '(float4) float4_global = (3, 4.5, -5, -6.5)',
+                          '(long4) long4_global = (-3333, -4444, 5555, 6666)',
+                          '(ulong4) ulong4_global = (5555, 6666, 7777, 8888)',
+                          '(double4) double4_global = (-77, 88.5, -99, 111.5)',
+                          '(rs_matrix2x2) matrix2x2_global = (m = (1, 2.5, 3, 4.5))',
+                          '(rs_matrix3x3) matrix3x3_global = {\n'
+                          '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)',
+                          '(rs_matrix4x4) matrix4x4_global = {\n'
+                          '  m = {\n'
+                          '    [0] = 5.5\n'
+                          '    [1] = 6\n'
+                          '    [2] = 7.5\n'
+                          '    [3] = 8\n'
+                          '    [4] = 9\n'
+                          '    [5] = 1.5\n'
+                          '    [6] = 2\n'
+                          '    [7] = 3.5\n'
+                          '    [8] = 4.5\n'
+                          '    [9] = 5.5\n'
+                          '    [10] = 6.5\n'
+                          '    [11] = 7\n'
+                          '    [12] = 8\n'
+                          '    [13] = 9.5\n'
+                          '    [14] = 1.5\n'
+                          '    [15] = 2.5\n'
+                          '  }\n',
+                          '(rs_quaternion) quaternion_global = (4.5, 5.5, 6, 3)'],
+                         [r"\((signed )?char\) char_global = '\\f'",
+                          r'\((long )?long\) long_global = -77777'])
+
+        # Use expr to inspect locals
+        self._try_inspecting_global('char_global',
+                         ["'\\f'"],
+                         [r'\((signed )?char\)'])
+
+        self._try_inspecting_global('uchar_global',
+                         ['(uchar)', "'\\xea'"])
+
+        self._try_inspecting_global('short_global',
+                         ['(short)', '-321'])
+
+        self._try_inspecting_global('ushort_global',
+                         ['(ushort)', '432'])
+
+        self._try_inspecting_global('int_global',
+                         ['(int)', '1234'])
+
+        self._try_inspecting_global('uint_global',
+                         ['(uint)', '2345'])
+
+        self._try_inspecting_global('float_global',
+                         ['(float)', '4.5'])
+
+        self._try_inspecting_global('long_global',
+                         ['-77777'],
+                         [r'\((long )?long\)'])
+
+        self._try_inspecting_global('ulong_global',
+                         ['(ulong)', '8888'])
+
+        self._try_inspecting_global('double_global',
+                         ['(double)', '-456.5'])
+
+
+        self._try_inspecting_global('char2_global',
+                                   ['(char2)', '(11, -22)'])
+
+        self._try_inspecting_global('uchar2_global',
+                                   ['(uchar2)', '(0x21, 0x2c)'])
+
+        self._try_inspecting_global('short2_global',
+                                   ['(short2)', '(-555, 666)'])
+
+        self._try_inspecting_global('ushort2_global',
+                                   ['(ushort2)', '(777, 888)'])
+
+        self._try_inspecting_global('int2_global',
+                                   ['(int2)', '(999, -1111)'])
+
+        self._try_inspecting_global('uint2_global',
+                                   ['(uint2)', '(2222, 3333)'])
+
+        self._try_inspecting_global('float2_global',
+                                   ['(float2)', '(4.5, -5)'])
+
+        self._try_inspecting_global('long2_global',
+                                   ['(long2)', '(-4444, 5555)'])
+
+        self._try_inspecting_global('ulong2_global',
+                                   ['(ulong2)', '(6666, 7777)'])
+
+        self._try_inspecting_global('double2_global',
+                                   ['(double2)', '(88.5, -99)'])
+
+        self._try_inspecting_global('char3_global',
+                                   ['(char3)',
+                                    '(11, -22, -33,'])
+
+        self._try_inspecting_global('uchar3_global',
+                                   ['(uchar3)',
+                                    '(0x21, 0x2c, 0x37,'])
+
+        self._try_inspecting_global('short3_global',
+                                   ['(short3)',
+                                    '(-555, 666, 777,'])
+
+        self._try_inspecting_global('ushort3_global',
+                                   ['(ushort3)',
+                                    '(777, 888, 999,'])
+
+        self._try_inspecting_global('int3_global',
+                                   ['(int3)',
+                                    '(999, -1111, 2222,'])
+
+        self._try_inspecting_global('uint3_global',
+                                   ['(uint3)',
+                                    '(2222, 3333, 4444,'])
+
+        self._try_inspecting_global('float3_global',
+                                   ['(float3)',
+                                    '(4.5, -5, -6.5,'])
+
+        self._try_inspecting_global('long3_global',
+                                   ['(long3)',
+                                    '(-4444, 5555, 6666,'])
+
+        self._try_inspecting_global('ulong3_global',
+                                   ['(ulong3)',
+                                    '(6666, 7777, 8888,'])
+
+        self._try_inspecting_global('double3_global',
+                                   ['(double3)',
+                                    '(88.5, -99, 111.5,'])
+
+        self._try_inspecting_global('char4_global',
+                                   ['(char4)',
+                                    '(55, 11, -22, -33)'])
+
+        self._try_inspecting_global('uchar4_global',
+                                   ['(uchar4)',
+                                    '(0xde, 0x21, 0x2c, 0x37)'])
+
+        self._try_inspecting_global('short4_global',
+                                   ['(short4)',
+                                    '(-444, -555, 666, 777)'])
+
+        self._try_inspecting_global('ushort4_global',
+                                   ['(ushort4)',
+                                    '(666, 777, 888, 999)'])
+
+        self._try_inspecting_global('int4_global',
+                                   ['(int4)',
+                                    '(888, 999, -1111, 2222)'])
+
+        self._try_inspecting_global('uint4_global',
+                                   ['(uint4)',
+                                    '(1111, 2222, 3333, 4444)'])
+
+        self._try_inspecting_global('float4_global',
+                                   ['(float4)',
+                                    '(3, 4.5, -5, -6.5)'])
+
+        self._try_inspecting_global('long4_global',
+                                   ['(long4)',
+                                    '(-3333, -4444, 5555, 6666)'])
+
+        self._try_inspecting_global('ulong4_global',
+                                   ['(ulong4)',
+                                    '(5555, 6666, 7777, 8888)'])
+
+        self._try_inspecting_global('double4_global',
+                                   ['(double4)',
+                                    '(-77, 88.5, -99, 111.5)'])
+
+        self._try_inspecting_global('matrix2x2_global',
+                                   ['(rs_matrix2x2)',
+                                    '= (m = (1, 2.5, 3, 4.5))'])
+
+        self._try_inspecting_global('matrix3x3_global',
+                                   ['(rs_matrix3x3)',
+                                    '= {\n'
+                                    '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)'])
+
+        self._try_inspecting_global('matrix4x4_global',
+                                   ['(rs_matrix4x4)',
+                                    '= {\n'
+                                    '  m = {\n'
+                                    '    [0] = 5.5\n'
+                                    '    [1] = 6\n'
+                                    '    [2] = 7.5\n'
+                                    '    [3] = 8\n'
+                                    '    [4] = 9\n'
+                                    '    [5] = 1.5\n'
+                                    '    [6] = 2\n'
+                                    '    [7] = 3.5\n'
+                                    '    [8] = 4.5\n'
+                                    '    [9] = 5.5\n'
+                                    '    [10] = 6.5\n'
+                                    '    [11] = 7\n'
+                                    '    [12] = 8\n'
+                                    '    [13] = 9.5\n'
+                                    '    [14] = 1.5\n'
+                                    '    [15] = 2.5\n'
+                                    '  }\n'])
+
+        self._try_inspecting_global('quaternion_global',
+                                   ['(rs_quaternion)',
+                                    '(4.5, 5.5, 6, 3)'])
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_read_local_cpp.py b/tests/lldb/tests/cpp/test_read_local_cpp.py
new file mode 100644
index 0000000..80873fa
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_read_local_cpp.py
@@ -0,0 +1,309 @@
+'''Module that contains the test TestReadLocalCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestReadLocalCpp(TestBaseRemote):
+    '''Tests inspecting local variables of all types in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "CppKernelVariables"
+
+    def _try_inspecting_local(self, local_name, expected_output,
+                             expected_regex=None):
+        '''Inspect a local and check for the output.
+
+        Run the "expr" and "frame variable" commands on a given local and
+        with a given output. (The commands should be equivalent.)
+
+        Args:
+            local_name: String which is the name of the global to inspect.
+            expected_output: List of strings that should be found in the output.
+            expected_regex: List of regular expressions that should match lldb's
+                            output.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr ' + local_name,
+                         expected_output,
+                         expected_regex)
+
+        self.try_command('frame variable ' + local_name,
+                         expected_output,
+                         expected_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        # pylint: disable=too-many-statements
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --file simple.rs --line 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('frame variable',
+                         ["(uchar) uchar_local = 'b'",
+                          '(short) short_local = -321',
+                          '(ushort) ushort_local = 432',
+                          '(int) int_local = 1234',
+                          '(uint) uint_local = 2345',
+                          '(float) float_local = 4.5',
+                          '(ulong) ulong_local = 8888',
+                          '(double) double_local = -456.5',
+                          '(char2) char2_local = (-11, -22)',
+                          '(uchar2) uchar2_local = (0x21, 0x2c)',
+                          '(short2) short2_local = (-555, 666)',
+                          '(ushort2) ushort2_local = (777, 888)',
+                          '(int2) int2_local = (999, -1111)',
+                          '(uint2) uint2_local = (2222, 3333)',
+                          '(float2) float2_local = (4.5, -5)',
+                          '(long2) long2_local = (-4444, 5555)',
+                          '(ulong2) ulong2_local = (6666, 7777)',
+                          '(double2) double2_local = (88.5, -99)',
+                          '(char3) char3_local = (11, -22, -33,',
+                          '(uchar3) uchar3_local = (0x21, 0x2c, 0x37,',
+                          '(short3) short3_local = (-555, 666, 777,',
+                          '(ushort3) ushort3_local = (777, 888, 999,',
+                          '(int3) int3_local = (999, -1111, 2222,',
+                          '(uint3) uint3_local = (2222, 3333, 4444,',
+                          '(float3) float3_local = (4.5, -5, -6.5,',
+                          '(long3) long3_local = (-4444, 5555, 6666,',
+                          '(ulong3) ulong3_local = (6666, 7777, 8888,',
+                          '(double3) double3_local = (88.5, -99, 111.5,',
+                          '(char4) char4_local = (55, 11, -22, -33)',
+                          '(uchar4) uchar4_local = (0x16, 0x21, 0x2c, 0x37)',
+                          '(short4) short4_local = (-444, -555, 666, 777)',
+                          '(ushort4) ushort4_local = (666, 777, 888, 999)',
+                          '(int4) int4_local = (888, 999, -1111, 2222)',
+                          '(uint4) uint4_local = (1111, 2222, 3333, 4444)',
+                          '(float4) float4_local = (3, 4.5, -5, -6.5)',
+                          '(long4) long4_local = (-3333, -4444, 5555, 6666)',
+                          '(ulong4) ulong4_local = (5555, 6666, 7777, 8888)',
+                          '(double4) double4_local = (-77, 88.5, -99, 111.5)',
+                          '(rs_matrix2x2) matrix2x2_local = (m = (1, 2.5, 3, 4.5))',
+                          '(rs_matrix3x3) matrix3x3_local = {\n'
+                          '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)',
+                          '(rs_matrix4x4) matrix4x4_local = {\n'
+                          '  m = {\n'
+                          '    [0] = 5.5\n'
+                          '    [1] = 6\n'
+                          '    [2] = 7.5\n'
+                          '    [3] = 8\n'
+                          '    [4] = 9\n'
+                          '    [5] = 1.5\n'
+                          '    [6] = 2\n'
+                          '    [7] = 3.5\n'
+                          '    [8] = 4.5\n'
+                          '    [9] = 5.5\n'
+                          '    [10] = 6.5\n'
+                          '    [11] = 7\n'
+                          '    [12] = 8\n'
+                          '    [13] = 9.5\n'
+                          '    [14] = 1.5\n'
+                          '    [15] = 2.5\n'
+                          '  }\n',
+                          '(rs_quaternion) quaternion_local = (8, 9, 0.5, 7.5)'],
+                         [r"\((signed )?char\) char_local = 'a'",
+                          r'\((long )?long\) long_local = -77777'])
+
+        # Use expr to inspect locals
+        self._try_inspecting_local('char_local',
+                                  ["'a'"],
+                                  [r'\((signed )?char\)'])
+
+        self._try_inspecting_local('uchar_local',
+                                  ['(uchar)', "'b'"])
+
+        self._try_inspecting_local('short_local',
+                                  ['(short)', '-321'])
+
+        self._try_inspecting_local('ushort_local',
+                                  ['(ushort)', '432'])
+
+        self._try_inspecting_local('int_local',
+                                  ['(int)', '1234'])
+
+        self._try_inspecting_local('uint_local',
+                                  ['(uint)', '2345'])
+
+        self._try_inspecting_local('float_local',
+                                  ['(float)', '4.5'])
+
+        self._try_inspecting_local('long_local',
+                                  ['-77777'], [r'\((long )?long\)'])
+
+        self._try_inspecting_local('ulong_local',
+                                  ['(ulong)', '8888'])
+
+        self._try_inspecting_local('double_local',
+                                  ['(double)', '-456.5'])
+
+        self._try_inspecting_local('char2_local',
+                                  ['(char2)', '(-11, -22)'])
+
+        self._try_inspecting_local('uchar2_local',
+                                  ['(uchar2)', '(0x21, 0x2c)'])
+
+        self._try_inspecting_local('short2_local',
+                                  ['(short2)', '(-555, 666)'])
+
+        self._try_inspecting_local('ushort2_local',
+                                  ['(ushort2)', '(777, 888)'])
+
+        self._try_inspecting_local('int2_local',
+                                  ['(int2)', '(999, -1111)'])
+
+        self._try_inspecting_local('uint2_local',
+                                  ['(uint2)', '(2222, 3333)'])
+
+        self._try_inspecting_local('float2_local',
+                                  ['(float2)', '(4.5, -5)'])
+
+        self._try_inspecting_local('long2_local',
+                                  ['(long2)', '(-4444, 5555)'])
+
+        self._try_inspecting_local('ulong2_local',
+                                  ['(ulong2)', '(6666, 7777)'])
+
+        self._try_inspecting_local('double2_local',
+                                  ['(double2)', '(88.5, -99)'])
+
+        self._try_inspecting_local('char3_local',
+                                  ['(char3)',
+                                   '(11, -22, -33,'])
+
+        self._try_inspecting_local('uchar3_local',
+                                  ['(uchar3)',
+                                   '(0x21, 0x2c, 0x37,'])
+
+        self._try_inspecting_local('short3_local',
+                                  ['(short3)',
+                                   '(-555, 666, 777,'])
+
+        self._try_inspecting_local('ushort3_local',
+                                  ['(ushort3)',
+                                   '(777, 888, 999,'])
+
+        self._try_inspecting_local('int3_local',
+                                  ['(int3)',
+                                   '(999, -1111, 2222,'])
+
+        self._try_inspecting_local('uint3_local',
+                                  ['(uint3)',
+                                   '(2222, 3333, 4444,'])
+
+        self._try_inspecting_local('float3_local',
+                                  ['(float3)',
+                                   '(4.5, -5, -6.5,'])
+
+        self._try_inspecting_local('long3_local',
+                                  ['(long3)',
+                                   '(-4444, 5555, 6666,'])
+
+        self._try_inspecting_local('ulong3_local',
+                                  ['(ulong3)',
+                                   '(6666, 7777, 8888,'])
+
+        self._try_inspecting_local('double3_local',
+                                  ['(double3)',
+                                   '(88.5, -99, 111.5,'])
+
+        self._try_inspecting_local('char4_local',
+                                  ['(char4)',
+                                   '(55, 11, -22, -33)'])
+
+        self._try_inspecting_local('uchar4_local',
+                                  ['(uchar4)',
+                                   '(0x16, 0x21, 0x2c, 0x37)'])
+
+        self._try_inspecting_local('short4_local',
+                                  ['(short4)',
+                                   '(-444, -555, 666, 777)'])
+
+        self._try_inspecting_local('ushort4_local',
+                                  ['(ushort4)',
+                                   '(666, 777, 888, 999)'])
+
+        self._try_inspecting_local('int4_local',
+                                  ['(int4)',
+                                   '(888, 999, -1111, 2222)'])
+
+        self._try_inspecting_local('uint4_local',
+                                  ['(uint4)',
+                                   '(1111, 2222, 3333, 4444)'])
+
+        self._try_inspecting_local('float4_local',
+                                  ['(float4)',
+                                   '(3, 4.5, -5, -6.5)'])
+
+        self._try_inspecting_local('long4_local',
+                                  ['(long4)',
+                                   '(-3333, -4444, 5555, 6666)'])
+
+        self._try_inspecting_local('ulong4_local',
+                                  ['(ulong4)',
+                                   '(5555, 6666, 7777, 8888)'])
+
+        self._try_inspecting_local('double4_local',
+                                  ['(double4)',
+                                   '(-77, 88.5, -99, 111.5)'])
+
+        self._try_inspecting_local('matrix2x2_local',
+                                   ['(rs_matrix2x2)',
+                                    '= (m = (1, 2.5, 3, 4.5))'])
+
+        self._try_inspecting_local('matrix3x3_local',
+                                   ['(rs_matrix3x3)',
+                                    '= {\n'
+                                    '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)'])
+
+        self._try_inspecting_local('matrix4x4_local',
+                                   ['(rs_matrix4x4)',
+                                    '= {\n'
+                                    '  m = {\n'
+                                    '    [0] = 5.5\n'
+                                    '    [1] = 6\n'
+                                    '    [2] = 7.5\n'
+                                    '    [3] = 8\n'
+                                    '    [4] = 9\n'
+                                    '    [5] = 1.5\n'
+                                    '    [6] = 2\n'
+                                    '    [7] = 3.5\n'
+                                    '    [8] = 4.5\n'
+                                    '    [9] = 5.5\n'
+                                    '    [10] = 6.5\n'
+                                    '    [11] = 7\n'
+                                    '    [12] = 8\n'
+                                    '    [13] = 9.5\n'
+                                    '    [14] = 1.5\n'
+                                    '    [15] = 2.5\n'
+                                    '  }\n'])
+
+        self._try_inspecting_local('quaternion_local',
+                                  ['(rs_quaternion)',
+                                   '(8, 9, 0.5, 7.5)'])
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_rs_consts_cpp.py b/tests/lldb/tests/cpp/test_rs_consts_cpp.py
new file mode 100644
index 0000000..8370a17
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_rs_consts_cpp.py
@@ -0,0 +1,81 @@
+'''Module that contains the test TestRSConstsCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestRSConstsCpp(TestBaseRemote):
+    '''Tests examining the RenderScript constants in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "CppKernelVariables"
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set kernel',
+                         [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Constants
+        self.try_command('expr M_1_PI',
+                         ['0.318309'])
+
+        self.try_command('expr M_2_PI',
+                         ['0.636619'])
+
+        self.try_command('expr M_2_SQRTPI',
+                         ['1.128379'])
+
+        self.try_command('expr M_E',
+                         ['2.718281'])
+
+        self.try_command('expr M_LN10',
+                         ['2.302585'])
+
+        self.try_command('expr M_LN2',
+                         ['0.693147'])
+
+        self.try_command('expr M_LOG10E',
+                         ['0.434294'])
+
+        self.try_command('expr M_LOG2E',
+                         ['1.442695'])
+
+        self.try_command('expr M_PI',
+                         ['3.141592'])
+
+        self.try_command('expr M_PI_2',
+                         ['1.570796'])
+
+        self.try_command('expr M_PI_4',
+                         ['0.785398'])
+
+        self.try_command('expr M_SQRT1_2',
+                         ['0.707106'])
+
+        self.try_command('expr M_SQRT2',
+                         ['1.414213'])
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_source_step_cpp.py b/tests/lldb/tests/cpp/test_source_step_cpp.py
new file mode 100644
index 0000000..1125ef1
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_source_step_cpp.py
@@ -0,0 +1,90 @@
+'''Module that contains the test TestSourceStepCpp.'''
+
+import os
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestSourceStepCpp(TestBaseRemote):
+    '''Test stepping through the source in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "CppBranchingFunCalls"
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.'''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.'''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 47',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'stop reason = breakpoint',
+                          'simple.rs:47'])
+
+        # set the source mapping
+        file_dir = os.path.dirname(os.path.realpath(__file__))
+        new_dir = os.path.join(file_dir, '..', '..', 'cpp', 'BranchingFunCalls')
+        self.set_src_map('simple.rs', new_dir)
+
+        self.try_command('process status',
+                         ['-> 47',
+                          'int i = in;'])
+
+        #47     int i = in;
+        self.try_command('thread step-in',
+                         ['-> 48'])
+        #48     float f = (float) i;
+        self.try_command('thread step-in',
+                         ['-> 49'])
+        #49     modify_f(&f);
+        self.try_command('thread step-over',
+                         ['-> 50'])
+        #50  	modify_i(&i);
+        self.try_command('thread step-in',
+                         ['-> 33'])
+        #33         int j = *i;
+        self.try_command('b -f simple.rs -l 38',
+                         ['modify_i',
+                          'simple.rs:38'])
+        self.try_command('c',
+                         ['stop reason = breakpoint',
+                          'simple.rs:38',
+                          '-> 38'])
+        #38    set_i(i, 0);
+        # For the line number anything between #20 and #22 is fine
+        self.try_command('thread step-in',
+                         [],
+                         [r'-> 2[012]'])
+        #22    int tmp = b;
+        self.try_command('thread step-out',
+                         ['-> 38'])
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 2', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_write_global_cpp.py b/tests/lldb/tests/cpp/test_write_global_cpp.py
new file mode 100644
index 0000000..8edfba9
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_write_global_cpp.py
@@ -0,0 +1,208 @@
+'''Module that contains the test TestWriteGlobalCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestWriteGlobalCpp(TestBaseRemote):
+    '''Tests modifying global variables of all types in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "CppKernelVariables"
+
+    def _try_modifying_global(self, global_name, new_value, data_type_in,
+                             expected_output, expected_output_regex=None):
+        '''Modify and then inspect a global and check for the output.
+
+        Run the "expr" command to set a given global to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            global_name: String which is the name of the global to modify.
+            new_value: A string that is the new value of the global.
+            data_type_in: A string containing a c-style parenthesised data type
+                          representing the type of the global.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=too-many-arguments
+        self.try_command('expr %s = %s%s' %
+                         (global_name, data_type_in, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('target variable ' + global_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=line-too-long
+        # There is no way we can make this look nice
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_global('char_global', '-2',
+                                  '(signed char)', ['\'\\xfe\''],
+                                  [r'\((signed )?char\)'])
+
+        self._try_modifying_global('uchar_global', '22',
+                                  '(uchar)', ['(uchar)', '\'\\x16\''])
+
+        self._try_modifying_global('short_global', '-33',
+                                  '(short)', ['(short)', '-33'])
+
+        self._try_modifying_global('ushort_global', '44',
+                                  '(ushort)', ['(ushort)', '44'])
+
+        self._try_modifying_global('int_global', '-55',
+                                  '(int)', ['(int)', '-55'])
+
+        self._try_modifying_global('uint_global', '66',
+                                  '(uint)', ['(uint)', '66'])
+
+        self._try_modifying_global('float_global', '-7.5',
+                                  '(float)', ['(float)', '-7.5'])
+
+        self._try_modifying_global('long_global', '-888888',
+                                  '(long long)', ['-888888'],
+                                  [r'\((long )?long\)'])
+
+        self._try_modifying_global('ulong_global', '99999999',
+                                  '(ulong)', ['(ulong)', '99999999'])
+
+        self._try_modifying_global('double_global', '-10101.5',
+                                  '(double)', ['(double)', '-10101.5'])
+
+
+        self._try_modifying_global('char2_global', '{22, 4}',
+                                  '(char2)', ['(char2)', '(22, 4)'])
+
+        self._try_modifying_global('uchar2_global', '{44, 55}',
+                                  '(uchar2)', ['(uchar2)', '(0x2c, 0x37)'])
+
+        self._try_modifying_global('short2_global', '{-66, 77}',
+                                  '(short2)', ['(short2)', '(-66, 77)'])
+
+        self._try_modifying_global('ushort2_global', '{88, 99}',
+                                  '(ushort2)', ['(ushort2)', '(88, 99)'])
+
+        self._try_modifying_global('int2_global', '{111, -222}',
+                                  '(int2)', ['(int2)', '(111, -222)'])
+
+        self._try_modifying_global('uint2_global', '{333, 444}',
+                                  '(uint2)', ['(uint2)', '(333, 444)'])
+
+        self._try_modifying_global('float2_global', '{-55.5f, 6.0}',
+                                  '(float2)', ['(float2)', '(-55.5, 6)'])
+
+        self._try_modifying_global('long2_global', '{666666, -777777}',
+                                  '(long2)', ['(long2)', '(666666, -777777)'])
+
+        self._try_modifying_global('ulong2_global', '{888888, 999999}',
+                                  '(ulong2)', ['(ulong2)', '(888888, 999999)'])
+
+        self._try_modifying_global('double2_global', '{11.0000000, -0.0l}',
+                                  '(double2)', ['(double2)', '(11, -0)'])
+
+        self._try_modifying_global('char3_global', '{2, -3, 4}',
+                                  '(char3)', ['(char3)', '(2, -3, 4,'])
+
+        self._try_modifying_global('uchar3_global', '{\'a\', \'b\', \'c\'}',
+                                  '(uchar3)', ['(uchar3)', '(0x61, 0x62, 0x63,'])
+
+        self._try_modifying_global('short3_global', '{44, -55, 66}',
+                                  '(short3)', ['(short3)', '(44, -55, 66,'])
+
+        self._try_modifying_global('ushort3_global', '{88, 99, 111}',
+                                  '(ushort3)', ['(ushort3)', '(88, 99, 111,'])
+
+        self._try_modifying_global('int3_global', '{-111, 222, -333}',
+                                  '(int3)', ['(int3)', '(-111, 222, -333,'])
+
+        self._try_modifying_global('uint3_global', '{444, 555, 666}',
+                                  '(uint3)', ['(uint3)', '(444, 555, 666,'])
+
+        self._try_modifying_global('float3_global', '{7.5F, 0008.000, 9}',
+                                  '(float3)', ['(float3)', '(7.5, 8, 9,'])
+
+        self._try_modifying_global('long3_global', '{111111, -22222222, 3333333}',
+                                  '(long3)', ['(long3)', '(111111, -22222222, 3333333,'])
+
+        self._try_modifying_global('ulong3_global', '{4444444, 5555555, 66666666}',
+                                  '(ulong3)', ['(ulong3)', '(4444444, 5555555, 66666666,'])
+
+        self._try_modifying_global('double3_global', '{7.5L, -0, 8.9e1}',
+                                  '(double3)', ['(double3)', '(7.5, 0, 89,'])
+
+        self._try_modifying_global('char4_global', '{0x1, 0x2, 0x3, 0x4}',
+                                  '(char4)',
+                                  ['(char4)', '(1, 2, 3, 4)'])
+
+        self._try_modifying_global('uchar4_global', '{0x5, 0x6, 0x7, 0x8}',
+                                  '(uchar4)',
+                                  ['(uchar4)', '(0x05, 0x06, 0x07, 0x08)'])
+
+        self._try_modifying_global('short4_global', '{0x9, 0xa, 0xb, 0xc}',
+                                  '(short4)',
+                                  ['(short4)', '(9, 10, 11, 12)'])
+
+        self._try_modifying_global('ushort4_global', '{0xd, 0xe, 0xf, 0x10}',
+                                  '(ushort4)',
+                                  ['(ushort4)', '(13, 14, 15, 16)'])
+
+        self._try_modifying_global('int4_global', '{0x11, 0x12, 0x13, 0x14}',
+                                  '(int4)',
+                                  ['(int4)', '(17, 18, 19, 20)'])
+
+        self._try_modifying_global('uint4_global', '{0x15, 0x16, 0x17, 0x18}',
+                                  '(uint4)',
+                                  ['(uint4)', '(21, 22, 23, 24)'])
+
+        self._try_modifying_global('float4_global', '{19.0, 20.5, -21, -22.5}',
+                                  '(float4)',
+                                  ['(float4)', '(19, 20.5, -21, -22.5)'])
+
+        self._try_modifying_global('long4_global', '{0x1d, 0x1e, 0x1f, 0x20}',
+                                  '(long4)',
+                                  ['(long4)', '(29, 30, 31, 32)'])
+
+        self._try_modifying_global('ulong4_global', '{0x21, 0x22, 0x23, 0x24}',
+                                  '(ulong4)',
+                                  ['(ulong4)', '(33, 34, 35, 36)'])
+
+        self._try_modifying_global('double4_global', '{25.000, -26, -27.5, 28.0}',
+                                  '(double4)',
+                                  ['(double4)', '(25, -26, -27.5, 28)'])
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_write_global_element_cpp.py b/tests/lldb/tests/cpp/test_write_global_element_cpp.py
new file mode 100644
index 0000000..5317e49
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_write_global_element_cpp.py
@@ -0,0 +1,268 @@
+'''Module that contains the test TestWriteGlobalElementCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestWriteGlobalElementCpp(TestBaseRemote):
+    '''Tests modifying elements of global vars of all types in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "CppKernelVariables"
+
+    def _try_inspecting_global(self, global_name, expected_output):
+        '''Run the "expr" command on a given global and with a given output.
+
+        Args:
+            global_name: String which is the name of the global to inspect.
+            expected_output: List of strings that should be found in the output.
+
+        Raises:
+            TestFail: The lldb command did not provide the expected output.
+        '''
+        self.try_command('expr ' + global_name, expected_output)
+
+    def _try_modifying_global(self, global_name, new_value, expected_output,
+                             expected_output_regex=None):
+        '''Modify and then inspect a global and check for the output.
+
+        Run the "expr" command to set a given global to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            global_name: String which is the name of the global to modify.
+            new_value: A string that is the new value of the global.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr %s = %s' % (global_name, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('target variable ' + global_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=too-many-statements
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_global('char2_global[0]', '2',
+                                  ['\'\\x02\''],
+                                  [r'\((signed )?char\)'])
+        self._try_inspecting_global('char2_global', ['(char2)', '(2, -22)'])
+
+        self._try_modifying_global('uchar2_global[1]', '3',
+                                  ['\'\\x03\''],
+                                  [r'\(u(nsigned )?char\)'])
+        self._try_inspecting_global('uchar2_global',
+                                   ['(uchar2)', '(0x21, 0x03)'])
+
+        self._try_modifying_global('short2_global[0]', '-44',
+                                  ['(short)', '-44'])
+        self._try_inspecting_global('short2_global',
+                                   ['(short2)', '(-44, 666)'])
+
+        self._try_modifying_global('ushort2_global[1]', '55',
+                                  ['55'],
+                                  [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_global('ushort2_global',
+                                   ['(ushort2)', '(777, 55)'])
+
+        self._try_modifying_global('int2_global[0]', '666',
+                                  ['(int)', '666'])
+        self._try_inspecting_global('int2_global',
+                                   ['(int2)', '(666, -1111)'])
+
+        self._try_modifying_global('uint2_global[1]', '777',
+                                  ['777'],
+                                  [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_global('uint2_global',
+                                   ['(uint2)', '(2222, 777)'])
+
+        self._try_modifying_global('float2_global[0]', '-8.5',
+                                  ['(float)', '-8.5'])
+        self._try_inspecting_global('float2_global',
+                                   ['(float2)', '(-8.5, -5)'])
+
+        self._try_modifying_global('long2_global[1]', '999999',
+                                  ['999999'],
+                                  [r'\((long )?long\)'])
+        self._try_inspecting_global('long2_global',
+                                   ['(long2)', '(-4444, 999999)'])
+
+        self._try_modifying_global('ulong2_global[0]', '10101010101',
+                                  ['10101010101'],
+                                  [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_global('ulong2_global',
+                                   ['(ulong2)', '(10101010101, 7777)'])
+
+        self._try_modifying_global('double2_global[1]', '-11.000',
+                                  ['(double)', '-11'])
+        self._try_inspecting_global('double2_global',
+                                   ['(double2)', '(88.5, -11)'])
+
+
+        self._try_modifying_global('char3_global[0]', '12',
+                                  ['\'\\f\''],
+                                  [r'\((signed )?char\)'])
+        self._try_inspecting_global('char3_global',
+                                   ['(char3)',
+                                    '(12, -22, -33,'])
+
+        self._try_modifying_global('uchar3_global[1]', '\'d\'',
+                                  ['\'d\''],
+                                  [r'\(u(nsigned )?char\)'])
+        self._try_inspecting_global('uchar3_global',
+                                   ['(uchar3)',
+                                    '(0x21, 0x64, 0x37,'])
+
+        self._try_modifying_global('short3_global[2]', '-131',
+                                  ['(short)', '-131'])
+        self._try_inspecting_global('short3_global',
+                                   ['(short3)',
+                                    '(-555, 666, -131,'])
+
+        self._try_modifying_global('ushort3_global[0]', '1414',
+                                  ['1414'],
+                                  [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_global('ushort3_global',
+                                   ['(ushort3)',
+                                    '(1414, 888, 999,'])
+
+        self._try_modifying_global('int3_global[0]', '151515',
+                                  ['(int)', '151515'])
+        self._try_inspecting_global('int3_global',
+                                   ['(int3)',
+                                    '(151515, -1111, 2222,'])
+
+        self._try_modifying_global('uint3_global[1]', '161616',
+                                  ['161616'],
+                                  [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_global('uint3_global',
+                                   ['(uint3)',
+                                    '(2222, 161616, 4444,'])
+
+        self._try_modifying_global('float3_global[2]', '17.5',
+                                  ['(float)', '17.5'])
+        self._try_inspecting_global('float3_global',
+                                   ['(float3)',
+                                    '(4.5, -5, 17.5,'])
+
+        self._try_modifying_global('long3_global[0]', '-181818181818',
+                                  ['-181818181818'],
+                                  [r'\((long )?long\)'])
+        self._try_inspecting_global('long3_global',
+                                   ['(long3)',
+                                    '(-181818181818, 5555, 6666,'])
+
+        self._try_modifying_global('ulong3_global[1]', '191919191919',
+                                  ['191919191919'],
+                                  [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_global('ulong3_global',
+                                   ['(ulong3)',
+                                    '(6666, 191919191919, 8888,'])
+
+        self._try_modifying_global('double3_global[2]', '20.5',
+                                  ['(double)', '20.5'])
+        self._try_inspecting_global('double3_global',
+                                   ['(double3)',
+                                    '(88.5, -99, 20.5,'])
+
+        self._try_modifying_global('char4_global[0]', '-21',
+                                  ['\'\\xeb\''],
+                                  [r'\((signed )?char\)'])
+        self._try_inspecting_global('char4_global',
+                                   ['(char4)',
+                                    '(-21, 11, -22, -33)'])
+
+        self._try_modifying_global('uchar4_global[1]', '22',
+                                  ['\'\\x16\''],
+                                  [r'\(u(nsigned )?char\)'])
+        self._try_inspecting_global('uchar4_global',
+                                   ['(uchar4)',
+                                    '(0xde, 0x16, 0x2c, 0x37)'])
+
+        self._try_modifying_global('short4_global[2]', '23',
+                                  ['(short)', '23'])
+        self._try_inspecting_global('short4_global',
+                                   ['(short4)',
+                                    '(-444, -555, 23, 777)'])
+
+        self._try_modifying_global('ushort4_global[3]', '24',
+                                  ['24'],
+                                  [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_global('ushort4_global',
+                                   ['(ushort4)',
+                                    '(666, 777, 888, 24)'])
+
+        self._try_modifying_global('int4_global[0]', '-2525',
+                                  ['(int)', '-2525'])
+        self._try_inspecting_global('int4_global',
+                                   ['(int4)',
+                                    '(-2525, 999, -1111, 2222)'])
+
+        self._try_modifying_global('uint4_global[1]', '26262',
+                                  ['26262'],
+                                  [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_global('uint4_global',
+                                   ['(uint4)',
+                                    '(1111, 26262, 3333, 4444)'])
+
+        self._try_modifying_global('float4_global[2]', '27.0f',
+                                  ['(float)', '27'])
+        self._try_inspecting_global('float4_global',
+                                   ['(float4)',
+                                    '(3, 4.5, 27, -6.5)'])
+
+        self._try_modifying_global('long4_global[3]', '-28282828282',
+                                  ['-28282828282'],
+                                  [r'\((long )?long\)'])
+        self._try_inspecting_global('long4_global',
+                                   ['(long4)',
+                                    '(-3333, -4444, 5555, -28282828282)'])
+
+        self._try_modifying_global('ulong4_global[0]', '2929292929',
+                                  ['2929292929'],
+                                  [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_global('ulong4_global',
+                                   ['(ulong4)',
+                                    '(2929292929, 6666, 7777, 8888)'])
+
+        self._try_modifying_global('double4_global[1]', '30.5',
+                                  ['(double)', '30.5'])
+        self._try_inspecting_global('double4_global',
+                                   ['(double4)',
+                                    '(-77, 30.5, -99, 111.5)'])
+
+        self.try_command('breakpoint delete 1', ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['exited with status = 0'])
diff --git a/tests/lldb/tests/cpp/test_write_local_cpp.py b/tests/lldb/tests/cpp/test_write_local_cpp.py
new file mode 100644
index 0000000..f10e306
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_write_local_cpp.py
@@ -0,0 +1,202 @@
+'''Module that contains the test TestWriteLocalCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestWriteLocalCpp(TestBaseRemote):
+    '''Tests modifying local variables of all types in an NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "CppKernelVariables"
+
+    def _try_modifying_local(self, local_name, new_value, data_type_in,
+                             expected_output, expected_output_regex=None):
+        '''Try getting lldb to modify a local and check the output.
+
+        Run the "expr" command to set a given local to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            local_name: String which is the name of the local to modify.
+            new_value: A string that is the new value of the local.
+            data_type_in: A string containing a c-style parenthesised data type
+                          representing the type of the local.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=too-many-arguments
+        self.try_command('expr %s = %s%s' % (local_name, data_type_in,
+                                             new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('frame variable ' + local_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=line-too-long
+        # There is no way we can make this look nice
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_local('char_local', '-2',
+                                 '(signed char)', ['\'\\xfe\''],
+                                 [r'\((signed )?char\)'])
+
+        self._try_modifying_local('uchar_local', '22',
+                                 '(uchar)', ['(uchar)', '\'\\x16\''])
+
+        self._try_modifying_local('short_local', '-33',
+                                 '(short)', ['(short)', '-33'])
+
+        self._try_modifying_local('ushort_local', '44',
+                                 '(ushort)', ['(ushort)', '44'])
+
+        self._try_modifying_local('int_local', '-55',
+                                 '(int)', ['(int)', '-55'])
+
+        self._try_modifying_local('uint_local', '66',
+                                 '(uint)', ['(uint)', '66'])
+
+        self._try_modifying_local('float_local', '-7.5',
+                                 '(float)', ['(float)', '-7.5'])
+
+        self._try_modifying_local('long_local', '-888888',
+                                 '(long long)', ['-888888'],
+                                 [r'\((long )?long\)'])
+
+        self._try_modifying_local('ulong_local', '99999999',
+                                 '(ulong)', ['(ulong)', '99999999'])
+
+        self._try_modifying_local('double_local', '-10101.5',
+                                 '(double)', ['(double)', '-10101.5'])
+
+        self._try_modifying_local('char2_local', '{22, 4}',
+                                 '(char2)', ['(char2)', '(22, 4)'])
+
+        self._try_modifying_local('uchar2_local', '{44, 55}',
+                                 '(uchar2)', ['(uchar2)', '(0x2c, 0x37)'])
+
+        self._try_modifying_local('short2_local', '{-66, 77}',
+                                 '(short2)', ['(short2)', '(-66, 77)'])
+
+        self._try_modifying_local('ushort2_local', '{88, 99}',
+                                 '(ushort2)', ['(ushort2)', '(88, 99)'])
+
+        self._try_modifying_local('int2_local', '{111, -222}',
+                                 '(int2)', ['(int2)', '(111, -222)'])
+
+        self._try_modifying_local('uint2_local', '{333, 444}',
+                                 '(uint2)', ['(uint2)', '(333, 444)'])
+
+        self._try_modifying_local('float2_local', '{-55.5f, 6.0}',
+                                 '(float2)', ['(float2)', '(-55.5, 6)'])
+
+        self._try_modifying_local('long2_local', '{666666, -777777}',
+                                 '(long2)', ['(long2)', '(666666, -777777)'])
+
+        self._try_modifying_local('ulong2_local', '{888888, 999999}',
+                                 '(ulong2)', ['(ulong2)', '(888888, 999999)'])
+
+        self._try_modifying_local('double2_local', '{11.0000000, -0.0l}',
+                                 '(double2)', ['(double2)', '(11, -0)'])
+
+        self._try_modifying_local('char3_local', '{2, -3, 4}',
+                                 '(char3)', ['(char3)', '(2, -3, 4,'])
+
+        self._try_modifying_local('uchar3_local', '{\'a\', \'b\', \'c\'}',
+                                 '(uchar3)', ['(uchar3)', '(0x61, 0x62, 0x63,'])
+
+        self._try_modifying_local('short3_local', '{44, -55, 66}',
+                                 '(short3)', ['(short3)', '(44, -55, 66,'])
+
+        self._try_modifying_local('ushort3_local', '{88, 99, 111}',
+                                 '(ushort3)', ['(ushort3)', '(88, 99, 111,'])
+
+        self._try_modifying_local('int3_local', '{-111, 222, -333}',
+                                 '(int3)', ['(int3)', '(-111, 222, -333,'])
+
+        self._try_modifying_local('uint3_local', '{444, 555, 666}',
+                                 '(uint3)', ['(uint3)', '(444, 555, 666,'])
+
+        self._try_modifying_local('float3_local', '{7.5F, 0008.000, 9}',
+                                 '(float3)', ['(float3)', '(7.5, 8, 9,'])
+
+        self._try_modifying_local('long3_local', '{111111, -22222222, 3333333}',
+                                 '(long3)', ['(long3)', '(111111, -22222222, 3333333,'])
+
+        self._try_modifying_local('ulong3_local', '{4444444, 5555555, 66666666}',
+                                 '(ulong3)', ['(ulong3)', '(4444444, 5555555, 66666666,'])
+
+        self._try_modifying_local('double3_local', '{7.5L, -0, 8.9e1}',
+                                 '(double3)', ['(double3)', '(7.5, 0, 89,'])
+
+        self._try_modifying_local('char4_local', '{0x1, 0x2, 0x3, 0x4}',
+                                 '(char4)',
+                                 ['(char4)', '(1, 2, 3, 4)'])
+
+        self._try_modifying_local('uchar4_local', '{0x5, 0x6, 0x7, 0x8}',
+                                 '(uchar4)',
+                                 ['(uchar4)', '(0x05, 0x06, 0x07, 0x08)'])
+
+        self._try_modifying_local('short4_local', '{0x9, 0xa, 0xb, 0xc}',
+                                 '(short4)',
+                                 ['(short4)', '(9, 10, 11, 12)'])
+
+        self._try_modifying_local('ushort4_local', '{0xd, 0xe, 0xf, 0x10}',
+                                 '(ushort4)',
+                                 ['(ushort4)', '(13, 14, 15, 16)'])
+
+        self._try_modifying_local('int4_local', '{0x11, 0x12, 0x13, 0x14}',
+                                 '(int4)',
+                                 ['(int4)', '(17, 18, 19, 20)'])
+
+        self._try_modifying_local('uint4_local', '{0x15, 0x16, 0x17, 0x18}',
+                                 '(uint4)',
+                                 ['(uint4)', '(21, 22, 23, 24)'])
+
+        self._try_modifying_local('float4_local', '{19.0, 20.5, -21, -22.5}',
+                                 '(float4)',
+                                 ['(float4)', '(19, 20.5, -21, -22.5)'])
+
+        self._try_modifying_local('long4_local', '{0x1d, 0x1e, 0x1f, 0x20}',
+                                 '(long4)',
+                                 ['(long4)', '(29, 30, 31, 32)'])
+
+        self._try_modifying_local('ulong4_local', '{0x21, 0x22, 0x23, 0x24}',
+                                 '(ulong4)',
+                                 ['(ulong4)', '(33, 34, 35, 36)'])
+
+        self._try_modifying_local('double4_local', '{25.000, -26, -27.5, 28.0}',
+                                 '(double4)',
+                                 ['(double4)', '(25, -26, -27.5, 28)'])
diff --git a/tests/lldb/tests/cpp/test_write_local_element_cpp.py b/tests/lldb/tests/cpp/test_write_local_element_cpp.py
new file mode 100644
index 0000000..7099ce6
--- /dev/null
+++ b/tests/lldb/tests/cpp/test_write_local_element_cpp.py
@@ -0,0 +1,272 @@
+'''Module that contains the test TestWriteLocalElementCpp.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestWriteLocalElementCpp(TestBaseRemote):
+    '''Tests modifying elements of local variables of all types in a NDK app.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "CppKernelVariables"
+
+    def _try_inspecting_local(self, local_name, expected_output):
+        '''Run the "expr" command on a given local and with a given output.
+
+        Args:
+            local_name: String which is the name of the local to inspect.
+            expected_output: List of strings that should be found in the output.
+
+        Raises:
+            TestFail: The lldb command did not provide the expected output.
+        '''
+        self.try_command('expr ' + local_name, expected_output)
+
+    def _try_modifying_local(self, local_name, new_value, expected_output,
+                             expected_output_regex=None):
+        '''Modify and then inspect a local and check for the output.
+
+        Run the "expr" command to set a given local to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            local_name: String which is the name of the local to modify.
+            new_value: A string that is the new value of the local.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr %s = %s' % (local_name, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('frame variable ' + local_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=too-many-statements
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_local('char2_local[0]', '2',
+                                 ['2'], [r'\((signed )?char\)'])
+        self._try_inspecting_local('char2_local',
+                                 ['(char2)', '(2, -22)'])
+
+        self._try_modifying_local('uchar2_local[1]', '3',
+                                 ['3'], [r'\(u(nsigned )?char\)'])
+        self._try_inspecting_local('uchar2_local',
+                                  ['(uchar2)', '(0x21, 0x03)'])
+
+        self._try_modifying_local('short2_local[0]', '-44',
+                                 ['(short)', '-44'])
+        self._try_inspecting_local('short2_local',
+                                  ['(short2)', '(-44, 666)'])
+
+        self._try_modifying_local('ushort2_local[1]', '55',
+                                 ['55'], [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_local('ushort2_local',
+                                  ['(ushort2)', '(777, 55)'])
+
+        self._try_modifying_local('int2_local[0]', '666',
+                                 ['(int)', '666'])
+        self._try_inspecting_local('int2_local',
+                                  ['(int2)', '(666, -1111)'])
+
+        self._try_modifying_local('uint2_local[1]', '777',
+                                 ['777'], [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_local('uint2_local',
+                                  ['(uint2)', '(2222, 777)'])
+
+        self._try_modifying_local('float2_local[0]', '-8.5',
+                                 ['(float)', '-8.5'])
+        self._try_inspecting_local('float2_local',
+                                  ['(float2)', '(-8.5, -5)'])
+
+        self._try_modifying_local('long2_local[1]', '999999',
+                                 ['999999'],
+                                 [r'\((long )?long\)'])
+        self._try_inspecting_local('long2_local',
+                                  ['(long2)', '(-4444, 999999)'])
+
+        self._try_modifying_local('ulong2_local[0]', '10101010101',
+                                 ['10101010101'],
+                                 [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_local('ulong2_local',
+                                  ['(ulong2)', '(10101010101, 7777)'])
+
+        self._try_modifying_local('double2_local[1]', '-11.000',
+                                 ['(double)', '-11'])
+        self._try_inspecting_local('double2_local',
+                                  ['(double2)', '(88.5, -11)'])
+
+        # For some reason the result of some char and uchar expr is in hex and
+        # that of frame variable in decimal, so calling _try_modifying_local
+        # doesn't work, because it reuses the expected output for both commands.
+        self.try_command('expr char3_local[0] = 12',
+                         ['\'\\f\''],
+                         [r'\((signed )?char\)'])
+        self.try_command('frame variable char3_local[0]',
+                         ['12'],
+                         [r'\((signed )?char\)'])
+
+        self._try_inspecting_local('char3_local',
+                                  ['(char3)',
+                                   '(12, -22, -33,'])
+
+        self.try_command('expr uchar3_local[1] = \'d\'',
+                         ['\'d\''],
+                         [r'\(u(nsigned )?char\)'])
+        self.try_command('frame variable uchar3_local[1]',
+                         ['0x64'],
+                         [r'\(u(nsigned )?char\)'])
+
+        self._try_inspecting_local('uchar3_local',
+                                  ['(uchar3)',
+                                   '(0x21, 0x64, 0x37,'])
+
+        self._try_modifying_local('short3_local[2]', '-131',
+                                 ['(short)', '-131'])
+        self._try_inspecting_local('short3_local',
+                                  ['(short3)',
+                                   '(-555, 666, -131,'])
+
+        self._try_modifying_local('ushort3_local[0]', '1414',
+                                 ['1414'], [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_local('ushort3_local',
+                                  ['(ushort3)',
+                                   '(1414, 888, 999,'])
+
+        self._try_modifying_local('int3_local[0]', '151515',
+                                 ['(int)', '151515'])
+        self._try_inspecting_local('int3_local',
+                                  ['(int3)',
+                                   '(151515, -1111, 2222,'])
+
+        self._try_modifying_local('uint3_local[1]', '161616',
+                                 ['161616'], [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_local('uint3_local',
+                                  ['(uint3)',
+                                   '(2222, 161616, 4444,'])
+
+        self._try_modifying_local('float3_local[2]', '17.5',
+                                 ['(float)', '17.5'])
+        self._try_inspecting_local('float3_local',
+                                  ['(float3)',
+                                   '(4.5, -5, 17.5,'])
+
+        self._try_modifying_local('long3_local[0]', '-181818181818',
+                                 ['-181818181818'], [r'\((long )?long\)'])
+        self._try_inspecting_local('long3_local',
+                                  ['(long3)',
+                                   '(-181818181818, 5555, 6666,'])
+
+        self._try_modifying_local('ulong3_local[1]', '191919191919',
+                                 ['191919191919'],
+                                 [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_local('ulong3_local',
+                                  ['(ulong3)',
+                                   '(6666, 191919191919, 8888,'])
+
+        self._try_modifying_local('double3_local[2]', '20.5',
+                                 ['(double)', '20.5'])
+        self._try_inspecting_local('double3_local',
+                                  ['(double3)',
+                                   '(88.5, -99, 20.5,'])
+
+        self.try_command('expr char4_local[0] = -21',
+                         ['\'\\xeb\''],
+                         [r'\((signed )?char\)'])
+        self.try_command('frame variable char4_local[0]',
+                         ['-21'],
+                         [r'\((signed )?char\)'])
+
+        self._try_inspecting_local('char4_local',
+                                  ['(char4)',
+                                   '(-21, 11, -22, -33)'])
+
+        self.try_command('expr uchar4_local[1] = 22',
+                         ['\'\\x16\''],
+                         [r'\(u(nsigned )?char\)'])
+        self.try_command('frame variable uchar4_local[1]',
+                         ['0x16'],
+                         [r'\(u(nsigned )?char\)'])
+
+        self._try_inspecting_local('uchar4_local',
+                                  ['(uchar4)',
+                                   '(0x16, 0x16, 0x2c, 0x37)'])
+
+        self._try_modifying_local('short4_local[2]', '23',
+                                 ['(short)', '23'])
+        self._try_inspecting_local('short4_local',
+                                  ['(short4)',
+                                   '(-444, -555, 23, 777)'])
+
+        self._try_modifying_local('ushort4_local[3]', '24',
+                                 ['24'], [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_local('ushort4_local',
+                                  ['(ushort4)',
+                                   '(666, 777, 888, 24)'])
+
+        self._try_modifying_local('int4_local[0]', '-2525',
+                                 ['(int)', '-2525'])
+        self._try_inspecting_local('int4_local',
+                                  ['(int4)',
+                                   '(-2525, 999, -1111, 2222)'])
+
+        self._try_modifying_local('uint4_local[1]', '26262',
+                                 ['26262'], [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_local('uint4_local',
+                                  ['(uint4)',
+                                   '(1111, 26262, 3333, 4444)'])
+
+        self._try_modifying_local('float4_local[2]', '27.0f',
+                                 ['(float)', '27'])
+        self._try_inspecting_local('float4_local',
+                                  ['(float4)',
+                                   '(3, 4.5, 27, -6.5)'])
+
+        self._try_modifying_local('long4_local[3]', '-28282828282',
+                                 ['-28282828282'], [r'\((long )?long\)'])
+        self._try_inspecting_local('long4_local',
+                                  ['(long4)',
+                                   '(-3333, -4444, 5555, -28282828282)'])
+
+        self._try_modifying_local('ulong4_local[0]', '2929292929',
+                                 ['2929292929'],
+                                 [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_local('ulong4_local',
+                                  ['(ulong4)',
+                                   '(2929292929, 6666, 7777, 8888)'])
+
+        self._try_modifying_local('double4_local[1]', '30.5',
+                                 ['(double)', '30.5'])
+        self._try_inspecting_local('double4_local',
+                                  ['(double4)',
+                                   '(-77, 30.5, -99, 111.5)'])
diff --git a/tests/lldb/tests/harness/RS_funs.py b/tests/lldb/tests/harness/RS_funs.py
new file mode 100644
index 0000000..a6492af
--- /dev/null
+++ b/tests/lldb/tests/harness/RS_funs.py
@@ -0,0 +1,1385 @@
+'''A list of signatures for RS builtin functions and util functions for them.
+
+Function signature syntax is usually C-like, however, fixed values can also be
+specified for those functions where the input range is restricted.
+Lines in the function table beginning with - are comments.
+Also contains utility functions to build an LLDB expression from a single
+function line.
+'''
+
+import re
+
+# Remove blank and comment lines using a lambda.
+FUNC_LIST = filter(lambda line: line.strip()
+                                and not line.strip().startswith('-'), '''
+- math functions
+
+uchar abs(char v);
+uchar2 abs(char2 v);
+uchar3 abs(char3 v);
+uchar4 abs(char4 v);
+uint abs(int v);
+uint2 abs(int2 v);
+uint3 abs(int3 v);
+uint4 abs(int4 v);
+ushort abs(short v);
+ushort2 abs(short2 v);
+ushort3 abs(short3 v);
+ushort4 abs(short4 v);
+
+float acos(float v);
+float2 acos(float2 v);
+float3 acos(float3 v);
+float4 acos(float4 v);
+
+float acosh(float v);
+float2 acosh(float2 v);
+float3 acosh(float3 v);
+float4 acosh(float4 v);
+
+float acospi(float v);
+float2 acospi(float2 v);
+float3 acospi(float3 v);
+float4 acospi(float4 v);
+
+float asin(float v);
+float2 asin(float2 v);
+float3 asin(float3 v);
+float4 asin(float4 v);
+
+float asinh(float v);
+float2 asinh(float2 v);
+float3 asinh(float3 v);
+float4 asinh(float4 v);
+
+float asinpi(float v);
+float2 asinpi(float2 v);
+float3 asinpi(float3 v);
+float4 asinpi(float4 v);
+
+float atan(float v);
+float2 atan(float2 v);
+float3 atan(float3 v);
+float4 atan(float4 v);
+
+float atan2(float numerator, float denominator);
+float2 atan2(float2 numerator, float2 denominator);
+float3 atan2(float3 numerator, float3 denominator);
+float4 atan2(float4 numerator, float4 denominator);
+
+float atan2pi(float numerator, float denominator);
+float2 atan2pi(float2 numerator, float2 denominator);
+float3 atan2pi(float3 numerator, float3 denominator);
+float4 atan2pi(float4 numerator, float4 denominator);
+
+float atanh(float v);
+float2 atanh(float2 v);
+float3 atanh(float3 v);
+float4 atanh(float4 v);
+
+float atanpi(float v);
+float2 atanpi(float2 v);
+float3 atanpi(float3 v);
+float4 atanpi(float4 v);
+
+float cbrt(float v);
+float2 cbrt(float2 v);
+float3 cbrt(float3 v);
+float4 cbrt(float4 v);
+
+float ceil(float v);
+float2 ceil(float2 v);
+float3 ceil(float3 v);
+float4 ceil(float4 v);
+
+char clamp(char value, char min_value, char max_value);
+char2 clamp(char2 value, char min_value, char max_value);
+char2 clamp(char2 value, char2 min_value, char2 max_value);
+char3 clamp(char3 value, char min_value, char max_value);
+char3 clamp(char3 value, char3 min_value, char3 max_value);
+char4 clamp(char4 value, char min_value, char max_value);
+char4 clamp(char4 value, char4 min_value, char4 max_value);
+float clamp(float value, float min_value, float max_value);
+float2 clamp(float2 value, float min_value, float max_value);
+float2 clamp(float2 value, float2 min_value, float2 max_value);
+float3 clamp(float3 value, float min_value, float max_value);
+float3 clamp(float3 value, float3 min_value, float3 max_value);
+float4 clamp(float4 value, float min_value, float max_value);
+float4 clamp(float4 value, float4 min_value, float4 max_value);
+int clamp(int value, int min_value, int max_value);
+int2 clamp(int2 value, int min_value, int max_value);
+int2 clamp(int2 value, int2 min_value, int2 max_value);
+int3 clamp(int3 value, int min_value, int max_value);
+int3 clamp(int3 value, int3 min_value, int3 max_value);
+int4 clamp(int4 value, int min_value, int max_value);
+int4 clamp(int4 value, int4 min_value, int4 max_value);
+long clamp(long value, long min_value, long max_value);
+long2 clamp(long2 value, long min_value, long max_value);
+long2 clamp(long2 value, long2 min_value, long2 max_value);
+long3 clamp(long3 value, long min_value, long max_value);
+long3 clamp(long3 value, long3 min_value, long3 max_value);
+long4 clamp(long4 value, long min_value, long max_value);
+long4 clamp(long4 value, long4 min_value, long4 max_value);
+short clamp(short value, short min_value, short max_value);
+short2 clamp(short2 value, short min_value, short max_value);
+short2 clamp(short2 value, short2 min_value, short2 max_value);
+short3 clamp(short3 value, short min_value, short max_value);
+short3 clamp(short3 value, short3 min_value, short3 max_value);
+short4 clamp(short4 value, short min_value, short max_value);
+short4 clamp(short4 value, short4 min_value, short4 max_value);
+uchar clamp(uchar value, uchar min_value, uchar max_value);
+uchar2 clamp(uchar2 value, uchar min_value, uchar max_value);
+uchar2 clamp(uchar2 value, uchar2 min_value, uchar2 max_value);
+uchar3 clamp(uchar3 value, uchar min_value, uchar max_value);
+uchar3 clamp(uchar3 value, uchar3 min_value, uchar3 max_value);
+uchar4 clamp(uchar4 value, uchar min_value, uchar max_value);
+uchar4 clamp(uchar4 value, uchar4 min_value, uchar4 max_value);
+uint clamp(uint value, uint min_value, uint max_value);
+uint2 clamp(uint2 value, uint min_value, uint max_value);
+uint2 clamp(uint2 value, uint2 min_value, uint2 max_value);
+uint3 clamp(uint3 value, uint min_value, uint max_value);
+uint3 clamp(uint3 value, uint3 min_value, uint3 max_value);
+uint4 clamp(uint4 value, uint min_value, uint max_value);
+uint4 clamp(uint4 value, uint4 min_value, uint4 max_value);
+ulong clamp(ulong value, ulong min_value, ulong max_value);
+ulong2 clamp(ulong2 value, ulong min_value, ulong max_value);
+ulong2 clamp(ulong2 value, ulong2 min_value, ulong2 max_value);
+ulong3 clamp(ulong3 value, ulong min_value, ulong max_value);
+ulong3 clamp(ulong3 value, ulong3 min_value, ulong3 max_value);
+ulong4 clamp(ulong4 value, ulong min_value, ulong max_value);
+ulong4 clamp(ulong4 value, ulong4 min_value, ulong4 max_value);
+ushort clamp(ushort value, ushort min_value, ushort max_value);
+ushort2 clamp(ushort2 value, ushort min_value, ushort max_value);
+ushort2 clamp(ushort2 value, ushort2 min_value, ushort2 max_value);
+ushort3 clamp(ushort3 value, ushort min_value, ushort max_value);
+ushort3 clamp(ushort3 value, ushort3 min_value, ushort3 max_value);
+ushort4 clamp(ushort4 value, ushort min_value, ushort max_value);
+ushort4 clamp(ushort4 value, ushort4 min_value, ushort4 max_value);
+
+char clz(char value);
+char2 clz(char2 value);
+char3 clz(char3 value);
+char4 clz(char4 value);
+int clz(int value);
+int2 clz(int2 value);
+int3 clz(int3 value);
+int4 clz(int4 value);
+short clz(short value);
+short2 clz(short2 value);
+short3 clz(short3 value);
+short4 clz(short4 value);
+uchar clz(uchar value);
+uchar2 clz(uchar2 value);
+uchar3 clz(uchar3 value);
+uchar4 clz(uchar4 value);
+uint clz(uint value);
+uint2 clz(uint2 value);
+uint3 clz(uint3 value);
+uint4 clz(uint4 value);
+ushort clz(ushort value);
+ushort2 clz(ushort2 value);
+ushort3 clz(ushort3 value);
+ushort4 clz(ushort4 value);
+
+float copysign(float magnitude_value, float sign_value);
+float2 copysign(float2 magnitude_value, float2 sign_value);
+float3 copysign(float3 magnitude_value, float3 sign_value);
+float4 copysign(float4 magnitude_value, float4 sign_value);
+
+float cos(float v);
+float2 cos(float2 v);
+float3 cos(float3 v);
+float4 cos(float4 v);
+
+float cosh(float v);
+float2 cosh(float2 v);
+float3 cosh(float3 v);
+float4 cosh(float4 v);
+
+float cospi(float v);
+float2 cospi(float2 v);
+float3 cospi(float3 v);
+float4 cospi(float4 v);
+
+float erf(float v);
+float2 erf(float2 v);
+float3 erf(float3 v);
+float4 erf(float4 v);
+
+float erfc(float v);
+float2 erfc(float2 v);
+float3 erfc(float3 v);
+float4 erfc(float4 v);
+
+float exp(float v);
+float2 exp(float2 v);
+float3 exp(float3 v);
+float4 exp(float4 v);
+
+float exp10(float v);
+float2 exp10(float2 v);
+float3 exp10(float3 v);
+float4 exp10(float4 v);
+
+float exp2(float v);
+float2 exp2(float2 v);
+float3 exp2(float3 v);
+float4 exp2(float4 v);
+
+float expm1(float v);
+float2 expm1(float2 v);
+float3 expm1(float3 v);
+float4 expm1(float4 v);
+
+float fabs(float v);
+float2 fabs(float2 v);
+float3 fabs(float3 v);
+float4 fabs(float4 v);
+
+float fdim(float a, float b);
+float2 fdim(float2 a, float2 b);
+float3 fdim(float3 a, float3 b);
+float4 fdim(float4 a, float4 b);
+
+float floor(float v);
+float2 floor(float2 v);
+float3 floor(float3 v);
+float4 floor(float4 v);
+
+float fma(float multiplicand1, float multiplicand2, float offset);
+float2 fma(float2 multiplicand1, float2 multiplicand2, float2 offset);
+float3 fma(float3 multiplicand1, float3 multiplicand2, float3 offset);
+float4 fma(float4 multiplicand1, float4 multiplicand2, float4 offset);
+
+float fmax(float a, float b);
+float2 fmax(float2 a, float b);
+float2 fmax(float2 a, float2 b);
+float3 fmax(float3 a, float b);
+float3 fmax(float3 a, float3 b);
+float4 fmax(float4 a, float b);
+float4 fmax(float4 a, float4 b);
+
+float fmin(float a, float b);
+float2 fmin(float2 a, float b);
+float2 fmin(float2 a, float2 b);
+float3 fmin(float3 a, float b);
+float3 fmin(float3 a, float3 b);
+float4 fmin(float4 a, float b);
+float4 fmin(float4 a, float4 b);
+
+float fmod(float numerator, float denominator);
+float2 fmod(float2 numerator, float2 denominator);
+float3 fmod(float3 numerator, float3 denominator);
+float4 fmod(float4 numerator, float4 denominator);
+
+float fract(float v, float* floor);
+float2 fract(float2 v, float2* floor);
+float3 fract(float3 v, float3* floor);
+float4 fract(float4 v, float4* floor);
+
+float frexp(float v, int* exponent);
+float2 frexp(float2 v, int2* exponent);
+float3 frexp(float3 v, int3* exponent);
+float4 frexp(float4 v, int4* exponent);
+
+float half_recip(float v);
+float2 half_recip(float2 v);
+float3 half_recip(float3 v);
+float4 half_recip(float4 v);
+
+float half_rsqrt(float v);
+float2 half_rsqrt(float2 v);
+float3 half_rsqrt(float3 v);
+float4 half_rsqrt(float4 v);
+
+float half_sqrt(float v);
+float2 half_sqrt(float2 v);
+float3 half_sqrt(float3 v);
+float4 half_sqrt(float4 v);
+
+float hypot(float a, float b);
+float2 hypot(float2 a, float2 b);
+float3 hypot(float3 a, float3 b);
+float4 hypot(float4 a, float4 b);
+
+int ilogb(float v);
+int2 ilogb(float2 v);
+int3 ilogb(float3 v);
+int4 ilogb(float4 v);
+
+float ldexp(float mantissa, int exponent);
+float2 ldexp(float2 mantissa, int exponent);
+float2 ldexp(float2 mantissa, int2 exponent);
+float3 ldexp(float3 mantissa, int exponent);
+float3 ldexp(float3 mantissa, int3 exponent);
+float4 ldexp(float4 mantissa, int exponent);
+float4 ldexp(float4 mantissa, int4 exponent);
+
+float lgamma(float v);
+float lgamma(float v, int* sign_of_gamma);
+float2 lgamma(float2 v);
+float2 lgamma(float2 v, int2* sign_of_gamma);
+float3 lgamma(float3 v);
+float3 lgamma(float3 v, int3* sign_of_gamma);
+float4 lgamma(float4 v);
+float4 lgamma(float4 v, int4* sign_of_gamma);
+
+float log(float v);
+float2 log(float2 v);
+float3 log(float3 v);
+float4 log(float4 v);
+
+float log10(float v);
+float2 log10(float2 v);
+float3 log10(float3 v);
+float4 log10(float4 v);
+
+float log1p(float v);
+float2 log1p(float2 v);
+float3 log1p(float3 v);
+float4 log1p(float4 v);
+
+float log2(float v);
+float2 log2(float2 v);
+float3 log2(float3 v);
+float4 log2(float4 v);
+
+float logb(float v);
+float2 logb(float2 v);
+float3 logb(float3 v);
+float4 logb(float4 v);
+
+float mad(float multiplicand1, float multiplicand2, float offset);
+float2 mad(float2 multiplicand1, float2 multiplicand2, float2 offset);
+float3 mad(float3 multiplicand1, float3 multiplicand2, float3 offset);
+float4 mad(float4 multiplicand1, float4 multiplicand2, float4 offset);
+
+char max(char a, char b);
+char2 max(char2 a, char2 b);
+char3 max(char3 a, char3 b);
+char4 max(char4 a, char4 b);
+float max(float a, float b);
+float2 max(float2 a, float2 b);
+float3 max(float3 a, float3 b);
+float4 max(float4 a, float4 b);
+int max(int a, int b);
+int2 max(int2 a, int2 b);
+int3 max(int3 a, int3 b);
+int4 max(int4 a, int4 b);
+long max(long a, long b);
+long2 max(long2 a, long2 b);
+long3 max(long3 a, long3 b);
+long4 max(long4 a, long4 b);
+short max(short a, short b);
+short2 max(short2 a, short2 b);
+short3 max(short3 a, short3 b);
+short4 max(short4 a, short4 b);
+uchar max(uchar a, uchar b);
+uchar2 max(uchar2 a, uchar2 b);
+uchar3 max(uchar3 a, uchar3 b);
+uchar4 max(uchar4 a, uchar4 b);
+uint max(uint a, uint b);
+uint2 max(uint2 a, uint2 b);
+uint3 max(uint3 a, uint3 b);
+uint4 max(uint4 a, uint4 b);
+ulong max(ulong a, ulong b);
+ulong2 max(ulong2 a, ulong2 b);
+ulong3 max(ulong3 a, ulong3 b);
+ulong4 max(ulong4 a, ulong4 b);
+ushort max(ushort a, ushort b);
+ushort2 max(ushort2 a, ushort2 b);
+ushort3 max(ushort3 a, ushort3 b);
+ushort4 max(ushort4 a, ushort4 b);
+
+char min(char a, char b);
+char2 min(char2 a, char2 b);
+char3 min(char3 a, char3 b);
+char4 min(char4 a, char4 b);
+float min(float a, float b);
+float2 min(float2 a, float2 b);
+float3 min(float3 a, float3 b);
+float4 min(float4 a, float4 b);
+int min(int a, int b);
+int2 min(int2 a, int2 b);
+int3 min(int3 a, int3 b);
+int4 min(int4 a, int4 b);
+long min(long a, long b);
+long2 min(long2 a, long2 b);
+long3 min(long3 a, long3 b);
+long4 min(long4 a, long4 b);
+short min(short a, short b);
+short2 min(short2 a, short2 b);
+short3 min(short3 a, short3 b);
+short4 min(short4 a, short4 b);
+uchar min(uchar a, uchar b);
+uchar2 min(uchar2 a, uchar2 b);
+uchar3 min(uchar3 a, uchar3 b);
+uchar4 min(uchar4 a, uchar4 b);
+uint min(uint a, uint b);
+uint2 min(uint2 a, uint2 b);
+uint3 min(uint3 a, uint3 b);
+uint4 min(uint4 a, uint4 b);
+ulong min(ulong a, ulong b);
+ulong2 min(ulong2 a, ulong2 b);
+ulong3 min(ulong3 a, ulong3 b);
+ulong4 min(ulong4 a, ulong4 b);
+ushort min(ushort a, ushort b);
+ushort2 min(ushort2 a, ushort2 b);
+ushort3 min(ushort3 a, ushort3 b);
+ushort4 min(ushort4 a, ushort4 b);
+
+float mix(float start, float stop, float fraction);
+float2 mix(float2 start, float2 stop, float fraction);
+float2 mix(float2 start, float2 stop, float2 fraction);
+float3 mix(float3 start, float3 stop, float fraction);
+float3 mix(float3 start, float3 stop, float3 fraction);
+float4 mix(float4 start, float4 stop, float fraction);
+float4 mix(float4 start, float4 stop, float4 fraction);
+
+float modf(float v, float* integral_part);
+float2 modf(float2 v, float2* integral_part);
+float3 modf(float3 v, float3* integral_part);
+float4 modf(float4 v, float4* integral_part);
+
+float nan(uint v);
+
+float native_acos(float v);
+float2 native_acos(float2 v);
+float3 native_acos(float3 v);
+float4 native_acos(float4 v);
+
+float native_acosh(float v);
+float2 native_acosh(float2 v);
+float3 native_acosh(float3 v);
+float4 native_acosh(float4 v);
+
+float native_acospi(float v);
+float2 native_acospi(float2 v);
+float3 native_acospi(float3 v);
+float4 native_acospi(float4 v);
+
+float native_asin(float v);
+float2 native_asin(float2 v);
+float3 native_asin(float3 v);
+float4 native_asin(float4 v);
+
+float native_asinh(float v);
+float2 native_asinh(float2 v);
+float3 native_asinh(float3 v);
+float4 native_asinh(float4 v);
+
+float native_asinpi(float v);
+float2 native_asinpi(float2 v);
+float3 native_asinpi(float3 v);
+float4 native_asinpi(float4 v);
+
+float native_atan(float v);
+float2 native_atan(float2 v);
+float3 native_atan(float3 v);
+float4 native_atan(float4 v);
+
+float native_atan2(float numerator, float denominator);
+float2 native_atan2(float2 numerator, float2 denominator);
+float3 native_atan2(float3 numerator, float3 denominator);
+float4 native_atan2(float4 numerator, float4 denominator);
+
+float native_atan2pi(float numerator, float denominator);
+float2 native_atan2pi(float2 numerator, float2 denominator);
+float3 native_atan2pi(float3 numerator, float3 denominator);
+float4 native_atan2pi(float4 numerator, float4 denominator);
+
+float native_atanh(float v);
+float2 native_atanh(float2 v);
+float3 native_atanh(float3 v);
+float4 native_atanh(float4 v);
+
+float native_atanpi(float v);
+float2 native_atanpi(float2 v);
+float3 native_atanpi(float3 v);
+float4 native_atanpi(float4 v);
+
+float native_cbrt(float v);
+float2 native_cbrt(float2 v);
+float3 native_cbrt(float3 v);
+float4 native_cbrt(float4 v);
+
+float native_cos(float v);
+float2 native_cos(float2 v);
+float3 native_cos(float3 v);
+float4 native_cos(float4 v);
+
+float native_cosh(float v);
+float2 native_cosh(float2 v);
+float3 native_cosh(float3 v);
+float4 native_cosh(float4 v);
+
+float native_cospi(float v);
+float2 native_cospi(float2 v);
+float3 native_cospi(float3 v);
+float4 native_cospi(float4 v);
+
+float native_divide(float left_vector, float right_vector);
+float2 native_divide(float2 left_vector, float2 right_vector);
+float3 native_divide(float3 left_vector, float3 right_vector);
+float4 native_divide(float4 left_vector, float4 right_vector);
+
+float native_exp(float v);
+float2 native_exp(float2 v);
+float3 native_exp(float3 v);
+float4 native_exp(float4 v);
+
+float native_exp10(float v);
+float2 native_exp10(float2 v);
+float3 native_exp10(float3 v);
+float4 native_exp10(float4 v);
+
+float native_exp2(float v);
+float2 native_exp2(float2 v);
+float3 native_exp2(float3 v);
+float4 native_exp2(float4 v);
+
+float native_expm1(float v);
+float2 native_expm1(float2 v);
+float3 native_expm1(float3 v);
+float4 native_expm1(float4 v);
+
+float native_hypot(float a, float b);
+float2 native_hypot(float2 a, float2 b);
+float3 native_hypot(float3 a, float3 b);
+float4 native_hypot(float4 a, float4 b);
+
+float native_log(float v);
+float2 native_log(float2 v);
+float3 native_log(float3 v);
+float4 native_log(float4 v);
+
+float native_log10(float v);
+float2 native_log10(float2 v);
+float3 native_log10(float3 v);
+float4 native_log10(float4 v);
+
+float native_log1p(float v);
+float2 native_log1p(float2 v);
+float3 native_log1p(float3 v);
+float4 native_log1p(float4 v);
+
+float native_log2(float v);
+float2 native_log2(float2 v);
+float3 native_log2(float3 v);
+float4 native_log2(float4 v);
+
+float native_powr(float base, float exponent);
+float2 native_powr(float2 base, float2 exponent);
+float3 native_powr(float3 base, float3 exponent);
+float4 native_powr(float4 base, float4 exponent);
+
+float native_recip(float v);
+float2 native_recip(float2 v);
+float3 native_recip(float3 v);
+float4 native_recip(float4 v);
+
+float native_rootn(float v, int n);
+float2 native_rootn(float2 v, int2 n);
+float3 native_rootn(float3 v, int3 n);
+float4 native_rootn(float4 v, int4 n);
+
+float native_rsqrt(float v);
+float2 native_rsqrt(float2 v);
+float3 native_rsqrt(float3 v);
+float4 native_rsqrt(float4 v);
+
+float native_sin(float v);
+float2 native_sin(float2 v);
+float3 native_sin(float3 v);
+float4 native_sin(float4 v);
+
+float native_sincos(float v, float* cos);
+float2 native_sincos(float2 v, float2* cos);
+float3 native_sincos(float3 v, float3* cos);
+float4 native_sincos(float4 v, float4* cos);
+
+float native_sinh(float v);
+float2 native_sinh(float2 v);
+float3 native_sinh(float3 v);
+float4 native_sinh(float4 v);
+
+float native_sinpi(float v);
+float2 native_sinpi(float2 v);
+float3 native_sinpi(float3 v);
+float4 native_sinpi(float4 v);
+
+float native_sqrt(float v);
+float2 native_sqrt(float2 v);
+float3 native_sqrt(float3 v);
+float4 native_sqrt(float4 v);
+
+float native_tan(float v);
+float2 native_tan(float2 v);
+float3 native_tan(float3 v);
+float4 native_tan(float4 v);
+
+float native_tanh(float v);
+float2 native_tanh(float2 v);
+float3 native_tanh(float3 v);
+float4 native_tanh(float4 v);
+
+float native_tanpi(float v);
+float2 native_tanpi(float2 v);
+float3 native_tanpi(float3 v);
+float4 native_tanpi(float4 v);
+
+float nextafter(float v, float target);
+float2 nextafter(float2 v, float2 target);
+float3 nextafter(float3 v, float3 target);
+float4 nextafter(float4 v, float4 target);
+
+float pow(float base, float exponent);
+float2 pow(float2 base, float2 exponent);
+float3 pow(float3 base, float3 exponent);
+float4 pow(float4 base, float4 exponent);
+
+float pown(float base, int exponent);
+float2 pown(float2 base, int2 exponent);
+float3 pown(float3 base, int3 exponent);
+float4 pown(float4 base, int4 exponent);
+
+float powr(float base, float exponent);
+float2 powr(float2 base, float2 exponent);
+float3 powr(float3 base, float3 exponent);
+float4 powr(float4 base, float4 exponent);
+
+float radians(float v);
+float2 radians(float2 v);
+float3 radians(float3 v);
+float4 radians(float4 v);
+
+float remainder(float numerator, float denominator);
+float2 remainder(float2 numerator, float2 denominator);
+float3 remainder(float3 numerator, float3 denominator);
+float4 remainder(float4 numerator, float4 denominator);
+
+float remquo(float numerator, float denominator, int* quotient);
+float2 remquo(float2 numerator, float2 denominator, int2* quotient);
+float3 remquo(float3 numerator, float3 denominator, int3* quotient);
+float4 remquo(float4 numerator, float4 denominator, int4* quotient);
+
+float rint(float v);
+float2 rint(float2 v);
+float3 rint(float3 v);
+float4 rint(float4 v);
+
+float rootn(float v, int n);
+float2 rootn(float2 v, int2 n);
+float3 rootn(float3 v, int3 n);
+float4 rootn(float4 v, int4 n);
+
+float round(float v);
+float2 round(float2 v);
+float3 round(float3 v);
+float4 round(float4 v);
+
+char rsClamp(char amount, char low, char high);
+int rsClamp(int amount, int low, int high);
+short rsClamp(short amount, short low, short high);
+uchar rsClamp(uchar amount, uchar low, uchar high);
+uint rsClamp(uint amount, uint low, uint high);
+ushort rsClamp(ushort amount, ushort low, ushort high);
+
+float rsFrac(float v);
+
+float rsRand(float max_value);
+float rsRand(float min_value, float max_value);
+int rsRand(int max_value);
+int rsRand(int min_value, int max_value);
+
+float rsqrt(float v);
+float2 rsqrt(float2 v);
+float3 rsqrt(float3 v);
+float4 rsqrt(float4 v);
+
+float sign(float v);
+float2 sign(float2 v);
+float3 sign(float3 v);
+float4 sign(float4 v);
+
+float sin(float v);
+float2 sin(float2 v);
+float3 sin(float3 v);
+float4 sin(float4 v);
+
+float sincos(float v, float* cos);
+float2 sincos(float2 v, float2* cos);
+float3 sincos(float3 v, float3* cos);
+float4 sincos(float4 v, float4* cos);
+
+float sinh(float v);
+float2 sinh(float2 v);
+float3 sinh(float3 v);
+float4 sinh(float4 v);
+
+float sinpi(float v);
+float2 sinpi(float2 v);
+float3 sinpi(float3 v);
+float4 sinpi(float4 v);
+
+float sqrt(float v);
+float2 sqrt(float2 v);
+float3 sqrt(float3 v);
+float4 sqrt(float4 v);
+
+float step(float edge, float v);
+float2 step(float edge, float2 v);
+float2 step(float2 edge, float v);
+float2 step(float2 edge, float2 v);
+float3 step(float edge, float3 v);
+float3 step(float3 edge, float v);
+float3 step(float3 edge, float3 v);
+float4 step(float edge, float4 v);
+float4 step(float4 edge, float v);
+float4 step(float4 edge, float4 v);
+
+float tan(float v);
+float2 tan(float2 v);
+float3 tan(float3 v);
+float4 tan(float4 v);
+
+float tanh(float v);
+float2 tanh(float2 v);
+float3 tanh(float3 v);
+float4 tanh(float4 v);
+
+float tanpi(float v);
+float2 tanpi(float2 v);
+float3 tanpi(float3 v);
+float4 tanpi(float4 v);
+
+float tgamma(float v);
+float2 tgamma(float2 v);
+float3 tgamma(float3 v);
+float4 tgamma(float4 v);
+
+float trunc(float v);
+float2 trunc(float2 v);
+float3 trunc(float3 v);
+float4 trunc(float4 v);
+
+uchar4 rsPackColorTo8888(float r, float g, float b);
+uchar4 rsPackColorTo8888(float r, float g, float b, float a);
+uchar4 rsPackColorTo8888(float3 color);
+uchar4 rsPackColorTo8888(float4 color);
+float4 rsUnpackColor8888(uchar4 c);
+
+float4 rsYuvToRGBA_float4(uchar y, uchar u, uchar v);
+uchar4 rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v);
+
+- vector functions
+
+float3 cross(float3 left_vector, float3 right_vector);
+float4 cross(float4 left_vector, float4 right_vector);
+
+float distance(float  left_vector, float  right_vector);
+float distance(float2 left_vector, float2 right_vector);
+float distance(float3 left_vector, float3 right_vector);
+float distance(float4 left_vector, float4 right_vector);
+
+float dot(float  left_vector, float  right_vector);
+float dot(float2 left_vector, float2 right_vector);
+float dot(float3 left_vector, float3 right_vector);
+float dot(float4 left_vector, float4 right_vector);
+
+float fast_distance(float  left_vector, float  right_vector);
+float fast_distance(float2 left_vector, float2 right_vector);
+float fast_distance(float3 left_vector, float3 right_vector);
+float fast_distance(float4 left_vector, float4 right_vector);
+
+float fast_length(float  v);
+float fast_length(float2 v);
+float fast_length(float3 v);
+float fast_length(float4 v);
+
+float  fast_normalize(float  v);
+float2 fast_normalize(float2 v);
+float3 fast_normalize(float3 v);
+float4 fast_normalize(float4 v);
+
+float length(float  v);
+float length(float2 v);
+float length(float3 v);
+float length(float4 v);
+
+float native_distance(float  left_vector, float  right_vector);
+float native_distance(float2 left_vector, float2 right_vector);
+float native_distance(float3 left_vector, float3 right_vector);
+float native_distance(float4 left_vector, float4 right_vector);
+
+float native_length(float  v);
+float native_length(float2 v);
+float native_length(float3 v);
+float native_length(float4 v);
+
+float  native_normalize(float  v);
+float2 native_normalize(float2 v);
+float3 native_normalize(float3 v);
+float4 native_normalize(float4 v);
+
+float  normalize(float  v);
+float2 normalize(float2 v);
+float3 normalize(float3 v);
+float4 normalize(float4 v);
+
+- conversion functions
+
+char2 convert_char2(char2 v);
+char2 convert_char2(double2 v);
+char2 convert_char2(float2 v);
+char2 convert_char2(int2 v);
+char2 convert_char2(long2 v);
+char2 convert_char2(short2 v);
+char2 convert_char2(uchar2 v);
+char2 convert_char2(uint2 v);
+char2 convert_char2(ulong2 v);
+char2 convert_char2(ushort2 v);
+
+char3 convert_char3(char3 v);
+char3 convert_char3(double3 v);
+char3 convert_char3(float3 v);
+char3 convert_char3(int3 v);
+char3 convert_char3(long3 v);
+char3 convert_char3(short3 v);
+char3 convert_char3(uchar3 v);
+char3 convert_char3(uint3 v);
+char3 convert_char3(ulong3 v);
+char3 convert_char3(ushort3 v);
+
+char4 convert_char4(char4 v);
+char4 convert_char4(double4 v);
+char4 convert_char4(float4 v);
+char4 convert_char4(int4 v);
+char4 convert_char4(long4 v);
+char4 convert_char4(short4 v);
+char4 convert_char4(uchar4 v);
+char4 convert_char4(uint4 v);
+char4 convert_char4(ulong4 v);
+char4 convert_char4(ushort4 v);
+
+double2 convert_double2(char2 v);
+double2 convert_double2(double2 v);
+double2 convert_double2(float2 v);
+double2 convert_double2(int2 v);
+double2 convert_double2(long2 v);
+double2 convert_double2(short2 v);
+double2 convert_double2(uchar2 v);
+double2 convert_double2(uint2 v);
+double2 convert_double2(ulong2 v);
+double2 convert_double2(ushort2 v);
+
+double3 convert_double3(char3 v);
+double3 convert_double3(double3 v);
+double3 convert_double3(float3 v);
+double3 convert_double3(int3 v);
+double3 convert_double3(long3 v);
+double3 convert_double3(short3 v);
+double3 convert_double3(uchar3 v);
+double3 convert_double3(uint3 v);
+double3 convert_double3(ulong3 v);
+double3 convert_double3(ushort3 v);
+
+double4 convert_double4(char4 v);
+double4 convert_double4(double4 v);
+double4 convert_double4(float4 v);
+double4 convert_double4(int4 v);
+double4 convert_double4(long4 v);
+double4 convert_double4(short4 v);
+double4 convert_double4(uchar4 v);
+double4 convert_double4(uint4 v);
+double4 convert_double4(ulong4 v);
+double4 convert_double4(ushort4 v);
+
+float2 convert_float2(char2 v);
+float2 convert_float2(double2 v);
+float2 convert_float2(float2 v);
+float2 convert_float2(int2 v);
+float2 convert_float2(long2 v);
+float2 convert_float2(short2 v);
+float2 convert_float2(uchar2 v);
+float2 convert_float2(uint2 v);
+float2 convert_float2(ulong2 v);
+float2 convert_float2(ushort2 v);
+
+float3 convert_float3(char3 v);
+float3 convert_float3(double3 v);
+float3 convert_float3(float3 v);
+float3 convert_float3(int3 v);
+float3 convert_float3(long3 v);
+float3 convert_float3(short3 v);
+float3 convert_float3(uchar3 v);
+float3 convert_float3(uint3 v);
+float3 convert_float3(ulong3 v);
+float3 convert_float3(ushort3 v);
+
+float4 convert_float4(char4 v);
+float4 convert_float4(double4 v);
+float4 convert_float4(float4 v);
+float4 convert_float4(int4 v);
+float4 convert_float4(long4 v);
+float4 convert_float4(short4 v);
+float4 convert_float4(uchar4 v);
+float4 convert_float4(uint4 v);
+float4 convert_float4(ulong4 v);
+float4 convert_float4(ushort4 v);
+
+int2 convert_int2(char2 v);
+int2 convert_int2(double2 v);
+int2 convert_int2(float2 v);
+int2 convert_int2(int2 v);
+int2 convert_int2(long2 v);
+int2 convert_int2(short2 v);
+int2 convert_int2(uchar2 v);
+int2 convert_int2(uint2 v);
+int2 convert_int2(ulong2 v);
+int2 convert_int2(ushort2 v);
+
+int3 convert_int3(char3 v);
+int3 convert_int3(double3 v);
+int3 convert_int3(float3 v);
+int3 convert_int3(int3 v);
+int3 convert_int3(long3 v);
+int3 convert_int3(short3 v);
+int3 convert_int3(uchar3 v);
+int3 convert_int3(uint3 v);
+int3 convert_int3(ulong3 v);
+int3 convert_int3(ushort3 v);
+
+int4 convert_int4(char4 v);
+int4 convert_int4(double4 v);
+int4 convert_int4(float4 v);
+int4 convert_int4(int4 v);
+int4 convert_int4(long4 v);
+int4 convert_int4(short4 v);
+int4 convert_int4(uchar4 v);
+int4 convert_int4(uint4 v);
+int4 convert_int4(ulong4 v);
+int4 convert_int4(ushort4 v);
+
+long2 convert_long2(char2 v);
+long2 convert_long2(double2 v);
+long2 convert_long2(float2 v);
+long2 convert_long2(int2 v);
+long2 convert_long2(long2 v);
+long2 convert_long2(short2 v);
+long2 convert_long2(uchar2 v);
+long2 convert_long2(uint2 v);
+long2 convert_long2(ulong2 v);
+long2 convert_long2(ushort2 v);
+
+long3 convert_long3(char3 v);
+long3 convert_long3(double3 v);
+long3 convert_long3(float3 v);
+long3 convert_long3(int3 v);
+long3 convert_long3(long3 v);
+long3 convert_long3(short3 v);
+long3 convert_long3(uchar3 v);
+long3 convert_long3(uint3 v);
+long3 convert_long3(ulong3 v);
+long3 convert_long3(ushort3 v);
+
+long4 convert_long4(char4 v);
+long4 convert_long4(double4 v);
+long4 convert_long4(float4 v);
+long4 convert_long4(int4 v);
+long4 convert_long4(long4 v);
+long4 convert_long4(short4 v);
+long4 convert_long4(uchar4 v);
+long4 convert_long4(uint4 v);
+long4 convert_long4(ulong4 v);
+long4 convert_long4(ushort4 v);
+
+short2 convert_short2(char2 v);
+short2 convert_short2(double2 v);
+short2 convert_short2(float2 v);
+short2 convert_short2(int2 v);
+short2 convert_short2(long2 v);
+short2 convert_short2(short2 v);
+short2 convert_short2(uchar2 v);
+short2 convert_short2(uint2 v);
+short2 convert_short2(ulong2 v);
+short2 convert_short2(ushort2 v);
+
+short3 convert_short3(char3 v);
+short3 convert_short3(double3 v);
+short3 convert_short3(float3 v);
+short3 convert_short3(int3 v);
+short3 convert_short3(long3 v);
+short3 convert_short3(short3 v);
+short3 convert_short3(uchar3 v);
+short3 convert_short3(uint3 v);
+short3 convert_short3(ulong3 v);
+short3 convert_short3(ushort3 v);
+
+short4 convert_short4(char4 v);
+short4 convert_short4(double4 v);
+short4 convert_short4(float4 v);
+short4 convert_short4(int4 v);
+short4 convert_short4(long4 v);
+short4 convert_short4(short4 v);
+short4 convert_short4(uchar4 v);
+short4 convert_short4(uint4 v);
+short4 convert_short4(ulong4 v);
+short4 convert_short4(ushort4 v);
+
+uchar2 convert_uchar2(char2 v);
+uchar2 convert_uchar2(double2 v);
+uchar2 convert_uchar2(float2 v);
+uchar2 convert_uchar2(int2 v);
+uchar2 convert_uchar2(long2 v);
+uchar2 convert_uchar2(short2 v);
+uchar2 convert_uchar2(uchar2 v);
+uchar2 convert_uchar2(uint2 v);
+uchar2 convert_uchar2(ulong2 v);
+uchar2 convert_uchar2(ushort2 v);
+
+uchar3 convert_uchar3(char3 v);
+uchar3 convert_uchar3(double3 v);
+uchar3 convert_uchar3(float3 v);
+uchar3 convert_uchar3(int3 v);
+uchar3 convert_uchar3(long3 v);
+uchar3 convert_uchar3(short3 v);
+uchar3 convert_uchar3(uchar3 v);
+uchar3 convert_uchar3(uint3 v);
+uchar3 convert_uchar3(ulong3 v);
+uchar3 convert_uchar3(ushort3 v);
+
+uchar4 convert_uchar4(char4 v);
+uchar4 convert_uchar4(double4 v);
+uchar4 convert_uchar4(float4 v);
+uchar4 convert_uchar4(int4 v);
+uchar4 convert_uchar4(long4 v);
+uchar4 convert_uchar4(short4 v);
+uchar4 convert_uchar4(uchar4 v);
+uchar4 convert_uchar4(uint4 v);
+uchar4 convert_uchar4(ulong4 v);
+uchar4 convert_uchar4(ushort4 v);
+
+uint2 convert_uint2(char2 v);
+uint2 convert_uint2(double2 v);
+uint2 convert_uint2(float2 v);
+uint2 convert_uint2(int2 v);
+uint2 convert_uint2(long2 v);
+uint2 convert_uint2(short2 v);
+uint2 convert_uint2(uchar2 v);
+uint2 convert_uint2(uint2 v);
+uint2 convert_uint2(ulong2 v);
+uint2 convert_uint2(ushort2 v);
+
+uint3 convert_uint3(char3 v);
+uint3 convert_uint3(double3 v);
+uint3 convert_uint3(float3 v);
+uint3 convert_uint3(int3 v);
+uint3 convert_uint3(long3 v);
+uint3 convert_uint3(short3 v);
+uint3 convert_uint3(uchar3 v);
+uint3 convert_uint3(uint3 v);
+uint3 convert_uint3(ulong3 v);
+uint3 convert_uint3(ushort3 v);
+
+uint4 convert_uint4(char4 v);
+uint4 convert_uint4(double4 v);
+uint4 convert_uint4(float4 v);
+uint4 convert_uint4(int4 v);
+uint4 convert_uint4(long4 v);
+uint4 convert_uint4(short4 v);
+uint4 convert_uint4(uchar4 v);
+uint4 convert_uint4(uint4 v);
+uint4 convert_uint4(ulong4 v);
+uint4 convert_uint4(ushort4 v);
+
+ulong2 convert_ulong2(char2 v);
+ulong2 convert_ulong2(double2 v);
+ulong2 convert_ulong2(float2 v);
+ulong2 convert_ulong2(int2 v);
+ulong2 convert_ulong2(long2 v);
+ulong2 convert_ulong2(short2 v);
+ulong2 convert_ulong2(uchar2 v);
+ulong2 convert_ulong2(uint2 v);
+ulong2 convert_ulong2(ulong2 v);
+ulong2 convert_ulong2(ushort2 v);
+
+ulong3 convert_ulong3(char3 v);
+ulong3 convert_ulong3(double3 v);
+ulong3 convert_ulong3(float3 v);
+ulong3 convert_ulong3(int3 v);
+ulong3 convert_ulong3(long3 v);
+ulong3 convert_ulong3(short3 v);
+ulong3 convert_ulong3(uchar3 v);
+ulong3 convert_ulong3(uint3 v);
+ulong3 convert_ulong3(ulong3 v);
+ulong3 convert_ulong3(ushort3 v);
+
+ulong4 convert_ulong4(char4 v);
+ulong4 convert_ulong4(double4 v);
+ulong4 convert_ulong4(float4 v);
+ulong4 convert_ulong4(int4 v);
+ulong4 convert_ulong4(long4 v);
+ulong4 convert_ulong4(short4 v);
+ulong4 convert_ulong4(uchar4 v);
+ulong4 convert_ulong4(uint4 v);
+ulong4 convert_ulong4(ulong4 v);
+ulong4 convert_ulong4(ushort4 v);
+
+ushort2 convert_ushort2(char2 v);
+ushort2 convert_ushort2(double2 v);
+ushort2 convert_ushort2(float2 v);
+ushort2 convert_ushort2(int2 v);
+ushort2 convert_ushort2(long2 v);
+ushort2 convert_ushort2(short2 v);
+ushort2 convert_ushort2(uchar2 v);
+ushort2 convert_ushort2(uint2 v);
+ushort2 convert_ushort2(ulong2 v);
+ushort2 convert_ushort2(ushort2 v);
+
+ushort3 convert_ushort3(char3 v);
+ushort3 convert_ushort3(double3 v);
+ushort3 convert_ushort3(float3 v);
+ushort3 convert_ushort3(int3 v);
+ushort3 convert_ushort3(long3 v);
+ushort3 convert_ushort3(short3 v);
+ushort3 convert_ushort3(uchar3 v);
+ushort3 convert_ushort3(uint3 v);
+ushort3 convert_ushort3(ulong3 v);
+ushort3 convert_ushort3(ushort3 v);
+
+ushort4 convert_ushort4(char4 v);
+ushort4 convert_ushort4(double4 v);
+ushort4 convert_ushort4(float4 v);
+ushort4 convert_ushort4(int4 v);
+ushort4 convert_ushort4(long4 v);
+ushort4 convert_ushort4(short4 v);
+ushort4 convert_ushort4(uchar4 v);
+ushort4 convert_ushort4(uint4 v);
+ushort4 convert_ushort4(ulong4 v);
+ushort4 convert_ushort4(ushort4 v);
+
+uchar4 rsPackColorTo8888(float r, float g, float b);
+uchar4 rsPackColorTo8888(float r, float g, float b, float a);
+uchar4 rsPackColorTo8888(float3 color);
+uchar4 rsPackColorTo8888(float4 color);
+
+float4 rsUnpackColor8888(uchar4 c);
+
+float4 rsYuvToRGBA_float4(uchar y, uchar u, uchar v);
+
+uchar4 rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v);
+
+- matrix functions, some of these are not supported yet
+
+-bool rsMatrixInverse(rs_matrix4x4* m);
+
+-bool rsMatrixInverseTranspose(rs_matrix4x4* m);
+
+-void rsMatrixLoad(rs_matrix2x2* destination, float* array);
+-void rsMatrixLoad(rs_matrix2x2* destination, rs_matrix2x2* source);
+-void rsMatrixLoad(rs_matrix3x3* destination, float* array);
+-void rsMatrixLoad(rs_matrix3x3* destination, rs_matrix3x3* source);
+-void rsMatrixLoad(rs_matrix4x4* destination, float* array);
+-void rsMatrixLoad(rs_matrix4x4* destination, rs_matrix2x2* source);
+-void rsMatrixLoad(rs_matrix4x4* destination, rs_matrix3x3* source);
+-void rsMatrixLoad(rs_matrix4x4* destination, rs_matrix4x4* source);
+
+-void rsMatrixLoadFrustum(rs_matrix4x4* m, float left, float right, float bottom, float top, float near, float far);
+
+-void rsMatrixLoadIdentity(rs_matrix2x2* m);
+-void rsMatrixLoadIdentity(rs_matrix3x3* m);
+-void rsMatrixLoadIdentity(rs_matrix4x4* m);
+
+-void rsMatrixLoadMultiply(rs_matrix2x2* m, rs_matrix2x2* lhs, rs_matrix2x2* rhs);
+-void rsMatrixLoadMultiply(rs_matrix3x3* m, rs_matrix3x3* lhs, rs_matrix3x3* rhs);
+-void rsMatrixLoadMultiply(rs_matrix4x4* m, rs_matrix4x4* lhs, rs_matrix4x4* rhs);
+
+-void rsMatrixLoadOrtho(rs_matrix4x4* m, float left, float right, float bottom, float top, float near, float far);
+
+-void rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
+
+-void rsMatrixLoadRotate(rs_matrix4x4* m, float rot, float x, float y, float z);
+
+-void rsMatrixLoadScale(rs_matrix4x4* m, float x, float y, float z);
+
+-void rsMatrixLoadTranslate(rs_matrix4x4* m, float x, float y, float z);
+
+float2 rsMatrixMultiply(rs_matrix2x2* m, float2 in);
+float3 rsMatrixMultiply(rs_matrix3x3* m, float2 in);
+float3 rsMatrixMultiply(rs_matrix3x3* m, float3 in);
+float4 rsMatrixMultiply(rs_matrix4x4* m, float2 in);
+float4 rsMatrixMultiply(rs_matrix4x4* m, float3 in);
+float4 rsMatrixMultiply(rs_matrix4x4* m, float4 in);
+void rsMatrixMultiply(rs_matrix2x2* m, rs_matrix2x2* rhs);
+void rsMatrixMultiply(rs_matrix3x3* m, rs_matrix3x3* rhs);
+void rsMatrixMultiply(rs_matrix4x4* m, rs_matrix4x4* rhs);
+
+-void rsMatrixRotate(rs_matrix4x4* m, float rot, float x, float y, float z);
+
+-void rsMatrixScale(rs_matrix4x4* m, float x, float y, float z);
+
+void rsMatrixSet(rs_matrix2x2* m, 0, 1, float v);
+void rsMatrixSet(rs_matrix3x3* m, 2, 0, float v);
+void rsMatrixSet(rs_matrix4x4* m, 1, 3, float v);
+
+-void rsMatrixTranslate(rs_matrix4x4* m, float x, float y, float z);
+
+-void rsMatrixTranspose(rs_matrix2x2* m);
+-void rsMatrixTranspose(rs_matrix3x3* m);
+-void rsMatrixTranspose(rs_matrix4x4* m);
+
+- quaternion functions
+
+void rsQuaternionAdd(rs_quaternion* q, rs_quaternion* rhs);
+
+void rsQuaternionConjugate(rs_quaternion* q);
+
+float rsQuaternionDot(rs_quaternion* q0, rs_quaternion* q1);
+
+void rsQuaternionGetMatrixUnit(rs_matrix4x4* m, rs_quaternion* q);
+
+void rsQuaternionLoadRotate(rs_quaternion* q, float rot, float x, float y, float z);
+
+void rsQuaternionLoadRotateUnit(rs_quaternion* q, float rot, float x, float y, float z);
+
+void rsQuaternionMultiply(rs_quaternion* q, rs_quaternion* rhs);
+void rsQuaternionMultiply(rs_quaternion* q, float scalar);
+
+void rsQuaternionNormalize(rs_quaternion* q);
+
+void rsQuaternionSet(rs_quaternion* q, rs_quaternion* rhs);
+void rsQuaternionSet(rs_quaternion* q, float w, float x, float y, float z);
+
+void rsQuaternionSlerp(rs_quaternion* q, rs_quaternion* q0, rs_quaternion* q1, float t);
+
+- allocation data access functions, this is a subset, since we don't have all types of allocations
+
+-void rsAllocationCopy1DRange(allocation_1D_global, uint dstOff, uint dstMip, uint count, allocation_1D_global2, uint srcOff, uint srcMip);
+
+-void rsAllocationCopy2DRange(allocation_2D_global, uint dstXoff, uint dstYoff, uint dstMip, rs_allocation_cubemap_face dstFace, uint width, uint height, allocation_2D_global2, uint srcXoff, uint srcYoff, uint srcMip, rs_allocation_cubemap_face srcFace);
+
+int2 rsAllocationVLoadX_int2(allocation_1D_global, 0);
+int2 rsAllocationVLoadX_int2(allocation_2D_global, 24, 25);
+int2 rsAllocationVLoadX_int2(allocation_3D_global, 0, 1, 0);
+int3 rsAllocationVLoadX_int3(allocation_1D_global, 1);
+int3 rsAllocationVLoadX_int3(allocation_2D_global, 27, 28);
+int3 rsAllocationVLoadX_int3(allocation_3D_global, 1, 0, 1);
+int4 rsAllocationVLoadX_int4(allocation_1D_global, 0);
+int4 rsAllocationVLoadX_int4(allocation_2D_global, 29, 30);
+int4 rsAllocationVLoadX_int4(allocation_3D_global, 0, 1, 0);
+
+void rsAllocationVStoreX_int2(allocation_1D_global, int2 val, 2);
+void rsAllocationVStoreX_int2(allocation_2D_global, int2 val, 6, 7);
+void rsAllocationVStoreX_int2(allocation_3D_global, int2 val, 0, 1, 0);
+void rsAllocationVStoreX_int3(allocation_1D_global, int3 val, 1);
+void rsAllocationVStoreX_int3(allocation_2D_global, int3 val, 12, 13);
+void rsAllocationVStoreX_int3(allocation_3D_global, int3 val, 1, 0, 1);
+void rsAllocationVStoreX_int4(allocation_1D_global, int4 val, 0);
+void rsAllocationVStoreX_int4(allocation_2D_global, int4 val, 18, 19);
+void rsAllocationVStoreX_int4(allocation_3D_global, int4 val, 0, 1, 0);
+
+void* rsGetElementAt(allocation_1D_global, 0);
+void* rsGetElementAt(allocation_2D_global, 20, 21);
+void* rsGetElementAt(allocation_3D_global, 1, 0, 1);
+int rsGetElementAt_int(allocation_1D_global, 1);
+int rsGetElementAt_int(allocation_2D_global, 22, 23);
+int rsGetElementAt_int(allocation_3D_global, 0, 1, 0);
+
+uchar rsGetElementAtYuv_uchar_U(allocation_YUV_2D_global, 0, 1);
+
+uchar rsGetElementAtYuv_uchar_V(allocation_YUV_2D_global, 2, 3);
+
+uchar rsGetElementAtYuv_uchar_Y(allocation_YUV_2D_global, 0, 1);
+
+float4 rsSample(allocation_1D_global, rs_sampler s, float location);
+float4 rsSample(allocation_1D_global, rs_sampler s, float location, float lod);
+float4 rsSample(allocation_1D_global, rs_sampler s, float2 location);
+float4 rsSample(allocation_1D_global, rs_sampler s, float2 location, float lod);
+
+void rsSetElementAt(allocation_1D_global, int* ptr, 2);
+void rsSetElementAt(allocation_2D_global, int* ptr, 24, 25);
+void rsSetElementAt_int(allocation_1D_global, int val, 0);
+void rsSetElementAt_int(allocation_2D_global, int val, 26, 27);
+void rsSetElementAt_int(allocation_3D_global, int val, 1, 0, 1);
+'''.splitlines())
+
+
+TYPE_MAP = {
+    'void' : '',
+    'char' : r'\((signed )?char\)',
+    'uchar' : r'\(uchar\)',
+    'short' : r'\(short\)',
+    'ushort' : r'\(ushort\)',
+    'int' : r'\(int\)',
+    'uint' : r'\(uint\)',
+    'long' : r'\((long )?long\)',
+    'ulong' : r'\(ulong\)',
+    'float' : r'\(float\)',
+    'float2' : r'\(float2\)',
+    'float3' : r'\(float3\)',
+    'float4' : r'\(float4\)'
+    }
+
+
+def _build_arg(token):
+    '''Given a C argument construct an lldb expression for the argument.
+
+    Given a token, which represents a single argument of a C function
+    declaration, construct an lldb expression for the argument.
+
+    Args:
+        token: A string representing a single argument to a function. This
+               can be either [type][name] (e.g. int arg) or [value] (e.g. 5).
+
+    Returns:
+        The string that is the lldb expression for that argument, e.g.
+        int_global or 5.
+    '''
+    if len(token.split()) == 1:
+        # This is a fixed constant. Just take that as output.
+        return token
+
+    result = token.split()[0]
+
+    # Remove the rs_ prefix, because our globals' names don't have them
+    if result[:3] == 'rs_':
+        result = result[3:]
+
+    # If the function expects a pointer, take the address of the global
+    if result[-1] == '*':
+        result = '&' + result
+        result = result[:-1]
+
+    result += '_global'
+    return result
+
+
+def build_expr(line):
+    '''Build an lldb expression given a function prototype.
+
+    Given a function declaration, this function will construct an lldb
+    expression to call it.
+
+    Args:
+        line: A string representing a function declaration.
+
+    Returns:
+        The string that is the lldb expression.
+    '''
+    tokens = re.findall(r"[^(),;]+", line)
+    assert len(tokens) > 0
+    ret_name = tokens[0].split()
+    ret = ret_name[0]
+    name = ret_name[1]
+    expr = 'expr {0}('.format(name)
+
+    first = True
+    for tok in tokens[1:]:
+        if not first:
+            expr += ', '
+        expr += _build_arg(tok)
+        first = False
+
+    expr += ')'
+    return ret, expr
diff --git a/tests/lldb/tests/harness/__init__.py b/tests/lldb/tests/harness/__init__.py
new file mode 100644
index 0000000..3390144
--- /dev/null
+++ b/tests/lldb/tests/harness/__init__.py
@@ -0,0 +1,9 @@
+'''This module contains utility code used by the test suite'''
+
+import exception
+import util_constants
+from exception import TestSuiteException
+from test_base import TestBase
+from util_android import UtilAndroid
+from util_bundle import UtilBundle
+import RS_funs
\ No newline at end of file
diff --git a/tests/lldb/tests/harness/exception.py b/tests/lldb/tests/harness/exception.py
new file mode 100644
index 0000000..9f826d6
--- /dev/null
+++ b/tests/lldb/tests/harness/exception.py
@@ -0,0 +1,15 @@
+'''Module that contains TestSuiteException.'''
+
+class TestSuiteException(Exception):
+    '''Exception that is thrown whenever an internal error is encountered.
+
+    Just contains a message.
+    '''
+    pass
+
+class DisconnectedException(Exception):
+    '''Exception that is thrown if lldb-server unexpectedly disconnected.
+
+    Just contains a message.
+    '''
+    pass
diff --git a/tests/lldb/tests/harness/test_base.py b/tests/lldb/tests/harness/test_base.py
new file mode 100644
index 0000000..61913ea
--- /dev/null
+++ b/tests/lldb/tests/harness/test_base.py
@@ -0,0 +1,257 @@
+'''Module that contains TestBase, the base class of all tests.'''
+
+import logging
+import os
+import re
+import tempfile
+import traceback
+
+from exception import DisconnectedException
+
+from . import util_log
+
+class TestBase(object):
+    '''Base class for all tests. Provides some common functionality.'''
+
+    def __init__(self, device_port, device, timer):
+        # Keep argument names for documentation purposes. This method is
+        # overwritten by test_base_remote.
+        # pylint: disable=unused-argument
+        self._lldb = None # handle to the lldb module
+        self._ci = None # instance of the lldb command interpreter for this test
+        self._timer = timer # timer instance, to check whether the test froze
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            String that is the name of the binary that this test should be run
+            with.
+        '''
+        raise NotImplementedError
+
+    def test_setup(self, android):
+        '''Set up environment for the test.
+
+        Override to specify commands to be run before the test APK launch.
+        Useful for setting Android properties or environment variables. See also
+        the test_shutdown method.
+
+        Args:
+            android: Handler to the android device, see the UtilAndroid class.
+        '''
+        pass
+
+    def test_shutdown(self, android):
+        '''Clean up environment after test.
+
+        Override this procedure to specify commands to be run after the test has
+        finished. This method is run regardless the outcome of the test.
+        Ideally, it should revert the changes introduced by test_setup.
+
+        Args:
+            android: Handler to the android device, see the UtilAndroid class.
+        '''
+        pass
+
+    def run(self, dbg, remote_pid, lldb, wimpy):
+        '''Execute the actual test.
+
+        Args:
+            dbg: The instance of the SBDebugger that is used to test commands.
+            remote_pid: The integer that is the process id of the binary that
+                        the debugger is attached to.
+            lldb: A handle to the lldb module.
+            wimpy: Boolean to specify only a subset of the commands be executed.
+
+        Returns:
+            True if the test passed, or False if not.
+        '''
+        raise NotImplementedError
+
+    def post_run(self):
+        '''Clean up after test execution.'''
+        pass
+
+    class TestFail(Exception):
+        '''Exception that is thrown when a line in a test fails.
+
+        This exception is thrown if a lldb command does not return the expected
+        string.
+        '''
+        pass
+
+    def test_assert(self, cond):
+        '''Check a given condition and raise TestFail if it is False.
+
+        Args:
+            cond: The boolean condition to check.
+
+        Raises:
+            TestFail: The condition was false.
+        '''
+        if not cond:
+            raise self.TestFail()
+
+    def assert_lang_renderscript(self):
+        '''Check that LLDB is stopped in a RenderScript frame
+
+        Use the LLDB API to check that the language of the current frame
+        is RenderScript, fail otherwise.
+
+        Raises:
+            TestFail: Detected language not RenderScript.
+        '''
+        assert self._lldb
+        assert self._ci
+
+        proc = self._ci.GetProcess()
+        frame = proc.GetSelectedThread().GetSelectedFrame()
+        lang = frame.GetCompileUnit().GetLanguage()
+
+        if lang != self._lldb.eLanguageTypeExtRenderScript:
+            raise self.TestFail('Frame language not RenderScript, instead {0}'
+                                .format(lang))
+
+    def do_command(self, cmd):
+        '''Run an lldb command and return the output.
+
+        Args:
+            cmd: The string representing the lldb command to run.
+
+        Raises:
+            TestFail: The lldb command failed.
+        '''
+        assert self._lldb
+        assert self._ci
+
+        log = util_log.get_logger()
+        res = self._lldb.SBCommandReturnObject()
+
+        log.info('[Command] {0}'.format(cmd))
+
+        # before issuing the command, restart the current timer to check
+        # whether the command is going to freeze the test
+        if self._timer:
+            self._timer.reset()
+
+        self._ci.HandleCommand(cmd, res)
+
+        if not res.Succeeded():
+            error = res.GetError()
+            raise self.TestFail('The command "{0}" failed with the error: {1}'
+                                .format(cmd, error if error else '<N/a>'))
+
+        output = res.GetOutput()
+        log.debug('[Output] {0}'.format(output.rstrip()))
+
+        return output
+
+    def try_command(self, cmd, expected, expected_regex=None):
+        '''Run an lldb command and match the expected response.
+
+        Args:
+            cmd: The string representing the lldb command to run.
+            expected: A list of strings that should be present in lldb's
+                      output.
+            expected_regex: A list of regular expressions that should
+                            match lldb's output.
+
+        Raises:
+            TestFail: One of the expected strings were not found in the lldb
+            output.
+        '''
+        assert self._lldb
+        assert self._ci
+
+        log = util_log.get_logger()
+        output = ''
+        try:
+            output = self.do_command(cmd)
+
+            if 'lost connection' in output:
+                raise DisconnectedException('Lost connection to lldb-server.')
+
+            # check the expected strings
+            self._match_literals(output, expected)
+
+            # check the regexp patterns
+            if expected_regex:
+                self._match_regexp_patterns(output, expected_regex)
+
+        except self.TestFail as exception:
+            # if the command failed, ensure the output retrieved from the
+            # command is printed even in verbose mode
+            if log.getEffectiveLevel() > logging.DEBUG:
+                log.error('[Output] {0}'.format(output.rstrip() if output
+                                                else '<empty>'))
+
+            # print the back trace, it should help to identify the error in
+            # the test
+            backtrace = ['[Back trace]']
+            for (filename, line, function, text) in \
+                    traceback.extract_stack()[:-1]:
+                backtrace.append('  [{0} line: {2} fn: {1}] {3}'.format(
+                            filename, function, line, text
+                    )
+                )
+            log.error('\n'.join(backtrace))
+            log.error('[TEST ERROR] {0}'.format(exception.message))
+            raise  # pass through
+
+    def _match_literals(self, text, literals):
+        '''Checks the text against the array of literals.
+
+        Raises a TestFail exception in case one of the literals is not contained
+        in the text.
+
+        Args:
+            text: String, it represents the text to match.
+            literals: an array of string literals to match in the output.
+
+        Throws: self.TestFail: if it cannot match one of the literals in
+                the output.
+        '''
+        for string in literals:
+            if string not in text:
+                raise self.TestFail('Cannot find "{0}" in the output'
+                                    .format(string))
+
+    def _match_regexp_patterns(self, text, patterns):
+        '''Checks the text against the array of regular expression patterns.
+
+        Raises a TestFail exception in case one of the patterns is not matched
+        in the given text.
+
+        Args:
+            text: String, it represents the text to match.
+            patterns: an array of strings, each of them representing a regular
+                      expression to match in text.
+
+        Throws: self.TestFail: if it cannot match one of the literals in
+                the output.
+        '''
+        log = util_log.get_logger()
+
+        for regex in patterns:
+            match = re.search(regex, text)
+            if not match:
+                raise self.TestFail('Cannot match the regexp "{0}" in '
+                                    'the output'.format(regex))
+            else:
+                msg = 'Found match to regex {0}: {1}'.format(regex,
+                                     match.group())
+                log.debug(msg)
+
+    @staticmethod
+    def get_tmp_file_path():
+        '''Get the path of a temporary file that is then deleted.
+
+        Returns:
+            A string that is the path to a temporary file.
+        '''
+        file_desc, name = tempfile.mkstemp()
+        os.close(file_desc)
+        os.remove(name)
+        return name
+
diff --git a/tests/lldb/tests/harness/test_base_remote.py b/tests/lldb/tests/harness/test_base_remote.py
new file mode 100644
index 0000000..acb2ba1
--- /dev/null
+++ b/tests/lldb/tests/harness/test_base_remote.py
@@ -0,0 +1,171 @@
+'''Module that contains the base class TestBaseRemote'''
+
+import os
+import re
+
+from test_base import TestBase
+from . import util_log
+
+
+class TestBaseRemote(TestBase):
+    '''Base class for all tests that connect to a remote device.
+
+    Provides common functionality to set up the connection and tear it down.
+    '''
+
+    def __init__(self, device_port, device, timer):
+        super(TestBaseRemote, self).__init__(device_port, device, timer)
+        # port used by lldb-server on the device.
+        self._device_port = device_port
+        self._platform = None
+        # id of the device that adb will communicate with.
+        self._device = device
+
+    def set_src_map(self, file_name, new_src_path):
+        '''Call lldb to set the source mapping of a given file.
+
+        Set lldb's source mapping of a given file to a given path. This can be
+        used to make the test suite independent of where an APK was compiled.
+
+        Args:
+            file_name: String, which is the name of the file whose mapping is
+                to be changed
+            new_src_path: String which is the new absolute path to the source
+                file.
+        '''
+        line_table = self.do_command('target modules dump line-table '
+                                     + file_name)
+
+        lines = line_table.split('\n')
+        if 'Line table for' not in lines[0]:
+            raise self.TestFail('Could not determine source path of '
+                                + file_name)
+
+        # Expecting output like:
+        # (lldb) target modules dump line-table scalars.rs
+        # Line table for /home/jenkins/workspace/grd-aosp-parameterised-build/
+        # merge_151216/frameworks/rs/tests/lldb/java/BranchingFunCalls/src/rs/
+        # frameworks/rs/tests/lldb/java/BranchingFunCalls/src/rs/scalars.rs in
+        # `librs.scalars.so
+        # 0xb30f2374: /home/jenkins/workspace/grd-aosp-parameterised-build/
+        # merge_151216/frameworks/rs/tests/lldb/java/BranchingFunCalls/src/rs/
+        # scalars.rs:46
+        # ...
+        # For some reason the first line contains a mangled path?
+        old_path = re.findall(r"[^ :]+", lines[1])[1]
+        old_dir = os.path.dirname(old_path)
+
+        self.try_command('settings set target.source-map %s %s'
+                         % (old_dir, new_src_path), [''])
+
+    def post_run(self):
+        '''Clean up after execution.'''
+        if self._platform:
+            self._platform.DisconnectRemote()
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        raise NotImplementedError
+
+    def _connect_to_platform(self, lldb_module, dbg, remote_pid):
+        '''Connect to an lldb platform that has been started elsewhere.
+
+        Args:
+            lldb_module: A handle to the lldb module.
+            dbg: The instance of the SBDebugger that should connect to the
+                 server.
+            remote_pid: The integer that is the process id of the binary that
+                        the debugger should attach to.
+
+        Returns:
+            True if the debugger successfully attached to the server and
+            process.
+        '''
+        # pylint: disable=too-many-return-statements
+        remote_pid = str(remote_pid)
+
+        log = util_log.get_logger()
+
+        err1 = dbg.SetCurrentPlatform('remote-android')
+        if err1.Fail():
+            log.fatal(err1.GetCString())
+            return False
+
+        self._platform = dbg.GetSelectedPlatform()
+        if not self._platform:
+            return False
+
+        connect_string = \
+            'adb://{0}:{1}'.format(self._device, self._device_port)
+        opts = lldb_module.SBPlatformConnectOptions(connect_string)
+
+        for _ in range(2):
+            err2 = self._platform.ConnectRemote(opts)
+            if err2.Fail():
+                log.error(err2.GetCString())
+
+                if 'Connection refused' in err2.GetCString():
+                    log.warning('Connection to lldb server was refused. '
+                                'Trying again.')
+                else:
+                    # Unknown error. Don't try again.
+                    return False
+            else:
+                # Success
+                break
+        else:
+            log.fatal('Not trying again, maximum retries exceeded.')
+            return False
+
+        target = dbg.CreateTarget(None)
+        if not target:
+            return False
+
+        dbg.SetSelectedTarget(target)
+        listener = lldb_module.SBListener()
+        err3 = lldb_module.SBError()
+        process = target.AttachToProcessWithID(listener, int(remote_pid), err3)
+        if err3.Fail() or not process:
+            log.fatal(err3.GetCString())
+            return False
+
+        return True
+
+    def run(self, dbg, remote_pid, lldb, wimpy):
+        '''Execute the actual test.
+
+        Args:
+            dbg: The instance of the SBDebugger that is used to test commands.
+            remote_pid: The integer that is the process id of the binary that
+                        the debugger is attached to.
+            lldb: A handle to the lldb module.
+            wimpy: Boolean to specify only a subset of the commands be executed.
+
+        Returns:
+            True if the test passed, or False if not.
+        '''
+        assert dbg
+        assert remote_pid
+        assert lldb
+
+        self._lldb = lldb
+
+        try:
+            self.test_assert(self._connect_to_platform(lldb, dbg, remote_pid))
+            self._ci = dbg.GetCommandInterpreter()
+            assert self._ci
+
+            self.test_assert(self._ci.IsValid())
+            self.test_assert(self._ci.HasCommands())
+
+            self.test_case(wimpy)
+
+        except self.TestFail:
+            return False
+
+        return True
diff --git a/tests/lldb/tests/harness/util_android.py b/tests/lldb/tests/harness/util_android.py
new file mode 100644
index 0000000..cbc928d
--- /dev/null
+++ b/tests/lldb/tests/harness/util_android.py
@@ -0,0 +1,715 @@
+'''Module that contains the class UtilAndroid, providing utility method to
+interface with Android ADB.'''
+
+import logging
+import re
+import subprocess
+import time
+import collections
+import multiprocessing
+import Queue
+from exception import TestSuiteException
+from . import util_log
+
+
+class UtilAndroid(object):
+    '''Provides some utility methods that interface with Android using adb.'''
+    # pylint: disable=too-many-public-methods
+
+    def __init__(self, adb_path, lldb_server_path_device, device):
+        # The path to the adb binary on the local machine
+        self._path_adb = adb_path
+        # The path to the lldb server binary on the device
+        self._path_lldbserver = lldb_server_path_device
+        self._log = util_log.get_logger()
+        self.device = device
+        self._prop_stacks = collections.defaultdict(list)
+        return
+
+    @staticmethod
+    def _validate_string(string):
+        '''Check that a string is valid and not empty.
+
+        Args:
+            string: The string to be checked.
+        '''
+        assert isinstance(string, str)
+        assert len(string) > 0
+
+    def adb(self, args, async=False, device=True, timeout=None):
+        '''Run an adb command (async optional).
+
+        Args:
+            args: The command (including arguments) to run in adb.
+            async: Boolean to specify whether adb should run the command
+                   asynchronously.
+            device: boolean to specify whether the serial id of the android
+                    device should be inserted in the adb command.
+            timeout: it specifies the number of seconds to wait for
+                     a synchronous invocation before aborting. If unspecified or
+                     None it waits indefinitely for the command to complete.
+
+        Raises:
+            ValueError: it can be caused by any of the following situations:
+                        - when both the combination async=True and timeout are
+                          given.
+                        - when a timeout <= 0 is specified.
+
+        Returns:
+            If adb was synchronously run and the command completed by the
+            specified timeout, a string which is the output (standard out and
+            error) from adb. Otherwise it returns None.
+        '''
+
+        # Form the command
+        if device:
+            cmd = '{0} -s {1} {2}'.format(self._path_adb, self.device, args)
+        else:
+            cmd = '{0} {1}'.format(self._path_adb, args)
+
+        self._log.debug('Execute ADB: %s', cmd)
+
+        if timeout is None:
+            # local invocation
+            return_code, output = UtilAndroid._execute_command_local(cmd, async)
+
+        else:
+            # remote invocation
+            if async:
+                raise ValueError('Invalid combination: asynchronous invocation '
+                                 'with timeout specified')
+
+            return_code, output = UtilAndroid._execute_command_remote(cmd,
+                                                                      timeout)
+
+            if return_code is None:
+                self._log.warn('[ADB] The command timed out: %s', cmd)
+
+        # log the output message
+        if output is not None:
+            self._adb_log_output(cmd, output, return_code)
+
+        return output
+
+    def adb_retry(self, args, max_num_attempts, timeout):
+        '''Attempt to execute the given adb command a certain number of times.
+
+        The function executes the given command through adb, waiting for its
+        completion up to 'timeout' seconds. If the command completes then it
+        returns its output. Otherwise it aborts the execution of the adb
+        command and re-issues it anew with the same parameters. In case of
+        timeout this process is repeated up to 'max_num_attempts'.
+
+        The purpose of this function is to handle the cases when, for some
+        reason, a command sent to 'adb' freezes, blocking the whole test suite
+        indefinitely.
+
+        Args:
+            args: The command (including arguments) to run in adb.
+            max_num_attempts: the max number of attempts to repeat the command
+                              in case of timeout.
+            timeout: it specifies the number of seconds to wait for the adb
+                     command to complete.
+
+        Raises:
+            ValueError: when the parameter timeout is invalid (None or <= 0).
+
+        Returns:
+            If adb was synchronously run and the command completes by the
+            specified timeout, a string which is the output (standard out and
+            error) from adb. Otherwise it returns None.
+        '''
+        if timeout is None or timeout <= 0:
+            raise ValueError('Invalid value for timeout')
+
+        output = None
+
+        for attempt in range(max_num_attempts):
+            self._log.debug('[ADB] Attempt #%d: %s', attempt + 1, args)
+            output = self.adb(args, False, True, timeout)
+            if output:
+                break
+
+        return output
+
+    def _adb_log_output(self, cmd, output, return_code):
+        '''Save in the log the command & output from `adb`.
+
+        Internal function, helper to record in the log the issued adb command
+        together with its output and return code.
+
+        Params:
+            cmd: string, the command issued to `adb`.
+            output: string, the output retrieved from `adb`.
+            return_code: int, the return code from `adb`.
+        '''
+
+        message = output.strip()
+
+        # if return_code != 0, we wish to also record the command executed
+        # (which occurs if and only if we are in verbose mode)
+        is_warning = return_code != 0
+        threshold = self._log.getEffectiveLevel()
+        if is_warning and threshold > logging.DEBUG:
+            self._log.warn("[ADB] Command executed: {0}".format(cmd))
+
+        level = logging.WARNING if is_warning else logging.DEBUG
+        if message:
+            # if message is composed by multiple lines, then print it after
+            # the log preamble
+            if re.search('\n', message):
+                message = '\n' + message
+        else:
+            message = '<empty>'
+
+        self._log.log(level, 'RC: {0}, Output: {1}'.format(return_code,
+                                                           message))
+
+    def check_adb_alive(self):
+        '''Ping the device and raise an exception in case of timeout.
+
+        It sends a ping message through 'adb shell'. The emulator/device should
+        echo the same message back by one minute. If it does not, it raises
+        a TestSuiteException.
+
+        Purpose of this method is to check whether 'adb' became frozen or
+        stuck.
+
+        Raises:
+            TestSuiteException: in case the device/emulator does not reply by
+                                one minute or the `ping' message is not echoed
+                                back.
+        '''
+        token = 'PING'
+        log = util_log.get_logger()
+        cmd = "echo {0}".format(token)
+
+        tries = 10
+        try_number = tries
+        while try_number > 0:
+            log.debug('Sending a ping through "adb shell" (try #%s)...',
+                      try_number)
+            output = self.shell(cmd, False, 60)
+
+            if output is None:
+                raise TestSuiteException(
+                    'Timeout when pinging the device/emulator through '
+                    '"adb shell".  Is "adb" stuck or dead?')
+            elif token not in output:
+                log.debug('Ping failed. Cannot match the token "%s" in "adb '
+                          'shell %s"', token, cmd)
+            else:
+                log.debug('Pong message received')
+                return
+
+            try_number -= 1
+            time.sleep(5)
+
+        raise TestSuiteException('Cannot ping the device/emulator through '
+                                 '"adb shell". Tried %s times. Is "adb" stuck '
+                                 'or dead?' % tries)
+
+    def shell(self, cmd, async=False, timeout=None):
+        '''Run a command via the adb shell.
+
+        Args:
+            cmd: The command (including arguments) to run in the adb shell.
+            async: Boolean to specify whether adb should run the command
+                   asynchronously.
+            timeout: it specifies the number of seconds to wait for
+                     a synchronous invocation before aborting. If unspecified or
+                     None it waits indefinitely for the command to complete
+
+        Returns:
+            If adb was synchronously run, a string which is the output (standard
+            out and error) from adb. Otherwise None.
+        '''
+        return self.adb('shell "{0}"'.format(cmd), async, True, timeout)
+
+    def find_app_pid(self, process_name):
+        '''Find the process ID of a process with a given name.
+
+        If more than one instance of the process is running return the first pid
+        it finds.
+
+        Args:
+            process_name: A string representing the name of the package or
+                          binary for which the id should be found. I.e. the
+                          string or part of the string that shows up in the "ps"
+                          command.
+
+        Returns:
+            An integer representing the id of the process, or None if it was not
+            found.
+        '''
+        self._validate_string(process_name)
+
+        pid_output = self.shell('pidof ' + process_name)
+        pid_output = re.sub(r'\*.+\*', '', pid_output)
+        pids = pid_output.split()
+
+        if len(pids) < 1:
+            self._log.warn('Unable to find pid of: {0}'.format(process_name))
+            return None
+
+        if len(pids) > 1:
+            self._log.warn('Found multiple instances of {0} running: {1}'
+                           .format(process_name, pids))
+
+        try:
+            pid = int(pids[0])
+            self._log.info('App pid found: {0}'.format(pids[0]))
+            return pid
+        except ValueError:
+            return None
+
+    def adb_root(self):
+        '''Set adb to be in root mode.'''
+        self.adb('root')
+
+    def _adb_remount(self):
+        '''Remount the filesystem of the device.'''
+        self.adb('remount')
+
+    def validate_adb(self):
+        '''Validate adb that it can be run.
+
+        Raises:
+            TestSuiteException: Unable to validate that adb exists and runs
+                                successfully.
+        '''
+        out = self.adb('version', False, False)
+        if out and 'Android' in out and 'version' in out:
+            self._log.info('adb found: {0}'.format(out))
+            return None
+        raise TestSuiteException('unable to validate adb')
+
+    def is_booted(self):
+        ''' Check if the device/emulator has finished booting.
+
+        Returns: True if the property sys.boot_completed is true, False
+                 otherwise.
+        '''
+        return self._get_prop('sys.boot_completed').strip() == '1'
+
+    def validate_device(self, check_boot=True, device_substring=''):
+        '''Validate that there is at least one device.
+
+        Args:
+            check_boot: Boolean to specify whether to check whether the device
+                        has finished booting as well as being present.
+            device_substring: String that needs to be part of the name of the
+                              device.
+
+        Raises:
+            TestSuiteException: There was a failure to run adb to list the
+                                devices or there is no device connected or
+                                multiple devices connected without the user
+                                having specified the device to use.
+        '''
+
+        out = self.adb('devices', False, False)
+        if not 'List of devices attached' in out:
+            raise TestSuiteException('Unable to list devices')
+
+        lines = out.split('\n')
+        found_device = False # True if the specified device is found
+        devices = []
+
+        for line in lines[1:]:
+            if '\tdevice' in line and device_substring in line:
+                device = line.split()[0]
+                devices.append(device)
+                if self.device:
+                    if self.device == device:
+                        found_device = True
+
+        if len(devices) == 0:
+            raise TestSuiteException('adb is unable to find a connected '
+                                     'device/emulator to test.')
+
+        if not self.device:
+            if len(devices) == 1:
+                self.device = devices[0]
+            else:
+                raise TestSuiteException('Multiple devices connected,'
+                                         'specify -d device id.')
+        else:
+            if not found_device:
+                raise TestSuiteException('Couldn\'t find the device {0} that '
+                                         'was specified, please check -d '
+                                         'argument'.format(self.device))
+
+        if check_boot and not self.is_booted():
+            raise TestSuiteException(
+                'The device {0} has not yet finished booting.'
+                .format(self.device))
+
+    def device_with_substring_exists(self, device_substring):
+        '''Check whether a device exists whose name contains a given string.
+
+        Args:
+            device_substring: String that is part of the name of the device to
+                              look for.
+
+        Raises:
+            TestSuiteException: There was a failure to run adb to list the
+                                devices.
+        '''
+        out = self.adb('devices', False, False)
+        if not 'List of devices attached' in out:
+            raise TestSuiteException('Unable to list devices')
+
+        lines = out.split('\n')
+
+        for line in lines[1:]:
+            if '\tdevice' in line:
+                device = line.split()[0]
+                if device.find(device_substring) != -1:
+                    return True
+
+        return False
+
+    def get_device_id(self):
+        '''Return ID of the device that will be used for running the tests on.
+
+        Returns:
+            String representing device ID.
+        '''
+        return self.device
+
+    def _kill_pid(self, pid):
+        '''Kill a process identified by its pid by issuing a "kill" command.
+
+        Args:
+            pid: The integer that is the process id of the process to be killed.
+        '''
+        self.shell('kill -9 ' + str(pid))
+
+    def stop_app(self, package_name):
+        '''Terminate an app by calling am force-stop.
+
+        Args:
+            package_name: The string representing the name of the package of the
+                          app that is to be stopped.
+        '''
+        self._validate_string(package_name)
+        self.shell('am force-stop ' + package_name)
+
+    def kill_process(self, name):
+        '''Kill a process identified by its name (package name in case of apk).
+
+        Issues the "kill" command.
+
+        Args:
+            name: The string representing the name of the binary of the process
+                  that is to be killed.
+
+        Returns:
+            True if the kill command was executed, False if it could not be
+            found.
+        '''
+        pid = self.find_app_pid(name)
+        if pid:
+            self._kill_pid(pid)
+            return True
+        return False
+
+    def kill_all_processes(self, name):
+        '''Repeatedly try to call "kill" on a process to ensure it is gone.
+
+        If the process is still there after 5 attempts reboot the device.
+
+        Args:
+            name: The string representing the name of the binary of the process
+                  that is to be killed.
+
+        Raises:
+            TestSuiteException: If the process could not be killed after 5
+                                attempts and the device then failed to boot
+                                after rebooting.
+        '''
+
+        # try 5 times to kill this process
+        for _ in range(1, 5):
+            if not self.kill_process(name):
+                return
+        # stalled process must reboot
+        self._reboot_device()
+
+    def kill_servers(self):
+        '''Kill all gdbserver and lldb-server instances.
+
+        Raises:
+            TestSuiteException: If gdbserver or lldb-server could not be killed
+                                after 5 attempts and the device then failed to
+                                boot after rebooting.
+        '''
+        self.kill_all_processes('gdbserver')
+        self.kill_all_processes('lldb-server')
+
+    def launch_elf(self, binary_name):
+        '''Launch a binary (compiled with the NDK).
+
+        Args:
+            binary_name: The string representing the name of the binary that is
+                         to be launched.
+
+        Returns:
+            Boolean, failure if the app is not installed, success otherwise.
+        '''
+        # Ensure the apk is actually installed.
+        output = self.shell('ls /data/ | grep ' + binary_name)
+        if binary_name not in output:
+            return False
+
+        stdout = self.shell('exec /data/' + binary_name, True)
+        self._log.info(str(stdout))
+
+        return True
+
+    def wait_for_device(self):
+        '''Ask ADB to wait for a device to become ready.'''
+        self.adb('wait-for-device')
+
+    def _reboot_device(self):
+        '''Reboot the remote device.
+
+        Raises:
+            TestSuiteException: If the device failed to boot after rebooting.
+        '''
+        self.adb('reboot')
+        self.wait_for_device()
+        # Allow 20  mins boot time to give emulators such as MIPS enough time
+        sleeping_countdown = 60*20
+        while not self.is_booted():
+            time.sleep(1)
+            sleeping_countdown -= 1
+            if sleeping_countdown == 0:
+                raise TestSuiteException('Failed to reboot. Terminating.')
+
+        self.adb_root()
+        self.wait_for_device()
+        self._adb_remount()
+        self.wait_for_device()
+
+    def launch_app(self, name, activity):
+        '''Launch a Renderscript application.
+
+        Args:
+            name: The string representing the name of the app that is to be
+                  launched.
+            activity: The string representing the activity of the app that is to
+                      be started.
+
+        Returns:
+            Boolean, failure if the apk is not installed, success otherwise.
+        '''
+        assert name and activity
+
+        # Ensure the apk is actually installed.
+        output = self.shell('pm list packages ' + name)
+        if not output:
+            return False
+
+        cmd = 'am start -S -n {0}/{0}.{1}'.format(name, activity)
+        stdout = self.shell(cmd)
+
+        self._log.info(str(stdout))
+
+        return True
+
+    def launch_lldb_platform(self, port):
+        '''Launch lldb server and attach to target app.
+
+        Args:
+            port: The integer that is the port on which lldb should listen.
+        '''
+        cmd = "export LLDB_DEBUGSERVER_PATH='{0}';{0} p --listen {1}"\
+            .format(self._path_lldbserver, port)
+        self.shell(cmd, True)
+        time.sleep(5)
+
+    def forward_port(self, local, remote):
+        '''Use adb to forward a device port onto the local machine.
+
+        Args:
+            local: The integer that is the local port to forward.
+            remote: The integer that is the remote port to which to forward.
+        '''
+        cmd = 'forward tcp:%s tcp:%s' % (str(local), str(remote))
+        self.adb(cmd)
+
+    def remove_port_forwarding(self):
+        '''Remove all of the forward socket connections open in adb.
+
+        Avoids a windows adb error where we can't bind to a listener
+        because too many files are open.
+        '''
+        self.adb('forward --remove-all')
+
+    def _get_prop(self, name):
+        '''Get the value of an Android system property.
+
+        Args:
+            name: Name of the property of interest [string].
+
+        Returns:
+            Current value of the property [string].
+        '''
+        return self.shell('getprop %s' % str(name))
+
+    def _set_prop(self, name, value):
+        '''Set the value of an Android system property.
+
+        Args:
+            name: Name of the property of interest [string].
+            value: Desired new value for the property [string or integer].
+        '''
+        self.shell("setprop %s '%s'" % (str(name), str(value)))
+
+    def push_prop(self, name, new_value):
+        '''Save the value of an Android system property and set a new value.
+
+        Saves the old value onto a stack so it can be restored later.
+
+        Args:
+            name: Name of the property of interest [string].
+            new_value: Desired new value for the property [string or integer].
+        '''
+        old_value = self._get_prop(name)
+        self._set_prop(name, new_value)
+        self._prop_stacks[name].append(old_value.strip())
+
+    def pop_prop(self, name):
+        '''Restore the value of an Android system property previously set by
+        push_prop.
+
+        Args:
+            name: Name of the property of interest [string].
+
+        Returns:
+            Current value of the property [string].
+        '''
+        old_value = self._prop_stacks[name].pop()
+        self._set_prop(name, old_value)
+
+    def reset_all_props(self):
+        '''Restore all the android properties to the state before the first push
+
+        This is equivalent to popping each property the number of times it has
+        been pushed.
+        '''
+        for name in self._prop_stacks:
+            if self._prop_stacks[name] != []:
+                self._set_prop(name, self._prop_stacks[name][0])
+                self._prop_stacks[name] = []
+
+    def make_device_writeable(self):
+        ''' Ensure the device is full writable, in particular the system folder.
+
+        This disables verity and remounts.
+        '''
+        output = self.adb('disable-verity')
+
+        # if the remote is an emulator do not even try to reboot
+        # otherwise check whether a reboot is advised
+        if (self._get_prop('ro.kernel.qemu') != '1' and output and
+                'Now reboot your device for settings to take effect' in output):
+            self._reboot_device()
+
+        self._adb_remount()
+        self.wait_for_device()
+        self.adb_root()
+        self.wait_for_device()
+
+    @staticmethod
+    def _execute_command_local(command, async=False):
+        '''Execute the given shell command in the same process.
+
+        Args:
+            command: String, the command to execute
+            async: Boolean to specify whether adb should run the command
+                   asynchronously.
+
+        Returns:
+            if async == False, it returns a tuple with the return code and
+            the output from the executed command. Otherwise the tuple
+            (None, None).
+        '''
+        proc = subprocess.Popen(command,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.STDOUT,
+                                shell=True)
+        if async:
+            return None, None
+
+        # read the whole output from the command
+        with proc.stdout as file_proc:
+            output = ''.join(line for line in file_proc)
+
+        # release the process state
+        proc.terminate()
+        return_code = proc.wait()
+
+        return return_code, output
+
+    @staticmethod
+    def _execute_command_remote(command, timeout):
+        '''Execute the given shell command remotely, in a separate process.
+
+        It spawns an ad hoc process to execute the given command. It waits up
+        to timeout for the command to complete, otherwise it aborts the
+        execution and returns None.
+
+        Args:
+            command: String, the command to execute.
+            timeout: the number of seconds to wait for the command to complete.
+
+        Returns:
+            a pair with the return code and the output from the command, if it
+            completed by the specified 'timeout' seconds. Otherwise the tuple
+            (None, None).
+        '''
+
+        channel = multiprocessing.Queue()
+        proc = multiprocessing.Process(
+            target=_handle_remote_request,
+            name="Executor of `{0}'".format(command),
+            args=(command, channel)
+        )
+
+        # execute the command
+        proc.start()
+        return_code = None
+        output = None
+
+        # wait for the result
+        try:
+            return_code, output = channel.get(True, timeout)
+        except Queue.Empty:
+            # timeout hit, the remote process has not fulfilled our request by
+            # the given time. We are going to return <None, None>, nothing to
+            # do here as it already holds return_code = output = None.
+            pass
+
+        # terminate the helper process
+        proc.terminate()
+
+        return return_code, output
+
+
+def _handle_remote_request(command, channel):
+    '''Entry point for the remote process.
+
+    It executes the given command and reports the result into the channel.
+    This function is supposed to be only called by
+    UtilAndroid._execute_command_remote to handle the inter-process
+    communication.
+
+    Args:
+        command: the command to execute.
+        channel: the channel to communicate with the caller process.
+    '''
+    channel.put(UtilAndroid._execute_command_local(command))
+
diff --git a/tests/lldb/tests/harness/util_bundle.py b/tests/lldb/tests/harness/util_bundle.py
new file mode 100644
index 0000000..ecd413a
--- /dev/null
+++ b/tests/lldb/tests/harness/util_bundle.py
@@ -0,0 +1,368 @@
+'''Module that contains the class UtilBundle, representing a collection of RS
+binaries.'''
+
+import os
+import time
+from . import util_constants
+from . import util_log
+from exception import TestSuiteException
+
+
+class UtilBundle(object):
+    '''Represents the collection of RS binaries that are debugged.'''
+
+    # Map of binary name to package name of all Java apps debugged
+    _tests_apk = {
+        'JavaInfiniteLoop': 'com.android.rs.infiniteloop',
+        'JavaDebugWaitAttach': 'com.android.rs.waitattachdebug',
+        'JavaNoDebugWaitAttach': 'com.android.rs.waitattachnodebug',
+        'BranchingFunCalls': 'com.android.rs.branchingfuncalls',
+        'KernelVariables': 'com.android.rs.kernelvariables',
+        'Allocations': 'com.android.rs.allocations',
+        'MultipleRSFiles': 'com.android.rs.multiplersfiles'
+    }
+
+    _tests_jni = {
+        'JNIInfiniteLoop': 'com.android.rs.jniinfiniteloop',
+        'JNIDebugWaitAttach': 'com.android.rs.jnidebugwaitattach',
+        'JNINoDebugWaitAttach': 'com.android.rs.jninodebugwaitattach',
+        'JNIBranchingFunCalls': 'com.android.rs.jnibranchingfuncalls',
+        'JNIKernelVariables': 'com.android.rs.jnikernelvariables',
+        'JNIAllocations': 'com.android.rs.jniallocations',
+        'JNIMultipleRSFiles': 'com.android.rs.jnimultiplersfiles'
+    }
+
+    _tests_ndk = {'CppInfiniteLoop', 'CppNoDebugWaitAttach',
+                  'CppDebugWaitAttach', 'CppBranchingFunCalls',
+                  'CppKernelVariables', 'CppAllocations', 'CppMultipleRSFiles'}
+
+    _missing_path_msg = (
+        'No product path has been provided, if using the '
+        'default environmental variable check it is set '
+        'by running lunch. Alternatively hardcode '
+        'your own path in the config file or set it via the '
+        'command line.'
+    )
+
+    def __init__(self, android, aosp_product_path):
+        assert android
+        self._android = android # Link to the android module
+        self._aosp_product_path = aosp_product_path
+        self._log = util_log.get_logger()
+
+    def is_apk(self, name):
+        '''Checks if a binary of a given name is an apk.
+
+        Checks whether the name of the apk is in the dictionary of apks.
+
+        Args:
+            name: The string that is the name of the binary to check.
+
+        Returns:
+            True if the binary is an apk, False if it is not.
+
+        Raises:
+            TestSuiteException: The string does not match any item in the list
+            of APK or NDK binaries.
+        '''
+        if name in self._tests_apk:
+            return True
+        if name not in self._tests_ndk and name not in self._tests_jni:
+            raise TestSuiteException('test not apk or ndk')
+        return False
+
+    def uninstall_all(self):
+        '''Uninstall/Delete all the testsuite's apks and binaries on the device.
+
+        Raises:
+            TestSuiteException: One or more apks could not be uninstalled.
+        '''
+        self.uninstall_all_apk()
+        self._delete_all_ndk()
+        self._uninstall_all_jni()
+
+    def uninstall_all_apk(self):
+        '''Uninstall all apks used by the test suite from the device.
+
+        Raises:
+            TestSuiteException: An apk could not be uninstalled.
+        '''
+        max_num_attempts = 3
+        timeout = 180
+
+        for app, package in self._tests_apk.items():
+            self._log.info('Uninstalling the application: %s', app)
+            output = self._android.adb_retry('uninstall ' + package,
+                                             max_num_attempts, timeout)
+
+            if output is None:
+                raise TestSuiteException('Repeated timeouts when uninstalling '
+                                         'the application: ' + app)
+            elif 'Success' not in output:
+                outmsg = '\n' + output.rstrip() if output else '<empty>'
+                self._log.error('Cannot match the string "Success" in the '
+                                'output: %s', outmsg)
+                raise TestSuiteException('Unable to uninstall app ' + app)
+            else:
+                self._log.debug('Application uninstalled: %r', app)
+
+            if 'Success' not in output:
+                self._log.warning('unable to uninstall app ' + app)
+
+    def _uninstall_all_jni(self):
+        '''Uninstall all apks used by the test suite from the device.
+
+        Raises:
+            TestSuiteException: An apk could not be uninstalled.
+        '''
+        for app, package in self._tests_jni.items():
+            output = self._android.adb('uninstall ' + package)
+
+            if 'Success' not in output:
+                raise TestSuiteException('unable to uninstall app ' + app)
+
+            output = self._android.shell('rm /system/lib/lib%s.so'
+                                         % app.lower())
+            if 'No such file or directory' in output:
+                self._log.warning(
+                    'unable to remove library file for app ' + app)
+
+    def _delete_all_ndk(self):
+        '''Delete all ndk binaries that were pushed to the device.
+
+        Raises:
+            TestSuiteException: A binary could not be deleted from the device.
+        '''
+        for app in self._tests_ndk:
+            output = self._android.shell('rm /data/' + app)
+            if 'No such file or directory' in output:
+                self._log.warning('unable to uninstall app ' + app)
+
+
+    def push_all(self):
+        '''Push all apk and ndk binaries required by the testsuite to the device
+
+        Raises:
+            TestSuiteException: One or more apks could not be installed or
+                                previously running processes thereof could not
+                                be killed.
+        '''
+        self._push_all_java()
+        self._push_all_ndk()
+        self._push_all_jni()
+
+    def _install_apk(self, app, package):
+        '''Push an apk files to the device.
+
+        This involves uninstalling any old installation and installing again.
+
+        Args:
+            app: A string that is the name of the apk.
+            package: A string that is the name of the package of the apk.
+
+        Raises:
+            TestSuiteException: The apk could not be installed.
+        '''
+        self._log.info('pushing {0}'.format(app))
+
+        self._android.stop_app(package)
+
+        self._android.adb('uninstall ' + package)
+        # Ignore the output of uninstall.
+        # The app may not have been installed in the first place. That's ok.
+
+        flags = ''
+
+        product_folder = self._aosp_product_path
+        if not product_folder:
+            raise TestSuiteException(self._missing_path_msg)
+
+        app_folder = os.path.join(product_folder, 'data/app')
+
+        cmd = 'install {0} {1}/{2}/{2}.apk'.format(flags, app_folder, app)
+        output = self._android.adb(cmd, False, True,
+                                   util_constants.PUSH_TIMEOUT)
+        if ('Success' not in output) or ("can't find" in output):
+            raise TestSuiteException('unable to install app ' + app)
+
+    def _push_all_java(self):
+        '''Push all apk files to the device.
+
+        This involves uninstalling any old installations and installing again.
+
+        Raises:
+            TestSuiteException: An apk could not be installed.
+        '''
+        for app, package in self._tests_apk.iteritems():
+            self._install_apk(app, package)
+
+    def _push_all_ndk(self):
+        '''Push all ndk binaries to the device.
+
+        Raises:
+            TestSuiteException: A binary could not be pushed to the device or
+                                a previous process could not be killed.
+        '''
+        product_folder = self._aosp_product_path
+        if not product_folder:
+            raise TestSuiteException(self._missing_path_msg)
+
+        bin_folder = os.path.join(product_folder, 'system/bin')
+
+        for app in self._tests_ndk:
+            self._log.info('pushing {0}'.format(app))
+
+            self._android.kill_all_processes(app)
+
+            cmd = 'push %s/%s /data' % (bin_folder, app)
+            output = self._android.adb(cmd, False, True,
+                                       util_constants.PUSH_TIMEOUT)
+            if ('failed to copy' in output or
+                'No such file or directory' in output):
+                raise TestSuiteException('unable to push binary ' + app)
+
+            # be sure to set the execute bit for NDK binaries
+            self._android.shell('chmod 777 /data/{0}'.format(app))
+
+    def _push_all_jni(self):
+        '''Push all JNI apk files to the device.
+
+        This involves uninstalling any old installations and installing again.
+
+        Raises:
+            TestSuiteException: An apk could not be installed.
+        '''
+        product_folder = self._aosp_product_path
+        if not product_folder:
+            raise TestSuiteException(self._missing_path_msg)
+
+        app_folder = os.path.join(product_folder, 'system/lib')
+
+        # Ensure the system/lib directory is writable
+        self._android.make_device_writeable()
+
+        for app, package in self._tests_jni.iteritems():
+            self._install_apk(app, package)
+            output = self._android.adb('push %s/lib%s.so /system/lib' %
+                                       (app_folder, app.lower()), False, True,
+                                       util_constants.PUSH_TIMEOUT)
+            if ("error" in output or
+                "failed to copy" in output):
+                raise TestSuiteException(
+                    'unable to copy %s/lib%s.so to /system/lib: %s'
+                    % (app_folder, app.lower(), output))
+
+    def delete_ndk_cache(self):
+        '''Deletes NDK cached scripts from the device.
+
+        The NDK caches compiled scripts as shared libraries in
+        the folder specified when calling `rs->init()`.
+
+        For all out tests this is set to '/data/rscache'.
+        '''
+        self._android.shell('rm -r /data/rscache')
+
+    def get_package(self, app_name):
+        '''From a given apk name get the name of its package.
+
+        Args:
+            app_name: The string that is the name of the apk.
+
+        Returns:
+            A string representing the name of the package of the app.
+
+        Raises:
+            TestSuiteException: The app name is not in the list of apks.
+        '''
+        if app_name in self._tests_apk:
+            return self._tests_apk[app_name]
+        elif app_name in self._tests_jni:
+            return self._tests_jni[app_name]
+        else:
+            msg = ('unknown app %s. (Do you need to add an '
+                  'entry to bundle.py :: test_apps_?)' % app_name)
+            raise TestSuiteException(msg)
+        return self._tests_apk[app_name]
+
+    def launch(self, app_name):
+        '''Launch an apk/ndk app on a remote device.
+
+        Args:
+            app_name: The string that is the name of the APK or NDK executable.
+
+        Returns:
+            The Process ID of the launched executable, otherwise None
+
+        Raises:
+            TestSuiteException: Previous processes of this apk could not be
+                                killed.
+        '''
+        process_name = ''
+        success = False
+        if app_name in self._tests_apk:
+            process_name = self._tests_apk[app_name]
+
+            self._android.kill_all_processes(process_name)
+
+            success = self._android.launch_app(process_name, 'MainActivity')
+        elif app_name in self._tests_ndk:
+            process_name = app_name
+            self._android.kill_all_processes(process_name)
+            success = self._android.launch_elf(process_name)
+        elif app_name in self._tests_jni:
+            package = self._tests_jni[app_name]
+
+            self._android.kill_process(package)
+
+            success = self._android.launch_app(package, 'MainActivity')
+            if not success:
+                self._log.log_and_print(app_name +
+                    ' is not installed. Try removing the --no-install option?')
+                return None
+
+            # Give the app time to crash if it needs to
+            time.sleep(2)
+            return self._android.find_app_pid(package)
+        else:
+            self._log.error('Executable {0} neither Java nor NDK.'
+                            .format(app_name))
+
+            self._log.fatal('Failed to launch test executable {0}'
+                            .format(app_name))
+            return None
+
+        if not success:
+            self._log.log_and_print(app_name +
+                ' is not installed. Try removing the --no-install option?')
+            return None
+
+        # Give the app time to crash if it needs to
+        time.sleep(20)
+        return self._android.find_app_pid(process_name)
+
+    def check_apps_installed(self, java_only):
+        ''' Check whether all Java/JNI/NDK apps are installed on the device.
+
+        Args:
+            java_only: Boolean to specify whether only the Java apks should be
+                       checked (in case of --wimpy mode for example).
+
+        Raises:
+            TestSuiteException: Not all apps are installed.
+        '''
+        java_and_jni_apks = self._tests_apk.copy()
+
+        if not java_only:
+            java_and_jni_apks.update(self._tests_jni)
+
+        installed = self._android.shell('pm list packages -f')
+
+        for app, package in java_and_jni_apks.iteritems():
+            if package not in installed:
+                raise TestSuiteException('apk %s is not installed.' % app)
+
+        if not java_only:
+            ls_data = self._android.shell('ls /data')
+            for app in self._tests_ndk:
+                if app not in ls_data:
+                    raise TestSuiteException('app %s is not installed.' % app)
diff --git a/tests/lldb/tests/harness/util_constants.py b/tests/lldb/tests/harness/util_constants.py
new file mode 100644
index 0000000..c50793a
--- /dev/null
+++ b/tests/lldb/tests/harness/util_constants.py
@@ -0,0 +1,8 @@
+'''This file contains constants shared between the test suite runner and the
+individual test runner.'''
+
+RC_TEST_OK = 0
+RC_TEST_TIMEOUT = 64
+RC_TEST_ERROR = 65
+RC_TEST_FATAL = 66
+PUSH_TIMEOUT = 60*5
diff --git a/tests/lldb/tests/harness/util_functions.py b/tests/lldb/tests/harness/util_functions.py
new file mode 100644
index 0000000..10e461c
--- /dev/null
+++ b/tests/lldb/tests/harness/util_functions.py
@@ -0,0 +1,36 @@
+'''This file contains utility functions used by both the test suite and the
+single test executor.'''
+
+import os
+import importlib
+import sys
+
+
+def load_py_module(path):
+    '''Load a python file from disk.
+
+    Args:
+        path: String path to python file.
+
+    Returns:
+        python module if success, None otherwise.
+    '''
+    assert isinstance(path, str)
+    try:
+        if not os.path.exists(path):
+            print 'Path does not exist: ' + path
+            return None
+        path = os.path.abspath(path)
+        module_dir, module_file = os.path.split(path)
+        module_name, _ = os.path.splitext(module_file)
+        # adjust sys.path, runtime counterpart of PYTHONPATH, to temporarily
+        # include the folder containing the user configuration module
+        sys.path.append(module_dir)
+        module_obj = importlib.import_module(module_name)
+        sys.path.pop(0)
+        return module_obj
+    except ImportError as err:
+        print str(err)
+        print "Looking in directory "
+        print module_dir
+        return None
diff --git a/tests/lldb/tests/harness/util_lldb.py b/tests/lldb/tests/harness/util_lldb.py
new file mode 100644
index 0000000..3f6d4d5
--- /dev/null
+++ b/tests/lldb/tests/harness/util_lldb.py
@@ -0,0 +1,71 @@
+'''Module that contains the class UtilLLDB, which provides lldb utility
+methods.'''
+
+import util_constants
+
+try:
+    import lldb
+except ImportError:
+    print 'unable to import lldb'
+    print 'please run "lldb -P" and add to $PYTHONPATH'
+    quit(util_constants.RC_TEST_ERROR)
+
+
+class UtilLLDB(object):
+    '''Provides utility methods to interface with lldb's python bindings.'''
+
+    @staticmethod
+    def start():
+        '''Initialise the lldb debugger framework.'''
+        lldb.SBDebugger_Initialize()
+
+    @staticmethod
+    def stop():
+        '''Terminate the lldb debugger framework.
+
+        Raises:
+            AssertionError: If an assertion fails.
+        '''
+        assert lldb
+        lldb.SBDebugger_Terminate()
+
+    @staticmethod
+    def create_debugger():
+        '''Create an lldb debugger instance.
+
+        Returns:
+            The SBDebugger instance that was created.
+
+        Raises:
+            AssertionError: If an assertion fails.
+        '''
+        assert lldb
+        inst = lldb.SBDebugger_Create()
+        inst.SetAsync(False)
+        return inst
+
+    @staticmethod
+    def destroy_debugger(dbg):
+        '''Destroy the lldb debugger instance.
+
+        Args:
+            dbg: Instance of SBDebugger that is to be destroyed.
+
+        Raises:
+            AssertionError: If an assertion fails.
+        '''
+        assert lldb
+        lldb.SBDebugger_Destroy(dbg)
+
+    @staticmethod
+    def get_module():
+        '''Get the lldb module.
+
+        Returns:
+            The lldb module.
+
+        Raises:
+            AssertionError: If an assertion fails.
+        '''
+        assert lldb
+        return lldb
diff --git a/tests/lldb/tests/harness/util_log.py b/tests/lldb/tests/harness/util_log.py
new file mode 100644
index 0000000..fa1b70d
--- /dev/null
+++ b/tests/lldb/tests/harness/util_log.py
@@ -0,0 +1,125 @@
+'''Initialise the Python logging facility for the test suite.
+
+It provides the function to initialise the logging facility and retrieve an
+instance of the logger class. It also contains the definition of the internal
+logger class.
+'''
+from __future__ import print_function
+
+import io
+import sys
+import logging
+
+
+INITIALISED = False
+NAMESPACE = 'RS_LLDB_TESTSUITE'
+
+def initialise(identifier, level=logging.INFO, print_to_stdout=False,
+               file_path=None, file_mode='a'):
+    '''Initialise the logging facility for the test suite.
+
+    This function should be invoked only once, at the start of the program, and
+    before emitting any log.
+
+    Args:
+        identifier: String, a label that will be part of each record. It is
+                    usually the test case name.
+        level: Integer, all messages above this log level will be discarded.
+               Valid values are those recognised by the python logging module:
+               https://docs.python.org/2/library/logging.html#levels .
+        print_to_stdout: Boolean, whether the logs should be redirected to
+                         sys.stdout (true) or stored into a text file (false).
+        file_path: String, path to the text file in which to store the logs.
+                   This option is only meaningful when print_to_stdout = False.
+        file_mode: String, the mode to open the text file. Valid modes are
+                   those recognised by the standard Python `open' function.
+                   This option is only meaningful when print_to_stdout = False.
+
+    Raises:
+        RuntimeError: If the logging has already been initialised
+        ValueError: If the argument "file_path" has not been provided when
+                    print_to_stdout=False
+    '''
+    # pylint: disable=global-statement
+    global INITIALISED
+    if INITIALISED:
+        raise RuntimeError('Already initialised')
+
+    # set the logging class
+    old_logger_class = logging.getLoggerClass()
+    logging.setLoggerClass(RsLogger)
+
+    # initialise the Logger
+    log = logging.getLogger(NAMESPACE)
+    log.setLevel(level) # reject all logs below
+
+    # don't propagate the log records to the logging root
+    log.propagate = False
+
+    # restore the previous class
+    logging.setLoggerClass(old_logger_class)
+
+    # handler
+    if print_to_stdout:
+        handler_default = logging.StreamHandler(sys.stdout)
+    else:
+        if file_path is None:
+            raise ValueError('Missing mandatory argument "file_path"')
+
+        handler_default = logging.FileHandler(file_path, file_mode)
+
+    # Do not filter records in the handler because of the level
+    handler_default.setLevel(logging.NOTSET)
+
+    # format the message
+    handler_default.setFormatter(
+        logging.Formatter(
+            '%(asctime)s [{0}] [%(levelname)s] %(message)s'
+                .format(identifier)
+    ))
+
+    log.addHandler(handler_default)
+
+    INITIALISED = True
+
+
+class RsLogger(logging.getLoggerClass()):
+    '''Internal logging class.
+
+    This is an internal class to enhance the logging facility with the methods
+    "log_and_print" and "seek_to_end".
+    '''
+    # pylint: disable=too-many-public-methods
+
+    def log_and_print(self, msg, level=logging.INFO):
+        '''Print "msg" to stdout and emit a log record.
+
+        Args:
+            msg: The message to emit.
+            level: The level to use. By default it is logging.INFO.
+        '''
+        print(msg)
+        self.log(level, msg)
+
+    def seek_to_end(self):
+        '''Reset the cursor position to the end for all handlers that are
+        Text File managers.'''
+        for hndlr in self.handlers:
+            if isinstance(hndlr, logging.FileHandler):
+                hndlr.stream.seek(0, io.SEEK_END)
+
+
+def get_logger():
+    '''Retrieves the Logger instance related to the testsuite.
+
+    Throws:
+        RuntimeError: If the logging facility has not been initialised with
+                      "initialise" beforehand.
+
+    Returns:
+        An instance of logging.Logger to write the logs.
+    '''
+    if not INITIALISED:
+        raise RuntimeError('Logging facility not initialised')
+
+    return logging.getLogger(NAMESPACE)
diff --git a/tests/lldb/tests/harness/util_timer.py b/tests/lldb/tests/harness/util_timer.py
new file mode 100644
index 0000000..a7b0a26
--- /dev/null
+++ b/tests/lldb/tests/harness/util_timer.py
@@ -0,0 +1,76 @@
+'''Timer utility'''
+
+import threading
+
+
+class Timer(object):
+    '''A Timer utility to execute a callback after a certain interval.'''
+
+    def __init__(self, interval, callback):
+        '''Initialise the Timer without starting it.
+
+        Args:
+            interval: int or float, interval in seconds to count, before
+                invoking the callback
+            callback: function, it handles the function to call once
+                the timeout expires.
+        '''
+
+        # validate input parameters
+        if not isinstance(interval, (int, float)):
+            raise TypeError('Argument "interval" is not a number: '
+                             '{0}'.format(type(interval)))
+        if not callable(callback):
+            raise TypeError('Argument "callback" is not a function: '
+                             '{0}'.format(type(callback)))
+
+        self._timer = None
+        self._callback = callback
+        self._interval = interval
+
+    def _is_running(self):
+        '''Checks whether the timer is executing.
+
+        Returns:
+            boolean, true if the timer is currently running, false otherwise
+        '''
+        return self._timer is not None
+
+    def start(self):
+        '''Starts the timer.
+
+        Returns:
+            self, the Timer instance
+
+        Throws:
+            RuntimeError: if the timer is already running
+        '''
+        if self._is_running():
+            raise RuntimeError('Timer already running')
+
+        self._timer = threading.Timer(self._interval, self._callback)
+        self._timer.start()
+        return self # so that we can perform Timer(...).start()
+
+    def stop(self):
+        '''Stops the timer if it's executing.
+
+        Returns:
+            self, the Timer instance
+        '''
+
+        if self._is_running():
+            self._timer.cancel()
+            self._timer = None
+        return self
+
+    def reset(self):
+        '''Restart the timer.
+
+        Returns:
+            self, the Timer instance
+        '''
+
+        self.stop()
+        self.start()
+        return self
diff --git a/tests/lldb/tests/harness/util_warnings.py b/tests/lldb/tests/harness/util_warnings.py
new file mode 100644
index 0000000..def8e24
--- /dev/null
+++ b/tests/lldb/tests/harness/util_warnings.py
@@ -0,0 +1,44 @@
+'''Redirect the Python warnings into the log.'''
+
+import warnings
+
+from . import util_log
+
+_OLD_WARNINGS_HANDLER = None
+
+
+def redirect_warnings():
+    '''Redirect all warnings issued by warnings::warn to the log.
+
+    By default all python warnings are printed into sys.stderr. This method
+    will force to redirect them into the test suite logger.
+    '''
+
+    # pylint: disable=global-statement
+    global _OLD_WARNINGS_HANDLER
+
+    # Already redirecting?
+    if _OLD_WARNINGS_HANDLER:
+        return None
+
+    _OLD_WARNINGS_HANDLER = warnings.showwarning
+
+    log = util_log.get_logger()
+
+    def _redirect_warnings_to_log(*args):
+        '''Redirect the warnings to the Logger.'''
+        log.warn(warnings.formatwarning(*args).rstrip())
+
+    warnings.showwarning = _redirect_warnings_to_log
+
+
+def restore_warnings():
+    '''Restore the reporting of warnings::warn as before.'''
+
+    # pylint: disable=global-statement
+    global _OLD_WARNINGS_HANDLER
+
+    if _OLD_WARNINGS_HANDLER:
+        warnings.showwarning = _OLD_WARNINGS_HANDLER
+        _OLD_WARNINGS_HANDLER = None
+
diff --git a/tests/lldb/tests/java/test_allocation_dump_1.py b/tests/lldb/tests/java/test_allocation_dump_1.py
new file mode 100644
index 0000000..e04a9de
--- /dev/null
+++ b/tests/lldb/tests/java/test_allocation_dump_1.py
@@ -0,0 +1,324 @@
+'''Module that contains the test TestAllocationDump1.'''
+
+from harness.test_base_remote import TestBaseRemote
+import os
+
+
+class TestAllocationDump1(TestBaseRemote):
+    '''Tests printing the contents of allocations.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            String that is the name of the binary that this test should be run
+            with.
+        '''
+        return 'Allocations'
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test dumping large allocations to file
+        output_file_1 = self.get_tmp_file_path()
+
+        self.try_command('language renderscript allocation dump 1 -f ' +
+                         output_file_1,
+                         ["Results written to '%s'" % output_file_1])
+
+        # Check the file was created
+        self.test_assert(os.path.isfile(output_file_1))
+        os.remove(output_file_1)
+
+        if not wimpy:
+            output_file_2 = self.get_tmp_file_path()
+
+            self.try_command('language renderscript allocation dump 2 -f ' +
+                             output_file_2,
+                             ["Results written to '%s'" % output_file_2])
+
+            self.test_assert(os.path.isfile(output_file_2))
+            os.remove(output_file_2)
+
+        # char
+        self.try_command('language renderscript allocation dump 3',
+                         ['(0, 0, 0) = 0',
+                          '(0, 1, 0) = 1',
+                          '(0, 2, 0) = 2',
+                          '(0, 0, 1) = 3',
+                          '(0, 1, 1) = 4',
+                          '(0, 2, 1) = 5',
+                          '(0, 0, 2) = 6',
+                          '(0, 1, 2) = 7',
+                          '(0, 2, 2) = 8',
+                          '(0, 0, 3) = 9',
+                          '(0, 1, 3) = 10',
+                          '(0, 2, 3) = 11',
+                          '(0, 0, 4) = 12',
+                          '(0, 1, 4) = 13',
+                          '(0, 2, 4) = 14',
+                          '(0, 0, 5) = 15',
+                          '(0, 1, 5) = 16',
+                          '(0, 2, 5) = 17',
+                          '(0, 0, 6) = 18',
+                          '(0, 1, 6) = 19',
+                          '(0, 2, 6) = 20',
+                          '(0, 0, 7) = 21',
+                          '(0, 1, 7) = 22',
+                          '(0, 2, 7) = 23'])
+
+        if not wimpy:
+            # char2
+            self.try_command('language renderscript allocation dump 4',
+                             ['(0, 0, 0) = {0 1}',
+                              '(1, 0, 0) = {2 3}',
+                              '(2, 0, 0) = {4 5}',
+                              '(3, 0, 0) = {6 7}',
+                              '(4, 0, 0) = {8 9}',
+                              '(5, 0, 0) = {10 11}',
+                              '(6, 0, 0) = {12 13}',
+                              '(7, 0, 0) = {14 15}',
+                              '(8, 0, 0) = {16 17}',
+                              '(9, 0, 0) = {18 19}',
+                              '(10, 0, 0) = {20 21}',
+                              '(11, 0, 0) = {22 23}'])
+
+            # char3
+            self.try_command('language renderscript allocation dump 5',
+                             ['(0, 0, 0) = {0 1 2}',
+                              '(1, 0, 0) = {4 5 6}',
+                              '(2, 0, 0) = {8 9 10}',
+                              '(3, 0, 0) = {12 13 14}',
+                              '(4, 0, 0) = {16 17 18}',
+                              '(5, 0, 0) = {20 21 22}'])
+
+            # char4
+            self.try_command('language renderscript allocation dump 6',
+                             ['(0, 0, 0) = {0 1 2 3}',
+                              '(1, 0, 0) = {4 5 6 7}',
+                              '(2, 0, 0) = {8 9 10 11}',
+                              '(3, 0, 0) = {12 13 14 15}',
+                              '(4, 0, 0) = {16 17 18 19}',
+                              '(5, 0, 0) = {20 21 22 23}'])
+
+            # short
+            self.try_command('language renderscript allocation dump 7',
+                             ['(0, 0, 0) = 0',
+                              '(1, 0, 0) = 1',
+                              '(2, 0, 0) = 2',
+                              '(3, 0, 0) = 3',
+                              '(4, 0, 0) = 4',
+                              '(5, 0, 0) = 5',
+                              '(6, 0, 0) = 6',
+                              '(7, 0, 0) = 7',
+                              '(8, 0, 0) = 8',
+                              '(9, 0, 0) = 9',
+                              '(10, 0, 0) = 10',
+                              '(11, 0, 0) = 11',
+                              '(12, 0, 0) = 12',
+                              '(13, 0, 0) = 13',
+                              '(14, 0, 0) = 14',
+                              '(15, 0, 0) = 15',
+                              '(16, 0, 0) = 16',
+                              '(17, 0, 0) = 17',
+                              '(18, 0, 0) = 18',
+                              '(19, 0, 0) = 19',
+                              '(20, 0, 0) = 20',
+                              '(21, 0, 0) = 21',
+                              '(22, 0, 0) = 22',
+                              '(23, 0, 0) = 23'])
+
+            # short2
+            self.try_command('language renderscript allocation dump 8',
+                             ['(0, 0, 0) = {0 1}',
+                              '(1, 0, 0) = {2 3}',
+                              '(2, 0, 0) = {4 5}',
+                              '(3, 0, 0) = {6 7}',
+                              '(4, 0, 0) = {8 9}',
+                              '(5, 0, 0) = {10 11}',
+                              '(0, 0, 1) = {12 13}',
+                              '(1, 0, 1) = {14 15}',
+                              '(2, 0, 1) = {16 17}',
+                              '(3, 0, 1) = {18 19}',
+                              '(4, 0, 1) = {20 21}',
+                              '(5, 0, 1) = {22 23}'])
+
+            # short3
+            self.try_command('language renderscript allocation dump 9',
+                             ['(0, 0, 0) = {0 1 2}',
+                              '(1, 0, 0) = {4 5 6}',
+                              '(2, 0, 0) = {8 9 10}',
+                              '(3, 0, 0) = {12 13 14}',
+                              '(4, 0, 0) = {16 17 18}',
+                              '(5, 0, 0) = {20 21 22}'])
+
+            # short4
+            self.try_command('language renderscript allocation dump 10',
+                             ['(0, 0, 0) = {0 1 2 3}',
+                              '(1, 0, 0) = {4 5 6 7}',
+                              '(2, 0, 0) = {8 9 10 11}',
+                              '(3, 0, 0) = {12 13 14 15}',
+                              '(4, 0, 0) = {16 17 18 19}',
+                              '(5, 0, 0) = {20 21 22 23}'])
+
+            # int
+            self.try_command('language renderscript allocation dump 11',
+                             ['(0, 0, 0) = 0',
+                              '(1, 0, 0) = 1',
+                              '(2, 0, 0) = 2',
+                              '(3, 0, 0) = 3',
+                              '(4, 0, 0) = 4',
+                              '(5, 0, 0) = 5',
+                              '(6, 0, 0) = 6',
+                              '(7, 0, 0) = 7',
+                              '(8, 0, 0) = 8',
+                              '(9, 0, 0) = 9',
+                              '(10, 0, 0) = 10',
+                              '(11, 0, 0) = 11',
+                              '(12, 0, 0) = 12',
+                              '(13, 0, 0) = 13',
+                              '(14, 0, 0) = 14',
+                              '(15, 0, 0) = 15',
+                              '(16, 0, 0) = 16',
+                              '(17, 0, 0) = 17',
+                              '(18, 0, 0) = 18',
+                              '(19, 0, 0) = 19',
+                              '(20, 0, 0) = 20',
+                              '(21, 0, 0) = 21',
+                              '(22, 0, 0) = 22',
+                              '(23, 0, 0) = 23'])
+
+            # int2
+            self.try_command('language renderscript allocation dump 12',
+                             ['(0, 0, 0) = {0 1}',
+                              '(1, 0, 0) = {2 3}',
+                              '(2, 0, 0) = {4 5}',
+                              '(3, 0, 0) = {6 7}',
+                              '(4, 0, 0) = {8 9}',
+                              '(5, 0, 0) = {10 11}',
+                              '(6, 0, 0) = {12 13}',
+                              '(7, 0, 0) = {14 15}',
+                              '(8, 0, 0) = {16 17}',
+                              '(9, 0, 0) = {18 19}',
+                              '(10, 0, 0) = {20 21}',
+                              '(11, 0, 0) = {22 23}'])
+
+            # int3
+            self.try_command('language renderscript allocation dump 13',
+                             ['(0, 0, 0) = {0 1 2}',
+                              '(1, 0, 0) = {4 5 6}',
+                              '(2, 0, 0) = {8 9 10}',
+                              '(0, 1, 0) = {12 13 14}',
+                              '(1, 1, 0) = {16 17 18}',
+                              '(2, 1, 0) = {20 21 22}'])
+            # int4
+            self.try_command('language renderscript allocation dump 14',
+                             ['(0, 0, 0) = {0 1 2 3}',
+                              '(1, 0, 0) = {4 5 6 7}',
+                              '(2, 0, 0) = {8 9 10 11}',
+                              '(3, 0, 0) = {12 13 14 15}',
+                              '(4, 0, 0) = {16 17 18 19}',
+                              '(5, 0, 0) = {20 21 22 23}'])
+
+            # long
+            self.try_command('language renderscript allocation dump 15',
+                             ['(0, 0, 0) = 0',
+                              '(1, 0, 0) = 1',
+                              '(2, 0, 0) = 2',
+                              '(3, 0, 0) = 3',
+                              '(4, 0, 0) = 4',
+                              '(5, 0, 0) = 5',
+                              '(6, 0, 0) = 6',
+                              '(7, 0, 0) = 7',
+                              '(8, 0, 0) = 8',
+                              '(9, 0, 0) = 9',
+                              '(10, 0, 0) = 10',
+                              '(11, 0, 0) = 11',
+                              '(12, 0, 0) = 12',
+                              '(13, 0, 0) = 13',
+                              '(14, 0, 0) = 14',
+                              '(15, 0, 0) = 15',
+                              '(16, 0, 0) = 16',
+                              '(17, 0, 0) = 17',
+                              '(18, 0, 0) = 18',
+                              '(19, 0, 0) = 19',
+                              '(20, 0, 0) = 20',
+                              '(21, 0, 0) = 21',
+                              '(22, 0, 0) = 22',
+                              '(23, 0, 0) = 23'])
+
+            # long2
+            self.try_command('language renderscript allocation dump 16',
+                             ['(0, 0, 0) = {0 1}',
+                              '(1, 0, 0) = {2 3}',
+                              '(2, 0, 0) = {4 5}',
+                              '(3, 0, 0) = {6 7}',
+                              '(4, 0, 0) = {8 9}',
+                              '(5, 0, 0) = {10 11}',
+                              '(6, 0, 0) = {12 13}',
+                              '(7, 0, 0) = {14 15}',
+                              '(8, 0, 0) = {16 17}',
+                              '(9, 0, 0) = {18 19}',
+                              '(10, 0, 0) = {20 21}',
+                              '(11, 0, 0) = {22 23}'])
+
+            # long3
+            self.try_command('language renderscript allocation dump 17',
+                             ['(0, 0, 0) = {0 1 2}',
+                              '(1, 0, 0) = {4 5 6}',
+                              '(2, 0, 0) = {8 9 10}',
+                              '(3, 0, 0) = {12 13 14}',
+                              '(4, 0, 0) = {16 17 18}',
+                              '(5, 0, 0) = {20 21 22}'])
+
+            # long4
+            self.try_command('language renderscript allocation dump 18',
+                             ['(0, 0, 0) = {0 1 2 3}',
+                              '(0, 1, 0) = {4 5 6 7}',
+                              '(0, 2, 0) = {8 9 10 11}',
+                              '(0, 3, 0) = {12 13 14 15}',
+                              '(0, 4, 0) = {16 17 18 19}',
+                              '(0, 5, 0) = {20 21 22 23}'])
+
+            # bool
+            self.try_command('language renderscript allocation dump 19',
+                             ['(0, 0, 0) = false',
+                              '(1, 0, 0) = true',
+                              '(2, 0, 0) = false',
+                              '(3, 0, 0) = true',
+                              '(4, 0, 0) = false',
+                              '(5, 0, 0) = true',
+                              '(6, 0, 0) = false',
+                              '(7, 0, 0) = true',
+                              '(8, 0, 0) = false',
+                              '(9, 0, 0) = true',
+                              '(10, 0, 0) = false',
+                              '(11, 0, 0) = true',
+                              '(12, 0, 0) = false',
+                              '(13, 0, 0) = true',
+                              '(14, 0, 0) = false',
+                              '(15, 0, 0) = true',
+                              '(16, 0, 0) = false',
+                              '(17, 0, 0) = true',
+                              '(18, 0, 0) = false',
+                              '(19, 0, 0) = true',
+                              '(20, 0, 0) = false',
+                              '(21, 0, 0) = true',
+                              '(22, 0, 0) = false',
+                              '(23, 0, 0) = true'])
diff --git a/tests/lldb/tests/java/test_allocation_dump_2.py b/tests/lldb/tests/java/test_allocation_dump_2.py
new file mode 100644
index 0000000..f747894
--- /dev/null
+++ b/tests/lldb/tests/java/test_allocation_dump_2.py
@@ -0,0 +1,589 @@
+'''Module that contains the test TestAllocationDump2'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestAllocationDump2(TestBaseRemote):
+    '''Tests printing the contents of allocations.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'Allocations'
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint del 1',
+                         ['1 breakpoints deleted'])
+
+        # Hit second kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # uchar
+        self.try_command('language renderscript allocation dump 20',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        if not wimpy:
+            # uchar2
+            self.try_command('language renderscript allocation dump 21',
+                             ['(0, 0, 0) = {0x00 0x01}',
+                              '(1, 0, 0) = {0x02 0x03}',
+                              '(0, 1, 0) = {0x04 0x05}',
+                              '(1, 1, 0) = {0x06 0x07}',
+                              '(0, 2, 0) = {0x08 0x09}',
+                              '(1, 2, 0) = {0x0a 0x0b}',
+                              '(0, 3, 0) = {0x0c 0x0d}',
+                              '(1, 3, 0) = {0x0e 0x0f}',
+                              '(0, 4, 0) = {0x10 0x11}',
+                              '(1, 4, 0) = {0x12 0x13}',
+                              '(0, 5, 0) = {0x14 0x15}',
+                              '(1, 5, 0) = {0x16 0x17}'])
+
+            # uchar3
+            self.try_command('language renderscript allocation dump 22',
+                             ['(0, 0, 0) = {0x00 0x01 0x02}',
+                              '(1, 0, 0) = {0x04 0x05 0x06}',
+                              '(2, 0, 0) = {0x08 0x09 0x0a}',
+                              '(3, 0, 0) = {0x0c 0x0d 0x0e}',
+                              '(4, 0, 0) = {0x10 0x11 0x12}',
+                              '(5, 0, 0) = {0x14 0x15 0x16}'])
+
+            # uchar4
+            self.try_command('language renderscript allocation dump 23',
+                             ['(0, 0, 0) = {0x00 0x01 0x02 0x03}',
+                              '(1, 0, 0) = {0x04 0x05 0x06 0x07}',
+                              '(2, 0, 0) = {0x08 0x09 0x0a 0x0b}',
+                              '(3, 0, 0) = {0x0c 0x0d 0x0e 0x0f}',
+                              '(4, 0, 0) = {0x10 0x11 0x12 0x13}',
+                              '(5, 0, 0) = {0x14 0x15 0x16 0x17}'])
+
+            # ushort
+            self.try_command('language renderscript allocation dump 24',
+                             ['(0, 0, 0) = 0',
+                              '(1, 0, 0) = 1',
+                              '(2, 0, 0) = 2',
+                              '(3, 0, 0) = 3',
+                              '(4, 0, 0) = 4',
+                              '(5, 0, 0) = 5',
+                              '(6, 0, 0) = 6',
+                              '(7, 0, 0) = 7',
+                              '(8, 0, 0) = 8',
+                              '(9, 0, 0) = 9',
+                              '(10, 0, 0) = 10',
+                              '(11, 0, 0) = 11',
+                              '(12, 0, 0) = 12',
+                              '(13, 0, 0) = 13',
+                              '(14, 0, 0) = 14',
+                              '(15, 0, 0) = 15',
+                              '(16, 0, 0) = 16',
+                              '(17, 0, 0) = 17',
+                              '(18, 0, 0) = 18',
+                              '(19, 0, 0) = 19',
+                              '(20, 0, 0) = 20',
+                              '(21, 0, 0) = 21',
+                              '(22, 0, 0) = 22',
+                              '(23, 0, 0) = 23'])
+
+            # ushort2
+            self.try_command('language renderscript allocation dump 25',
+                             ['(0, 0, 0) = {0x0000 0x0001}',
+                              '(1, 0, 0) = {0x0002 0x0003}',
+                              '(2, 0, 0) = {0x0004 0x0005}',
+                              '(3, 0, 0) = {0x0006 0x0007}',
+                              '(4, 0, 0) = {0x0008 0x0009}',
+                              '(5, 0, 0) = {0x000a 0x000b}',
+                              '(6, 0, 0) = {0x000c 0x000d}',
+                              '(7, 0, 0) = {0x000e 0x000f}',
+                              '(8, 0, 0) = {0x0010 0x0011}',
+                              '(9, 0, 0) = {0x0012 0x0013}',
+                              '(10, 0, 0) = {0x0014 0x0015}',
+                              '(11, 0, 0) = {0x0016 0x0017}'])
+
+            # ushort3
+            self.try_command('language renderscript allocation dump 26',
+                             ['(0, 0, 0) = {0x0000 0x0001 0x0002}',
+                              '(0, 1, 0) = {0x0004 0x0005 0x0006}',
+                              '(0, 2, 0) = {0x0008 0x0009 0x000a}',
+                              '(0, 3, 0) = {0x000c 0x000d 0x000e}',
+                              '(0, 4, 0) = {0x0010 0x0011 0x0012}',
+                              '(0, 5, 0) = {0x0014 0x0015 0x0016}'])
+
+            # ushort4
+            self.try_command('language renderscript allocation dump 27',
+                             ['(0, 0, 0) = {0x0000 0x0001 0x0002 0x0003}',
+                              '(1, 0, 0) = {0x0004 0x0005 0x0006 0x0007}',
+                              '(2, 0, 0) = {0x0008 0x0009 0x000a 0x000b}',
+                              '(3, 0, 0) = {0x000c 0x000d 0x000e 0x000f}',
+                              '(4, 0, 0) = {0x0010 0x0011 0x0012 0x0013}',
+                              '(5, 0, 0) = {0x0014 0x0015 0x0016 0x0017}'])
+
+            # uint
+            self.try_command('language renderscript allocation dump 28',
+                             ['(0, 0, 0) = 0',
+                              '(1, 0, 0) = 1',
+                              '(2, 0, 0) = 2',
+                              '(3, 0, 0) = 3',
+                              '(4, 0, 0) = 4',
+                              '(5, 0, 0) = 5',
+                              '(6, 0, 0) = 6',
+                              '(7, 0, 0) = 7',
+                              '(8, 0, 0) = 8',
+                              '(9, 0, 0) = 9',
+                              '(10, 0, 0) = 10',
+                              '(11, 0, 0) = 11',
+                              '(12, 0, 0) = 12',
+                              '(13, 0, 0) = 13',
+                              '(14, 0, 0) = 14',
+                              '(15, 0, 0) = 15',
+                              '(16, 0, 0) = 16',
+                              '(17, 0, 0) = 17',
+                              '(18, 0, 0) = 18',
+                              '(19, 0, 0) = 19',
+                              '(20, 0, 0) = 20',
+                              '(21, 0, 0) = 21',
+                              '(22, 0, 0) = 22',
+                              '(23, 0, 0) = 23'])
+
+            # uint2
+            self.try_command('language renderscript allocation dump 29',
+                             ['(0, 0, 0) = {0x00000000 0x00000001}',
+                              '(1, 0, 0) = {0x00000002 0x00000003}',
+                              '(2, 0, 0) = {0x00000004 0x00000005}',
+                              '(3, 0, 0) = {0x00000006 0x00000007}',
+                              '(4, 0, 0) = {0x00000008 0x00000009}',
+                              '(5, 0, 0) = {0x0000000a 0x0000000b}',
+                              '(6, 0, 0) = {0x0000000c 0x0000000d}',
+                              '(7, 0, 0) = {0x0000000e 0x0000000f}',
+                              '(8, 0, 0) = {0x00000010 0x00000011}',
+                              '(9, 0, 0) = {0x00000012 0x00000013}',
+                              '(10, 0, 0) = {0x00000014 0x00000015}',
+                              '(11, 0, 0) = {0x00000016 0x00000017}'])
+
+            # uint3
+            self.try_command('language renderscript allocation dump 30',
+                             ['(0, 0, 0) = {0x00000000 0x00000001 0x00000002}',
+                              '(1, 0, 0) = {0x00000004 0x00000005 0x00000006}',
+                              '(2, 0, 0) = {0x00000008 0x00000009 0x0000000a}',
+                              '(3, 0, 0) = {0x0000000c 0x0000000d 0x0000000e}',
+                              '(4, 0, 0) = {0x00000010 0x00000011 0x00000012}',
+                              '(5, 0, 0) = {0x00000014 0x00000015 0x00000016}'])
+
+            # uint4
+            self.try_command('language renderscript allocation dump 31',
+                             ['(0, 0, 0) = {0x00000000 0x00000001 0x00000002 0x00000003}',
+                              '(0, 0, 1) = {0x00000004 0x00000005 0x00000006 0x00000007}',
+                              '(0, 0, 2) = {0x00000008 0x00000009 0x0000000a 0x0000000b}',
+                              '(0, 0, 3) = {0x0000000c 0x0000000d 0x0000000e 0x0000000f}',
+                              '(0, 0, 4) = {0x00000010 0x00000011 0x00000012 0x00000013}',
+                              '(0, 0, 5) = {0x00000014 0x00000015 0x00000016 0x00000017}'])
+
+            # ulong
+            self.try_command('language renderscript allocation dump 32',
+                             ['(0, 0, 0) = 0',
+                              '(1, 0, 0) = 1',
+                              '(2, 0, 0) = 2',
+                              '(3, 0, 0) = 3',
+                              '(0, 1, 0) = 4',
+                              '(1, 1, 0) = 5',
+                              '(2, 1, 0) = 6',
+                              '(3, 1, 0) = 7',
+                              '(0, 2, 0) = 8',
+                              '(1, 2, 0) = 9',
+                              '(2, 2, 0) = 10',
+                              '(3, 2, 0) = 11',
+                              '(0, 0, 1) = 12',
+                              '(1, 0, 1) = 13',
+                              '(2, 0, 1) = 14',
+                              '(3, 0, 1) = 15',
+                              '(0, 1, 1) = 16',
+                              '(1, 1, 1) = 17',
+                              '(2, 1, 1) = 18',
+                              '(3, 1, 1) = 19',
+                              '(0, 2, 1) = 20',
+                              '(1, 2, 1) = 21',
+                              '(2, 2, 1) = 22',
+                              '(3, 2, 1) = 23'])
+
+            # ulong2
+            self.try_command('language renderscript allocation dump 33',
+                             ['(0, 0, 0) = {0x0000000000000000 0x0000000000000001}',
+                              '(1, 0, 0) = {0x0000000000000002 0x0000000000000003}',
+                              '(2, 0, 0) = {0x0000000000000004 0x0000000000000005}',
+                              '(3, 0, 0) = {0x0000000000000006 0x0000000000000007}',
+                              '(4, 0, 0) = {0x0000000000000008 0x0000000000000009}',
+                              '(5, 0, 0) = {0x000000000000000a 0x000000000000000b}',
+                              '(6, 0, 0) = {0x000000000000000c 0x000000000000000d}',
+                              '(7, 0, 0) = {0x000000000000000e 0x000000000000000f}',
+                              '(8, 0, 0) = {0x0000000000000010 0x0000000000000011}',
+                              '(9, 0, 0) = {0x0000000000000012 0x0000000000000013}',
+                              '(10, 0, 0) = {0x0000000000000014 0x0000000000000015}',
+                              '(11, 0, 0) = {0x0000000000000016 0x0000000000000017}'])
+
+            # ulong3
+            self.try_command('language renderscript allocation dump 34',
+                             ['(0, 0, 0) = {0x0000000000000000 0x0000000000000001 0x0000000000000002}',
+                              '(1, 0, 0) = {0x0000000000000004 0x0000000000000005 0x0000000000000006}',
+                              '(2, 0, 0) = {0x0000000000000008 0x0000000000000009 0x000000000000000a}',
+                              '(3, 0, 0) = {0x000000000000000c 0x000000000000000d 0x000000000000000e}',
+                              '(4, 0, 0) = {0x0000000000000010 0x0000000000000011 0x0000000000000012}',
+                              '(5, 0, 0) = {0x0000000000000014 0x0000000000000015 0x0000000000000016}'])
+
+            # ulong4
+            self.try_command('language renderscript allocation dump 35',
+                             ['(0, 0, 0) = {0x0000000000000000 0x0000000000000001 '
+                                           '0x0000000000000002 0x0000000000000003}',
+                              '(1, 0, 0) = {0x0000000000000004 0x0000000000000005 '
+                                           '0x0000000000000006 0x0000000000000007}',
+                              '(2, 0, 0) = {0x0000000000000008 0x0000000000000009 '
+                                           '0x000000000000000a 0x000000000000000b}',
+                              '(3, 0, 0) = {0x000000000000000c 0x000000000000000d '
+                                           '0x000000000000000e 0x000000000000000f}',
+                              '(4, 0, 0) = {0x0000000000000010 0x0000000000000011 '
+                                           '0x0000000000000012 0x0000000000000013}',
+                              '(5, 0, 0) = {0x0000000000000014 0x0000000000000015 '
+                                           '0x0000000000000016 0x0000000000000017}'])
+
+        self.try_command('breakpoint del 2',
+                         ['1 breakpoints deleted'])
+
+        # Hit third kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test that uint allocation has been squared by square_kernel
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 4',
+                          '(3, 0, 0) = 9',
+                          '(4, 0, 0) = 16',
+                          '(5, 0, 0) = 25',
+                          '(6, 0, 0) = 36',
+                          '(7, 0, 0) = 49',
+                          '(8, 0, 0) = 64',
+                          '(9, 0, 0) = 81',
+                          '(10, 0, 0) = 100',
+                          '(11, 0, 0) = 121',
+                          '(12, 0, 0) = 144',
+                          '(13, 0, 0) = 169',
+                          '(14, 0, 0) = 196',
+                          '(15, 0, 0) = 225',
+                          '(16, 0, 0) = 256',
+                          '(17, 0, 0) = 289',
+                          '(18, 0, 0) = 324',
+                          '(19, 0, 0) = 361',
+                          '(20, 0, 0) = 400',
+                          '(21, 0, 0) = 441',
+                          '(22, 0, 0) = 484',
+                          '(23, 0, 0) = 529'])
+
+        if not wimpy:
+            # half
+            self.try_command('language renderscript allocation dump 36',
+                             ['(0, 0, 0) = 1',
+                              '(1, 0, 0) = 1.00098',
+                              '(2, 0, 0) = 1.00195',
+                              '(3, 0, 0) = 1.00293',
+                              '(4, 0, 0) = 1.00391',
+                              '(5, 0, 0) = 1.00488',
+                              '(6, 0, 0) = 1.00586',
+                              '(7, 0, 0) = 1.00684',
+                              '(8, 0, 0) = 1.00781',
+                              '(9, 0, 0) = 1.00879',
+                              '(10, 0, 0) = 1.00977',
+                              '(11, 0, 0) = 1.01074',
+                              '(12, 0, 0) = 1.01172',
+                              '(13, 0, 0) = 1.0127',
+                              '(14, 0, 0) = 1.01367',
+                              '(15, 0, 0) = 1.01465',
+                              '(16, 0, 0) = 1.0156',
+                              '(17, 0, 0) = 1.0166',
+                              '(18, 0, 0) = 1.01758',
+                              '(19, 0, 0) = 1.01855',
+                              '(20, 0, 0) = 1.01953',
+                              '(21, 0, 0) = 1.02051',
+                              '(22, 0, 0) = 1.02148',
+                              '(23, 0, 0) = 1.02246'])
+
+            # half2
+            self.try_command('language renderscript allocation dump 37',
+                             ['(0, 0, 0) = {1 1.00098}',
+                              '(1, 0, 0) = {1.00195 1.00293}',
+                              '(2, 0, 0) = {1.00391 1.00488}',
+                              '(3, 0, 0) = {1.00586 1.00684}',
+                              '(4, 0, 0) = {1.00781 1.00879}',
+                              '(5, 0, 0) = {1.00977 1.01074}',
+                              '(6, 0, 0) = {1.01172 1.0127}',
+                              '(7, 0, 0) = {1.01367 1.01465}',
+                              '(9, 0, 0) = {1.01758 1.01855}',
+                              '(10, 0, 0) = {1.01953 1.02051}',
+                              '(11, 0, 0) = {1.02148 1.02246}'],
+                              [r'\(8, 0, 0\) = \{1\.0156[23] 1\.0166\}'])
+
+            # half3
+            self.try_command('language renderscript allocation dump 38',
+                             ['(0, 0, 0) = {1 1.00098 1.00195}',
+                              '(0, 1, 0) = {1.00391 1.00488 1.00586}',
+                              '(0, 2, 0) = {1.00781 1.00879 1.00977}',
+                              '(0, 3, 0) = {1.01172 1.0127 1.01367}',
+                              '(0, 5, 0) = {1.01953 1.02051 1.02148}'],
+                            [r'\(0, 4, 0\) = \{1\.0156[23] 1\.0166 1\.01758\}'])
+
+            # half4
+            self.try_command('language renderscript allocation dump 39',
+                             ['(0, 0, 0) = {1 1.00098 1.00195 1.00293}',
+                              '(1, 0, 0) = {1.00391 1.00488 1.00586 1.00684}',
+                              '(2, 0, 0) = {1.00781 1.00879 1.00977 1.01074}',
+                              '(3, 0, 0) = {1.01172 1.0127 1.01367 1.01465}',
+                              '(5, 0, 0) = {1.01953 1.02051 1.02148 1.02246}'],
+                             [r'\(4, 0, 0\) = \{1\.0156[23] 1\.0166 1\.01758 1\.01855\}'])
+
+            # float
+            self.try_command('language renderscript allocation dump 40',
+                             ['(0, 0, 0) = inf',
+                              '(1, 0, 0) = 1',
+                              '(2, 0, 0) = 0.5',
+                              '(3, 0, 0) = 0.333333',
+                              '(4, 0, 0) = 0.25',
+                              '(5, 0, 0) = 0.2',
+                              '(6, 0, 0) = 0.166667',
+                              '(7, 0, 0) = 0.142857',
+                              '(8, 0, 0) = 0.125',
+                              '(9, 0, 0) = 0.111111',
+                              '(10, 0, 0) = 0.1',
+                              '(11, 0, 0) = 0.0909091',
+                              '(12, 0, 0) = 0.0833333',
+                              '(13, 0, 0) = 0.0769231',
+                              '(14, 0, 0) = 0.0714286',
+                              '(15, 0, 0) = 0.0666667',
+                              '(16, 0, 0) = 0.0625',
+                              '(17, 0, 0) = 0.0588235',
+                              '(18, 0, 0) = 0.0555556',
+                              '(19, 0, 0) = 0.0526316',
+                              '(20, 0, 0) = 0.05',
+                              '(21, 0, 0) = 0.047619',
+                              '(22, 0, 0) = 0.0454545',
+                              '(23, 0, 0) = 0.0434783'])
+
+            # float2
+            self.try_command('language renderscript allocation dump 41',
+                             ['(0, 0, 0) = {inf 1}',
+                              '(1, 0, 0) = {0.5 0.333333}',
+                              '(2, 0, 0) = {0.25 0.2}',
+                              '(3, 0, 0) = {0.166667 0.142857}',
+                              '(4, 0, 0) = {0.125 0.111111}',
+                              '(5, 0, 0) = {0.1 0.0909091}',
+                              '(6, 0, 0) = {0.0833333 0.0769231}',
+                              '(7, 0, 0) = {0.0714286 0.0666667}',
+                              '(8, 0, 0) = {0.0625 0.0588235}',
+                              '(9, 0, 0) = {0.0555556 0.0526316}',
+                              '(10, 0, 0) = {0.05 0.047619}',
+                              '(11, 0, 0) = {0.0454545 0.0434783}'])
+
+            # float3
+            self.try_command('language renderscript allocation dump 42',
+                             ['(0, 0, 0) = {inf 1 0.5}',
+                              '(1, 0, 0) = {0.25 0.2 0.166667}',
+                              '(2, 0, 0) = {0.125 0.111111 0.1}',
+                              '(3, 0, 0) = {0.0833333 0.0769231 0.0714286}',
+                              '(4, 0, 0) = {0.0625 0.0588235 0.0555556}',
+                              '(5, 0, 0) = {0.05 0.047619 0.0454545}'])
+
+            # float4
+            self.try_command('language renderscript allocation dump 43',
+                             ['(0, 0, 0) = {inf 1 0.5 0.333333}',
+                              '(1, 0, 0) = {0.25 0.2 0.166667 0.142857}',
+                              '(2, 0, 0) = {0.125 0.111111 0.1 0.0909091}',
+                              '(0, 1, 0) = {0.0833333 0.0769231 0.0714286 0.0666667}',
+                              '(1, 1, 0) = {0.0625 0.0588235 0.0555556 0.0526316}',
+                              '(2, 1, 0) = {0.05 0.047619 0.0454545 0.0434783}'])
+
+            # double
+            self.try_command('language renderscript allocation dump 44',
+                             ['(0, 0, 0) = inf',
+                              '(1, 0, 0) = 1',
+                              '(2, 0, 0) = 0.5',
+                              '(3, 0, 0) = 0.333333333333333',
+                              '(4, 0, 0) = 0.25',
+                              '(5, 0, 0) = 0.2',
+                              '(6, 0, 0) = 0.166666666666667',
+                              '(7, 0, 0) = 0.142857142857143',
+                              '(8, 0, 0) = 0.125',
+                              '(9, 0, 0) = 0.111111111111111',
+                              '(10, 0, 0) = 0.1',
+                              '(11, 0, 0) = 0.0909090909090909',
+                              '(12, 0, 0) = 0.0833333333333333',
+                              '(13, 0, 0) = 0.0769230769230769',
+                              '(14, 0, 0) = 0.0714285714285714',
+                              '(15, 0, 0) = 0.0666666666666667',
+                              '(16, 0, 0) = 0.0625',
+                              '(17, 0, 0) = 0.0588235294117647',
+                              '(18, 0, 0) = 0.0555555555555556',
+                              '(19, 0, 0) = 0.0526315789473684',
+                              '(20, 0, 0) = 0.05',
+                              '(21, 0, 0) = 0.0476190476190476',
+                              '(22, 0, 0) = 0.0454545454545455',
+                              '(23, 0, 0) = 0.0434782608695652'])
+
+            # double2
+            self.try_command('language renderscript allocation dump 45',
+                             ['(0, 0, 0) = {inf 1}',
+                              '(1, 0, 0) = {0.5 0.333333333333333}',
+                              '(2, 0, 0) = {0.25 0.2}',
+                              '(3, 0, 0) = {0.166666666666667 0.142857142857143}',
+                              '(0, 0, 1) = {0.125 0.111111111111111}',
+                              '(1, 0, 1) = {0.1 0.0909090909090909}',
+                              '(2, 0, 1) = {0.0833333333333333 0.0769230769230769}',
+                              '(3, 0, 1) = {0.0714285714285714 0.0666666666666667}',
+                              '(0, 0, 2) = {0.0625 0.0588235294117647}',
+                              '(1, 0, 2) = {0.0555555555555556 0.0526315789473684}',
+                              '(2, 0, 2) = {0.05 0.0476190476190476}',
+                              '(3, 0, 2) = {0.0454545454545455 0.0434782608695652}'])
+
+            # double3
+            self.try_command('language renderscript allocation dump 46',
+                             ['(0, 0, 0) = {inf 1 0.5}',
+                              '(0, 1, 0) = {0.25 0.2 0.166666666666667}',
+                              '(0, 0, 1) = {0.125 0.111111111111111 0.1}',
+                              '(0, 1, 1) = {0.0833333333333333 0.0769230769230769 '
+                                           '0.0714285714285714}',
+                              '(0, 0, 2) = {0.0625 0.0588235294117647 0.0555555555555556}',
+                              '(0, 1, 2) = {0.05 0.0476190476190476 0.0454545454545455}'])
+
+            # double4
+            self.try_command('language renderscript allocation dump 47',
+                             ['(0, 0, 0) = {inf 1 0.5 0.333333333333333}',
+                              '(0, 1, 0) = {0.25 0.2 0.166666666666667 0.142857142857143}',
+                              '(0, 0, 1) = {0.125 0.111111111111111 0.1 0.0909090909090909}',
+                              '(0, 1, 1) = {0.0833333333333333 0.0769230769230769 '
+                                           '0.0714285714285714 0.0666666666666667}',
+                              '(0, 0, 2) = {0.0625 0.0588235294117647 '
+                                           '0.0555555555555556 0.0526315789473684}',
+                              '(0, 1, 2) = {0.05 0.0476190476190476 '
+                                           '0.0454545454545455 0.0434782608695652}'])
+
+        # Delete kernel breakpoint on add_half_kernel
+        self.try_command('breakpoint del 3',
+                         ['1 breakpoints deleted'])
+
+        # Hit struct_kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Double 3 has been modified by add_half_kernel
+        self.try_command('language renderscript allocation dump 46',
+                         ['(0, 0, 0) = {inf 1.5 1}',
+                          '(0, 1, 0) = {0.75 0.7 0.666666666666667}',
+                          '(0, 0, 1) = {0.625 0.611111111111111 0.6}',
+                          '(0, 1, 1) = {0.583333333333333 0.576923076923077 0.571428571428571}',
+                          '(0, 0, 2) = {0.5625 0.558823529411765 0.555555555555556}',
+                          '(0, 1, 2) = {0.55 0.547619047619048 0.545454545454545}'])
+
+        # Floating point allocation data should have been overwritten
+        self.try_command('language renderscript allocation dump 40',
+                         ['(0, 0, 0) = -inf',
+                          '(1, 0, 0) = -1',
+                          '(2, 0, 0) = -0.5',
+                          '(3, 0, 0) = -0.333333',
+                          '(4, 0, 0) = -0.25',
+                          '(5, 0, 0) = -0.2',
+                          '(6, 0, 0) = -0.166667',
+                          '(7, 0, 0) = -0.142857',
+                          '(8, 0, 0) = -0.125',
+                          '(9, 0, 0) = -0.111111',
+                          '(10, 0, 0) = -0.1',
+                          '(11, 0, 0) = -0.0909091',
+                          '(12, 0, 0) = -0.0833333',
+                          '(13, 0, 0) = -0.0769231',
+                          '(14, 0, 0) = -0.0714286',
+                          '(15, 0, 0) = -0.0666667',
+                          '(16, 0, 0) = -0.0625',
+                          '(17, 0, 0) = -0.0588235',
+                          '(18, 0, 0) = -0.0555556',
+                          '(19, 0, 0) = -0.0526316',
+                          '(20, 0, 0) = -0.05',
+                          '(21, 0, 0) = -0.047619',
+                          '(22, 0, 0) = -0.0454545',
+                          '(23, 0, 0) = -0.0434783'])
+
+        self.try_command('language renderscript allocation dump 41',
+                         ['(0, 0, 0) = {-inf -1}',
+                          '(1, 0, 0) = {-0.5 -0.333333}',
+                          '(2, 0, 0) = {-0.25 -0.2}',
+                          '(3, 0, 0) = {-0.166667 -0.142857}',
+                          '(4, 0, 0) = {-0.125 -0.111111}',
+                          '(5, 0, 0) = {-0.1 -0.0909091}',
+                          '(6, 0, 0) = {-0.0833333 -0.0769231}',
+                          '(7, 0, 0) = {-0.0714286 -0.0666667}',
+                          '(8, 0, 0) = {-0.0625 -0.0588235}',
+                          '(9, 0, 0) = {-0.0555556 -0.0526316}',
+                          '(10, 0, 0) = {-0.05 -0.047619}',
+                          '(11, 0, 0) = {-0.0454545 -0.0434783}'])
+
+        self.try_command('language renderscript allocation dump 42',
+                         ['(0, 0, 0) = {-inf -1 -0.5}',
+                          '(1, 0, 0) = {-0.25 -0.2 -0.166667}',
+                          '(2, 0, 0) = {-0.125 -0.111111 -0.1}',
+                          '(3, 0, 0) = {-0.0833333 -0.0769231 -0.0714286}',
+                          '(4, 0, 0) = {-0.0625 -0.0588235 -0.0555556}',
+                          '(5, 0, 0) = {-0.05 -0.047619 -0.0454545}'])
+
+        self.try_command('language renderscript allocation dump 43',
+                         ['(0, 0, 0) = {-inf -1 -0.5 -0.333333}',
+                          '(1, 0, 0) = {-0.25 -0.2 -0.166667 -0.142857}',
+                          '(2, 0, 0) = {-0.125 -0.111111 -0.1 -0.0909091}',
+                          '(0, 1, 0) = {-0.0833333 -0.0769231 -0.0714286 -0.0666667}',
+                          '(1, 1, 0) = {-0.0625 -0.0588235 -0.0555556 -0.0526316}',
+                          '(2, 1, 0) = {-0.05 -0.047619 -0.0454545 -0.0434783}'])
diff --git a/tests/lldb/tests/java/test_allocation_dump_struct.py b/tests/lldb/tests/java/test_allocation_dump_struct.py
new file mode 100644
index 0000000..ee6c2d0
--- /dev/null
+++ b/tests/lldb/tests/java/test_allocation_dump_struct.py
@@ -0,0 +1,160 @@
+'''Module that contains the test TestAllocationDumpStruct.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestAllocationDumpStruct(TestBaseRemote):
+    '''Tests printing the contents of a struct allocation.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            String that is the name of the binary that this test should be run
+            with.
+        '''
+        return 'Allocations'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.'''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.'''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        # pylint: disable=line-too-long
+        # Hit struct_kernel on last coordinate, so almost all elements have been initalised
+        self.try_command('language renderscript kernel breakpoint set struct_kernel -c 23',
+                         ['Conditional kernel breakpoint on coordinate 23, 0, 0',
+                          'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # complex_struct output allocation
+        self.try_command('language renderscript allocation dump 49',
+                         ['(0, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 0, j = 0)\n'
+                          '   (0x00, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 0, [1] = 0.5)\n'
+                          '}',
+                          '(1, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 1, j = 1)\n'
+                          '   (0x01, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 1, [1] = 1.5)\n'
+                          '}',
+                          '(2, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 2, j = 2)\n'
+                          '   (0x02, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 2, [1] = 2.5)\n'
+                          '}',
+                          '(3, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 3, j = 3)\n'
+                          '   (0x03, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 3, [1] = 3.5)\n'
+                          '}',
+                          '(4, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 4, j = 4)\n'
+                          '   (0x04, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 4, [1] = 4.5)\n'
+                          '}',
+                          '(5, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 5, j = 5)\n'
+                          '   (0x05, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 5, [1] = 5.5)\n'
+                          '}',
+                          '(6, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 6, j = 6)\n'
+                          '   (0x06, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 6, [1] = 6.5)\n'
+                          '}',
+                          '(7, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 7, j = 7)\n'
+                          '   (0x07, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 7, [1] = 7.5)\n'
+                          '}',
+                          '(8, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 8, j = 8)\n'
+                          '   (0x08, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 8, [1] = 8.5)\n'
+                          '}',
+                          '(9, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 9, j = 9)\n'
+                          '   (0x09, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 9, [1] = 9.5)\n'
+                          '}',
+                          '(10, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 10, j = 10)\n'
+                          '   (0x0a, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 10, [1] = 10.5)\n'
+                          '}',
+                          '(11, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 11, j = 11)\n'
+                          '   (0x0b, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 11, [1] = 11.5)\n'
+                          '}',
+                          '(12, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 12, j = 12)\n'
+                          '   (0x0c, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 12, [1] = 12.5)\n'
+                          '}',
+                          '(13, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 13, j = 13)\n'
+                          '   (0x0d, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 13, [1] = 13.5)\n'
+                          '}',
+                          '(14, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 14, j = 14)\n'
+                          '   (0x0e, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 14, [1] = 14.5)\n'
+                          '}',
+                          '(15, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 15, j = 15)\n'
+                          '   (0x0f, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 15, [1] = 15.5)\n'
+                          '}',
+                          '(16, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 16, j = 16)\n'
+                          '   (0x10, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 16, [1] = 16.5)\n'
+                          '}',
+                          '(17, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 17, j = 17)\n'
+                          '   (0x11, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 17, [1] = 17.5)\n'
+                          '}',
+                          '(18, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 18, j = 18)\n'
+                          '   (0x12, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 18, [1] = 18.5)\n'
+                          '}',
+                          '(19, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 19, j = 19)\n'
+                          '   (0x13, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 19, [1] = 19.5)\n'
+                          '}',
+                          '(20, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 20, j = 20)\n'
+                          '   (0x14, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 20, [1] = 20.5)\n'
+                          '}',
+                          '(21, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 21, j = 21)\n'
+                          '   (0x15, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 21, [1] = 21.5)\n'
+                          '}',
+                          '(22, 0, 0) = (complexStruct)  {\n'
+                          '   (i = 22, j = 22)\n'
+                          '   (0x16, 0x41, 0x42, 0x43)\n'
+                          '   ([0] = 22, [1] = 22.5)\n'
+                          '}'])
diff --git a/tests/lldb/tests/java/test_allocation_file.py b/tests/lldb/tests/java/test_allocation_file.py
new file mode 100644
index 0000000..84f8b27
--- /dev/null
+++ b/tests/lldb/tests/java/test_allocation_file.py
@@ -0,0 +1,189 @@
+'''Module that contains the test TestAllocationFile.'''
+
+from harness.test_base_remote import TestBaseRemote
+import os
+
+
+class TestAllocationFile(TestBaseRemote):
+    '''Tests saving the contents of allocations to disk and reloading them.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'Allocations'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Binary file of int2 allocation
+        file_int2 = self.get_tmp_file_path()
+
+        self.try_command('language renderscript allocation save 12 ' +
+                         file_int2,
+                         ["Allocation written to file '%s'" % file_int2])
+
+        # Check file was created
+        self.test_assert(os.path.isfile(file_int2))
+
+        # Load the file we just created, to assert the allocation contents are
+        # the same
+        self.try_command('language renderscript allocation load 12 ' +
+                         file_int2,
+                         ["Contents of file '%s' read into allocation 12" %
+                          file_int2])
+        os.remove(file_int2)
+
+        self.try_command('language renderscript allocation dump 12',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(6, 0, 0) = {12 13}',
+                          '(7, 0, 0) = {14 15}',
+                          '(8, 0, 0) = {16 17}',
+                          '(9, 0, 0) = {18 19}',
+                          '(10, 0, 0) = {20 21}',
+                          '(11, 0, 0) = {22 23}'])
+
+        self.try_command('breakpoint del 1',
+                         ['1 breakpoints deleted'])
+
+        # Hit second kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Binary file of uint allocation
+        file_uint = self.get_tmp_file_path()
+
+        self.try_command('language renderscript allocation save 28 ' +
+                         file_uint,
+                         ["Allocation written to file '%s'" % file_uint])
+
+        # Check file was created
+        self.test_assert(os.path.isfile(file_uint))
+
+        # Test loading file into allocation with an incompatible type 'short'
+        self.try_command('language renderscript allocation load 7 ' + file_uint,
+                         ["Contents of file '%s' read into allocation 7" %
+                          file_uint,
+                          "Warning: Mismatched Element sizes",
+                          "Warning: Mismatched Types",
+                          "Warning: Mismatched allocation sizes"])
+
+        # Check result of size inconsistency, mapping 4-byte unsigned to 2-byte
+        # int
+        self.try_command('language renderscript allocation dump 7',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 0',
+                          '(2, 0, 0) = 1',
+                          '(3, 0, 0) = 0',
+                          '(4, 0, 0) = 2',
+                          '(5, 0, 0) = 0',
+                          '(6, 0, 0) = 3',
+                          '(7, 0, 0) = 0',
+                          '(8, 0, 0) = 4',
+                          '(9, 0, 0) = 0',
+                          '(10, 0, 0) = 5',
+                          '(11, 0, 0) = 0',
+                          '(12, 0, 0) = 6',
+                          '(13, 0, 0) = 0',
+                          '(14, 0, 0) = 7',
+                          '(15, 0, 0) = 0',
+                          '(16, 0, 0) = 8',
+                          '(17, 0, 0) = 0',
+                          '(18, 0, 0) = 9',
+                          '(19, 0, 0) = 0',
+                          '(20, 0, 0) = 10',
+                          '(21, 0, 0) = 0',
+                          '(22, 0, 0) = 11',
+                          '(23, 0, 0) = 0'])
+
+        self.try_command('breakpoint del 2',
+                         ['1 breakpoints deleted'])
+
+        # Hit third kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test that uint allocation has been squared by square_kernel
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 4',
+                          '(3, 0, 0) = 9',
+                          '(4, 0, 0) = 16',
+                          '(5, 0, 0) = 25',
+                          '(6, 0, 0) = 36',
+                          '(7, 0, 0) = 49',
+                          '(8, 0, 0) = 64',
+                          '(9, 0, 0) = 81',
+                          '(10, 0, 0) = 100',
+                          '(11, 0, 0) = 121',
+                          '(12, 0, 0) = 144',
+                          '(13, 0, 0) = 169',
+                          '(14, 0, 0) = 196',
+                          '(15, 0, 0) = 225',
+                          '(16, 0, 0) = 256',
+                          '(17, 0, 0) = 289',
+                          '(18, 0, 0) = 324',
+                          '(19, 0, 0) = 361',
+                          '(20, 0, 0) = 400',
+                          '(21, 0, 0) = 441',
+                          '(22, 0, 0) = 484',
+                          '(23, 0, 0) = 529'])
+
+        # Load uint allocation from save before square_kernel had been run
+        self.try_command('language renderscript allocation load 28 ' +
+                         file_uint,
+                         ["Contents of file '%s' read into allocation 28" %
+                          file_uint])
+        os.remove(file_uint)
+
+        # Check contents are back to original
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
diff --git a/tests/lldb/tests/java/test_allocation_list.py b/tests/lldb/tests/java/test_allocation_list.py
new file mode 100644
index 0000000..5641406
--- /dev/null
+++ b/tests/lldb/tests/java/test_allocation_list.py
@@ -0,0 +1,523 @@
+'''Module that contains the test TestAllocationList.'''
+
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestAllocationList(TestBaseRemote):
+    '''Tests printing the details of all allocations.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'Allocations'
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                   this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=anomalous-backslash-in-string
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test command line flag for single allocation
+        self.try_command('language renderscript allocation list -i 3',
+                         [],
+                         ['3:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 3, 8\)\n'
+                          '    Data Type: char\n'
+                          '    Data Kind: User'])
+
+        if not wimpy:
+            self.try_command('language renderscript allocation list',
+                             [],
+                             ['1:\n'
+                             # Regex for non zero hex number
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(64, 64, 0\)\n'
+                              '    Data Type: uchar4\n'
+                              '    Data Kind: RGBA Pixel',
+                              '2:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(64, 64, 0\)\n'
+                              '    Data Type: uchar4\n'
+                              '    Data Kind: RGBA Pixel',
+                              '3:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(1, 3, 8\)\n'
+                              '    Data Type: char\n'
+                              '    Data Kind: User',
+                              '4:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(12, 0, 0\)\n'
+                              '    Data Type: char2\n'
+                              '    Data Kind: User',
+                              '5:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: char3\n'
+                              '    Data Kind: User',
+                              '6:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: char4\n'
+                              '    Data Kind: User',
+                              '7:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: short\n'
+                              '    Data Kind: User',
+                              '8:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 1, 2\)\n'
+                              '    Data Type: short2\n'
+                              '    Data Kind: User',
+                              '9:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: short3\n'
+                              '    Data Kind: User',
+                              '10:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: short4\n'
+                              '    Data Kind: User',
+                              '11:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: int\n'
+                              '    Data Kind: User',
+                              '12:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(12, 0, 0\)\n'
+                              '    Data Type: int2\n'
+                              '    Data Kind: User',
+                              '13:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(3, 2, 0\)\n'
+                              '    Data Type: int3\n'
+                              '    Data Kind: User',
+                              '14:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: int4\n'
+                              '    Data Kind: User',
+                              '15:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: long\n'
+                              '    Data Kind: User',
+                              '16:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(12, 0, 0\)\n'
+                              '    Data Type: long2\n'
+                              '    Data Kind: User',
+                              '17:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: long3\n'
+                              '    Data Kind: User',
+                              '18:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(1, 6, 0\)\n'
+                              '    Data Type: long4\n'
+                              '    Data Kind: User',
+                              '19:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: bool\n'
+                              '    Data Kind: User'
+                             ])
+
+        self.try_command('breakpoint del 1',
+                          ['1 breakpoints deleted'])
+
+        # Hit second kernel
+        self.try_command('process continue',
+                          ['resuming',
+                           'stopped',
+                           'stop reason = breakpoint'])
+
+        if not wimpy:
+            self.try_command('language renderscript allocation list',
+                             [],
+                             ['1:\n'
+                              # Regex for non zero hex number
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(64, 64, 0\)\n'
+                              '    Data Type: uchar4\n'
+                              '    Data Kind: RGBA Pixel',
+                              '2:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(64, 64, 0\)\n'
+                              '    Data Type: uchar4\n'
+                              '    Data Kind: RGBA Pixel',
+                              '7:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: short\n'
+                              '    Data Kind: User',
+                              '20:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: uchar\n'
+                              '    Data Kind: User',
+                              '21:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(2, 6, 0\)\n'
+                              '    Data Type: uchar2\n'
+                              '    Data Kind: User',
+                              '22:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: uchar3\n'
+                              '    Data Kind: User',
+                              '23:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: uchar4\n'
+                              '    Data Kind: User',
+                              '24:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: ushort\n'
+                              '    Data Kind: User',
+                              '25:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(12, 0, 0\)\n'
+                              '    Data Type: ushort2\n'
+                              '    Data Kind: User',
+                              '26:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(1, 6, 0\)\n'
+                              '    Data Type: ushort3\n'
+                              '    Data Kind: User',
+                              '27:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: ushort4\n'
+                              '    Data Kind: User',
+                              '28:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: uint\n'
+                              '    Data Kind: User',
+                              '29:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(12, 0, 0\)\n'
+                              '    Data Type: uint2\n'
+                              '    Data Kind: User',
+                              '30:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: uint3\n'
+                              '    Data Kind: User',
+                              '31:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(1, 1, 6\)\n'
+                              '    Data Type: uint4\n'
+                              '    Data Kind: User',
+                              '32:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(4, 3, 2\)\n'
+                              '    Data Type: ulong\n'
+                              '    Data Kind: User',
+                              '33:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(12, 0, 0\)\n'
+                              '    Data Type: ulong2\n'
+                              '    Data Kind: User',
+                              '34:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: ulong3\n'
+                              '    Data Kind: User',
+                              '35:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: ulong4\n'
+                              '    Data Kind: User'
+                             ])
+
+        self.try_command('breakpoint del 2',
+                         ['1 breakpoints deleted'])
+
+        # Hit third kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        if not wimpy:
+            self.try_command('language renderscript allocation list',
+                             [],
+                             ['1:\n'
+                              # Regex for non zero hex number
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(64, 64, 0\)\n'
+                              '    Data Type: uchar4\n'
+                              '    Data Kind: RGBA Pixel',
+                              '2:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(64, 64, 0\)\n'
+                              '    Data Type: uchar4\n'
+                              '    Data Kind: RGBA Pixel',
+                              '7:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: short\n'
+                              '    Data Kind: User',
+                              '28:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: uint\n'
+                              '    Data Kind: User',
+                              '36:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: half\n'
+                              '    Data Kind: User',
+                              '37:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(12, 0, 0\)\n'
+                              '    Data Type: half2\n'
+                              '    Data Kind: User',
+                              '38:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(1, 6, 0\)\n'
+                              '    Data Type: half3\n'
+                              '    Data Kind: User',
+                              '39:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: half4\n'
+                              '    Data Kind: User',
+                              '40:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: float\n'
+                              '    Data Kind: User',
+                              '41:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(12, 0, 0\)\n'
+                              '    Data Type: float2\n'
+                              '    Data Kind: User',
+                              '42:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(6, 0, 0\)\n'
+                              '    Data Type: float3\n'
+                              '    Data Kind: User',
+                              '43:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(3, 2, 0\)\n'
+                              '    Data Type: float4\n'
+                              '    Data Kind: User',
+                              '44:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(24, 0, 0\)\n'
+                              '    Data Type: double\n'
+                              '    Data Kind: User',
+                              '45:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(4, 1, 3\)\n'
+                              '    Data Type: double2\n'
+                              '    Data Kind: User',
+                              '46:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(1, 2, 3\)\n'
+                              '    Data Type: double3\n'
+                              '    Data Kind: User',
+                              '47:\n'
+                              '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                              '    Dimensions: \(1, 2, 3\)\n'
+                              '    Data Type: double4\n'
+                              '    Data Kind: User'])
+
+        self.try_command('breakpoint del 3',
+                         ['1 breakpoints deleted'])
+
+        # Hit last kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('language renderscript allocation list',
+                         [],
+                         ['1:\n'
+                          # Regex for non zero hex number
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '2:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '7:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: short\n'
+                          '    Data Kind: User',
+                          '28:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: uint\n'
+                          '    Data Kind: User',
+                          '46:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 2, 3\)\n'
+                          '    Data Type: double3\n'
+                          '    Data Kind: User',
+                          '48:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: complexStruct\n'
+                          '    Data Kind: User',
+                          '49:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: complexStruct\n'
+                          '    Data Kind: User'])
diff --git a/tests/lldb/tests/java/test_backtrace.py b/tests/lldb/tests/java/test_backtrace.py
new file mode 100644
index 0000000..5c532c4
--- /dev/null
+++ b/tests/lldb/tests/java/test_backtrace.py
@@ -0,0 +1,72 @@
+'''Module that contains the test TestBacktrace.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBacktrace(TestBaseRemote):
+    '''Tests breaking on a kernel and a function, and viewing the call stack.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'BranchingFunCalls'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          # We should be able to see three functions in bt:
+                          # libRSCpuRef, kernel.expand and the kernel
+                          'frame #2:',
+                          'librs.scalars.so',
+                          'simple_kernel'],
+                         [r'scalars\.rs:4[567]'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('b set_i',
+                         ['Breakpoint 2',
+                          'set_i'],
+                         [r'scalars\.rs:2[012]'])
+
+        self.try_command('breakpoint list',
+                         ['set_i', 'resolved'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          # We should be able to see five functions in bt:
+                          # libRSCpuRef, kernel.expand, kernel and two functions
+                          'frame #4:',
+                          'librs.scalars.so',
+                          'modify_i',
+                          'set_i'],
+                         [r'scalars\.rs:2[012]'])
diff --git a/tests/lldb/tests/java/test_breakpoint_coordinate.py b/tests/lldb/tests/java/test_breakpoint_coordinate.py
new file mode 100644
index 0000000..1709301
--- /dev/null
+++ b/tests/lldb/tests/java/test_breakpoint_coordinate.py
@@ -0,0 +1,165 @@
+'''Module that contains the test TestBreakpointCoordinate.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointCoordinate(TestBaseRemote):
+    '''Tests breaking on a specific kernel invocation.
+
+    Uses the -c option to specify the coordinate.
+    '''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'Allocations'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.pop_prop('debug.rs.max-threads')
+
+    def _check_coordinates(self, (x_coord, y_coord, z_coord), kernel):
+        '''Run lldb commands to check that coordinates match expected values.
+
+        Args:
+            (x_coord, y_coord, z_coord): The expected coordinates.
+            kernel: String that is the name of the kernel function.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          'frame #0:',
+                          'librs.allocs.so`%s' % kernel])
+
+        self.try_command('language renderscript kernel coordinate',
+                         ['Coordinate: (%d, %d, %d)'
+                          % (x_coord, y_coord, z_coord)])
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                   this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        if not wimpy:
+            # Test conditional coordinate in a two dimensions
+            self.try_command('language renderscript kernel breakpoint set swizzle_kernel -c 3,7',
+                             ['Conditional kernel breakpoint on coordinate 3, 7, 0',
+                              'Breakpoint(s) created'])
+
+            # We will delete this breakpoint before we hit it.
+            self.try_command('language renderscript kernel breakpoint set swizzle_kernel -c 199,199',
+                            ['Conditional kernel breakpoint on coordinate 199, 199, 0',
+                             'Breakpoint(s) created'])
+
+            self.try_command('process continue',
+                             ['resuming',
+                              'stopped',
+                              'stop reason = breakpoint'])
+
+            self._check_coordinates((3, 7, 0), 'swizzle_kernel')
+
+            # Check breakpoints that have been hit are disabled
+            self.try_command('breakpoint list',
+                             ["1: RenderScript kernel breakpoint for 'swizzle_kernel', locations = 1 Options: disabled",
+                              "2: RenderScript kernel breakpoint for 'swizzle_kernel', locations = 1, resolved = 1"])
+
+            # Delete breakpoint on 199,199,0
+            self.try_command('breakpoint delete 2',
+                             ['1 breakpoints deleted'])
+
+            # Test conditional coordinate in a single dimension
+            self.try_command('language renderscript kernel breakpoint set square_kernel -c 8',
+                            ['Conditional kernel breakpoint on coordinate 8, 0, 0',
+                             'Breakpoint(s) created'])
+
+            self.try_command('process continue',
+                             ['resuming',
+                              'stopped',
+                              'stop reason = breakpoint'])
+
+            self._check_coordinates((8, 0, 0), 'square_kernel')
+
+        # Test conditional coordinate in three dimensions
+        self.try_command('language renderscript kernel breakpoint set add_half_kernel -c 0,0,1',
+                        ['Conditional kernel breakpoint on coordinate 0, 0, 1',
+                         'Breakpoint(s) created'])
+
+        # Test we can set more than one conditional kernel breakpoint and both
+        # will be hit
+        self.try_command('language renderscript kernel breakpoint set add_half_kernel -c 0,1,2',
+                        ['Conditional kernel breakpoint on coordinate 0, 1, 2',
+                         'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((0, 0, 1), 'add_half_kernel')
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((0, 1, 2), 'add_half_kernel')
+
+        # Check we can see the coordinate from a function invoked by the kernel
+        self.try_command('break set -n half_helper',
+                         ['librs.allocs.so`half_helper'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((0, 1, 2), 'half_helper')
+
+        # Delete helper function breakpoint
+        if wimpy:
+            self.try_command('breakpoint delete 3',
+                             ['1 breakpoints deleted'])
+        else:
+            self.try_command('breakpoint delete 6',
+                             ['1 breakpoints deleted'])
+
+        # Check our delete breakpoints have been removed
+        if wimpy:
+            self.try_command('breakpoint list',
+                             ["1: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled",
+                              "2: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled"])
+        else:
+            # Delete breakpoint which has already been disabled
+            self.try_command('breakpoint delete 1',
+                             ['1 breakpoints deleted'])
+
+            self.try_command('breakpoint list',
+                             ["3: RenderScript kernel breakpoint for 'square_kernel', locations = 1 Options: disabled",
+                              "4: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled",
+                              "5: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled"])
diff --git a/tests/lldb/tests/java/test_breakpoint_fileline.py b/tests/lldb/tests/java/test_breakpoint_fileline.py
new file mode 100644
index 0000000..175dc44
--- /dev/null
+++ b/tests/lldb/tests/java/test_breakpoint_fileline.py
@@ -0,0 +1,54 @@
+'''Module that contains the test TestBreakpointFileLine.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointFileLine(TestBaseRemote):
+    '''Tests the setting of a breakpoint on a specific line of a RS file.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JavaDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --file simple.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         [])
+
+        self.try_command('bt',
+                         ['librs.simple.so',
+                          'simple_kernel',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ['simple.rs',
+                          'resolved = 1'])
+
+        self.try_command('process status',
+                         ['stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command(
+            'language renderscript kernel breakpoint set simple_kernel',
+            ['where = librs.simple.so`simple_kernel',
+             'Breakpoint(s) created'])
+
+        self.try_command('breakpoint list',
+                         [])
diff --git a/tests/lldb/tests/java/test_breakpoint_fileline_multiple_rs_files.py b/tests/lldb/tests/java/test_breakpoint_fileline_multiple_rs_files.py
new file mode 100644
index 0000000..78993ae
--- /dev/null
+++ b/tests/lldb/tests/java/test_breakpoint_fileline_multiple_rs_files.py
@@ -0,0 +1,63 @@
+'''Module that contains the test TestBreakpointFileLineMultipleRSFiles.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointFileLineMultipleRSFiles(TestBaseRemote):
+    '''Tests the setting of a breakpoint on one of multiple RS files.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'MultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --file first.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.first.so`first_kernel',
+                          'at first.rs:12',
+                          "name = 'multiplersfiles'",
+                          'stop reason = breakpoint 1'])
+
+        self.try_command('breakpoint set --file second.rs --line 7',
+                         ['Breakpoint 2',
+                          'librs.second.so`second_kernel',
+                          'second.rs:7'])
+
+        self.try_command('breakpoint list',
+                         ['first.rs',
+                          'second.rs',
+                          'resolved = 1',
+                          'first.rs:12',
+                          'second.rs:7'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.second.so`second_kernel',
+                          'at second.rs:7',
+                          "name = 'multiplersfiles'",
+                          'stop reason = breakpoint 2'])
+
+        self.try_command('process status',
+                         ['stopped',
+                          'stop reason = breakpoint'])
diff --git a/tests/lldb/tests/java/test_breakpoint_kernel_1.py b/tests/lldb/tests/java/test_breakpoint_kernel_1.py
new file mode 100644
index 0000000..d365759
--- /dev/null
+++ b/tests/lldb/tests/java/test_breakpoint_kernel_1.py
@@ -0,0 +1,77 @@
+'''Module that contains the test TestBreakpointKernel1.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernel1(TestBaseRemote):
+    '''Tests the setting of a breakpoint on a RS kernel.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JavaDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        # Try set a breakpoint on a kernel which doesn't exist
+        self.try_command('language renderscript kernel breakpoint set imaginary_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 0 (pending)",
+                          "'imaginary_kernel', locations = 0 (pending)"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          'frame #0:',
+                          'librs.simple.so',
+                          'simple_kernel'])
+
+        self.try_command('breakpoint list',
+                         ["'imaginary_kernel', locations = 0 (pending)",
+                          "'simple_kernel', locations = 1, resolved = 1"])
+
+        # Delete breakpoint on kernel which doesn't exist
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ['No breakpoints currently set'])
diff --git a/tests/lldb/tests/java/test_breakpoint_kernel_2.py b/tests/lldb/tests/java/test_breakpoint_kernel_2.py
new file mode 100644
index 0000000..bed4d8b
--- /dev/null
+++ b/tests/lldb/tests/java/test_breakpoint_kernel_2.py
@@ -0,0 +1,48 @@
+'''Module that contains the test TestBreakpointKernel2.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernel2(TestBaseRemote):
+    '''Tests the setting of a breakpoint on a RS kernel.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JavaInfiniteLoop'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          'frame #0:',
+                          'librs.infiniteloop.so',
+                          'simple_kernel'],
+                         [r'infiniteloop\.rs:2[78]'])
+
+        self.try_command('breakpoint list',
+                         ['simple_kernel',
+                          'resolved = 1'])
+
+        self.try_command('process status',
+                         ['stopped',
+                          '.so`simple_kernel',
+                          'stop reason = breakpoint'])
diff --git a/tests/lldb/tests/java/test_breakpoint_kernel_all.py b/tests/lldb/tests/java/test_breakpoint_kernel_all.py
new file mode 100644
index 0000000..4101bec
--- /dev/null
+++ b/tests/lldb/tests/java/test_breakpoint_kernel_all.py
@@ -0,0 +1,75 @@
+'''Module that contains the test TestBreakpointKernelAll.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernelAll(TestBaseRemote):
+    '''Tests setting breakpoints on every RS kernel.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JavaDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # Test command works with no kernels currently loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1",
+                          "'other_kernel', locations = 1, resolved = 1"])
+
+        # Check disable doesn't delete breakpoints
+        self.try_command('language renderscript kernel breakpoint all disable',
+                         ['Breakpoints will not be set on any new kernels'])
+
+        # Delete all breakpoints manually
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["No breakpoints currently set"])
+
+        # Test command works when kernels are loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1",
+                          "'other_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 3',
+                         ['1 breakpoints deleted'])
+
+        # Check other_kernel breakpoint gets hit
+        self.try_command('breakpoint list',
+                         ["'other_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
diff --git a/tests/lldb/tests/java/test_breakpoint_kernel_all_multiple_rs_files.py b/tests/lldb/tests/java/test_breakpoint_kernel_all_multiple_rs_files.py
new file mode 100644
index 0000000..cd7ebb6
--- /dev/null
+++ b/tests/lldb/tests/java/test_breakpoint_kernel_all_multiple_rs_files.py
@@ -0,0 +1,75 @@
+'''Module that contains the test TestBreakpointKernelAllMultipleRSFiles.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernelAllMultipleRSFiles(TestBaseRemote):
+    '''Tests setting breakpoints on every RS kernel in multiple kernel files.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'MultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # Test command works with no kernels currently loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1",
+                          "'second_kernel', locations = 1, resolved = 1"])
+
+        # Check disable doesn't delete breakpoints
+        self.try_command('language renderscript kernel breakpoint all disable',
+                         ['Breakpoints will not be set on any new kernels'])
+
+        # Delete all breakpoints manually
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["No breakpoints currently set"])
+
+        # Test command works when kernels are loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1",
+                          "'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 3',
+                         ['1 breakpoints deleted'])
+
+        # Check other_kernel breakpoint gets hit
+        self.try_command('breakpoint list',
+                         ["'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
diff --git a/tests/lldb/tests/java/test_breakpoint_kernel_multiple_rs_files.py b/tests/lldb/tests/java/test_breakpoint_kernel_multiple_rs_files.py
new file mode 100644
index 0000000..d2e1c99
--- /dev/null
+++ b/tests/lldb/tests/java/test_breakpoint_kernel_multiple_rs_files.py
@@ -0,0 +1,70 @@
+'''Module that contains the test TestBreakpointKernelMultipleRSFiles.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestBreakpointKernelMultipleRSFiles(TestBaseRemote):
+    '''Tests the setting of a breakpoint on RS kernels in multiple files.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'MultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript kernel breakpoint set first_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 0 (pending)"])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.first.so`first_kernel',
+                          "name = 'multiplersfiles'",
+                          'stop reason = breakpoint 1'],
+                          [r'at first\.rs:1[012]'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('language renderscript kernel breakpoint set second_kernel',
+                         ['Breakpoint(s) created',
+                          'Breakpoint 2',
+                          'Breakpoint(s) created'],
+                          [r"librs\.second\.so`second_kernel at second\.rs:[56]",])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1",
+                          "'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint',
+                          "librs.second.so`second_kernel"],
+                          [r'second\.rs:[56]'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ['No breakpoints currently set'])
diff --git a/tests/lldb/tests/java/test_call_api_funs.py b/tests/lldb/tests/java/test_call_api_funs.py
new file mode 100644
index 0000000..4b505a5
--- /dev/null
+++ b/tests/lldb/tests/java/test_call_api_funs.py
@@ -0,0 +1,146 @@
+'''Module that contains the test TestCallApiFuns.'''
+
+from harness.test_base_remote import TestBaseRemote
+from harness import RS_funs
+
+
+class TestCallApiFuns(TestBaseRemote):
+    '''Tests calling of some RS API functions. This tests that JITing works.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test
+            can be run with.
+        '''
+        return "KernelVariables"
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                   this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test the atomics separately because we want to check the output
+        # AtomicAdd(1234, 2)
+        self.try_command('expr rsAtomicAdd(&int_global, 2)',
+                         ['1234'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '1236'])
+
+        # AtomicAnd(2345, 333)
+        self.try_command('expr rsAtomicAnd(&uint_global, 333)',
+                         ['2345'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '265'])
+
+        # AtomicCas(1236, 1236, 2345)
+        self.try_command('expr rsAtomicCas(&int_global, 1236, 2345)',
+                         ['1236'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '2345'])
+
+        # AtomicDec(265)
+        self.try_command('expr rsAtomicDec(&uint_global)',
+                         ['265'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '264'])
+
+        # AtomicInc(2345)
+        self.try_command('expr rsAtomicInc(&int_global)',
+                         ['2345'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '2346'])
+
+        # AtomicMax(264, 3456)
+        self.try_command('expr rsAtomicMax(&uint_global, 3456)',
+                         ['264'],
+                         [r'\(uint(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '3456'])
+
+        # AtomicMin(2346, 3)
+        self.try_command('expr rsAtomicMin(&int_global, 3)',
+                         ['2346'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '3'])
+
+        # AtomicOr(3, 456)
+        self.try_command('expr rsAtomicOr(&int_global, 456)',
+                         ['3'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '459'])
+
+        # AtomicSub(3456, 7)
+        self.try_command('expr rsAtomicSub(&uint_global, 7)',
+                         ['3456'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '3449'])
+
+        # AtomicXor(459, 89)
+        self.try_command('expr rsAtomicXor(&int_global, 89)',
+                         ['459'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '402'])
+
+        count = 0
+        for line in RS_funs.FUNC_LIST:
+            count += 1
+            if wimpy and not count % 10 == 0:
+                continue
+
+            # build the expression
+            ret, expr = RS_funs.build_expr(line)
+            # query return type table
+            if ret in RS_funs.TYPE_MAP:
+                # evaluate the expression
+                self.try_command(expr, [], [RS_funs.TYPE_MAP[ret]])
+            else:
+                # evaluate the expression
+                self.try_command(expr, '('+ret+')')
diff --git a/tests/lldb/tests/java/test_coordinates.py b/tests/lldb/tests/java/test_coordinates.py
new file mode 100644
index 0000000..844e81f
--- /dev/null
+++ b/tests/lldb/tests/java/test_coordinates.py
@@ -0,0 +1,108 @@
+'''Module that contains the test TestCoordinates.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestCoordinates(TestBaseRemote):
+    '''Tests the inspection of coordinates.
+
+    Tests the inspection of the range and dimension of coordinates as well
+    as the current coordinates.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JavaDebugWaitAttach'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        # Check the initial conditions.
+        self._lldb_continue()
+        self._inspect_coordinates((0, 0, 0))
+
+        # Check two more steps.
+        self._lldb_continue()
+        self._inspect_coordinates((1, 0, 0))
+        self._lldb_continue()
+        self._inspect_coordinates((2, 0, 0))
+
+        # After eight more steps we should have advanced one step in the y dimension.
+        for _ in range(8):
+            self._lldb_continue()
+        self._inspect_coordinates((2, 1, 0))
+
+    def _lldb_continue(self):
+        '''Try 'continue' lldb command. Expect to hit a breakpoint.'''
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+    def _inspect_coordinates(self, (x_coord, y_coord, z_coord)):
+        '''Run lldb commands to inspect kernel size and coordinates
+        and match against expected values.
+
+        Args:
+            (x_coord, y_coord, z_coord): The expected coordinates (int triple)
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript kernel coordinate',
+                         ['Coordinate: (%d, %d, %d)'
+                          % (x_coord, y_coord, z_coord)])
+
+        self.try_command('frame select 1',
+                         ['librs.simple.so`simple_kernel.expand',
+                         'at generated.rs:1'])
+
+        # Inspect the invocation length, should be the same every time.
+        self.try_command('expr p->dim',
+                         ['x = 8',
+                          'y = 8',
+                          'z = 0'])
+
+        # The X coordinate is in the rsIndex variable.
+        self.try_command('expr rsIndex',
+                          ['= ' + str(x_coord)])
+
+        # Inspect the Y and Z coordinates.
+        self.try_command('expr p->current',
+                         ['x = ' + str(0),
+                          'y = ' + str(y_coord),
+                          'z = ' + str(z_coord)])
diff --git a/tests/lldb/tests/java/test_dwarf_lang.py b/tests/lldb/tests/java/test_dwarf_lang.py
new file mode 100644
index 0000000..5aa4c40
--- /dev/null
+++ b/tests/lldb/tests/java/test_dwarf_lang.py
@@ -0,0 +1,29 @@
+'''Module that contains the test DWARF language attribute test.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestDWARFLang(TestBaseRemote):
+    '''Tests the DWARF language attribute is present in RenderScript kernels.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JavaDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status', [])
+        self.try_command('b simple_kernel', [])
+        self.try_command('process continue', [])
+
+        self.assert_lang_renderscript()
diff --git a/tests/lldb/tests/java/test_invoke_fun.py b/tests/lldb/tests/java/test_invoke_fun.py
new file mode 100644
index 0000000..0e67823
--- /dev/null
+++ b/tests/lldb/tests/java/test_invoke_fun.py
@@ -0,0 +1,49 @@
+'''Module that contains the test TestInvokeFun.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestInvokeFun(TestBaseRemote):
+    '''Tests debugging a function executed from Java using invoke_*.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            String that is the name of the binary that this test should be run
+            with.
+        '''
+        return "BranchingFunCalls"
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --name addToGlobal',
+                         ['Breakpoint 1', '(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'stop reason = breakpoint'],
+                         [r'scalars\.rs:5[789]'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint 2', 'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'stop reason = breakpoint',
+                          'simple_kernel'],
+                         [r'scalars\.rs:4[567]'])
+
+        self.try_command('expr glob',
+                         ['(int)',
+                          '357'])
diff --git a/tests/lldb/tests/java/test_language.py b/tests/lldb/tests/java/test_language.py
new file mode 100644
index 0000000..aaba524
--- /dev/null
+++ b/tests/lldb/tests/java/test_language.py
@@ -0,0 +1,55 @@
+'''Module that contains the test TestLanguage.'''
+
+from harness.test_base import TestBase
+
+
+class TestLanguage(TestBase):
+    '''Tests the "language" command and "language renderscript" subcommand.
+
+    This doesn't require a binary to be running.
+    '''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return None
+
+    def run(self, dbg, _, lldb, _unused):
+        '''Execute the test case.
+
+        Args:
+            dbg: The instance of the SBDebugger that is used to test commands.
+            lldb: A handle to the lldb module.
+
+        Returns:
+            True: test passed, False: test failed.
+        '''
+        assert dbg
+        assert lldb
+
+        self._lldb = lldb
+
+        try:
+            self._ci = dbg.GetCommandInterpreter()
+            assert self._ci
+
+            if (not self._ci.IsValid() or
+                not self._ci.HasCommands() or
+                not self._ci.CommandExists('language')):
+                return False
+
+            self.try_command('language', ['renderscript'])
+
+            self.try_command('language renderscript', ['kernel',
+                                                       'context',
+                                                       'module',
+                                                       'status'])
+
+        except self.TestFail:
+            return False
+
+        return True
diff --git a/tests/lldb/tests/java/test_language_subcmds.py b/tests/lldb/tests/java/test_language_subcmds.py
new file mode 100644
index 0000000..92e33a3
--- /dev/null
+++ b/tests/lldb/tests/java/test_language_subcmds.py
@@ -0,0 +1,132 @@
+'''Module that contains the test TestLanguageSubcmds.'''
+
+import os
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestLanguageSubcmds(TestBaseRemote):
+    '''Tests the 'language renderscript' subcommands.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JavaDebugWaitAttach'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.'''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.'''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.'''
+        self.try_command('language',
+                         [])
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered',
+                          'Runtime functions hooked',
+                          'rsdAllocationInit',
+                          'rsdAllocationRead2D',
+                          'rsdScriptInit',
+                          'rsdScriptInvokeForEach',
+                          'rsdScriptInvokeForEachMulti',
+                          'rsdScriptSetGlobalVar'])
+
+        self.try_command('breakpoint set --file simple.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         [])
+
+        self.try_command('language renderscript kernel',
+                         ['breakpoint',
+                          'coordinate',
+                          'list'])
+
+        self.try_command('language renderscript kernel breakpoint',
+                         ['all',
+                          'set'])
+
+        self.try_command('language renderscript kernel list',
+                         ['RenderScript Kernels',
+                          "Resource 'simple'",
+                          'root',
+                          'simple_kernel'])
+
+        self.try_command('language renderscript kernel coordinate',
+                         ['Coordinate: (0, 0, 0)'])
+
+        self.try_command('language renderscript context',
+                         ['dump'])
+
+        self.try_command('language renderscript context dump',
+                         ['Inferred RenderScript Contexts',
+                          '1 script instances'])
+
+        self.try_command('language renderscript allocation',
+                         ['list',
+                          'load',
+                          'save',
+                          'dump',
+                          'refresh'])
+
+        self.try_command('language renderscript allocation list',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list -i 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list --id 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation dump 1',
+                         ['Data (X, Y, Z):'])
+
+        output_file = self.get_tmp_file_path()
+        self.try_command('language renderscript allocation dump 1 -f ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        if os.path.isfile(output_file):
+            os.remove(output_file)
+
+        self.try_command('language renderscript allocation dump 1 --file ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        self.try_command('language renderscript allocation save 1 ' +
+                         output_file,
+                         ["Allocation written to file '%s'" % output_file])
+
+        self.try_command('language renderscript allocation load 1 ' +
+                         output_file,
+                         ["Contents of file '%s' read into allocation 1" %
+                          output_file])
+
+        self.try_command('language renderscript allocation refresh',
+                         ['All allocations successfully recomputed'])
+
+        self.try_command('language renderscript module',
+                         ['dump'])
+
+        self.try_command('language renderscript module dump',
+                         ['RenderScript Modules:',
+                          'librs.simple.so',
+                          'Debug info loaded',
+                          'Globals: 1',
+                          'gColor - float4',
+                          'Kernels: 3',
+                          'root',
+                          'simple_kernel',
+                          'other_kernel',
+                          'java_package_name: com.android.rs.waitattachdebug',
+                          'version:'])
diff --git a/tests/lldb/tests/java/test_language_subcmds_no_debug.py b/tests/lldb/tests/java/test_language_subcmds_no_debug.py
new file mode 100644
index 0000000..615a4a7
--- /dev/null
+++ b/tests/lldb/tests/java/test_language_subcmds_no_debug.py
@@ -0,0 +1,112 @@
+'''Module that contains the test TestLanguageSubcmdsNoDebug.'''
+
+import os
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestLanguageSubcmdsNoDebug(TestBaseRemote):
+    '''Tests the 'language renderscript' subcommands without debug info.
+
+    In particular, module dump should report missing debug info.
+    '''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JavaNoDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.'''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel'
+                         '',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         [])
+
+        self.try_command('language renderscript kernel',
+                         ['breakpoint',
+                          'coordinate',
+                          'list'])
+
+        self.try_command('language renderscript kernel list',
+                         ['RenderScript Kernels',
+                          "Resource 'simple'",
+                          'root',
+                          'simple_kernel'])
+
+        self.try_command('language renderscript context',
+                         ['dump'])
+
+        self.try_command('language renderscript context dump',
+                         ['Inferred RenderScript Contexts',
+                          '1 script instances'])
+
+        self.try_command('language renderscript allocation',
+                         ['list',
+                          'load',
+                          'save',
+                          'dump',
+                          'refresh'])
+
+        self.try_command('language renderscript allocation list',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list -i 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list --id 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation dump 1',
+                         ['Data (X, Y, Z):'])
+
+        output_file = self.get_tmp_file_path()
+        self.try_command('language renderscript allocation dump 1 -f ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        if os.path.isfile(output_file):
+            os.remove(output_file)
+
+        self.try_command('language renderscript allocation dump 1 --file ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        self.try_command('language renderscript allocation save 1 ' +
+                         output_file,
+                         ["Allocation written to file '%s'" % output_file])
+
+        self.try_command('language renderscript allocation load 1 ' +
+                         output_file,
+                         ["Contents of file '%s' read into allocation 1" %
+                          output_file])
+
+        self.try_command('language renderscript allocation refresh',
+                         ['All allocations successfully recomputed'])
+
+        self.try_command('language renderscript module',
+                         ['dump'])
+
+        self.try_command('language renderscript module dump',
+                         ['RenderScript Modules:',
+                          'librs.simple.so',
+                          'Debug info does not exist.',
+                          'Globals: 1',
+                          'gColor - variable identified, but not found in '
+                            'binary (symbol exists)',
+                          'Kernels: 2',
+                          'root',
+                          'simple_kernel',
+                          'java_package_name: com.android.rs.waitattachnodebug',
+                          'version'])
diff --git a/tests/lldb/tests/java/test_multiple_rs_files.py b/tests/lldb/tests/java/test_multiple_rs_files.py
new file mode 100644
index 0000000..a20e386
--- /dev/null
+++ b/tests/lldb/tests/java/test_multiple_rs_files.py
@@ -0,0 +1,59 @@
+'''Module that contains the test TestMultipleRSFiles.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestMultipleRSFiles(TestBaseRemote):
+    '''Tests some commands on an apk which has two rs files.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'MultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.'''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered',
+                          'Runtime functions hooked'])
+
+        self.try_command('breakpoint set --file first.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.first.so`first_kernel',
+                          'at first.rs:12',
+                          "name = 'multiplersfiles'",
+                          'stop reason = breakpoint 1'])
+
+        self.try_command('language renderscript kernel list',
+                         ['RenderScript Kernels',
+                          "Resource 'first'",
+                          "Resource 'second'",
+                          'root',
+                          'first_kernel',
+                          'second_kernel'])
+
+        self.try_command('language renderscript context dump',
+                         ['Inferred RenderScript Contexts',
+                          '2 script instances'])
+
+        self.try_command('language renderscript module dump',
+                         ['RenderScript Modules:',
+                          'librs.first.so',
+                          'librs.second.so',
+                          'Debug info loaded',
+                          'Globals: 1',
+                          'gColor - float4',
+                          'Kernels: 2',
+                          'root',
+                          'first_kernel',
+                          'second_kernel',
+                          'java_package_name: com.android.rs.multiplersfiles',
+                          'version:'])
diff --git a/tests/lldb/tests/java/test_read_global.py b/tests/lldb/tests/java/test_read_global.py
new file mode 100644
index 0000000..5bd26af
--- /dev/null
+++ b/tests/lldb/tests/java/test_read_global.py
@@ -0,0 +1,315 @@
+'''Module that contains the test TestReadGlobal.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestReadGlobal(TestBaseRemote):
+    '''Tests inspecting global variables of all types.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "KernelVariables"
+
+    def _try_inspecting_global(self, global_name, expected_output,
+                              expected_regex=None):
+        '''Inspect a global and check for the output.
+
+        Run the "expr" and "target variable" commands on a given global and
+        with a given output. (The commands should be equivalent.)
+
+        Args:
+            global_name: String which is the name of the global to inspect.
+            expected_output: List of strings that should be found in the output.
+            expected_regex: List of regular expressions that should match lldb's
+                            output.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr ' + global_name,
+                         expected_output,
+                         expected_regex)
+
+        self.try_command('target variable ' + global_name,
+                         expected_output,
+                         expected_regex)
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                   this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        # pylint: disable=too-many-statements
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('target variable',
+                         ['Global variables for',
+                          'librs.simple.so',
+                          "(uchar) uchar_global = '\\xea'",
+                          '(short) short_global = -321',
+                          '(ushort) ushort_global = 432',
+                          '(int) int_global = 1234',
+                          '(uint) uint_global = 2345',
+                          '(float) float_global = 4.5',
+                          '(ulong) ulong_global = 8888',
+                          '(double) double_global = -456.5',
+                          '(char2) char2_global = (11, -22)',
+                          '(uchar2) uchar2_global = (0x21, 0x2c)',
+                          '(short2) short2_global = (-555, 666)',
+                          '(ushort2) ushort2_global = (777, 888)',
+                          '(int2) int2_global = (999, -1111)',
+                          '(uint2) uint2_global = (2222, 3333)',
+                          '(float2) float2_global = (4.5, -5)',
+                          '(long2) long2_global = (-4444, 5555)',
+                          '(ulong2) ulong2_global = (6666, 7777)',
+                          '(double2) double2_global = (88.5, -99)',
+                          '(char3) char3_global = (11, -22, -33,',
+                          '(uchar3) uchar3_global = (0x21, 0x2c, 0x37,',
+                          '(short3) short3_global = (-555, 666, 777,',
+                          '(ushort3) ushort3_global = (777, 888, 999,',
+                          '(int3) int3_global = (999, -1111, 2222,',
+                          '(uint3) uint3_global = (2222, 3333, 4444,',
+                          '(float3) float3_global = (4.5, -5, -6.5,',
+                          '(long3) long3_global = (-4444, 5555, 6666,',
+                          '(ulong3) ulong3_global = (6666, 7777, 8888,',
+                          '(double3) double3_global = (88.5, -99, 111.5,',
+                          '(char4) char4_global = (55, 11, -22, -33)',
+                          '(uchar4) uchar4_global = (0xde, 0x21, 0x2c, 0x37)',
+                          '(short4) short4_global = (-444, -555, 666, 777)',
+                          '(ushort4) ushort4_global = (666, 777, 888, 999)',
+                          '(int4) int4_global = (888, 999, -1111, 2222)',
+                          '(uint4) uint4_global = (1111, 2222, 3333, 4444)',
+                          '(float4) float4_global = (3, 4.5, -5, -6.5)',
+                          '(long4) long4_global = (-3333, -4444, 5555, 6666)',
+                          '(ulong4) ulong4_global = (5555, 6666, 7777, 8888)',
+                          '(double4) double4_global = (-77, 88.5, -99, 111.5)',
+                          '(rs_matrix2x2) matrix2x2_global = (m = (1, 2.5, 3, 4.5))',
+                          '(rs_matrix3x3) matrix3x3_global = {\n'
+                          '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)',
+                          '(rs_matrix4x4) matrix4x4_global = {\n'
+                          '  m = {\n'
+                          '    [0] = 5.5\n'
+                          '    [1] = 6\n'
+                          '    [2] = 7.5\n'
+                          '    [3] = 8\n'
+                          '    [4] = 9\n'
+                          '    [5] = 1.5\n'
+                          '    [6] = 2\n'
+                          '    [7] = 3.5\n'
+                          '    [8] = 4.5\n'
+                          '    [9] = 5.5\n'
+                          '    [10] = 6.5\n'
+                          '    [11] = 7\n'
+                          '    [12] = 8\n'
+                          '    [13] = 9.5\n'
+                          '    [14] = 1.5\n'
+                          '    [15] = 2.5\n'
+                          '  }\n',
+                          '(rs_quaternion) quaternion_global = (4.5, 5.5, 6, 3)'],
+                         [r"\((signed )?char\) char_global = '\\f'",
+                          r'\((long )?long\) long_global = -77777'])
+
+        # Use expr to inspect locals
+        self._try_inspecting_global('char_global',
+                         ["'\\f'"],
+                         [r'\((signed )?char\)'])
+
+        if not wimpy:
+            self._try_inspecting_global('uchar_global',
+                             ['(uchar)', "'\\xea'"])
+
+            self._try_inspecting_global('short_global',
+                             ['(short)', '-321'])
+
+            self._try_inspecting_global('ushort_global',
+                             ['(ushort)', '432'])
+
+            self._try_inspecting_global('int_global',
+                             ['(int)', '1234'])
+
+            self._try_inspecting_global('uint_global',
+                             ['(uint)', '2345'])
+
+            self._try_inspecting_global('float_global',
+                             ['(float)', '4.5'])
+
+            self._try_inspecting_global('long_global',
+                             ['-77777'],
+                             [r'\((long )?long\)'])
+
+            self._try_inspecting_global('ulong_global',
+                             ['(ulong)', '8888'])
+
+            self._try_inspecting_global('double_global',
+                             ['(double)', '-456.5'])
+
+            self._try_inspecting_global('char2_global',
+                                       ['(char2)', '(11, -22)'])
+
+        self._try_inspecting_global('uchar2_global',
+                                   ['(uchar2)', '(0x21, 0x2c)'])
+
+        if not wimpy:
+            self._try_inspecting_global('short2_global',
+                                       ['(short2)', '(-555, 666)'])
+
+            self._try_inspecting_global('ushort2_global',
+                                       ['(ushort2)', '(777, 888)'])
+
+            self._try_inspecting_global('int2_global',
+                                       ['(int2)', '(999, -1111)'])
+
+            self._try_inspecting_global('uint2_global',
+                                       ['(uint2)', '(2222, 3333)'])
+
+            self._try_inspecting_global('float2_global',
+                                       ['(float2)', '(4.5, -5)'])
+
+            self._try_inspecting_global('long2_global',
+                                       ['(long2)', '(-4444, 5555)'])
+
+            self._try_inspecting_global('ulong2_global',
+                                       ['(ulong2)', '(6666, 7777)'])
+
+            self._try_inspecting_global('double2_global',
+                                       ['(double2)', '(88.5, -99)'])
+
+            self._try_inspecting_global('char3_global',
+                                       ['(char3)',
+                                        '(11, -22, -33,'])
+
+            self._try_inspecting_global('uchar3_global',
+                                       ['(uchar3)',
+                                        '(0x21, 0x2c, 0x37,'])
+
+        self._try_inspecting_global('short3_global',
+                                   ['(short3)',
+                                    '(-555, 666, 777,'])
+
+        if not wimpy:
+            self._try_inspecting_global('ushort3_global',
+                                       ['(ushort3)',
+                                        '(777, 888, 999,'])
+
+            self._try_inspecting_global('int3_global',
+                                       ['(int3)',
+                                        '(999, -1111, 2222,'])
+
+            self._try_inspecting_global('uint3_global',
+                                       ['(uint3)',
+                                        '(2222, 3333, 4444,'])
+
+            self._try_inspecting_global('float3_global',
+                                       ['(float3)',
+                                        '(4.5, -5, -6.5,'])
+
+            self._try_inspecting_global('long3_global',
+                                       ['(long3)',
+                                        '(-4444, 5555, 6666,'])
+
+            self._try_inspecting_global('ulong3_global',
+                                       ['(ulong3)',
+                                        '(6666, 7777, 8888,'])
+
+            self._try_inspecting_global('double3_global',
+                                       ['(double3)',
+                                        '(88.5, -99, 111.5,'])
+
+            self._try_inspecting_global('char4_global',
+                                       ['(char4)',
+                                        '(55, 11, -22, -33)'])
+
+            self._try_inspecting_global('uchar4_global',
+                                       ['(uchar4)',
+                                        '(0xde, 0x21, 0x2c, 0x37)'])
+
+            self._try_inspecting_global('short4_global',
+                                       ['(short4)',
+                                        '(-444, -555, 666, 777)'])
+
+        self._try_inspecting_global('ushort4_global',
+                                   ['(ushort4)',
+                                    '(666, 777, 888, 999)'])
+
+        if not wimpy:
+            self._try_inspecting_global('int4_global',
+                                       ['(int4)',
+                                        '(888, 999, -1111, 2222)'])
+
+            self._try_inspecting_global('uint4_global',
+                                       ['(uint4)',
+                                        '(1111, 2222, 3333, 4444)'])
+
+            self._try_inspecting_global('float4_global',
+                                       ['(float4)',
+                                        '(3, 4.5, -5, -6.5)'])
+
+            self._try_inspecting_global('long4_global',
+                                       ['(long4)',
+                                        '(-3333, -4444, 5555, 6666)'])
+
+            self._try_inspecting_global('ulong4_global',
+                                       ['(ulong4)',
+                                        '(5555, 6666, 7777, 8888)'])
+
+            self._try_inspecting_global('double4_global',
+                                       ['(double4)',
+                                        '(-77, 88.5, -99, 111.5)'])
+
+            self._try_inspecting_global('matrix2x2_global',
+                                       ['(rs_matrix2x2)',
+                                        '= (m = (1, 2.5, 3, 4.5))'])
+
+            self._try_inspecting_global('matrix3x3_global',
+                                       ['(rs_matrix3x3)',
+                                        '= {\n'
+                                        '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)'])
+
+        self._try_inspecting_global('matrix4x4_global',
+                                   ['(rs_matrix4x4)',
+                                    '= {\n'
+                                    '  m = {\n'
+                                    '    [0] = 5.5\n'
+                                    '    [1] = 6\n'
+                                    '    [2] = 7.5\n'
+                                    '    [3] = 8\n'
+                                    '    [4] = 9\n'
+                                    '    [5] = 1.5\n'
+                                    '    [6] = 2\n'
+                                    '    [7] = 3.5\n'
+                                    '    [8] = 4.5\n'
+                                    '    [9] = 5.5\n'
+                                    '    [10] = 6.5\n'
+                                    '    [11] = 7\n'
+                                    '    [12] = 8\n'
+                                    '    [13] = 9.5\n'
+                                    '    [14] = 1.5\n'
+                                    '    [15] = 2.5\n'
+                                    '  }\n'])
+
+        self._try_inspecting_global('quaternion_global',
+                                   ['(rs_quaternion)',
+                                    '(4.5, 5.5, 6, 3)'])
diff --git a/tests/lldb/tests/java/test_read_local.py b/tests/lldb/tests/java/test_read_local.py
new file mode 100644
index 0000000..17b1a79
--- /dev/null
+++ b/tests/lldb/tests/java/test_read_local.py
@@ -0,0 +1,312 @@
+'''Module that contains the test TestReadLocal.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestReadLocal(TestBaseRemote):
+    '''Tests inspecting local variables of all types.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "KernelVariables"
+
+    def _try_inspecting_local(self, local_name, expected_output,
+                             expected_regex=None):
+        '''Inspect a local and check for the output.
+
+        Run the "expr" and "frame variable" commands on a given local and
+        with a given output. (The commands should be equivalent.)
+
+        Args:
+            local_name: String which is the name of the global to inspect.
+            expected_output: List of strings that should be found in the output.
+            expected_regex: List of regular expressions that should match lldb's
+                            output.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr ' + local_name,
+                         expected_output,
+                         expected_regex)
+
+        self.try_command('frame variable ' + local_name,
+                         expected_output,
+                         expected_regex)
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                   this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        # pylint: disable=too-many-statements
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --file simple.rs --line 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('frame variable',
+                         ["(uchar) uchar_local = 'b'",
+                          '(short) short_local = -321',
+                          '(ushort) ushort_local = 432',
+                          '(int) int_local = 1234',
+                          '(uint) uint_local = 2345',
+                          '(float) float_local = 4.5',
+                          '(ulong) ulong_local = 8888',
+                          '(double) double_local = -456.5',
+                          '(char2) char2_local = (-11, -22)',
+                          '(uchar2) uchar2_local = (0x21, 0x2c)',
+                          '(short2) short2_local = (-555, 666)',
+                          '(ushort2) ushort2_local = (777, 888)',
+                          '(int2) int2_local = (999, -1111)',
+                          '(uint2) uint2_local = (2222, 3333)',
+                          '(float2) float2_local = (4.5, -5)',
+                          '(long2) long2_local = (-4444, 5555)',
+                          '(ulong2) ulong2_local = (6666, 7777)',
+                          '(double2) double2_local = (88.5, -99)',
+                          '(char3) char3_local = (11, -22, -33,',
+                          '(uchar3) uchar3_local = (0x21, 0x2c, 0x37,',
+                          '(short3) short3_local = (-555, 666, 777,',
+                          '(ushort3) ushort3_local = (777, 888, 999,',
+                          '(int3) int3_local = (999, -1111, 2222,',
+                          '(uint3) uint3_local = (2222, 3333, 4444,',
+                          '(float3) float3_local = (4.5, -5, -6.5,',
+                          '(long3) long3_local = (-4444, 5555, 6666,',
+                          '(ulong3) ulong3_local = (6666, 7777, 8888,',
+                          '(double3) double3_local = (88.5, -99, 111.5,',
+                          '(char4) char4_local = (55, 11, -22, -33)',
+                          '(uchar4) uchar4_local = (0x16, 0x21, 0x2c, 0x37)',
+                          '(short4) short4_local = (-444, -555, 666, 777)',
+                          '(ushort4) ushort4_local = (666, 777, 888, 999)',
+                          '(int4) int4_local = (888, 999, -1111, 2222)',
+                          '(uint4) uint4_local = (1111, 2222, 3333, 4444)',
+                          '(float4) float4_local = (3, 4.5, -5, -6.5)',
+                          '(long4) long4_local = (-3333, -4444, 5555, 6666)',
+                          '(ulong4) ulong4_local = (5555, 6666, 7777, 8888)',
+                          '(double4) double4_local = (-77, 88.5, -99, 111.5)',
+                          '(rs_matrix2x2) matrix2x2_local = (m = (1, 2.5, 3, 4.5))',
+                          '(rs_matrix3x3) matrix3x3_local = {\n'
+                          '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)',
+                          '(rs_matrix4x4) matrix4x4_local = {\n'
+                          '  m = {\n'
+                          '    [0] = 5.5\n'
+                          '    [1] = 6\n'
+                          '    [2] = 7.5\n'
+                          '    [3] = 8\n'
+                          '    [4] = 9\n'
+                          '    [5] = 1.5\n'
+                          '    [6] = 2\n'
+                          '    [7] = 3.5\n'
+                          '    [8] = 4.5\n'
+                          '    [9] = 5.5\n'
+                          '    [10] = 6.5\n'
+                          '    [11] = 7\n'
+                          '    [12] = 8\n'
+                          '    [13] = 9.5\n'
+                          '    [14] = 1.5\n'
+                          '    [15] = 2.5\n'
+                          '  }\n',
+                          '(rs_quaternion) quaternion_local = (8, 9, 0.5, 7.5)'],
+                         [r"\((signed )?char\) char_local = 'a'",
+                          r'\((long )?long\) long_local = -77777'])
+
+        # Use expr to inspect locals
+        self._try_inspecting_local('char_local',
+                                  ["'a'"],
+                                  [r'\((signed )?char\)'])
+
+        if not wimpy:
+            self._try_inspecting_local('uchar_local',
+                                      ['(uchar)', "'b'"])
+
+            self._try_inspecting_local('short_local',
+                                      ['(short)', '-321'])
+
+            self._try_inspecting_local('ushort_local',
+                                      ['(ushort)', '432'])
+
+            self._try_inspecting_local('int_local',
+                                      ['(int)', '1234'])
+
+            self._try_inspecting_local('uint_local',
+                                      ['(uint)', '2345'])
+
+            self._try_inspecting_local('float_local',
+                                      ['(float)', '4.5'])
+
+            self._try_inspecting_local('long_local',
+                                      ['-77777'], [r'\((long )?long\)'])
+
+            self._try_inspecting_local('ulong_local',
+                                      ['(ulong)', '8888'])
+
+            self._try_inspecting_local('double_local',
+                                      ['(double)', '-456.5'])
+
+            self._try_inspecting_local('char2_local',
+                                      ['(char2)', '(-11, -22)'])
+
+        self._try_inspecting_local('uchar2_local',
+                                  ['(uchar2)', '(0x21, 0x2c)'])
+
+        if not wimpy:
+            self._try_inspecting_local('short2_local',
+                                      ['(short2)', '(-555, 666)'])
+
+            self._try_inspecting_local('ushort2_local',
+                                      ['(ushort2)', '(777, 888)'])
+
+            self._try_inspecting_local('int2_local',
+                                      ['(int2)', '(999, -1111)'])
+
+            self._try_inspecting_local('uint2_local',
+                                      ['(uint2)', '(2222, 3333)'])
+
+            self._try_inspecting_local('float2_local',
+                                      ['(float2)', '(4.5, -5)'])
+
+            self._try_inspecting_local('long2_local',
+                                      ['(long2)', '(-4444, 5555)'])
+
+            self._try_inspecting_local('ulong2_local',
+                                      ['(ulong2)', '(6666, 7777)'])
+
+            self._try_inspecting_local('double2_local',
+                                      ['(double2)', '(88.5, -99)'])
+
+            self._try_inspecting_local('char3_local',
+                                      ['(char3)',
+                                       '(11, -22, -33,'])
+
+            self._try_inspecting_local('uchar3_local',
+                                      ['(uchar3)',
+                                       '(0x21, 0x2c, 0x37,'])
+
+        self._try_inspecting_local('short3_local',
+                                  ['(short3)',
+                                   '(-555, 666, 777,'])
+
+        if not wimpy:
+            self._try_inspecting_local('ushort3_local',
+                                      ['(ushort3)',
+                                       '(777, 888, 999,'])
+
+            self._try_inspecting_local('int3_local',
+                                      ['(int3)',
+                                       '(999, -1111, 2222,'])
+
+            self._try_inspecting_local('uint3_local',
+                                      ['(uint3)',
+                                       '(2222, 3333, 4444,'])
+
+            self._try_inspecting_local('float3_local',
+                                      ['(float3)',
+                                       '(4.5, -5, -6.5,'])
+
+            self._try_inspecting_local('long3_local',
+                                      ['(long3)',
+                                       '(-4444, 5555, 6666,'])
+
+            self._try_inspecting_local('ulong3_local',
+                                      ['(ulong3)',
+                                       '(6666, 7777, 8888,'])
+
+            self._try_inspecting_local('double3_local',
+                                      ['(double3)',
+                                       '(88.5, -99, 111.5,'])
+
+            self._try_inspecting_local('char4_local',
+                                      ['(char4)',
+                                       '(55, 11, -22, -33)'])
+
+            self._try_inspecting_local('uchar4_local',
+                                      ['(uchar4)',
+                                       '(0x16, 0x21, 0x2c, 0x37)'])
+
+            self._try_inspecting_local('short4_local',
+                                      ['(short4)',
+                                       '(-444, -555, 666, 777)'])
+
+        self._try_inspecting_local('ushort4_local',
+                                  ['(ushort4)',
+                                   '(666, 777, 888, 999)'])
+
+        if not wimpy:
+            self._try_inspecting_local('int4_local',
+                                      ['(int4)',
+                                       '(888, 999, -1111, 2222)'])
+
+            self._try_inspecting_local('uint4_local',
+                                      ['(uint4)',
+                                       '(1111, 2222, 3333, 4444)'])
+
+            self._try_inspecting_local('float4_local',
+                                      ['(float4)',
+                                       '(3, 4.5, -5, -6.5)'])
+
+            self._try_inspecting_local('long4_local',
+                                      ['(long4)',
+                                       '(-3333, -4444, 5555, 6666)'])
+
+            self._try_inspecting_local('ulong4_local',
+                                      ['(ulong4)',
+                                       '(5555, 6666, 7777, 8888)'])
+
+            self._try_inspecting_local('double4_local',
+                                      ['(double4)',
+                                       '(-77, 88.5, -99, 111.5)'])
+
+            self._try_inspecting_local('matrix2x2_local',
+                                       ['(rs_matrix2x2)',
+                                        '= (m = (1, 2.5, 3, 4.5))'])
+
+            self._try_inspecting_local('matrix3x3_local',
+                                       ['(rs_matrix3x3)',
+                                        '= {\n'
+                                        '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)'])
+
+        self._try_inspecting_local('matrix4x4_local',
+                                   ['(rs_matrix4x4)',
+                                    '= {\n'
+                                    '  m = {\n'
+                                    '    [0] = 5.5\n'
+                                    '    [1] = 6\n'
+                                    '    [2] = 7.5\n'
+                                    '    [3] = 8\n'
+                                    '    [4] = 9\n'
+                                    '    [5] = 1.5\n'
+                                    '    [6] = 2\n'
+                                    '    [7] = 3.5\n'
+                                    '    [8] = 4.5\n'
+                                    '    [9] = 5.5\n'
+                                    '    [10] = 6.5\n'
+                                    '    [11] = 7\n'
+                                    '    [12] = 8\n'
+                                    '    [13] = 9.5\n'
+                                    '    [14] = 1.5\n'
+                                    '    [15] = 2.5\n'
+                                    '  }\n'])
+
+        self._try_inspecting_local('quaternion_local',
+                                  ['(rs_quaternion)',
+                                   '(8, 9, 0.5, 7.5)'])
diff --git a/tests/lldb/tests/java/test_rs_consts.py b/tests/lldb/tests/java/test_rs_consts.py
new file mode 100644
index 0000000..319154d
--- /dev/null
+++ b/tests/lldb/tests/java/test_rs_consts.py
@@ -0,0 +1,76 @@
+'''Module that contains the test TestRSConsts.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestRSConsts(TestBaseRemote):
+    '''Tests examining the RenderScript constants.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "KernelVariables"
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set kernel',
+                         [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Constants
+        self.try_command('expr M_1_PI',
+                         ['0.318309'])
+
+        self.try_command('expr M_2_PI',
+                         ['0.636619'])
+
+        self.try_command('expr M_2_SQRTPI',
+                         ['1.128379'])
+
+        self.try_command('expr M_E',
+                         ['2.718281'])
+
+        self.try_command('expr M_LN10',
+                         ['2.302585'])
+
+        self.try_command('expr M_LN2',
+                         ['0.693147'])
+
+        self.try_command('expr M_LOG10E',
+                         ['0.434294'])
+
+        self.try_command('expr M_LOG2E',
+                         ['1.442695'])
+
+        self.try_command('expr M_PI',
+                         ['3.141592'])
+
+        self.try_command('expr M_PI_2',
+                         ['1.570796'])
+
+        self.try_command('expr M_PI_4',
+                         ['0.785398'])
+
+        self.try_command('expr M_SQRT1_2',
+                         ['0.707106'])
+
+        self.try_command('expr M_SQRT2',
+                         ['1.414213'])
diff --git a/tests/lldb/tests/java/test_source_step.py b/tests/lldb/tests/java/test_source_step.py
new file mode 100644
index 0000000..355eed3
--- /dev/null
+++ b/tests/lldb/tests/java/test_source_step.py
@@ -0,0 +1,83 @@
+'''Module that contains the test TestSourceStep.'''
+
+import os
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestSourceStep(TestBaseRemote):
+    '''Test stepping through the source using step-in, -over and -out.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "BranchingFunCalls"
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.'''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.'''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f scalars.rs -l 47',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'stop reason = breakpoint',
+                          'scalars.rs:47'])
+
+        # set the source mapping
+        file_dir = os.path.dirname(os.path.realpath(__file__))
+        new_dir = os.path.join(file_dir, '..', '..', 'java',
+                               'BranchingFunCalls', 'src', 'rs')
+        self.set_src_map('scalars.rs', new_dir)
+
+        self.try_command('process status',
+                         ['-> 47',
+                          'int i = in;'])
+
+        #47     int i = in;
+        self.try_command('thread step-in',
+                         ['-> 48'])
+        #48     float f = (float) i;
+        self.try_command('thread step-in',
+                         ['-> 49'])
+        #49     modify_f(&f);
+        self.try_command('thread step-over',
+                         ['-> 50'])
+        #50  	modify_i(&i);
+        self.try_command('thread step-in',
+                         ['-> 33'])
+        #33         int j = *i;
+        self.try_command('b -f scalars.rs -l 38',
+                         ['librs.scalars.so`modify_i',
+                          'scalars.rs:38'])
+        self.try_command('c',
+                         ['stop reason = breakpoint',
+                          'scalars.rs:38',
+                          '-> 38'])
+        #38    set_i(i, 0);
+        # For the line number anything between #20 and #22 is fine
+        self.try_command('thread step-in',
+                         [],
+                         [r'-> 2[012]'])
+        #22    int tmp = b;
+        self.try_command('thread step-out',
+                         ['-> 38'])
diff --git a/tests/lldb/tests/java/test_write_global.py b/tests/lldb/tests/java/test_write_global.py
new file mode 100644
index 0000000..4b4712b
--- /dev/null
+++ b/tests/lldb/tests/java/test_write_global.py
@@ -0,0 +1,210 @@
+'''Module that contains the test TestWriteGlobal.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestWriteGlobal(TestBaseRemote):
+    '''Tests modifying global variables of all types.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "KernelVariables"
+
+    def _try_modifying_global(self, global_name, new_value, data_type_in,
+                             expected_output, expected_output_regex=None):
+        '''Modify and then inspect a global and check for the output.
+
+        Run the "expr" command to set a given global to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            global_name: String which is the name of the global to modify.
+            new_value: A string that is the new value of the global.
+            data_type_in: A string containing a c-style parenthesised data type
+                          representing the type of the global.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=too-many-arguments
+        self.try_command('expr %s = %s%s' %
+                         (global_name, data_type_in, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('target variable ' + global_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                   this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=line-too-long
+        # There is no way we can make this look nice
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_global('char_global', '-2',
+                                  '(signed char)', ['\'\\xfe\''],
+                                  [r'\((signed )?char\)'])
+
+        if not wimpy:
+            self._try_modifying_global('uchar_global', '22',
+                                      '(uchar)', ['(uchar)', '\'\\x16\''])
+
+            self._try_modifying_global('short_global', '-33',
+                                      '(short)', ['(short)', '-33'])
+
+            self._try_modifying_global('ushort_global', '44',
+                                      '(ushort)', ['(ushort)', '44'])
+
+            self._try_modifying_global('int_global', '-55',
+                                      '(int)', ['(int)', '-55'])
+
+            self._try_modifying_global('uint_global', '66',
+                                      '(uint)', ['(uint)', '66'])
+
+            self._try_modifying_global('float_global', '-7.5',
+                                      '(float)', ['(float)', '-7.5'])
+
+            self._try_modifying_global('long_global', '-888888',
+                                      '(long long)', ['-888888'],
+                                      [r'\((long )?long\)'])
+
+            self._try_modifying_global('ulong_global', '99999999',
+                                      '(ulong)', ['(ulong)', '99999999'])
+
+            self._try_modifying_global('double_global', '-10101.5',
+                                      '(double)', ['(double)', '-10101.5'])
+
+            self._try_modifying_global('char2_global', '{22, 4}',
+                                      '(char2)', ['(char2)', '(22, 4)'])
+
+        self._try_modifying_global('uchar2_global', '{44, 55}',
+                                  '(uchar2)', ['(uchar2)', '(0x2c, 0x37)'])
+
+        if not wimpy:
+            self._try_modifying_global('short2_global', '{-66, 77}',
+                                      '(short2)', ['(short2)', '(-66, 77)'])
+
+            self._try_modifying_global('ushort2_global', '{88, 99}',
+                                      '(ushort2)', ['(ushort2)', '(88, 99)'])
+
+            self._try_modifying_global('int2_global', '{111, -222}',
+                                      '(int2)', ['(int2)', '(111, -222)'])
+
+            self._try_modifying_global('uint2_global', '{333, 444}',
+                                      '(uint2)', ['(uint2)', '(333, 444)'])
+
+            self._try_modifying_global('float2_global', '{-55.5f, 6.0}',
+                                      '(float2)', ['(float2)', '(-55.5, 6)'])
+
+            self._try_modifying_global('long2_global', '{666666, -777777}',
+                                      '(long2)', ['(long2)', '(666666, -777777)'])
+
+            self._try_modifying_global('ulong2_global', '{888888, 999999}',
+                                      '(ulong2)', ['(ulong2)', '(888888, 999999)'])
+
+            self._try_modifying_global('double2_global', '{11.0000000, -0.0l}',
+                                      '(double2)', ['(double2)', '(11, -0)'])
+
+            self._try_modifying_global('char3_global', '{2, -3, 4}',
+                                      '(char3)', ['(char3)', '(2, -3, 4,'])
+
+            self._try_modifying_global('uchar3_global', '{\'a\', \'b\', \'c\'}',
+                                      '(uchar3)', ['(uchar3)', '(0x61, 0x62, 0x63,'])
+
+        self._try_modifying_global('short3_global', '{44, -55, 66}',
+                                  '(short3)', ['(short3)', '(44, -55, 66,'])
+
+        if not wimpy:
+            self._try_modifying_global('ushort3_global', '{88, 99, 111}',
+                                      '(ushort3)', ['(ushort3)', '(88, 99, 111,'])
+
+            self._try_modifying_global('int3_global', '{-111, 222, -333}',
+                                      '(int3)', ['(int3)', '(-111, 222, -333,'])
+
+            self._try_modifying_global('uint3_global', '{444, 555, 666}',
+                                      '(uint3)', ['(uint3)', '(444, 555, 666,'])
+
+            self._try_modifying_global('float3_global', '{7.5F, 0008.000, 9}',
+                                      '(float3)', ['(float3)', '(7.5, 8, 9,'])
+
+            self._try_modifying_global('long3_global', '{111111, -22222222, 3333333}',
+                                      '(long3)', ['(long3)', '(111111, -22222222, 3333333,'])
+
+            self._try_modifying_global('ulong3_global', '{4444444, 5555555, 66666666}',
+                                      '(ulong3)', ['(ulong3)', '(4444444, 5555555, 66666666,'])
+
+            self._try_modifying_global('double3_global', '{7.5L, -0, 8.9e1}',
+                                      '(double3)', ['(double3)', '(7.5, 0, 89,'])
+
+            self._try_modifying_global('char4_global', '{0x1, 0x2, 0x3, 0x4}',
+                                      '(char4)',
+                                      ['(char4)', '(1, 2, 3, 4)'])
+
+            self._try_modifying_global('uchar4_global', '{0x5, 0x6, 0x7, 0x8}',
+                                      '(uchar4)',
+                                      ['(uchar4)', '(0x05, 0x06, 0x07, 0x08)'])
+
+            self._try_modifying_global('short4_global', '{0x9, 0xa, 0xb, 0xc}',
+                                      '(short4)',
+                                      ['(short4)', '(9, 10, 11, 12)'])
+
+        self._try_modifying_global('ushort4_global', '{0xd, 0xe, 0xf, 0x10}',
+                                  '(ushort4)',
+                                  ['(ushort4)', '(13, 14, 15, 16)'])
+
+        if not wimpy:
+            self._try_modifying_global('int4_global', '{0x11, 0x12, 0x13, 0x14}',
+                                      '(int4)',
+                                      ['(int4)', '(17, 18, 19, 20)'])
+
+            self._try_modifying_global('uint4_global', '{0x15, 0x16, 0x17, 0x18}',
+                                      '(uint4)',
+                                      ['(uint4)', '(21, 22, 23, 24)'])
+
+            self._try_modifying_global('float4_global', '{19.0, 20.5, -21, -22.5}',
+                                      '(float4)',
+                                      ['(float4)', '(19, 20.5, -21, -22.5)'])
+
+            self._try_modifying_global('long4_global', '{0x1d, 0x1e, 0x1f, 0x20}',
+                                      '(long4)',
+                                      ['(long4)', '(29, 30, 31, 32)'])
+
+            self._try_modifying_global('ulong4_global', '{0x21, 0x22, 0x23, 0x24}',
+                                      '(ulong4)',
+                                      ['(ulong4)', '(33, 34, 35, 36)'])
+
+            self._try_modifying_global('double4_global', '{25.000, -26, -27.5, 28.0}',
+                                      '(double4)',
+                                      ['(double4)', '(25, -26, -27.5, 28)'])
diff --git a/tests/lldb/tests/java/test_write_global_element.py b/tests/lldb/tests/java/test_write_global_element.py
new file mode 100644
index 0000000..9ed3d86
--- /dev/null
+++ b/tests/lldb/tests/java/test_write_global_element.py
@@ -0,0 +1,269 @@
+'''Module that contains the test TestWriteGlobalElement.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestWriteGlobalElement(TestBaseRemote):
+    '''Tests modifying elements of global variables of all types.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "KernelVariables"
+
+    def _try_inspecting_global(self, global_name, expected_output):
+        '''Run the "expr" command on a given global and with a given output.
+
+        Args:
+            global_name: String which is the name of the global to inspect.
+            expected_output: List of strings that should be found in the output.
+
+        Raises:
+            TestFail: The lldb command did not provide the expected output.
+        '''
+        self.try_command('expr ' + global_name, expected_output)
+
+    def _try_modifying_global(self, global_name, new_value, expected_output,
+                             expected_output_regex=None):
+        '''Modify and then inspect a global and check for the output.
+
+        Run the "expr" command to set a given global to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            global_name: String which is the name of the global to modify.
+            new_value: A string that is the new value of the global.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr %s = %s' % (global_name, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('target variable ' + global_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                   this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=too-many-statements
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_global('char2_global[0]', '2',
+                                  ['\'\\x02\''],
+                                  [r'\((signed )?char\)'])
+        self._try_inspecting_global('char2_global', ['(char2)', '(2, -22)'])
+
+        if not wimpy:
+            self._try_modifying_global('uchar2_global[1]', '3',
+                                      ['\'\\x03\''],
+                                      [r'\(u(nsigned )?char\)'])
+            self._try_inspecting_global('uchar2_global',
+                                       ['(uchar2)', '(0x21, 0x03)'])
+
+            self._try_modifying_global('short2_global[0]', '-44',
+                                      ['(short)', '-44'])
+            self._try_inspecting_global('short2_global',
+                                       ['(short2)', '(-44, 666)'])
+
+            self._try_modifying_global('ushort2_global[1]', '55',
+                                      ['55'],
+                                      [r'\(u(nsigned )?short\)'])
+            self._try_inspecting_global('ushort2_global',
+                                       ['(ushort2)', '(777, 55)'])
+
+            self._try_modifying_global('int2_global[0]', '666',
+                                      ['(int)', '666'])
+            self._try_inspecting_global('int2_global',
+                                       ['(int2)', '(666, -1111)'])
+
+            self._try_modifying_global('uint2_global[1]', '777',
+                                      ['777'],
+                                      [r'\(u(nsigned )?int\)'])
+            self._try_inspecting_global('uint2_global',
+                                       ['(uint2)', '(2222, 777)'])
+
+            self._try_modifying_global('float2_global[0]', '-8.5',
+                                      ['(float)', '-8.5'])
+            self._try_inspecting_global('float2_global',
+                                       ['(float2)', '(-8.5, -5)'])
+
+            self._try_modifying_global('long2_global[1]', '999999',
+                                      ['999999'],
+                                      [r'\((long )?long\)'])
+            self._try_inspecting_global('long2_global',
+                                       ['(long2)', '(-4444, 999999)'])
+
+            self._try_modifying_global('ulong2_global[0]', '10101010101',
+                                      ['10101010101'],
+                                      [r'\(u(nsigned )?(long )?long\)'])
+            self._try_inspecting_global('ulong2_global',
+                                       ['(ulong2)', '(10101010101, 7777)'])
+
+            self._try_modifying_global('double2_global[1]', '-11.000',
+                                      ['(double)', '-11'])
+            self._try_inspecting_global('double2_global',
+                                       ['(double2)', '(88.5, -11)'])
+
+            self._try_modifying_global('char3_global[0]', '12',
+                                      ['\'\\f\''],
+                                      [r'\((signed )?char\)'])
+            self._try_inspecting_global('char3_global',
+                                       ['(char3)',
+                                        '(12, -22, -33,'])
+
+        self._try_modifying_global('uchar3_global[1]', '\'d\'',
+                                  ['\'d\''],
+                                  [r'\(u(nsigned )?char\)'])
+        self._try_inspecting_global('uchar3_global',
+                                   ['(uchar3)',
+                                    '(0x21, 0x64, 0x37,'])
+
+        if not wimpy:
+            self._try_modifying_global('short3_global[2]', '-131',
+                                      ['(short)', '-131'])
+            self._try_inspecting_global('short3_global',
+                                       ['(short3)',
+                                        '(-555, 666, -131,'])
+
+            self._try_modifying_global('ushort3_global[0]', '1414',
+                                      ['1414'],
+                                      [r'\(u(nsigned )?short\)'])
+            self._try_inspecting_global('ushort3_global',
+                                       ['(ushort3)',
+                                        '(1414, 888, 999,'])
+
+            self._try_modifying_global('int3_global[0]', '151515',
+                                      ['(int)', '151515'])
+            self._try_inspecting_global('int3_global',
+                                       ['(int3)',
+                                        '(151515, -1111, 2222,'])
+
+            self._try_modifying_global('uint3_global[1]', '161616',
+                                      ['161616'],
+                                      [r'\(u(nsigned )?int\)'])
+            self._try_inspecting_global('uint3_global',
+                                       ['(uint3)',
+                                        '(2222, 161616, 4444,'])
+
+            self._try_modifying_global('float3_global[2]', '17.5',
+                                      ['(float)', '17.5'])
+            self._try_inspecting_global('float3_global',
+                                       ['(float3)',
+                                        '(4.5, -5, 17.5,'])
+
+            self._try_modifying_global('long3_global[0]', '-181818181818',
+                                      ['-181818181818'],
+                                      [r'\((long )?long\)'])
+            self._try_inspecting_global('long3_global',
+                                       ['(long3)',
+                                        '(-181818181818, 5555, 6666,'])
+
+            self._try_modifying_global('ulong3_global[1]', '191919191919',
+                                      ['191919191919'],
+                                      [r'\(u(nsigned )?(long )?long\)'])
+            self._try_inspecting_global('ulong3_global',
+                                       ['(ulong3)',
+                                        '(6666, 191919191919, 8888,'])
+
+            self._try_modifying_global('double3_global[2]', '20.5',
+                                      ['(double)', '20.5'])
+            self._try_inspecting_global('double3_global',
+                                       ['(double3)',
+                                        '(88.5, -99, 20.5,'])
+
+            self._try_modifying_global('char4_global[0]', '-21',
+                                      ['\'\\xeb\''],
+                                      [r'\((signed )?char\)'])
+            self._try_inspecting_global('char4_global',
+                                       ['(char4)',
+                                        '(-21, 11, -22, -33)'])
+
+            self._try_modifying_global('uchar4_global[1]', '22',
+                                      ['\'\\x16\''],
+                                      [r'\(u(nsigned )?char\)'])
+            self._try_inspecting_global('uchar4_global',
+                                       ['(uchar4)',
+                                        '(0xde, 0x16, 0x2c, 0x37)'])
+
+        self._try_modifying_global('short4_global[2]', '23',
+                                  ['(short)', '23'])
+        self._try_inspecting_global('short4_global',
+                                   ['(short4)',
+                                    '(-444, -555, 23, 777)'])
+
+        if not wimpy:
+            self._try_modifying_global('ushort4_global[3]', '24',
+                                      ['24'],
+                                      [r'\(u(nsigned )?short\)'])
+            self._try_inspecting_global('ushort4_global',
+                                       ['(ushort4)',
+                                        '(666, 777, 888, 24)'])
+
+            self._try_modifying_global('int4_global[0]', '-2525',
+                                      ['(int)', '-2525'])
+            self._try_inspecting_global('int4_global',
+                                       ['(int4)',
+                                        '(-2525, 999, -1111, 2222)'])
+
+            self._try_modifying_global('uint4_global[1]', '26262',
+                                      ['26262'],
+                                      [r'\(u(nsigned )?int\)'])
+            self._try_inspecting_global('uint4_global',
+                                       ['(uint4)',
+                                        '(1111, 26262, 3333, 4444)'])
+
+            self._try_modifying_global('float4_global[2]', '27.0f',
+                                      ['(float)', '27'])
+            self._try_inspecting_global('float4_global',
+                                       ['(float4)',
+                                        '(3, 4.5, 27, -6.5)'])
+
+            self._try_modifying_global('long4_global[3]', '-28282828282',
+                                      ['-28282828282'],
+                                      [r'\((long )?long\)'])
+            self._try_inspecting_global('long4_global',
+                                       ['(long4)',
+                                        '(-3333, -4444, 5555, -28282828282)'])
+
+            self._try_modifying_global('ulong4_global[0]', '2929292929',
+                                      ['2929292929'],
+                                      [r'\(u(nsigned )?(long )?long\)'])
+            self._try_inspecting_global('ulong4_global',
+                                       ['(ulong4)',
+                                        '(2929292929, 6666, 7777, 8888)'])
+
+            self._try_modifying_global('double4_global[1]', '30.5',
+                                      ['(double)', '30.5'])
+            self._try_inspecting_global('double4_global',
+                                       ['(double4)',
+                                        '(-77, 30.5, -99, 111.5)'])
diff --git a/tests/lldb/tests/java/test_write_local.py b/tests/lldb/tests/java/test_write_local.py
new file mode 100644
index 0000000..6e560b4
--- /dev/null
+++ b/tests/lldb/tests/java/test_write_local.py
@@ -0,0 +1,209 @@
+'''Module that contains the test TestWriteLocal.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestWriteLocal(TestBaseRemote):
+    '''Tests modifying local variables of all types.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "KernelVariables"
+
+    def _try_modifying_local(self, local_name, new_value, data_type_in,
+                             expected_output, expected_output_regex=None):
+        '''Try getting lldb to modify a local and check the output.
+
+        Run the "expr" command to set a given local to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            local_name: String which is the name of the local to modify.
+            new_value: A string that is the new value of the local.
+            data_type_in: A string containing a c-style parenthesised data type
+                          representing the type of the local.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=too-many-arguments
+        self.try_command('expr %s = %s%s'
+                         % (local_name, data_type_in, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('frame variable ' + local_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                   this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=line-too-long
+        # There is no way we can make this look nice
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_local('char_local', '-2',
+                                 '(signed char)', ['\'\\xfe\''],
+                                 [r'\((signed )?char\)'])
+
+        if not wimpy:
+            self._try_modifying_local('uchar_local', '22',
+                                     '(uchar)', ['(uchar)', '\'\\x16\''])
+
+            self._try_modifying_local('short_local', '-33',
+                                     '(short)', ['(short)', '-33'])
+
+            self._try_modifying_local('ushort_local', '44',
+                                     '(ushort)', ['(ushort)', '44'])
+
+            self._try_modifying_local('int_local', '-55',
+                                     '(int)', ['(int)', '-55'])
+
+            self._try_modifying_local('uint_local', '66',
+                                     '(uint)', ['(uint)', '66'])
+
+            self._try_modifying_local('float_local', '-7.5',
+                                     '(float)', ['(float)', '-7.5'])
+
+            self._try_modifying_local('long_local', '-888888',
+                                     '(long long)', ['-888888'],
+                                     [r'\((long )?long\)'])
+
+            self._try_modifying_local('ulong_local', '99999999',
+                                     '(ulong)', ['(ulong)', '99999999'])
+
+            self._try_modifying_local('double_local', '-10101.5',
+                                     '(double)', ['(double)', '-10101.5'])
+
+            self._try_modifying_local('char2_local', '{22, 4}',
+                                     '(char2)', ['(char2)', '(22, 4)'])
+
+        self._try_modifying_local('uchar2_local', '{44, 55}',
+                                 '(uchar2)', ['(uchar2)', '(0x2c, 0x37)'])
+
+        if not wimpy:
+            self._try_modifying_local('short2_local', '{-66, 77}',
+                                     '(short2)', ['(short2)', '(-66, 77)'])
+
+            self._try_modifying_local('ushort2_local', '{88, 99}',
+                                     '(ushort2)', ['(ushort2)', '(88, 99)'])
+
+            self._try_modifying_local('int2_local', '{111, -222}',
+                                     '(int2)', ['(int2)', '(111, -222)'])
+
+            self._try_modifying_local('uint2_local', '{333, 444}',
+                                     '(uint2)', ['(uint2)', '(333, 444)'])
+
+            self._try_modifying_local('float2_local', '{-55.5f, 6.0}',
+                                     '(float2)', ['(float2)', '(-55.5, 6)'])
+
+            self._try_modifying_local('long2_local', '{666666, -777777}',
+                                     '(long2)', ['(long2)', '(666666, -777777)'])
+
+            self._try_modifying_local('ulong2_local', '{888888, 999999}',
+                                     '(ulong2)', ['(ulong2)', '(888888, 999999)'])
+
+            self._try_modifying_local('double2_local', '{11.0000000, -0.0l}',
+                                     '(double2)', ['(double2)', '(11, -0)'])
+
+            self._try_modifying_local('char3_local', '{2, -3, 4}',
+                                     '(char3)', ['(char3)', '(2, -3, 4,'])
+
+            self._try_modifying_local('uchar3_local', '{\'a\', \'b\', \'c\'}',
+                                     '(uchar3)', ['(uchar3)', '(0x61, 0x62, 0x63,'])
+
+        self._try_modifying_local('short3_local', '{44, -55, 66}',
+                                 '(short3)', ['(short3)', '(44, -55, 66,'])
+
+        if not wimpy:
+            self._try_modifying_local('ushort3_local', '{88, 99, 111}',
+                                     '(ushort3)', ['(ushort3)', '(88, 99, 111,'])
+
+            self._try_modifying_local('int3_local', '{-111, 222, -333}',
+                                     '(int3)', ['(int3)', '(-111, 222, -333,'])
+
+            self._try_modifying_local('uint3_local', '{444, 555, 666}',
+                                     '(uint3)', ['(uint3)', '(444, 555, 666,'])
+
+            self._try_modifying_local('float3_local', '{7.5F, 0008.000, 9}',
+                                     '(float3)', ['(float3)', '(7.5, 8, 9,'])
+
+            self._try_modifying_local('long3_local', '{111111, -22222222, 3333333}',
+                                     '(long3)', ['(long3)', '(111111, -22222222, 3333333,'])
+
+            self._try_modifying_local('ulong3_local', '{4444444, 5555555, 66666666}',
+                                     '(ulong3)', ['(ulong3)', '(4444444, 5555555, 66666666,'])
+
+            self._try_modifying_local('double3_local', '{7.5L, -0, 8.9e1}',
+                                     '(double3)', ['(double3)', '(7.5, 0, 89,'])
+
+            self._try_modifying_local('char4_local', '{0x1, 0x2, 0x3, 0x4}',
+                                     '(char4)',
+                                     ['(char4)', '(1, 2, 3, 4)'])
+
+            self._try_modifying_local('uchar4_local', '{0x5, 0x6, 0x7, 0x8}',
+                                     '(uchar4)',
+                                     ['(uchar4)', '(0x05, 0x06, 0x07, 0x08)'])
+
+            self._try_modifying_local('short4_local', '{0x9, 0xa, 0xb, 0xc}',
+                                     '(short4)',
+                                     ['(short4)', '(9, 10, 11, 12)'])
+
+        self._try_modifying_local('ushort4_local', '{0xd, 0xe, 0xf, 0x10}',
+                                 '(ushort4)',
+                                 ['(ushort4)', '(13, 14, 15, 16)'])
+
+        if not wimpy:
+            self._try_modifying_local('int4_local', '{0x11, 0x12, 0x13, 0x14}',
+                                     '(int4)',
+                                     ['(int4)', '(17, 18, 19, 20)'])
+
+            self._try_modifying_local('uint4_local', '{0x15, 0x16, 0x17, 0x18}',
+                                     '(uint4)',
+                                     ['(uint4)', '(21, 22, 23, 24)'])
+
+            self._try_modifying_local('float4_local', '{19.0, 20.5, -21, -22.5}',
+                                     '(float4)',
+                                     ['(float4)', '(19, 20.5, -21, -22.5)'])
+
+            self._try_modifying_local('long4_local', '{0x1d, 0x1e, 0x1f, 0x20}',
+                                     '(long4)',
+                                     ['(long4)', '(29, 30, 31, 32)'])
+
+            self._try_modifying_local('ulong4_local', '{0x21, 0x22, 0x23, 0x24}',
+                                     '(ulong4)',
+                                     ['(ulong4)', '(33, 34, 35, 36)'])
+
+            self._try_modifying_local('double4_local', '{25.000, -26, -27.5, 28.0}',
+                                     '(double4)',
+                                     ['(double4)', '(25, -26, -27.5, 28)'])
diff --git a/tests/lldb/tests/java/test_write_local_element.py b/tests/lldb/tests/java/test_write_local_element.py
new file mode 100644
index 0000000..5af7d5a
--- /dev/null
+++ b/tests/lldb/tests/java/test_write_local_element.py
@@ -0,0 +1,280 @@
+'''Module that contains the test TestWriteLocalElement.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestWriteLocalElement(TestBaseRemote):
+    '''Tests modifying elements of local variables of all types.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "KernelVariables"
+
+    def _try_inspecting_local(self, local_name, expected_output):
+        '''Run the "expr" command on a given local and with a given output.
+
+        Args:
+            local_name: String which is the name of the local to inspect.
+            expected_output: List of strings that should be found in the output.
+
+        Raises:
+            TestFail: The lldb command did not provide the expected output.
+        '''
+        self.try_command('expr ' + local_name, expected_output)
+
+    def _try_modifying_local(self, local_name, new_value, expected_output,
+                             expected_output_regex=None):
+        '''Modify and then inspect a local and check for the output.
+
+        Run the "expr" command to set a given local to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            local_name: String which is the name of the local to modify.
+            new_value: A string that is the new value of the local.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr %s = %s' % (local_name, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('frame variable ' + local_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, wimpy):
+        '''Run the lldb commands that are being tested.
+
+        Args:
+            wimpy: Boolean to specify whether only a subset of the commands in
+                   this test should be executed.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=too-many-statements
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_local('char2_local[0]', '2',
+                                 ['2'], [r'\((signed )?char\)'])
+        self._try_inspecting_local('char2_local',
+                                 ['(char2)', '(2, -22)'])
+
+        if not wimpy:
+            self._try_modifying_local('uchar2_local[1]', '3',
+                                     ['3'], [r'\(u(nsigned )?char\)'])
+            self._try_inspecting_local('uchar2_local',
+                                      ['(uchar2)', '(0x21, 0x03)'])
+
+            self._try_modifying_local('short2_local[0]', '-44',
+                                     ['(short)', '-44'])
+            self._try_inspecting_local('short2_local',
+                                      ['(short2)', '(-44, 666)'])
+
+            self._try_modifying_local('ushort2_local[1]', '55',
+                                     ['55'], [r'\(u(nsigned )?short\)'])
+            self._try_inspecting_local('ushort2_local',
+                                      ['(ushort2)', '(777, 55)'])
+
+            self._try_modifying_local('int2_local[0]', '666',
+                                     ['(int)', '666'])
+            self._try_inspecting_local('int2_local',
+                                      ['(int2)', '(666, -1111)'])
+
+            self._try_modifying_local('uint2_local[1]', '777',
+                                     ['777'], [r'\(u(nsigned )?int\)'])
+            self._try_inspecting_local('uint2_local',
+                                      ['(uint2)', '(2222, 777)'])
+
+            self._try_modifying_local('float2_local[0]', '-8.5',
+                                     ['(float)', '-8.5'])
+            self._try_inspecting_local('float2_local',
+                                      ['(float2)', '(-8.5, -5)'])
+
+            self._try_modifying_local('long2_local[1]', '999999',
+                                     ['999999'],
+                                     [r'\((long )?long\)'])
+            self._try_inspecting_local('long2_local',
+                                      ['(long2)', '(-4444, 999999)'])
+
+            self._try_modifying_local('ulong2_local[0]', '10101010101',
+                                     ['10101010101'],
+                                     [r'\(u(nsigned )?(long )?long\)'])
+            self._try_inspecting_local('ulong2_local',
+                                      ['(ulong2)', '(10101010101, 7777)'])
+
+            self._try_modifying_local('double2_local[1]', '-11.000',
+                                     ['(double)', '-11'])
+            self._try_inspecting_local('double2_local',
+                                      ['(double2)', '(88.5, -11)'])
+
+            # For some reason the result of some char and uchar expr is in hex
+            # and that of frame variable in decimal, so calling
+            # try_modifying_local doesn't work, because it reuses the expected
+            # output for both commands.
+            self.try_command('expr char3_local[0] = 12',
+                             ['\'\\f\''],
+                             [r'\((signed )?char\)'])
+            self.try_command('frame variable char3_local[0]',
+                             ['12'],
+                             [r'\((signed )?char\)'])
+
+            self._try_inspecting_local('char3_local',
+                                      ['(char3)',
+                                       '(12, -22, -33,'])
+
+        self.try_command('expr uchar3_local[1] = \'d\'',
+                         ['\'d\''],
+                         [r'\(u(nsigned )?char\)'])
+        self.try_command('frame variable uchar3_local[1]',
+                         ['0x64'],
+                         [r'\(u(nsigned )?char\)'])
+
+        if not wimpy:
+            self._try_inspecting_local('uchar3_local',
+                                      ['(uchar3)',
+                                       '(0x21, 0x64, 0x37,'])
+
+            self._try_modifying_local('short3_local[2]', '-131',
+                                     ['(short)', '-131'])
+            self._try_inspecting_local('short3_local',
+                                      ['(short3)',
+                                       '(-555, 666, -131,'])
+
+            self._try_modifying_local('ushort3_local[0]', '1414',
+                                     ['1414'], [r'\(u(nsigned )?short\)'])
+            self._try_inspecting_local('ushort3_local',
+                                      ['(ushort3)',
+                                       '(1414, 888, 999,'])
+
+            self._try_modifying_local('int3_local[0]', '151515',
+                                     ['(int)', '151515'])
+            self._try_inspecting_local('int3_local',
+                                      ['(int3)',
+                                       '(151515, -1111, 2222,'])
+
+            self._try_modifying_local('uint3_local[1]', '161616',
+                                     ['161616'], [r'\(u(nsigned )?int\)'])
+            self._try_inspecting_local('uint3_local',
+                                      ['(uint3)',
+                                       '(2222, 161616, 4444,'])
+
+            self._try_modifying_local('float3_local[2]', '17.5',
+                                     ['(float)', '17.5'])
+            self._try_inspecting_local('float3_local',
+                                      ['(float3)',
+                                       '(4.5, -5, 17.5,'])
+
+            self._try_modifying_local('long3_local[0]', '-181818181818',
+                                     ['-181818181818'], [r'\((long )?long\)'])
+            self._try_inspecting_local('long3_local',
+                                      ['(long3)',
+                                       '(-181818181818, 5555, 6666,'])
+
+            self._try_modifying_local('ulong3_local[1]', '191919191919',
+                                     ['191919191919'],
+                                     [r'\(u(nsigned )?(long )?long\)'])
+            self._try_inspecting_local('ulong3_local',
+                                      ['(ulong3)',
+                                       '(6666, 191919191919, 8888,'])
+
+            self._try_modifying_local('double3_local[2]', '20.5',
+                                     ['(double)', '20.5'])
+            self._try_inspecting_local('double3_local',
+                                      ['(double3)',
+                                       '(88.5, -99, 20.5,'])
+
+            self.try_command('expr char4_local[0] = -21',
+                             ['\'\\xeb\''],
+                             [r'\((signed )?char\)'])
+            self.try_command('frame variable char4_local[0]',
+                             ['-21'],
+                             [r'\((signed )?char\)'])
+
+            self._try_inspecting_local('char4_local',
+                                      ['(char4)',
+                                       '(-21, 11, -22, -33)'])
+
+            self.try_command('expr uchar4_local[1] = 22',
+                             ['\'\\x16\''],
+                             [r'\(u(nsigned )?char\)'])
+            self.try_command('frame variable uchar4_local[1]',
+                             ['0x16'],
+                             [r'\(u(nsigned )?char\)'])
+
+            self._try_inspecting_local('uchar4_local',
+                                      ['(uchar4)',
+                                       '(0x16, 0x16, 0x2c, 0x37)'])
+
+        self._try_modifying_local('short4_local[2]', '23',
+                                 ['(short)', '23'])
+        self._try_inspecting_local('short4_local',
+                                  ['(short4)',
+                                   '(-444, -555, 23, 777)'])
+
+        if not wimpy:
+            self._try_modifying_local('ushort4_local[3]', '24',
+                                     ['24'], [r'\(u(nsigned )?short\)'])
+            self._try_inspecting_local('ushort4_local',
+                                      ['(ushort4)',
+                                       '(666, 777, 888, 24)'])
+
+            self._try_modifying_local('int4_local[0]', '-2525',
+                                     ['(int)', '-2525'])
+            self._try_inspecting_local('int4_local',
+                                      ['(int4)',
+                                       '(-2525, 999, -1111, 2222)'])
+
+            self._try_modifying_local('uint4_local[1]', '26262',
+                                     ['26262'], [r'\(u(nsigned )?int\)'])
+            self._try_inspecting_local('uint4_local',
+                                      ['(uint4)',
+                                       '(1111, 26262, 3333, 4444)'])
+
+            self._try_modifying_local('float4_local[2]', '27.0f',
+                                     ['(float)', '27'])
+            self._try_inspecting_local('float4_local',
+                                      ['(float4)',
+                                       '(3, 4.5, 27, -6.5)'])
+
+            self._try_modifying_local('long4_local[3]', '-28282828282',
+                                     ['-28282828282'], [r'\((long )?long\)'])
+            self._try_inspecting_local('long4_local',
+                                      ['(long4)',
+                                       '(-3333, -4444, 5555, -28282828282)'])
+
+            self._try_modifying_local('ulong4_local[0]', '2929292929',
+                                     ['2929292929'],
+                                     [r'\(u(nsigned )?(long )?long\)'])
+            self._try_inspecting_local('ulong4_local',
+                                      ['(ulong4)',
+                                       '(2929292929, 6666, 7777, 8888)'])
+
+            self._try_modifying_local('double4_local[1]', '30.5',
+                                     ['(double)', '30.5'])
+            self._try_inspecting_local('double4_local',
+                                      ['(double4)',
+                                       '(-77, 30.5, -99, 111.5)'])
diff --git a/tests/lldb/tests/jni/test_allocation_dump_1_jni.py b/tests/lldb/tests/jni/test_allocation_dump_1_jni.py
new file mode 100644
index 0000000..136c261
--- /dev/null
+++ b/tests/lldb/tests/jni/test_allocation_dump_1_jni.py
@@ -0,0 +1,316 @@
+'''Module that contains the test TestAllocationDump1JNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+import os
+
+
+class TestAllocationDump1(TestBaseRemote):
+    '''Tests printing the contents of allocations.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            String that is the name of the binary that this test should be run
+            with.
+        '''
+        return 'JNIAllocations'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test dumping large allocations to file
+        output_file_1 = self.get_tmp_file_path()
+        output_file_2 = self.get_tmp_file_path()
+
+        self.try_command('language renderscript allocation dump 1 -f ' +
+                         output_file_1,
+                         ["Results written to '%s'" % output_file_1])
+
+        self.try_command('language renderscript allocation dump 2 -f '
+                         + output_file_2,
+                         ["Results written to '%s'" % output_file_2])
+
+        # Check files were created
+        self.test_assert(os.path.isfile(output_file_1))
+        self.test_assert(os.path.isfile(output_file_2))
+        os.remove(output_file_1)
+        os.remove(output_file_2)
+
+        # char
+        self.try_command('language renderscript allocation dump 3',
+                         ['(0, 0, 0) = 0',
+                          '(0, 1, 0) = 1',
+                          '(0, 2, 0) = 2',
+                          '(0, 0, 1) = 3',
+                          '(0, 1, 1) = 4',
+                          '(0, 2, 1) = 5',
+                          '(0, 0, 2) = 6',
+                          '(0, 1, 2) = 7',
+                          '(0, 2, 2) = 8',
+                          '(0, 0, 3) = 9',
+                          '(0, 1, 3) = 10',
+                          '(0, 2, 3) = 11',
+                          '(0, 0, 4) = 12',
+                          '(0, 1, 4) = 13',
+                          '(0, 2, 4) = 14',
+                          '(0, 0, 5) = 15',
+                          '(0, 1, 5) = 16',
+                          '(0, 2, 5) = 17',
+                          '(0, 0, 6) = 18',
+                          '(0, 1, 6) = 19',
+                          '(0, 2, 6) = 20',
+                          '(0, 0, 7) = 21',
+                          '(0, 1, 7) = 22',
+                          '(0, 2, 7) = 23'])
+
+        # char2
+        self.try_command('language renderscript allocation dump 4',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(6, 0, 0) = {12 13}',
+                          '(7, 0, 0) = {14 15}',
+                          '(8, 0, 0) = {16 17}',
+                          '(9, 0, 0) = {18 19}',
+                          '(10, 0, 0) = {20 21}',
+                          '(11, 0, 0) = {22 23}'])
+
+        # char3
+        self.try_command('language renderscript allocation dump 5',
+                         ['(0, 0, 0) = {0 1 2}',
+                          '(1, 0, 0) = {4 5 6}',
+                          '(2, 0, 0) = {8 9 10}',
+                          '(3, 0, 0) = {12 13 14}',
+                          '(4, 0, 0) = {16 17 18}',
+                          '(5, 0, 0) = {20 21 22}'])
+
+        # char4
+        self.try_command('language renderscript allocation dump 6',
+                         ['(0, 0, 0) = {0 1 2 3}',
+                          '(1, 0, 0) = {4 5 6 7}',
+                          '(2, 0, 0) = {8 9 10 11}',
+                          '(3, 0, 0) = {12 13 14 15}',
+                          '(4, 0, 0) = {16 17 18 19}',
+                          '(5, 0, 0) = {20 21 22 23}'])
+
+        # short
+        self.try_command('language renderscript allocation dump 7',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # short2
+        self.try_command('language renderscript allocation dump 8',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(0, 0, 1) = {12 13}',
+                          '(1, 0, 1) = {14 15}',
+                          '(2, 0, 1) = {16 17}',
+                          '(3, 0, 1) = {18 19}',
+                          '(4, 0, 1) = {20 21}',
+                          '(5, 0, 1) = {22 23}'])
+
+        # short3
+        self.try_command('language renderscript allocation dump 9',
+                         ['(0, 0, 0) = {0 1 2}',
+                          '(1, 0, 0) = {4 5 6}',
+                          '(2, 0, 0) = {8 9 10}',
+                          '(3, 0, 0) = {12 13 14}',
+                          '(4, 0, 0) = {16 17 18}',
+                          '(5, 0, 0) = {20 21 22}'])
+
+        # short4
+        self.try_command('language renderscript allocation dump 10',
+                         ['(0, 0, 0) = {0 1 2 3}',
+                          '(1, 0, 0) = {4 5 6 7}',
+                          '(2, 0, 0) = {8 9 10 11}',
+                          '(3, 0, 0) = {12 13 14 15}',
+                          '(4, 0, 0) = {16 17 18 19}',
+                          '(5, 0, 0) = {20 21 22 23}'])
+
+        # int
+        self.try_command('language renderscript allocation dump 11',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # int2
+        self.try_command('language renderscript allocation dump 12',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(6, 0, 0) = {12 13}',
+                          '(7, 0, 0) = {14 15}',
+                          '(8, 0, 0) = {16 17}',
+                          '(9, 0, 0) = {18 19}',
+                          '(10, 0, 0) = {20 21}',
+                          '(11, 0, 0) = {22 23}'])
+
+        # int3
+        self.try_command('language renderscript allocation dump 13',
+                         ['(0, 0, 0) = {0 1 2}',
+                          '(1, 0, 0) = {4 5 6}',
+                          '(2, 0, 0) = {8 9 10}',
+                          '(0, 1, 0) = {12 13 14}',
+                          '(1, 1, 0) = {16 17 18}',
+                          '(2, 1, 0) = {20 21 22}'])
+        # int4
+        self.try_command('language renderscript allocation dump 14',
+                         ['(0, 0, 0) = {0 1 2 3}',
+                          '(1, 0, 0) = {4 5 6 7}',
+                          '(2, 0, 0) = {8 9 10 11}',
+                          '(3, 0, 0) = {12 13 14 15}',
+                          '(4, 0, 0) = {16 17 18 19}',
+                          '(5, 0, 0) = {20 21 22 23}'])
+
+        # long
+        self.try_command('language renderscript allocation dump 15',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # long2
+        self.try_command('language renderscript allocation dump 16',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(6, 0, 0) = {12 13}',
+                          '(7, 0, 0) = {14 15}',
+                          '(8, 0, 0) = {16 17}',
+                          '(9, 0, 0) = {18 19}',
+                          '(10, 0, 0) = {20 21}',
+                          '(11, 0, 0) = {22 23}'])
+
+        # long3
+        self.try_command('language renderscript allocation dump 17',
+                         ['(0, 0, 0) = {0 1 2}',
+                          '(1, 0, 0) = {4 5 6}',
+                          '(2, 0, 0) = {8 9 10}',
+                          '(3, 0, 0) = {12 13 14}',
+                          '(4, 0, 0) = {16 17 18}',
+                          '(5, 0, 0) = {20 21 22}'])
+
+        # long4
+        self.try_command('language renderscript allocation dump 18',
+                         ['(0, 0, 0) = {0 1 2 3}',
+                          '(0, 1, 0) = {4 5 6 7}',
+                          '(0, 2, 0) = {8 9 10 11}',
+                          '(0, 3, 0) = {12 13 14 15}',
+                          '(0, 4, 0) = {16 17 18 19}',
+                          '(0, 5, 0) = {20 21 22 23}'])
+
+        # bool
+        self.try_command('language renderscript allocation dump 19',
+                         ['(0, 0, 0) = false',
+                          '(1, 0, 0) = true',
+                          '(2, 0, 0) = false',
+                          '(3, 0, 0) = true',
+                          '(4, 0, 0) = false',
+                          '(5, 0, 0) = true',
+                          '(6, 0, 0) = false',
+                          '(7, 0, 0) = true',
+                          '(8, 0, 0) = false',
+                          '(9, 0, 0) = true',
+                          '(10, 0, 0) = false',
+                          '(11, 0, 0) = true',
+                          '(12, 0, 0) = false',
+                          '(13, 0, 0) = true',
+                          '(14, 0, 0) = false',
+                          '(15, 0, 0) = true',
+                          '(16, 0, 0) = false',
+                          '(17, 0, 0) = true',
+                          '(18, 0, 0) = false',
+                          '(19, 0, 0) = true',
+                          '(20, 0, 0) = false',
+                          '(21, 0, 0) = true',
+                          '(22, 0, 0) = false',
+                          '(23, 0, 0) = true'])
diff --git a/tests/lldb/tests/jni/test_allocation_dump_2_jni.py b/tests/lldb/tests/jni/test_allocation_dump_2_jni.py
new file mode 100644
index 0000000..4f4bfe7
--- /dev/null
+++ b/tests/lldb/tests/jni/test_allocation_dump_2_jni.py
@@ -0,0 +1,507 @@
+'''Module that contains the test TestAllocationDump2JNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestAllocationDump2JNI(TestBaseRemote):
+    '''Tests printing the contents of allocations of a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIAllocations'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint del 1',
+                         ['1 breakpoints deleted'])
+
+        # Hit second kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # uchar
+        self.try_command('language renderscript allocation dump 20',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # uchar2
+        self.try_command('language renderscript allocation dump 21',
+                         ['(0, 0, 0) = {0x00 0x01}',
+                          '(1, 0, 0) = {0x02 0x03}',
+                          '(0, 1, 0) = {0x04 0x05}',
+                          '(1, 1, 0) = {0x06 0x07}',
+                          '(0, 2, 0) = {0x08 0x09}',
+                          '(1, 2, 0) = {0x0a 0x0b}',
+                          '(0, 3, 0) = {0x0c 0x0d}',
+                          '(1, 3, 0) = {0x0e 0x0f}',
+                          '(0, 4, 0) = {0x10 0x11}',
+                          '(1, 4, 0) = {0x12 0x13}',
+                          '(0, 5, 0) = {0x14 0x15}',
+                          '(1, 5, 0) = {0x16 0x17}'])
+
+        # uchar3
+        self.try_command('language renderscript allocation dump 22',
+                         ['(0, 0, 0) = {0x00 0x01 0x02}',
+                          '(1, 0, 0) = {0x04 0x05 0x06}',
+                          '(2, 0, 0) = {0x08 0x09 0x0a}',
+                          '(3, 0, 0) = {0x0c 0x0d 0x0e}',
+                          '(4, 0, 0) = {0x10 0x11 0x12}',
+                          '(5, 0, 0) = {0x14 0x15 0x16}'])
+
+        # uchar4
+        self.try_command('language renderscript allocation dump 23',
+                         ['(0, 0, 0) = {0x00 0x01 0x02 0x03}',
+                          '(1, 0, 0) = {0x04 0x05 0x06 0x07}',
+                          '(2, 0, 0) = {0x08 0x09 0x0a 0x0b}',
+                          '(3, 0, 0) = {0x0c 0x0d 0x0e 0x0f}',
+                          '(4, 0, 0) = {0x10 0x11 0x12 0x13}',
+                          '(5, 0, 0) = {0x14 0x15 0x16 0x17}'])
+
+        # ushort
+        self.try_command('language renderscript allocation dump 24',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # ushort2
+        self.try_command('language renderscript allocation dump 25',
+                         ['(0, 0, 0) = {0x0000 0x0001}',
+                          '(1, 0, 0) = {0x0002 0x0003}',
+                          '(2, 0, 0) = {0x0004 0x0005}',
+                          '(3, 0, 0) = {0x0006 0x0007}',
+                          '(4, 0, 0) = {0x0008 0x0009}',
+                          '(5, 0, 0) = {0x000a 0x000b}',
+                          '(6, 0, 0) = {0x000c 0x000d}',
+                          '(7, 0, 0) = {0x000e 0x000f}',
+                          '(8, 0, 0) = {0x0010 0x0011}',
+                          '(9, 0, 0) = {0x0012 0x0013}',
+                          '(10, 0, 0) = {0x0014 0x0015}',
+                          '(11, 0, 0) = {0x0016 0x0017}'])
+
+        # ushort3
+        self.try_command('language renderscript allocation dump 26',
+                         ['(0, 0, 0) = {0x0000 0x0001 0x0002}',
+                          '(0, 1, 0) = {0x0004 0x0005 0x0006}',
+                          '(0, 2, 0) = {0x0008 0x0009 0x000a}',
+                          '(0, 3, 0) = {0x000c 0x000d 0x000e}',
+                          '(0, 4, 0) = {0x0010 0x0011 0x0012}',
+                          '(0, 5, 0) = {0x0014 0x0015 0x0016}'])
+
+        # ushort4
+        self.try_command('language renderscript allocation dump 27',
+                         ['(0, 0, 0) = {0x0000 0x0001 0x0002 0x0003}',
+                          '(1, 0, 0) = {0x0004 0x0005 0x0006 0x0007}',
+                          '(2, 0, 0) = {0x0008 0x0009 0x000a 0x000b}',
+                          '(3, 0, 0) = {0x000c 0x000d 0x000e 0x000f}',
+                          '(4, 0, 0) = {0x0010 0x0011 0x0012 0x0013}',
+                          '(5, 0, 0) = {0x0014 0x0015 0x0016 0x0017}'])
+
+        # uint
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
+
+        # uint2
+        self.try_command('language renderscript allocation dump 29',
+                         ['(0, 0, 0) = {0x00000000 0x00000001}',
+                          '(1, 0, 0) = {0x00000002 0x00000003}',
+                          '(2, 0, 0) = {0x00000004 0x00000005}',
+                          '(3, 0, 0) = {0x00000006 0x00000007}',
+                          '(4, 0, 0) = {0x00000008 0x00000009}',
+                          '(5, 0, 0) = {0x0000000a 0x0000000b}',
+                          '(6, 0, 0) = {0x0000000c 0x0000000d}',
+                          '(7, 0, 0) = {0x0000000e 0x0000000f}',
+                          '(8, 0, 0) = {0x00000010 0x00000011}',
+                          '(9, 0, 0) = {0x00000012 0x00000013}',
+                          '(10, 0, 0) = {0x00000014 0x00000015}',
+                          '(11, 0, 0) = {0x00000016 0x00000017}'])
+
+        # uint3
+        self.try_command('language renderscript allocation dump 30',
+                         ['(0, 0, 0) = {0x00000000 0x00000001 0x00000002}',
+                          '(1, 0, 0) = {0x00000004 0x00000005 0x00000006}',
+                          '(2, 0, 0) = {0x00000008 0x00000009 0x0000000a}',
+                          '(3, 0, 0) = {0x0000000c 0x0000000d 0x0000000e}',
+                          '(4, 0, 0) = {0x00000010 0x00000011 0x00000012}',
+                          '(5, 0, 0) = {0x00000014 0x00000015 0x00000016}'])
+
+        # uint4
+        self.try_command('language renderscript allocation dump 31',
+                         ['(0, 0, 0) = {0x00000000 0x00000001 0x00000002 0x00000003}',
+                          '(0, 0, 1) = {0x00000004 0x00000005 0x00000006 0x00000007}',
+                          '(0, 0, 2) = {0x00000008 0x00000009 0x0000000a 0x0000000b}',
+                          '(0, 0, 3) = {0x0000000c 0x0000000d 0x0000000e 0x0000000f}',
+                          '(0, 0, 4) = {0x00000010 0x00000011 0x00000012 0x00000013}',
+                          '(0, 0, 5) = {0x00000014 0x00000015 0x00000016 0x00000017}'])
+
+        # ulong
+        self.try_command('language renderscript allocation dump 32',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(0, 1, 0) = 4',
+                          '(1, 1, 0) = 5',
+                          '(2, 1, 0) = 6',
+                          '(3, 1, 0) = 7',
+                          '(0, 2, 0) = 8',
+                          '(1, 2, 0) = 9',
+                          '(2, 2, 0) = 10',
+                          '(3, 2, 0) = 11',
+                          '(0, 0, 1) = 12',
+                          '(1, 0, 1) = 13',
+                          '(2, 0, 1) = 14',
+                          '(3, 0, 1) = 15',
+                          '(0, 1, 1) = 16',
+                          '(1, 1, 1) = 17',
+                          '(2, 1, 1) = 18',
+                          '(3, 1, 1) = 19',
+                          '(0, 2, 1) = 20',
+                          '(1, 2, 1) = 21',
+                          '(2, 2, 1) = 22',
+                          '(3, 2, 1) = 23'])
+
+        # ulong2
+        self.try_command('language renderscript allocation dump 33',
+                         ['(0, 0, 0) = {0x0000000000000000 0x0000000000000001}',
+                          '(1, 0, 0) = {0x0000000000000002 0x0000000000000003}',
+                          '(2, 0, 0) = {0x0000000000000004 0x0000000000000005}',
+                          '(3, 0, 0) = {0x0000000000000006 0x0000000000000007}',
+                          '(4, 0, 0) = {0x0000000000000008 0x0000000000000009}',
+                          '(5, 0, 0) = {0x000000000000000a 0x000000000000000b}',
+                          '(6, 0, 0) = {0x000000000000000c 0x000000000000000d}',
+                          '(7, 0, 0) = {0x000000000000000e 0x000000000000000f}',
+                          '(8, 0, 0) = {0x0000000000000010 0x0000000000000011}',
+                          '(9, 0, 0) = {0x0000000000000012 0x0000000000000013}',
+                          '(10, 0, 0) = {0x0000000000000014 0x0000000000000015}',
+                          '(11, 0, 0) = {0x0000000000000016 0x0000000000000017}'])
+
+        # ulong3
+        self.try_command('language renderscript allocation dump 34',
+                         ['(0, 0, 0) = {0x0000000000000000 0x0000000000000001 0x0000000000000002}',
+                          '(1, 0, 0) = {0x0000000000000004 0x0000000000000005 0x0000000000000006}',
+                          '(2, 0, 0) = {0x0000000000000008 0x0000000000000009 0x000000000000000a}',
+                          '(3, 0, 0) = {0x000000000000000c 0x000000000000000d 0x000000000000000e}',
+                          '(4, 0, 0) = {0x0000000000000010 0x0000000000000011 0x0000000000000012}',
+                          '(5, 0, 0) = {0x0000000000000014 0x0000000000000015 0x0000000000000016}'])
+
+        # ulong4
+        self.try_command('language renderscript allocation dump 35',
+                         ['(0, 0, 0) = {0x0000000000000000 0x0000000000000001 '
+                                       '0x0000000000000002 0x0000000000000003}',
+                          '(1, 0, 0) = {0x0000000000000004 0x0000000000000005 '
+                                       '0x0000000000000006 0x0000000000000007}',
+                          '(2, 0, 0) = {0x0000000000000008 0x0000000000000009 '
+                                       '0x000000000000000a 0x000000000000000b}',
+                          '(3, 0, 0) = {0x000000000000000c 0x000000000000000d '
+                                       '0x000000000000000e 0x000000000000000f}',
+                          '(4, 0, 0) = {0x0000000000000010 0x0000000000000011 '
+                                       '0x0000000000000012 0x0000000000000013}',
+                          '(5, 0, 0) = {0x0000000000000014 0x0000000000000015 '
+                                       '0x0000000000000016 0x0000000000000017}'])
+
+        self.try_command('breakpoint del 2',
+                         ['1 breakpoints deleted'])
+
+        # Hit third kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test that uint allocation has been squared by square_kernel
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 4',
+                          '(3, 0, 0) = 9',
+                          '(4, 0, 0) = 16',
+                          '(5, 0, 0) = 25',
+                          '(6, 0, 0) = 36',
+                          '(7, 0, 0) = 49',
+                          '(8, 0, 0) = 64',
+                          '(9, 0, 0) = 81',
+                          '(10, 0, 0) = 100',
+                          '(11, 0, 0) = 121',
+                          '(12, 0, 0) = 144',
+                          '(13, 0, 0) = 169',
+                          '(14, 0, 0) = 196',
+                          '(15, 0, 0) = 225',
+                          '(16, 0, 0) = 256',
+                          '(17, 0, 0) = 289',
+                          '(18, 0, 0) = 324',
+                          '(19, 0, 0) = 361',
+                          '(20, 0, 0) = 400',
+                          '(21, 0, 0) = 441',
+                          '(22, 0, 0) = 484',
+                          '(23, 0, 0) = 529'])
+
+        # half
+        self.try_command('language renderscript allocation dump 36',
+                         ['(0, 0, 0) = inf',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 0.5',
+                          '(3, 0, 0) = 0.333252',
+                          '(4, 0, 0) = 0.25',
+                          '(5, 0, 0) = 0.199951',
+                          '(6, 0, 0) = 0.166626',
+                          '(7, 0, 0) = 0.142822',
+                          '(8, 0, 0) = 0.125',
+                          '(9, 0, 0) = 0.111084',
+                          '(10, 0, 0) = 0.0999756',
+                          '(11, 0, 0) = 0.0908813',
+                          '(12, 0, 0) = 0.083313',
+                          '(13, 0, 0) = 0.0769043',
+                          '(14, 0, 0) = 0.0714111',
+                          '(15, 0, 0) = 0.0666504',
+                          '(16, 0, 0) = 0.0625',
+                          '(17, 0, 0) = 0.0588379',
+                          '(18, 0, 0) = 0.055542',
+                          '(19, 0, 0) = 0.0526428',
+                          '(20, 0, 0) = 0.0499878',
+                          '(21, 0, 0) = 0.0476074',
+                          '(22, 0, 0) = 0.0454407',
+                          '(23, 0, 0) = 0.0434875'])
+
+        # half2
+        self.try_command('language renderscript allocation dump 37',
+                         ['(0, 0, 0) = {inf 1}',
+                          '(1, 0, 0) = {0.5 0.333252}',
+                          '(2, 0, 0) = {0.25 0.199951}',
+                          '(3, 0, 0) = {0.166626 0.142822}',
+                          '(4, 0, 0) = {0.125 0.111084}',
+                          '(5, 0, 0) = {0.0999756 0.0908813}',
+                          '(6, 0, 0) = {0.083313 0.0769043}',
+                          '(7, 0, 0) = {0.0714111 0.0666504}',
+                          '(8, 0, 0) = {0.0625 0.0588379}',
+                          '(9, 0, 0) = {0.055542 0.0526428}',
+                          '(10, 0, 0) = {0.0499878 0.0476074}',
+                          '(11, 0, 0) = {0.0454407 0.0434875}'])
+
+        # half3
+        self.try_command('language renderscript allocation dump 38',
+                         ['(0, 0, 0) = {inf 1 0.5}',
+                          '(0, 1, 0) = {0.25 0.199951 0.166626}',
+                          '(0, 2, 0) = {0.125 0.111084 0.0999756}',
+                          '(0, 3, 0) = {0.083313 0.0769043 0.0714111}',
+                          '(0, 4, 0) = {0.0625 0.0588379 0.055542}',
+                          '(0, 5, 0) = {0.0499878 0.0476074 0.0454407}'])
+
+        # half4
+        self.try_command('language renderscript allocation dump 39',
+                         ['(0, 0, 0) = {inf 1 0.5 0.333252}',
+                          '(1, 0, 0) = {0.25 0.199951 0.166626 0.142822}',
+                          '(2, 0, 0) = {0.125 0.111084 0.0999756 0.0908813}',
+                          '(3, 0, 0) = {0.083313 0.0769043 0.0714111 0.0666504}',
+                          '(4, 0, 0) = {0.0625 0.0588379 0.055542 0.0526428}',
+                          '(5, 0, 0) = {0.0499878 0.0476074 0.0454407 0.0434875}'])
+
+        # float
+        self.try_command('language renderscript allocation dump 40',
+                         ['(0, 0, 0) = inf',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 0.5',
+                          '(3, 0, 0) = 0.333333',
+                          '(4, 0, 0) = 0.25',
+                          '(5, 0, 0) = 0.2',
+                          '(6, 0, 0) = 0.166667',
+                          '(7, 0, 0) = 0.142857',
+                          '(8, 0, 0) = 0.125',
+                          '(9, 0, 0) = 0.111111',
+                          '(10, 0, 0) = 0.1',
+                          '(11, 0, 0) = 0.0909091',
+                          '(12, 0, 0) = 0.0833333',
+                          '(13, 0, 0) = 0.0769231',
+                          '(14, 0, 0) = 0.0714286',
+                          '(15, 0, 0) = 0.0666667',
+                          '(16, 0, 0) = 0.0625',
+                          '(17, 0, 0) = 0.0588235',
+                          '(18, 0, 0) = 0.0555556',
+                          '(19, 0, 0) = 0.0526316',
+                          '(20, 0, 0) = 0.05',
+                          '(21, 0, 0) = 0.047619',
+                          '(22, 0, 0) = 0.0454545',
+                          '(23, 0, 0) = 0.0434783'])
+
+        # float2
+        self.try_command('language renderscript allocation dump 41',
+                         ['(0, 0, 0) = {inf 1}',
+                          '(1, 0, 0) = {0.5 0.333333}',
+                          '(2, 0, 0) = {0.25 0.2}',
+                          '(3, 0, 0) = {0.166667 0.142857}',
+                          '(4, 0, 0) = {0.125 0.111111}',
+                          '(5, 0, 0) = {0.1 0.0909091}',
+                          '(6, 0, 0) = {0.0833333 0.0769231}',
+                          '(7, 0, 0) = {0.0714286 0.0666667}',
+                          '(8, 0, 0) = {0.0625 0.0588235}',
+                          '(9, 0, 0) = {0.0555556 0.0526316}',
+                          '(10, 0, 0) = {0.05 0.047619}',
+                          '(11, 0, 0) = {0.0454545 0.0434783}'])
+
+        # float3
+        self.try_command('language renderscript allocation dump 42',
+                         ['(0, 0, 0) = {inf 1 0.5}',
+                          '(1, 0, 0) = {0.25 0.2 0.166667}',
+                          '(2, 0, 0) = {0.125 0.111111 0.1}',
+                          '(3, 0, 0) = {0.0833333 0.0769231 0.0714286}',
+                          '(4, 0, 0) = {0.0625 0.0588235 0.0555556}',
+                          '(5, 0, 0) = {0.05 0.047619 0.0454545}'])
+
+        # float4
+        self.try_command('language renderscript allocation dump 43',
+                         ['(0, 0, 0) = {inf 1 0.5 0.333333}',
+                          '(1, 0, 0) = {0.25 0.2 0.166667 0.142857}',
+                          '(2, 0, 0) = {0.125 0.111111 0.1 0.0909091}',
+                          '(0, 1, 0) = {0.0833333 0.0769231 0.0714286 0.0666667}',
+                          '(1, 1, 0) = {0.0625 0.0588235 0.0555556 0.0526316}',
+                          '(2, 1, 0) = {0.05 0.047619 0.0454545 0.0434783}'])
+
+        # double
+        self.try_command('language renderscript allocation dump 44',
+                         ['(0, 0, 0) = inf',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 0.5',
+                          '(3, 0, 0) = 0.333333333333333',
+                          '(4, 0, 0) = 0.25',
+                          '(5, 0, 0) = 0.2',
+                          '(6, 0, 0) = 0.166666666666667',
+                          '(7, 0, 0) = 0.142857142857143',
+                          '(8, 0, 0) = 0.125',
+                          '(9, 0, 0) = 0.111111111111111',
+                          '(10, 0, 0) = 0.1',
+                          '(11, 0, 0) = 0.0909090909090909',
+                          '(12, 0, 0) = 0.0833333333333333',
+                          '(13, 0, 0) = 0.0769230769230769',
+                          '(14, 0, 0) = 0.0714285714285714',
+                          '(15, 0, 0) = 0.0666666666666667',
+                          '(16, 0, 0) = 0.0625',
+                          '(17, 0, 0) = 0.0588235294117647',
+                          '(18, 0, 0) = 0.0555555555555556',
+                          '(19, 0, 0) = 0.0526315789473684',
+                          '(20, 0, 0) = 0.05',
+                          '(21, 0, 0) = 0.0476190476190476',
+                          '(22, 0, 0) = 0.0454545454545455',
+                          '(23, 0, 0) = 0.0434782608695652'])
+
+        # double2
+        self.try_command('language renderscript allocation dump 45',
+                         ['(0, 0, 0) = {inf 1}',
+                          '(1, 0, 0) = {0.5 0.333333333333333}',
+                          '(2, 0, 0) = {0.25 0.2}',
+                          '(3, 0, 0) = {0.166666666666667 0.142857142857143}',
+                          '(0, 0, 1) = {0.125 0.111111111111111}',
+                          '(1, 0, 1) = {0.1 0.0909090909090909}',
+                          '(2, 0, 1) = {0.0833333333333333 0.0769230769230769}',
+                          '(3, 0, 1) = {0.0714285714285714 0.0666666666666667}',
+                          '(0, 0, 2) = {0.0625 0.0588235294117647}',
+                          '(1, 0, 2) = {0.0555555555555556 0.0526315789473684}',
+                          '(2, 0, 2) = {0.05 0.0476190476190476}',
+                          '(3, 0, 2) = {0.0454545454545455 0.0434782608695652}'])
+
+        # double3
+        self.try_command('language renderscript allocation dump 46',
+                         ['(0, 0, 0) = {inf 1 0.5}',
+                          '(0, 1, 0) = {0.25 0.2 0.166666666666667}',
+                          '(0, 0, 1) = {0.125 0.111111111111111 0.1}',
+                          '(0, 1, 1) = {0.0833333333333333 0.0769230769230769 '
+                                       '0.0714285714285714}',
+                          '(0, 0, 2) = {0.0625 0.0588235294117647 0.0555555555555556}',
+                          '(0, 1, 2) = {0.05 0.0476190476190476 0.0454545454545455}'])
+
+        # double4
+        self.try_command('language renderscript allocation dump 47',
+                         ['(0, 0, 0) = {inf 1 0.5 0.333333333333333}',
+                          '(0, 1, 0) = {0.25 0.2 0.166666666666667 0.142857142857143}',
+                          '(0, 0, 1) = {0.125 0.111111111111111 0.1 0.0909090909090909}',
+                          '(0, 1, 1) = {0.0833333333333333 0.0769230769230769 '
+                                       '0.0714285714285714 0.0666666666666667}',
+                          '(0, 0, 2) = {0.0625 0.0588235294117647 '
+                                       '0.0555555555555556 0.0526315789473684}',
+                          '(0, 1, 2) = {0.05 0.0476190476190476 '
+                                       '0.0454545454545455 0.0434782608695652}'])
diff --git a/tests/lldb/tests/jni/test_allocation_file_jni.py b/tests/lldb/tests/jni/test_allocation_file_jni.py
new file mode 100644
index 0000000..afec575
--- /dev/null
+++ b/tests/lldb/tests/jni/test_allocation_file_jni.py
@@ -0,0 +1,188 @@
+'''Module that contains the test TestAllocationFileJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+import os
+
+class TestAllocationFileJNI(TestBaseRemote):
+    '''Tests saving an allocation of a JNI apk to disk and reloading it.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIAllocations'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Binary file of int2 allocation
+        file_int2 = self.get_tmp_file_path()
+
+        self.try_command('language renderscript allocation save 12 ' +
+                         file_int2,
+                         ["Allocation written to file '%s'" % file_int2])
+
+        # Check file was created
+        self.test_assert(os.path.isfile(file_int2))
+
+        # Load the file we just created, to assert the allocation contents are
+        # the same
+        self.try_command('language renderscript allocation load 12 ' +
+                         file_int2,
+                         ["Contents of file '%s' read into allocation 12" %
+                          file_int2])
+        os.remove(file_int2)
+
+        self.try_command('language renderscript allocation dump 12',
+                         ['(0, 0, 0) = {0 1}',
+                          '(1, 0, 0) = {2 3}',
+                          '(2, 0, 0) = {4 5}',
+                          '(3, 0, 0) = {6 7}',
+                          '(4, 0, 0) = {8 9}',
+                          '(5, 0, 0) = {10 11}',
+                          '(6, 0, 0) = {12 13}',
+                          '(7, 0, 0) = {14 15}',
+                          '(8, 0, 0) = {16 17}',
+                          '(9, 0, 0) = {18 19}',
+                          '(10, 0, 0) = {20 21}',
+                          '(11, 0, 0) = {22 23}'])
+
+        self.try_command('breakpoint del 1',
+                         ['1 breakpoints deleted'])
+
+        # Hit second kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Binary file of uint allocation
+        file_uint = self.get_tmp_file_path()
+
+        self.try_command('language renderscript allocation save 28 ' +
+                         file_uint,
+                         ["Allocation written to file '%s'" % file_uint])
+
+        # Check file was created
+        self.test_assert(os.path.isfile(file_uint))
+
+        # Test loading file into allocation with an incompatible type 'short'
+        self.try_command('language renderscript allocation load 7 ' + file_uint,
+                         ["Contents of file '%s' read into allocation 7" %
+                          file_uint,
+                          "Warning: Mismatched Element sizes",
+                          "Warning: Mismatched Types",
+                          "Warning: Mismatched allocation sizes"])
+
+        # Check result of size inconsistency, mapping 4-byte unsigned to 2-byte
+        # int
+        self.try_command('language renderscript allocation dump 7',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 0',
+                          '(2, 0, 0) = 1',
+                          '(3, 0, 0) = 0',
+                          '(4, 0, 0) = 2',
+                          '(5, 0, 0) = 0',
+                          '(6, 0, 0) = 3',
+                          '(7, 0, 0) = 0',
+                          '(8, 0, 0) = 4',
+                          '(9, 0, 0) = 0',
+                          '(10, 0, 0) = 5',
+                          '(11, 0, 0) = 0',
+                          '(12, 0, 0) = 6',
+                          '(13, 0, 0) = 0',
+                          '(14, 0, 0) = 7',
+                          '(15, 0, 0) = 0',
+                          '(16, 0, 0) = 8',
+                          '(17, 0, 0) = 0',
+                          '(18, 0, 0) = 9',
+                          '(19, 0, 0) = 0',
+                          '(20, 0, 0) = 10',
+                          '(21, 0, 0) = 0',
+                          '(22, 0, 0) = 11',
+                          '(23, 0, 0) = 0'])
+
+        self.try_command('breakpoint del 2',
+                         ['1 breakpoints deleted'])
+
+        # Hit third kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test that uint allocation has been squared by square_kernel
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 4',
+                          '(3, 0, 0) = 9',
+                          '(4, 0, 0) = 16',
+                          '(5, 0, 0) = 25',
+                          '(6, 0, 0) = 36',
+                          '(7, 0, 0) = 49',
+                          '(8, 0, 0) = 64',
+                          '(9, 0, 0) = 81',
+                          '(10, 0, 0) = 100',
+                          '(11, 0, 0) = 121',
+                          '(12, 0, 0) = 144',
+                          '(13, 0, 0) = 169',
+                          '(14, 0, 0) = 196',
+                          '(15, 0, 0) = 225',
+                          '(16, 0, 0) = 256',
+                          '(17, 0, 0) = 289',
+                          '(18, 0, 0) = 324',
+                          '(19, 0, 0) = 361',
+                          '(20, 0, 0) = 400',
+                          '(21, 0, 0) = 441',
+                          '(22, 0, 0) = 484',
+                          '(23, 0, 0) = 529'])
+
+        # Load uint allocation from save before square_kernel had been run
+        self.try_command('language renderscript allocation load 28 ' +
+                         file_uint,
+                         ["Contents of file '%s' read into allocation 28" %
+                          file_uint])
+        os.remove(file_uint)
+
+        # Check contents are back to original
+        self.try_command('language renderscript allocation dump 28',
+                         ['(0, 0, 0) = 0',
+                          '(1, 0, 0) = 1',
+                          '(2, 0, 0) = 2',
+                          '(3, 0, 0) = 3',
+                          '(4, 0, 0) = 4',
+                          '(5, 0, 0) = 5',
+                          '(6, 0, 0) = 6',
+                          '(7, 0, 0) = 7',
+                          '(8, 0, 0) = 8',
+                          '(9, 0, 0) = 9',
+                          '(10, 0, 0) = 10',
+                          '(11, 0, 0) = 11',
+                          '(12, 0, 0) = 12',
+                          '(13, 0, 0) = 13',
+                          '(14, 0, 0) = 14',
+                          '(15, 0, 0) = 15',
+                          '(16, 0, 0) = 16',
+                          '(17, 0, 0) = 17',
+                          '(18, 0, 0) = 18',
+                          '(19, 0, 0) = 19',
+                          '(20, 0, 0) = 20',
+                          '(21, 0, 0) = 21',
+                          '(22, 0, 0) = 22',
+                          '(23, 0, 0) = 23'])
diff --git a/tests/lldb/tests/jni/test_allocation_list_jni.py b/tests/lldb/tests/jni/test_allocation_list_jni.py
new file mode 100644
index 0000000..a454194
--- /dev/null
+++ b/tests/lldb/tests/jni/test_allocation_list_jni.py
@@ -0,0 +1,439 @@
+'''Module that contains the test TestAllocationListJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+#
+class TestAllocationListJNI(TestBaseRemote):
+    '''Tests printing the details of all allocations of a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIAllocations'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=anomalous-backslash-in-string
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test command line flag for single allocation
+        self.try_command('language renderscript allocation list -i 3',
+                         [],
+                         ['3:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 3, 8\)\n'
+                          '    Data Type: char\n'
+                          '    Data Kind: User'])
+
+        self.try_command('language renderscript allocation list',
+                         [],
+                         ['1:\n'
+                          # Regex for non zero hex number
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '2:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '3:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 3, 8\)\n'
+                          '    Data Type: char\n'
+                          '    Data Kind: User',
+                          '4:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: char2\n'
+                          '    Data Kind: User',
+                          '5:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: char3\n'
+                          '    Data Kind: User',
+                          '6:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: char4\n'
+                          '    Data Kind: User',
+                          '7:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: short\n'
+                          '    Data Kind: User',
+                          '8:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 1, 2\)\n'
+                          '    Data Type: short2\n'
+                          '    Data Kind: User',
+                          '9:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: short3\n'
+                          '    Data Kind: User',
+                          '10:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: short4\n'
+                          '    Data Kind: User',
+                          '11:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: int\n'
+                          '    Data Kind: User',
+                          '12:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: int2\n'
+                          '    Data Kind: User',
+                          '13:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(3, 2, 0\)\n'
+                          '    Data Type: int3\n'
+                          '    Data Kind: User',
+                          '14:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: int4\n'
+                          '    Data Kind: User',
+                          '15:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: long\n'
+                          '    Data Kind: User',
+                          '16:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: long2\n'
+                          '    Data Kind: User',
+                          '17:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: long3\n'
+                          '    Data Kind: User',
+                          '18:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 6, 0\)\n'
+                          '    Data Type: long4\n'
+                          '    Data Kind: User',
+                          '19:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: bool\n'
+                          '    Data Kind: User'
+                         ])
+
+
+        self.try_command('breakpoint del 1',
+                         ['1 breakpoints deleted'])
+
+        # Hit second kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('language renderscript allocation list',
+                         [],
+                         ['2:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '7:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: short\n'
+                          '    Data Kind: User',
+                          '20:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: uchar\n'
+                          '    Data Kind: User',
+                          '21:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(2, 6, 0\)\n'
+                          '    Data Type: uchar2\n'
+                          '    Data Kind: User',
+                          '22:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: uchar3\n'
+                          '    Data Kind: User',
+                          '23:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: User',
+                          '24:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: ushort\n'
+                          '    Data Kind: User',
+                          '25:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: ushort2\n'
+                          '    Data Kind: User',
+                          '26:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 6, 0\)\n'
+                          '    Data Type: ushort3\n'
+                          '    Data Kind: User',
+                          '27:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: ushort4\n'
+                          '    Data Kind: User',
+                          '28:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: uint\n'
+                          '    Data Kind: User',
+                          '29:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: uint2\n'
+                          '    Data Kind: User',
+                          '30:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: uint3\n'
+                          '    Data Kind: User',
+                          '31:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 1, 6\)\n'
+                          '    Data Type: uint4\n'
+                          '    Data Kind: User',
+                          '32:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(4, 3, 2\)\n'
+                          '    Data Type: ulong\n'
+                          '    Data Kind: User',
+                          '33:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: ulong2\n'
+                          '    Data Kind: User',
+                          '34:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: ulong3\n'
+                          '    Data Kind: User',
+                          '35:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: ulong4\n'
+                          '    Data Kind: User'
+                         ])
+
+        self.try_command('breakpoint del 2',
+                         ['1 breakpoints deleted'])
+
+        # Hit third kernel
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('language renderscript allocation list',
+                         [],
+                         ['2:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(64, 64, 0\)\n'
+                          '    Data Type: uchar4\n'
+                          '    Data Kind: RGBA Pixel',
+                          '7:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: short\n'
+                          '    Data Kind: User',
+                          '28:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: uint\n'
+                          '    Data Kind: User',
+                          '36:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: half\n'
+                          '    Data Kind: User',
+                          '37:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: half2\n'
+                          '    Data Kind: User',
+                          '38:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 6, 0\)\n'
+                          '    Data Type: half3\n'
+                          '    Data Kind: User',
+                          '39:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: half4\n'
+                          '    Data Kind: User',
+                          '40:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: float\n'
+                          '    Data Kind: User',
+                          '41:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(12, 0, 0\)\n'
+                          '    Data Type: float2\n'
+                          '    Data Kind: User',
+                          '42:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(6, 0, 0\)\n'
+                          '    Data Type: float3\n'
+                          '    Data Kind: User',
+                          '43:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(3, 2, 0\)\n'
+                          '    Data Type: float4\n'
+                          '    Data Kind: User',
+                          '44:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(24, 0, 0\)\n'
+                          '    Data Type: double\n'
+                          '    Data Kind: User',
+                          '45:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(4, 1, 3\)\n'
+                          '    Data Type: double2\n'
+                          '    Data Kind: User',
+                          '46:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 2, 3\)\n'
+                          '    Data Type: double3\n'
+                          '    Data Kind: User',
+                          '47:\n'
+                          '    Context: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Address: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Data pointer: 0x0*[1-9a-fA-F][0-9a-fA-F]*\n'
+                          '    Dimensions: \(1, 2, 3\)\n'
+                          '    Data Type: double4\n'
+                          '    Data Kind: User'
+                         ])
diff --git a/tests/lldb/tests/jni/test_backtrace_jni.py b/tests/lldb/tests/jni/test_backtrace_jni.py
new file mode 100644
index 0000000..0bd8280
--- /dev/null
+++ b/tests/lldb/tests/jni/test_backtrace_jni.py
@@ -0,0 +1,71 @@
+'''Module that contains the test TestBacktraceJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestBacktraceJNI(TestBaseRemote):
+    '''Tests viewing the call stack of a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIBranchingFunCalls'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          # We should be able to see three functions in bt:
+                          # libRSCpuRef, kernel.expand and the kernel
+                          'frame #2:',
+                          'librs.simple.so',
+                          'simple_kernel'],
+                         [r'simple\.rs:4[567]'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('b set_i',
+                         ['Breakpoint 2',
+                          'set_i'],
+                         [r'simple.rs:2[012]'])
+
+        self.try_command('breakpoint list',
+                         ['set_i', 'resolved'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          # We should be able to see five functions in bt:
+                          # libRSCpuRef, kernel.expand, kernel and two functions
+                          'frame #4:',
+                          'librs.simple.so',
+                          'modify_i',
+                          'set_i'],
+                         [r'simple\.rs:2[012]'])
diff --git a/tests/lldb/tests/jni/test_breakpoint_coordinate_jni.py b/tests/lldb/tests/jni/test_breakpoint_coordinate_jni.py
new file mode 100644
index 0000000..ec2ecc4
--- /dev/null
+++ b/tests/lldb/tests/jni/test_breakpoint_coordinate_jni.py
@@ -0,0 +1,149 @@
+'''Module that contains the test TestBreakpointCoordinateJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestBreakpointCoordinateJNI(TestBaseRemote):
+    '''Tests breaking on a specific kernel invocation in a JNI apk.
+
+    Uses the -c option to specify the coordinate.
+    '''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIAllocations'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.pop_prop('debug.rs.max-threads')
+
+    def _check_coordinates(self, (x_coord, y_coord, z_coord), kernel):
+        '''Run lldb commands to check that coordinates match expected values.
+
+        Args:
+            (x_coord, y_coord, z_coord): The expected coordinates.
+            kernel: String that is the name of the kernel function.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          'frame #0:',
+                          'librs.allocs.so`%s' % kernel])
+
+        self.try_command('language renderscript kernel coordinate',
+                         ['Coordinate: (%d, %d, %d)' %
+                          (x_coord, y_coord, z_coord)])
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        # Test conditional coordinate in a two dimensions
+        self.try_command('language renderscript kernel breakpoint set swizzle_kernel -c 3,7',
+                         ['Conditional kernel breakpoint on coordinate 3, 7, 0',
+                          'Breakpoint(s) created'])
+
+        # We will delete this breakpoint before we hit it.
+        self.try_command('language renderscript kernel breakpoint set swizzle_kernel -c 199,199',
+                        ['Conditional kernel breakpoint on coordinate 199, 199, 0',
+                         'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((3, 7, 0), 'swizzle_kernel')
+
+        # Check breakpoints that have been hit are disabled
+        self.try_command('breakpoint list',
+                         ["1: RenderScript kernel breakpoint for 'swizzle_kernel', locations = 1 Options: disabled",
+                          "2: RenderScript kernel breakpoint for 'swizzle_kernel', locations = 1, resolved = 1"])
+
+        # Delete breakpoint on 199,199,0
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        # Test conditional coordinate in a single dimension
+        self.try_command('language renderscript kernel breakpoint set square_kernel -c 8',
+                        ['Conditional kernel breakpoint on coordinate 8, 0, 0',
+                         'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((8, 0, 0), 'square_kernel')
+
+        # Test conditional coordinate in three dimensions
+        self.try_command('language renderscript kernel breakpoint set add_half_kernel -c 0,0,1',
+                        ['Conditional kernel breakpoint on coordinate 0, 0, 1',
+                         'Breakpoint(s) created'])
+
+        # Test we can set more than one conditional kernel breakpoint and both
+        # will be hit
+        self.try_command('language renderscript kernel breakpoint set add_half_kernel -c 0,1,2',
+                        ['Conditional kernel breakpoint on coordinate 0, 1, 2',
+                         'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((0, 0, 1), 'add_half_kernel')
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((0, 1, 2), 'add_half_kernel')
+
+        # Check we can see the coordinate from a function invoked by the kernel
+        self.try_command('break set -n half_helper',
+                         ['librs.allocs.so`half_helper'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._check_coordinates((0, 1, 2), 'half_helper')
+
+        # Delete helper function breakpoint
+        self.try_command('breakpoint delete 3',
+                         ['1 breakpoints deleted'])
+
+        # Delete breakpoint which has already been disabled
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        # Check our delete breakpoints have been removed
+        self.try_command('breakpoint list',
+                         ["4: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled",
+                          "5: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled"])
diff --git a/tests/lldb/tests/jni/test_breakpoint_fileline_jni.py b/tests/lldb/tests/jni/test_breakpoint_fileline_jni.py
new file mode 100644
index 0000000..98882f2
--- /dev/null
+++ b/tests/lldb/tests/jni/test_breakpoint_fileline_jni.py
@@ -0,0 +1,48 @@
+'''Module that contains the test TestBreakpointFileLineJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestBreakpointFileLineJNI(TestBaseRemote):
+    '''Tests setting a bp on a specific line of a RS file in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --file simple.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         [])
+
+        self.try_command('bt',
+                         ['librs.simple.so',
+                          'simple_kernel',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ['simple.rs',
+                          'resolved = 1'])
+
+        self.try_command('process status',
+                         ['stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
diff --git a/tests/lldb/tests/jni/test_breakpoint_fileline_multiple_rs_files_jni.py b/tests/lldb/tests/jni/test_breakpoint_fileline_multiple_rs_files_jni.py
new file mode 100644
index 0000000..6362802
--- /dev/null
+++ b/tests/lldb/tests/jni/test_breakpoint_fileline_multiple_rs_files_jni.py
@@ -0,0 +1,62 @@
+'''Module that contains the test TestBreakpointFileLineMultipleRSFilesJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestBreakpointFileLineMultipleRSFilesJNI(TestBaseRemote):
+    '''Tests setting a breakpoint on one of multiple RS files in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIMultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --file first.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.first.so`first_kernel',
+                          'at first.rs:12',
+                          "name = 'multiplersfiles'",
+                          'stop reason = breakpoint 1'])
+
+        self.try_command('breakpoint set --file second.rs --line 7',
+                         ['Breakpoint 2',
+                          'librs.second.so`second_kernel',
+                          'second.rs:7'])
+
+        self.try_command('breakpoint list',
+                         ['first.rs',
+                          'second.rs',
+                          'resolved = 1',
+                          'first.rs:12',
+                          'second.rs:7'])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.second.so`second_kernel',
+                          'at second.rs:7',
+                          "name = 'multiplersfiles'",
+                          'stop reason = breakpoint 2'])
+
+        self.try_command('process status',
+                         ['stopped',
+                          'stop reason = breakpoint'])
diff --git a/tests/lldb/tests/jni/test_breakpoint_kernel_1_jni.py b/tests/lldb/tests/jni/test_breakpoint_kernel_1_jni.py
new file mode 100644
index 0000000..9657c7d
--- /dev/null
+++ b/tests/lldb/tests/jni/test_breakpoint_kernel_1_jni.py
@@ -0,0 +1,76 @@
+'''Module that contains the test TestBreakpointKernel1JNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestBreakpointKernel1JNI(TestBaseRemote):
+    '''Tests the setting of a breakpoint on a RS kernel in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        # Try set a breakpoint on a kernel which doesn't exist
+        self.try_command('language renderscript kernel breakpoint set imaginary_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 0 (pending)",
+                          "'imaginary_kernel', locations = 0 (pending)"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          'frame #0:',
+                          'librs.simple.so',
+                          'simple_kernel'])
+
+        self.try_command('breakpoint list',
+                         ["'imaginary_kernel', locations = 0 (pending)",
+                          "'simple_kernel', locations = 1, resolved = 1"])
+
+        # Delete breakpoint on kernel which doesn't exist
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ['No breakpoints currently set'])
diff --git a/tests/lldb/tests/jni/test_breakpoint_kernel_2_jni.py b/tests/lldb/tests/jni/test_breakpoint_kernel_2_jni.py
new file mode 100644
index 0000000..1d99f62
--- /dev/null
+++ b/tests/lldb/tests/jni/test_breakpoint_kernel_2_jni.py
@@ -0,0 +1,47 @@
+'''Module that contains the test TestBreakpointKernel2JNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestBreakpointKernel2JNI(TestBaseRemote):
+    '''Tests the setting of a breakpoint on a RS kernel in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIInfiniteLoop'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('bt',
+                         ['stop reason = breakpoint',
+                          'frame #0:',
+                          'librs.infiniteLoop.so',
+                          'simple_kernel'],
+                         [r'infiniteLoop\.rs:2[78]'])
+
+        self.try_command('breakpoint list',
+                         ['simple_kernel',
+                          'resolved = 1'])
+
+        self.try_command('process status',
+                         ['stopped',
+                          '.so`simple_kernel',
+                          'stop reason = breakpoint'])
diff --git a/tests/lldb/tests/jni/test_breakpoint_kernel_all_jni.py b/tests/lldb/tests/jni/test_breakpoint_kernel_all_jni.py
new file mode 100644
index 0000000..e620342
--- /dev/null
+++ b/tests/lldb/tests/jni/test_breakpoint_kernel_all_jni.py
@@ -0,0 +1,74 @@
+'''Module that contains the test TestBreakpointKernelAllJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestBreakpointKernelAllJNI(TestBaseRemote):
+    '''Tests setting breakpoints on every RS kernel on a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # Test command works with no kernels currently loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1",
+                          "'other_kernel', locations = 1, resolved = 1"])
+
+        # Check disable doesn't delete breakpoints
+        self.try_command('language renderscript kernel breakpoint all disable',
+                         ['Breakpoints will not be set on any new kernels'])
+
+        # Delete all breakpoints manually
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["No breakpoints currently set"])
+
+        # Test command works when kernels are loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('breakpoint list',
+                         ["'simple_kernel', locations = 1, resolved = 1",
+                          "'other_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 3',
+                         ['1 breakpoints deleted'])
+
+        # Check other_kernel breakpoint gets hit
+        self.try_command('breakpoint list',
+                         ["'other_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
diff --git a/tests/lldb/tests/jni/test_breakpoint_kernel_all_multiple_rs_files_jni.py b/tests/lldb/tests/jni/test_breakpoint_kernel_all_multiple_rs_files_jni.py
new file mode 100644
index 0000000..7f65514
--- /dev/null
+++ b/tests/lldb/tests/jni/test_breakpoint_kernel_all_multiple_rs_files_jni.py
@@ -0,0 +1,74 @@
+'''Module that contains the test TestBreakpointKernelAllMultipleRSFilesJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestBreakpointKernelAllMultipleRSFilesJNI(TestBaseRemote):
+    '''Tests setting bp on every RS kernel in many kernel files in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIMultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # Test command works with no kernels currently loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1",
+                          "'second_kernel', locations = 1, resolved = 1"])
+
+        # Check disable doesn't delete breakpoints
+        self.try_command('language renderscript kernel breakpoint all disable',
+                         ['Breakpoints will not be set on any new kernels'])
+
+        # Delete all breakpoints manually
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["No breakpoints currently set"])
+
+        # Test command works when kernels are loaded
+        self.try_command('language renderscript kernel breakpoint all enable',
+                         ['Breakpoints will be set on all kernels'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1",
+                          "'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('breakpoint delete 3',
+                         ['1 breakpoints deleted'])
+
+        # Check other_kernel breakpoint gets hit
+        self.try_command('breakpoint list',
+                         ["'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
diff --git a/tests/lldb/tests/jni/test_breakpoint_kernel_multiple_rs_files_jni.py b/tests/lldb/tests/jni/test_breakpoint_kernel_multiple_rs_files_jni.py
new file mode 100644
index 0000000..49459b2
--- /dev/null
+++ b/tests/lldb/tests/jni/test_breakpoint_kernel_multiple_rs_files_jni.py
@@ -0,0 +1,69 @@
+'''Module that contains the test TestBreakpointKernelMultipleRSFilesJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestBreakpointKernelMultipleRSFilesJNI(TestBaseRemote):
+    '''Tests setting a breakpoint on RS kernels in many files in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIMultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript kernel breakpoint set first_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 0 (pending)"])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.first.so`first_kernel',
+                          "name = 'multiplersfiles'",
+                          'stop reason = breakpoint 1'],
+                          [r'at first\.rs:1[012]'])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('language renderscript kernel breakpoint set second_kernel',
+                         ['Breakpoint(s) created',
+                          'Breakpoint 2',
+                          'Breakpoint(s) created'],
+                          [r"librs\.second\.so`second_kernel at second\.rs:[56]",])
+
+        self.try_command('breakpoint list',
+                         ["'first_kernel', locations = 1, resolved = 1",
+                          "'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('breakpoint delete 1',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ["'second_kernel', locations = 1, resolved = 1"])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint',
+                          "librs.second.so`second_kernel"],
+                          [r'second\.rs:[56]'])
+
+        self.try_command('breakpoint delete 2',
+                         ['1 breakpoints deleted'])
+
+        self.try_command('breakpoint list',
+                         ['No breakpoints currently set'])
diff --git a/tests/lldb/tests/jni/test_call_api_funs_jni.py b/tests/lldb/tests/jni/test_call_api_funs_jni.py
new file mode 100644
index 0000000..af454e2
--- /dev/null
+++ b/tests/lldb/tests/jni/test_call_api_funs_jni.py
@@ -0,0 +1,139 @@
+'''Module that contains the test TestCallApiFunsJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+from harness import RS_funs
+
+
+class TestCallApiFunsJNI(TestBaseRemote):
+    '''Tests calling of some RS API functions on a JNI apk.
+
+    This tests that JITing works.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test
+            can be run with.
+        '''
+        return "JNIKernelVariables"
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Test the atomics separately because we want to check the output
+        # AtomicAdd(1234, 2)
+        self.try_command('expr rsAtomicAdd(&int_global, 2)',
+                         ['1234'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '1236'])
+
+        # AtomicAnd(2345, 333)
+        self.try_command('expr rsAtomicAnd(&uint_global, 333)',
+                         ['2345'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '265'])
+
+        # AtomicCas(1236, 1236, 2345)
+        self.try_command('expr rsAtomicCas(&int_global, 1236, 2345)',
+                         ['1236'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '2345'])
+
+        # AtomicDec(265)
+        self.try_command('expr rsAtomicDec(&uint_global)',
+                         ['265'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '264'])
+
+        # AtomicInc(2345)
+        self.try_command('expr rsAtomicInc(&int_global)',
+                         ['2345'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '2346'])
+
+        # AtomicMax(264, 3456)
+        self.try_command('expr rsAtomicMax(&uint_global, 3456)',
+                         ['264'],
+                         [r'\(uint(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '3456'])
+
+        # AtomicMin(2346, 3)
+        self.try_command('expr rsAtomicMin(&int_global, 3)',
+                         ['2346'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '3'])
+
+        # AtomicOr(3, 456)
+        self.try_command('expr rsAtomicOr(&int_global, 456)',
+                         ['3'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '459'])
+
+        # AtomicSub(3456, 7)
+        self.try_command('expr rsAtomicSub(&uint_global, 7)',
+                         ['3456'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr uint_global',
+                         ['(uint)',
+                          '3449'])
+
+        # AtomicXor(459, 89)
+        self.try_command('expr rsAtomicXor(&int_global, 89)',
+                         ['459'],
+                         [r'\(int(32_t)?\)'])
+
+        self.try_command('expr int_global',
+                         ['(int)',
+                          '402'])
+
+        for line in RS_funs.FUNC_LIST:
+            # build the expression
+            ret, expr = RS_funs.build_expr(line)
+            # query return type table
+            if ret in RS_funs.TYPE_MAP:
+                # evaluate the expression
+                self.try_command(expr, [], [RS_funs.TYPE_MAP[ret]])
+            else:
+                # evaluate the expression
+                self.try_command(expr, '('+ret+')')
diff --git a/tests/lldb/tests/jni/test_coordinates_jni.py b/tests/lldb/tests/jni/test_coordinates_jni.py
new file mode 100644
index 0000000..84d23d0
--- /dev/null
+++ b/tests/lldb/tests/jni/test_coordinates_jni.py
@@ -0,0 +1,107 @@
+'''Module that contains the test TestCoordinatesJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestCoordinatesJNI(TestBaseRemote):
+    '''Tests the inspection of coordinates in a JNI apk.
+
+    Tests the inspection of the range and dimension of coordinates as well
+    as the current coordinates.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIDebugWaitAttach'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.
+
+        Args:
+            android: The android_util module.
+        '''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint(s) created',
+                          '(pending)'])
+
+        # Check the initial conditions.
+        self._lldb_continue()
+        self._inspect_coordinates((0, 0, 0))
+
+        # Check two more steps.
+        self._lldb_continue()
+        self._inspect_coordinates((1, 0, 0))
+        self._lldb_continue()
+        self._inspect_coordinates((2, 0, 0))
+
+        # After eight more steps we should have advanced one step in the y dimension.
+        for _ in range(8):
+            self._lldb_continue()
+        self._inspect_coordinates((2, 1, 0))
+
+    def _lldb_continue(self):
+        '''Try 'continue' lldb command. Expect to hit a breakpoint.'''
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+    def _inspect_coordinates(self, (x_coord, y_coord, z_coord)):
+        '''Run lldb commands to inspect kernel size and coordinates
+        and match against expected values.
+
+        Args:
+            (x_coord, y_coord, z_coord): The expected coordinates (int triple)
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript kernel coordinate',
+                         ['Coordinate: (%d, %d, %d)' %
+                          (x_coord, y_coord, z_coord)])
+
+        self.try_command('frame select 1',
+                         ['librs.simple.so`simple_kernel.expand',
+                         'at generated.rs:1'])
+
+        # Inspect the invocation length, should be the same every time.
+        self.try_command('expr p->dim',
+                         ['x = 8',
+                          'y = 8',
+                          'z = 0'])
+
+        # The X coordinate is in the rsIndex variable.
+        self.try_command('expr rsIndex',
+                          ['= ' + str(x_coord)])
+
+        # Inspect the Y and Z coordinates.
+        self.try_command('expr p->current',
+                         ['x = ' + str(0),
+                          'y = ' + str(y_coord),
+                          'z = ' + str(z_coord)])
diff --git a/tests/lldb/tests/jni/test_dwarf_lang_jni.py b/tests/lldb/tests/jni/test_dwarf_lang_jni.py
new file mode 100644
index 0000000..a4de77d
--- /dev/null
+++ b/tests/lldb/tests/jni/test_dwarf_lang_jni.py
@@ -0,0 +1,29 @@
+'''Module that contains the test DWARF language attribute test for JNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestDWARFLangJNI(TestBaseRemote):
+    '''Tests the DWARF language attribute is present in RS kernels in a JNI.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('language renderscript status', [])
+        self.try_command('b simple_kernel', [])
+        self.try_command('process continue', [])
+
+        self.assert_lang_renderscript()
diff --git a/tests/lldb/tests/jni/test_invoke_fun_jni.py b/tests/lldb/tests/jni/test_invoke_fun_jni.py
new file mode 100644
index 0000000..c0511a1
--- /dev/null
+++ b/tests/lldb/tests/jni/test_invoke_fun_jni.py
@@ -0,0 +1,49 @@
+'''Module that contains the test TestInvokeFunJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+
+class TestInvokeFunJNI(TestBaseRemote):
+    '''Tests debugging a function executed from JNI using invoke_*.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            String that is the name of the binary that this test should be run
+            with.
+        '''
+        return "JNIBranchingFunCalls"
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --name addToGlobal',
+                         ['Breakpoint 1', '(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'stop reason = breakpoint'],
+                         [r'simple\.rs:5[789]'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel',
+                         ['Breakpoint 2', 'Breakpoint(s) created'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'stop reason = breakpoint',
+                          'simple_kernel'],
+                         [r'simple\.rs:4[567]'])
+
+        self.try_command('expr glob',
+                         ['(int)',
+                          '357'])
diff --git a/tests/lldb/tests/jni/test_language_subcmds_jni.py b/tests/lldb/tests/jni/test_language_subcmds_jni.py
new file mode 100644
index 0000000..5970515
--- /dev/null
+++ b/tests/lldb/tests/jni/test_language_subcmds_jni.py
@@ -0,0 +1,132 @@
+'''Module that contains the test TestLanguageSubcmdsJNI.'''
+
+import os
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestLanguageSubcmdsJNI(TestBaseRemote):
+    '''Tests the 'language renderscript' subcommands on a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIDebugWaitAttach'
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.'''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.'''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.'''
+        # pylint: disable=line-too-long
+        self.try_command('language',
+                         [])
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered',
+                          'Runtime functions hooked',
+                          'rsdAllocationInit',
+                          'rsdAllocationRead2D',
+                          'rsdScriptInit',
+                          'rsdScriptInvokeForEach',
+                          'rsdScriptInvokeForEachMulti',
+                          'rsdScriptSetGlobalVar'])
+
+        self.try_command('breakpoint set --file simple.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         [])
+
+        self.try_command('language renderscript kernel',
+                         ['breakpoint',
+                          'coordinate',
+                          'list'])
+
+        self.try_command('language renderscript kernel breakpoint',
+                         ['all',
+                          'set'])
+
+        self.try_command('language renderscript kernel list',
+                         ['RenderScript Kernels',
+                          "Resource 'simple'",
+                          'root',
+                          'simple_kernel'])
+
+        self.try_command('language renderscript kernel coordinate',
+                         ['Coordinate: (0, 0, 0)'])
+
+        self.try_command('language renderscript context',
+                         ['dump'])
+
+        self.try_command('language renderscript context dump',
+                         ['Inferred RenderScript Contexts',
+                          '1 script instances'])
+
+        self.try_command('language renderscript allocation',
+                         ['list',
+                          'load',
+                          'save',
+                          'dump',
+                          'refresh'])
+
+        self.try_command('language renderscript allocation list',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list -i 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list --id 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation dump 1',
+                         ['Data (X, Y, Z):'])
+
+        output_file = self.get_tmp_file_path()
+        self.try_command('language renderscript allocation dump 1 -f ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        if os.path.isfile(output_file):
+            os.remove(output_file)
+
+        self.try_command('language renderscript allocation dump 1 --file ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        self.try_command('language renderscript allocation save 1 ' +
+                         output_file,
+                         ["Allocation written to file '%s'" % output_file])
+
+        self.try_command('language renderscript allocation load 1 ' +
+                         output_file,
+                         ["Contents of file '%s' read into allocation 1" %
+                          output_file])
+
+        self.try_command('language renderscript allocation refresh',
+                         ['All allocations successfully recomputed'])
+
+        self.try_command('language renderscript module',
+                         ['dump'])
+
+        self.try_command('language renderscript module dump',
+                         ['RenderScript Modules:',
+                          'librs.simple.so',
+                          'Debug info loaded',
+                          'Globals: 1',
+                          'gColor - float4',
+                          'Kernels: 3',
+                          'root',
+                          'simple_kernel',
+                          'other_kernel',
+                          'java_package_name: com.android.rs.jnidebugwaitattach',
+                          'version:'])
diff --git a/tests/lldb/tests/jni/test_language_subcmds_no_debug_jni.py b/tests/lldb/tests/jni/test_language_subcmds_no_debug_jni.py
new file mode 100644
index 0000000..97cfa0d
--- /dev/null
+++ b/tests/lldb/tests/jni/test_language_subcmds_no_debug_jni.py
@@ -0,0 +1,111 @@
+'''Module that contains the test TestLanguageSubcmdsNoDebugJNI.'''
+
+import os
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestLanguageSubcmdsNoDebugJNI(TestBaseRemote):
+    '''Tests the 'language renderscript' command on a JNI apk without debug info
+
+    In particular, module dump should report missing debug info.
+    '''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNINoDebugWaitAttach'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.'''
+        # pylint: disable=line-too-long
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set simple_kernel'
+                         '',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         [])
+
+        self.try_command('language renderscript kernel',
+                         ['breakpoint',
+                          'coordinate',
+                          'list'])
+
+        self.try_command('language renderscript kernel list',
+                         ['RenderScript Kernels',
+                          "Resource 'simple'",
+                          'root',
+                          'simple_kernel'])
+
+        self.try_command('language renderscript context',
+                         ['dump'])
+
+        self.try_command('language renderscript context dump',
+                         ['Inferred RenderScript Contexts',
+                          '1 script instances'])
+
+        self.try_command('language renderscript allocation',
+                         ['list',
+                          'load',
+                          'save',
+                          'dump',
+                          'refresh'])
+
+        self.try_command('language renderscript allocation list',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list -i 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation list --id 0',
+                         ['RenderScript Allocations:'])
+
+        self.try_command('language renderscript allocation dump 1',
+                         ['Data (X, Y, Z):'])
+
+        output_file = self.get_tmp_file_path()
+        self.try_command('language renderscript allocation dump 1 -f ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        if os.path.isfile(output_file):
+            os.remove(output_file)
+
+        self.try_command('language renderscript allocation dump 1 --file ' +
+                         output_file,
+                         ["Results written to '%s'" % output_file])
+
+        self.try_command('language renderscript allocation save 1 ' +
+                         output_file,
+                         ["Allocation written to file '%s'" % output_file])
+
+        self.try_command('language renderscript allocation load 1 ' +
+                         output_file,
+                         ["Contents of file '%s' read into allocation 1" %
+                          output_file])
+
+        self.try_command('language renderscript allocation refresh',
+                         ['All allocations successfully recomputed'])
+
+        self.try_command('language renderscript module',
+                         ['dump'])
+
+        self.try_command('language renderscript module dump',
+                         ['RenderScript Modules:',
+                          'librs.simple.so',
+                          'Debug info does not exist.',
+                          'Globals: 1',
+                          'gColor - variable identified, but not found in '
+                            'binary (symbol exists)',
+                          'Kernels: 2',
+                          'root',
+                          'simple_kernel',
+                          'java_package_name: com.android.rs.jninodebugwaitattach',
+                          'version'])
diff --git a/tests/lldb/tests/jni/test_multiple_rs_files_jni.py b/tests/lldb/tests/jni/test_multiple_rs_files_jni.py
new file mode 100644
index 0000000..a58a26a
--- /dev/null
+++ b/tests/lldb/tests/jni/test_multiple_rs_files_jni.py
@@ -0,0 +1,61 @@
+'''Module that contains the test TestMultipleRSFilesJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestMultipleRSFilesJNI(TestBaseRemote):
+    '''Tests some commands on a JNI apk which has two rs files.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return 'JNIMultipleRSFiles'
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.'''
+
+        # pylint: disable=line-too-long
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered',
+                          'Runtime functions hooked'])
+
+        self.try_command('breakpoint set --file first.rs --line 12',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'librs.first.so`first_kernel',
+                          'at first.rs:12',
+                          "name = 'multiplersfiles'",
+                          'stop reason = breakpoint 1'])
+
+        self.try_command('language renderscript kernel list',
+                         ['RenderScript Kernels',
+                          "Resource 'first'",
+                          "Resource 'second'",
+                          'root',
+                          'first_kernel',
+                          'second_kernel'])
+
+        self.try_command('language renderscript context dump',
+                         ['Inferred RenderScript Contexts',
+                          '2 script instances'])
+
+        self.try_command('language renderscript module dump',
+                         ['RenderScript Modules:',
+                          'librs.first.so',
+                          'librs.second.so',
+                          'Debug info loaded',
+                          'Globals: 1',
+                          'gColor - float4',
+                          'Kernels: 2',
+                          'root',
+                          'first_kernel',
+                          'second_kernel',
+                          'java_package_name: com.android.rs.jnimultiplersfiles',
+                          'version:'])
diff --git a/tests/lldb/tests/jni/test_read_global_jni.py b/tests/lldb/tests/jni/test_read_global_jni.py
new file mode 100644
index 0000000..5fffac2
--- /dev/null
+++ b/tests/lldb/tests/jni/test_read_global_jni.py
@@ -0,0 +1,272 @@
+'''Module that contains the test TestReadGlobalJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestReadGlobalJNI(TestBaseRemote):
+    '''Tests inspecting global variables of all types in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "JNIKernelVariables"
+
+    def _try_inspecting_global(self, global_name, expected_output,
+                              expected_regex=None):
+        '''Inspect a global and check for the output.
+
+        Run the "expr" and "target variable" commands on a given global and
+        with a given output. (The commands should be equivalent.)
+
+        Args:
+            global_name: String which is the name of the global to inspect.
+            expected_output: List of strings that should be found in the output.
+            expected_regex: List of regular expressions that should match lldb's
+                            output.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr ' + global_name,
+                         expected_output,
+                         expected_regex)
+
+        self.try_command('target variable ' + global_name,
+                         expected_output,
+                         expected_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        # pylint: disable=too-many-statements
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('target variable',
+                         ['Global variables for',
+                          'librs.simple.so',
+                          "(uchar) uchar_global = '\\xea'",
+                          '(short) short_global = -321',
+                          '(ushort) ushort_global = 432',
+                          '(int) int_global = 1234',
+                          '(uint) uint_global = 2345',
+                          '(float) float_global = 4.5',
+                          '(ulong) ulong_global = 8888',
+                          '(double) double_global = -456.5',
+                          '(char2) char2_global = (11, -22)',
+                          '(uchar2) uchar2_global = (0x21, 0x2c)',
+                          '(short2) short2_global = (-555, 666)',
+                          '(ushort2) ushort2_global = (777, 888)',
+                          '(int2) int2_global = (999, -1111)',
+                          '(uint2) uint2_global = (2222, 3333)',
+                          '(float2) float2_global = (4.5, -5)',
+                          '(long2) long2_global = (-4444, 5555)',
+                          '(ulong2) ulong2_global = (6666, 7777)',
+                          '(double2) double2_global = (88.5, -99)',
+                          '(char3) char3_global = (11, -22, -33,',
+                          '(uchar3) uchar3_global = (0x21, 0x2c, 0x37,',
+                          '(short3) short3_global = (-555, 666, 777,',
+                          '(ushort3) ushort3_global = (777, 888, 999,',
+                          '(int3) int3_global = (999, -1111, 2222,',
+                          '(uint3) uint3_global = (2222, 3333, 4444,',
+                          '(float3) float3_global = (4.5, -5, -6.5,',
+                          '(long3) long3_global = (-4444, 5555, 6666,',
+                          '(ulong3) ulong3_global = (6666, 7777, 8888,',
+                          '(double3) double3_global = (88.5, -99, 111.5,',
+                          '(char4) char4_global = (55, 11, -22, -33)',
+                          '(uchar4) uchar4_global = (0xde, 0x21, 0x2c, 0x37)',
+                          '(short4) short4_global = (-444, -555, 666, 777)',
+                          '(ushort4) ushort4_global = (666, 777, 888, 999)',
+                          '(int4) int4_global = (888, 999, -1111, 2222)',
+                          '(uint4) uint4_global = (1111, 2222, 3333, 4444)',
+                          '(float4) float4_global = (3, 4.5, -5, -6.5)',
+                          '(long4) long4_global = (-3333, -4444, 5555, 6666)',
+                          '(ulong4) ulong4_global = (5555, 6666, 7777, 8888)',
+                          '(double4) double4_global = (-77, 88.5, -99, 111.5)',
+                          '(rs_matrix2x2) matrix2x2_global = (m = (1, 2.5, 3, 4.5))',
+                          '(rs_matrix3x3) matrix3x3_global = {\n'
+                          '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)',
+                          '(rs_matrix4x4) matrix4x4_global = {\n'
+                          '  m = {\n'
+                          '    [0] = 5.5\n'
+                          '    [1] = 6\n'
+                          '    [2] = 7.5\n'
+                          '    [3] = 8\n'
+                          '    [4] = 9\n'
+                          '    [5] = 1.5\n'
+                          '    [6] = 2\n'
+                          '    [7] = 3.5\n'
+                          '    [8] = 4.5\n'
+                          '    [9] = 5.5\n'
+                          '    [10] = 6.5\n'
+                          '    [11] = 7\n'
+                          '    [12] = 8\n'
+                          '    [13] = 9.5\n'
+                          '    [14] = 1.5\n'
+                          '    [15] = 2.5\n'
+                          '  }\n',
+                          '(rs_quaternion) quaternion_global = (4.5, 5.5, 6, 3)'],
+                         [r"\((signed )?char\) char_global = '\\f'",
+                          r'\((long )?long\) long_global = -77777'])
+
+        # Use expr to inspect locals
+        self._try_inspecting_global('char_global',
+                         ["'\\f'"],
+                         [r'\((signed )?char\)'])
+
+        self._try_inspecting_global('uchar_global',
+                         ['(uchar)', "'\\xea'"])
+
+        self._try_inspecting_global('short_global',
+                         ['(short)', '-321'])
+
+        self._try_inspecting_global('ushort_global',
+                         ['(ushort)', '432'])
+
+        self._try_inspecting_global('int_global',
+                         ['(int)', '1234'])
+
+        self._try_inspecting_global('uint_global',
+                         ['(uint)', '2345'])
+
+        self._try_inspecting_global('float_global',
+                         ['(float)', '4.5'])
+
+        self._try_inspecting_global('long_global',
+                         ['-77777'],
+                         [r'\((long )?long\)'])
+
+        self._try_inspecting_global('ulong_global',
+                         ['(ulong)', '8888'])
+
+        self._try_inspecting_global('double_global',
+                         ['(double)', '-456.5'])
+
+
+        self._try_inspecting_global('char2_global',
+                                   ['(char2)', '(11, -22)'])
+
+        self._try_inspecting_global('uchar2_global',
+                                   ['(uchar2)', '(0x21, 0x2c)'])
+
+        self._try_inspecting_global('short2_global',
+                                   ['(short2)', '(-555, 666)'])
+
+        self._try_inspecting_global('ushort2_global',
+                                   ['(ushort2)', '(777, 888)'])
+
+        self._try_inspecting_global('int2_global',
+                                   ['(int2)', '(999, -1111)'])
+
+        self._try_inspecting_global('uint2_global',
+                                   ['(uint2)', '(2222, 3333)'])
+
+        self._try_inspecting_global('float2_global',
+                                   ['(float2)', '(4.5, -5)'])
+
+        self._try_inspecting_global('long2_global',
+                                   ['(long2)', '(-4444, 5555)'])
+
+        self._try_inspecting_global('ulong2_global',
+                                   ['(ulong2)', '(6666, 7777)'])
+
+        self._try_inspecting_global('double2_global',
+                                   ['(double2)', '(88.5, -99)'])
+
+        self._try_inspecting_global('char3_global',
+                                   ['(char3)',
+                                    '(11, -22, -33,'])
+
+        self._try_inspecting_global('uchar3_global',
+                                   ['(uchar3)',
+                                    '(0x21, 0x2c, 0x37,'])
+
+        self._try_inspecting_global('short3_global',
+                                   ['(short3)',
+                                    '(-555, 666, 777,'])
+
+        self._try_inspecting_global('ushort3_global',
+                                   ['(ushort3)',
+                                    '(777, 888, 999,'])
+
+        self._try_inspecting_global('int3_global',
+                                   ['(int3)',
+                                    '(999, -1111, 2222,'])
+
+        self._try_inspecting_global('uint3_global',
+                                   ['(uint3)',
+                                    '(2222, 3333, 4444,'])
+
+        self._try_inspecting_global('float3_global',
+                                   ['(float3)',
+                                    '(4.5, -5, -6.5,'])
+
+        self._try_inspecting_global('long3_global',
+                                   ['(long3)',
+                                    '(-4444, 5555, 6666,'])
+
+        self._try_inspecting_global('ulong3_global',
+                                   ['(ulong3)',
+                                    '(6666, 7777, 8888,'])
+
+        self._try_inspecting_global('double3_global',
+                                   ['(double3)',
+                                    '(88.5, -99, 111.5,'])
+
+        self._try_inspecting_global('char4_global',
+                                   ['(char4)',
+                                    '(55, 11, -22, -33)'])
+
+        self._try_inspecting_global('uchar4_global',
+                                   ['(uchar4)',
+                                    '(0xde, 0x21, 0x2c, 0x37)'])
+
+        self._try_inspecting_global('short4_global',
+                                   ['(short4)',
+                                    '(-444, -555, 666, 777)'])
+
+        self._try_inspecting_global('ushort4_global',
+                                   ['(ushort4)',
+                                    '(666, 777, 888, 999)'])
+
+        self._try_inspecting_global('int4_global',
+                                   ['(int4)',
+                                    '(888, 999, -1111, 2222)'])
+
+        self._try_inspecting_global('uint4_global',
+                                   ['(uint4)',
+                                    '(1111, 2222, 3333, 4444)'])
+
+        self._try_inspecting_global('float4_global',
+                                   ['(float4)',
+                                    '(3, 4.5, -5, -6.5)'])
+
+        self._try_inspecting_global('long4_global',
+                                   ['(long4)',
+                                    '(-3333, -4444, 5555, 6666)'])
+
+        self._try_inspecting_global('ulong4_global',
+                                   ['(ulong4)',
+                                    '(5555, 6666, 7777, 8888)'])
+
+        self._try_inspecting_global('double4_global',
+                                   ['(double4)',
+                                    '(-77, 88.5, -99, 111.5)'])
diff --git a/tests/lldb/tests/jni/test_read_local_jni.py b/tests/lldb/tests/jni/test_read_local_jni.py
new file mode 100644
index 0000000..5c67559
--- /dev/null
+++ b/tests/lldb/tests/jni/test_read_local_jni.py
@@ -0,0 +1,268 @@
+'''Module that contains the test TestReadLocalJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestReadLocalJNI(TestBaseRemote):
+    '''Tests inspecting local variables of all types in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "JNIKernelVariables"
+
+    def _try_inspecting_local(self, local_name, expected_output,
+                             expected_regex=None):
+        '''Inspect a local and check for the output.
+
+        Run the "expr" and "frame variable" commands on a given local and
+        with a given output. (The commands should be equivalent.)
+
+        Args:
+            local_name: String which is the name of the global to inspect.
+            expected_output: List of strings that should be found in the output.
+            expected_regex: List of regular expressions that should match lldb's
+                            output.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr ' + local_name,
+                         expected_output,
+                         expected_regex)
+
+        self.try_command('frame variable ' + local_name,
+                         expected_output,
+                         expected_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        # pylint: disable=line-too-long
+        # pylint: disable=too-many-statements
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('breakpoint set --file simple.rs --line 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self.try_command('frame variable',
+                         ["(uchar) uchar_local = 'b'",
+                          '(short) short_local = -321',
+                          '(ushort) ushort_local = 432',
+                          '(int) int_local = 1234',
+                          '(uint) uint_local = 2345',
+                          '(float) float_local = 4.5',
+                          '(ulong) ulong_local = 8888',
+                          '(double) double_local = -456.5',
+                          '(char2) char2_local = (-11, -22)',
+                          '(uchar2) uchar2_local = (0x21, 0x2c)',
+                          '(short2) short2_local = (-555, 666)',
+                          '(ushort2) ushort2_local = (777, 888)',
+                          '(int2) int2_local = (999, -1111)',
+                          '(uint2) uint2_local = (2222, 3333)',
+                          '(float2) float2_local = (4.5, -5)',
+                          '(long2) long2_local = (-4444, 5555)',
+                          '(ulong2) ulong2_local = (6666, 7777)',
+                          '(double2) double2_local = (88.5, -99)',
+                          '(char3) char3_local = (11, -22, -33,',
+                          '(uchar3) uchar3_local = (0x21, 0x2c, 0x37,',
+                          '(short3) short3_local = (-555, 666, 777,',
+                          '(ushort3) ushort3_local = (777, 888, 999,',
+                          '(int3) int3_local = (999, -1111, 2222,',
+                          '(uint3) uint3_local = (2222, 3333, 4444,',
+                          '(float3) float3_local = (4.5, -5, -6.5,',
+                          '(long3) long3_local = (-4444, 5555, 6666,',
+                          '(ulong3) ulong3_local = (6666, 7777, 8888,',
+                          '(double3) double3_local = (88.5, -99, 111.5,',
+                          '(char4) char4_local = (55, 11, -22, -33)',
+                          '(uchar4) uchar4_local = (0x16, 0x21, 0x2c, 0x37)',
+                          '(short4) short4_local = (-444, -555, 666, 777)',
+                          '(ushort4) ushort4_local = (666, 777, 888, 999)',
+                          '(int4) int4_local = (888, 999, -1111, 2222)',
+                          '(uint4) uint4_local = (1111, 2222, 3333, 4444)',
+                          '(float4) float4_local = (3, 4.5, -5, -6.5)',
+                          '(long4) long4_local = (-3333, -4444, 5555, 6666)',
+                          '(ulong4) ulong4_local = (5555, 6666, 7777, 8888)',
+                          '(double4) double4_local = (-77, 88.5, -99, 111.5)',
+                          '(rs_matrix2x2) matrix2x2_local = (m = (1, 2.5, 3, 4.5))',
+                          '(rs_matrix3x3) matrix3x3_local = {\n'
+                          '  m = ([0] = 5, [1] = 6.5, [2] = 7, [3] = 8.5, [4] = 9, [5] = 1.5, [6] = 2, [7] = 3.5, [8] = 4)',
+                          '(rs_matrix4x4) matrix4x4_local = {\n'
+                          '  m = {\n'
+                          '    [0] = 5.5\n'
+                          '    [1] = 6\n'
+                          '    [2] = 7.5\n'
+                          '    [3] = 8\n'
+                          '    [4] = 9\n'
+                          '    [5] = 1.5\n'
+                          '    [6] = 2\n'
+                          '    [7] = 3.5\n'
+                          '    [8] = 4.5\n'
+                          '    [9] = 5.5\n'
+                          '    [10] = 6.5\n'
+                          '    [11] = 7\n'
+                          '    [12] = 8\n'
+                          '    [13] = 9.5\n'
+                          '    [14] = 1.5\n'
+                          '    [15] = 2.5\n'
+                          '  }\n',
+                          '(rs_quaternion) quaternion_local = (8, 9, 0.5, 7.5)'],
+                         [r"\((signed )?char\) char_local = 'a'",
+                          r'\((long )?long\) long_local = -77777'])
+
+        # Use expr to inspect locals
+        self._try_inspecting_local('char_local',
+                                  ["'a'"],
+                                  [r'\((signed )?char\)'])
+
+        self._try_inspecting_local('uchar_local',
+                                  ['(uchar)', "'b'"])
+
+        self._try_inspecting_local('short_local',
+                                  ['(short)', '-321'])
+
+        self._try_inspecting_local('ushort_local',
+                                  ['(ushort)', '432'])
+
+        self._try_inspecting_local('int_local',
+                                  ['(int)', '1234'])
+
+        self._try_inspecting_local('uint_local',
+                                  ['(uint)', '2345'])
+
+        self._try_inspecting_local('float_local',
+                                  ['(float)', '4.5'])
+
+        self._try_inspecting_local('long_local',
+                                  ['-77777'], [r'\((long )?long\)'])
+
+        self._try_inspecting_local('ulong_local',
+                                  ['(ulong)', '8888'])
+
+        self._try_inspecting_local('double_local',
+                                  ['(double)', '-456.5'])
+
+        self._try_inspecting_local('char2_local',
+                                  ['(char2)', '(-11, -22)'])
+
+        self._try_inspecting_local('uchar2_local',
+                                  ['(uchar2)', '(0x21, 0x2c)'])
+
+        self._try_inspecting_local('short2_local',
+                                  ['(short2)', '(-555, 666)'])
+
+        self._try_inspecting_local('ushort2_local',
+                                  ['(ushort2)', '(777, 888)'])
+
+        self._try_inspecting_local('int2_local',
+                                  ['(int2)', '(999, -1111)'])
+
+        self._try_inspecting_local('uint2_local',
+                                  ['(uint2)', '(2222, 3333)'])
+
+        self._try_inspecting_local('float2_local',
+                                  ['(float2)', '(4.5, -5)'])
+
+        self._try_inspecting_local('long2_local',
+                                  ['(long2)', '(-4444, 5555)'])
+
+        self._try_inspecting_local('ulong2_local',
+                                  ['(ulong2)', '(6666, 7777)'])
+
+        self._try_inspecting_local('double2_local',
+                                  ['(double2)', '(88.5, -99)'])
+
+        self._try_inspecting_local('char3_local',
+                                  ['(char3)',
+                                   '(11, -22, -33,'])
+
+        self._try_inspecting_local('uchar3_local',
+                                  ['(uchar3)',
+                                   '(0x21, 0x2c, 0x37,'])
+
+        self._try_inspecting_local('short3_local',
+                                  ['(short3)',
+                                   '(-555, 666, 777,'])
+
+        self._try_inspecting_local('ushort3_local',
+                                  ['(ushort3)',
+                                   '(777, 888, 999,'])
+
+        self._try_inspecting_local('int3_local',
+                                  ['(int3)',
+                                   '(999, -1111, 2222,'])
+
+        self._try_inspecting_local('uint3_local',
+                                  ['(uint3)',
+                                   '(2222, 3333, 4444,'])
+
+        self._try_inspecting_local('float3_local',
+                                  ['(float3)',
+                                   '(4.5, -5, -6.5,'])
+
+        self._try_inspecting_local('long3_local',
+                                  ['(long3)',
+                                   '(-4444, 5555, 6666,'])
+
+        self._try_inspecting_local('ulong3_local',
+                                  ['(ulong3)',
+                                   '(6666, 7777, 8888,'])
+
+        self._try_inspecting_local('double3_local',
+                                  ['(double3)',
+                                   '(88.5, -99, 111.5,'])
+
+        self._try_inspecting_local('char4_local',
+                                  ['(char4)',
+                                   '(55, 11, -22, -33)'])
+
+        self._try_inspecting_local('uchar4_local',
+                                  ['(uchar4)',
+                                   '(0x16, 0x21, 0x2c, 0x37)'])
+
+        self._try_inspecting_local('short4_local',
+                                  ['(short4)',
+                                   '(-444, -555, 666, 777)'])
+
+        self._try_inspecting_local('ushort4_local',
+                                  ['(ushort4)',
+                                   '(666, 777, 888, 999)'])
+
+        self._try_inspecting_local('int4_local',
+                                  ['(int4)',
+                                   '(888, 999, -1111, 2222)'])
+
+        self._try_inspecting_local('uint4_local',
+                                  ['(uint4)',
+                                   '(1111, 2222, 3333, 4444)'])
+
+        self._try_inspecting_local('float4_local',
+                                  ['(float4)',
+                                   '(3, 4.5, -5, -6.5)'])
+
+        self._try_inspecting_local('long4_local',
+                                  ['(long4)',
+                                   '(-3333, -4444, 5555, 6666)'])
+
+        self._try_inspecting_local('ulong4_local',
+                                  ['(ulong4)',
+                                   '(5555, 6666, 7777, 8888)'])
+
+        self._try_inspecting_local('double4_local',
+                                  ['(double4)',
+                                   '(-77, 88.5, -99, 111.5)'])
diff --git a/tests/lldb/tests/jni/test_rs_consts_jni.py b/tests/lldb/tests/jni/test_rs_consts_jni.py
new file mode 100644
index 0000000..d4a063a
--- /dev/null
+++ b/tests/lldb/tests/jni/test_rs_consts_jni.py
@@ -0,0 +1,75 @@
+'''Module that contains the test TestRSConstsJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestRSConstsJNI(TestBaseRemote):
+    '''Tests examining the RenderScript constants in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "JNIKernelVariables"
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('language renderscript kernel breakpoint set kernel',
+                         [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        # Constants
+        self.try_command('expr M_1_PI',
+                         ['0.318309'])
+
+        self.try_command('expr M_2_PI',
+                         ['0.636619'])
+
+        self.try_command('expr M_2_SQRTPI',
+                         ['1.128379'])
+
+        self.try_command('expr M_E',
+                         ['2.718281'])
+
+        self.try_command('expr M_LN10',
+                         ['2.302585'])
+
+        self.try_command('expr M_LN2',
+                         ['0.693147'])
+
+        self.try_command('expr M_LOG10E',
+                         ['0.434294'])
+
+        self.try_command('expr M_LOG2E',
+                         ['1.442695'])
+
+        self.try_command('expr M_PI',
+                         ['3.141592'])
+
+        self.try_command('expr M_PI_2',
+                         ['1.570796'])
+
+        self.try_command('expr M_PI_4',
+                         ['0.785398'])
+
+        self.try_command('expr M_SQRT1_2',
+                         ['0.707106'])
+
+        self.try_command('expr M_SQRT2',
+                         ['1.414213'])
diff --git a/tests/lldb/tests/jni/test_source_step_jni.py b/tests/lldb/tests/jni/test_source_step_jni.py
new file mode 100644
index 0000000..908ae79
--- /dev/null
+++ b/tests/lldb/tests/jni/test_source_step_jni.py
@@ -0,0 +1,82 @@
+'''Module that contains the test TestSourceStepJNI.'''
+
+import os
+from harness.test_base_remote import TestBaseRemote
+
+class TestSourceStepJNI(TestBaseRemote):
+    '''Test stepping through the source in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "JNIBranchingFunCalls"
+
+    def test_setup(self, android):
+        '''This test requires to be run on one thread.'''
+        android.push_prop('debug.rs.max-threads', 1)
+
+    def test_shutdown(self, android):
+        '''Reset the number of RS threads to the previous value.'''
+        android.pop_prop('debug.rs.max-threads')
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+            output.
+        '''
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 47',
+                         ['(pending)'])
+
+        self.try_command('process continue',
+                         ['stopped',
+                          'stop reason = breakpoint',
+                          'simple.rs:47'])
+
+        # set the source mapping
+        file_dir = os.path.dirname(os.path.realpath(__file__))
+        new_dir = os.path.join(file_dir, '..', '..', 'jni', 'BranchingFunCalls',
+                               'jnibranchingfuncalls')
+        self.set_src_map('simple.rs', new_dir)
+
+        self.try_command('process status',
+                         ['-> 47',
+                          'int i = in;'])
+
+        #47     int i = in;
+        self.try_command('thread step-in',
+                         ['-> 48'])
+        #48     float f = (float) i;
+        self.try_command('thread step-in',
+                         ['-> 49'])
+        #49     modify_f(&f);
+        self.try_command('thread step-over',
+                         ['-> 50'])
+        #50  	modify_i(&i);
+        self.try_command('thread step-in',
+                         ['-> 33'])
+        #33         int j = *i;
+        self.try_command('b -f simple.rs -l 38',
+                         ['librs.simple.so`modify_i',
+                          'simple.rs:38'])
+        self.try_command('c',
+                         ['stop reason = breakpoint',
+                          'simple.rs:38',
+                          '-> 38'])
+        #38    set_i(i, 0);
+        # For the line number anything between #20 and #22 is fine
+        self.try_command('thread step-in',
+                         [],
+                         [r'-> 2[012]'])
+        #22    int tmp = b;
+        self.try_command('thread step-out',
+                         ['-> 38'])
diff --git a/tests/lldb/tests/jni/test_write_global_element_jni.py b/tests/lldb/tests/jni/test_write_global_element_jni.py
new file mode 100644
index 0000000..c7ed21b
--- /dev/null
+++ b/tests/lldb/tests/jni/test_write_global_element_jni.py
@@ -0,0 +1,263 @@
+'''Module that contains the test TestWriteGlobalElementJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestWriteGlobalElementJNI(TestBaseRemote):
+    '''Tests modifying global variables of all types in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "JNIKernelVariables"
+
+    def _try_inspecting_global(self, global_name, expected_output):
+        '''Run the "expr" command on a given global and with a given output.
+
+        Args:
+            global_name: String which is the name of the global to inspect.
+            expected_output: List of strings that should be found in the output.
+
+        Raises:
+            TestFail: The lldb command did not provide the expected output.
+        '''
+        self.try_command('expr ' + global_name, expected_output)
+
+    def _try_modifying_global(self, global_name, new_value, expected_output,
+                             expected_output_regex=None):
+        '''Modify and then inspect a global and check for the output.
+
+        Run the "expr" command to set a given global to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            global_name: String which is the name of the global to modify.
+            new_value: A string that is the new value of the global.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr %s = %s' % (global_name, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('target variable ' + global_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=too-many-statements
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_global('char2_global[0]', '2',
+                                  ['\'\\x02\''],
+                                  [r'\((signed )?char\)'])
+        self._try_inspecting_global('char2_global', ['(char2)', '(2, -22)'])
+
+        self._try_modifying_global('uchar2_global[1]', '3',
+                                  ['\'\\x03\''],
+                                  [r'\(u(nsigned )?char\)'])
+        self._try_inspecting_global('uchar2_global',
+                                   ['(uchar2)', '(0x21, 0x03)'])
+
+        self._try_modifying_global('short2_global[0]', '-44',
+                                  ['(short)', '-44'])
+        self._try_inspecting_global('short2_global',
+                                   ['(short2)', '(-44, 666)'])
+
+        self._try_modifying_global('ushort2_global[1]', '55',
+                                  ['55'],
+                                  [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_global('ushort2_global',
+                                   ['(ushort2)', '(777, 55)'])
+
+        self._try_modifying_global('int2_global[0]', '666',
+                                  ['(int)', '666'])
+        self._try_inspecting_global('int2_global',
+                                   ['(int2)', '(666, -1111)'])
+
+        self._try_modifying_global('uint2_global[1]', '777',
+                                  ['777'],
+                                  [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_global('uint2_global',
+                                   ['(uint2)', '(2222, 777)'])
+
+        self._try_modifying_global('float2_global[0]', '-8.5',
+                                  ['(float)', '-8.5'])
+        self._try_inspecting_global('float2_global',
+                                   ['(float2)', '(-8.5, -5)'])
+
+        self._try_modifying_global('long2_global[1]', '999999',
+                                  ['999999'],
+                                  [r'\((long )?long\)'])
+        self._try_inspecting_global('long2_global',
+                                   ['(long2)', '(-4444, 999999)'])
+
+        self._try_modifying_global('ulong2_global[0]', '10101010101',
+                                  ['10101010101'],
+                                  [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_global('ulong2_global',
+                                   ['(ulong2)', '(10101010101, 7777)'])
+
+        self._try_modifying_global('double2_global[1]', '-11.000',
+                                  ['(double)', '-11'])
+        self._try_inspecting_global('double2_global',
+                                   ['(double2)', '(88.5, -11)'])
+
+
+        self._try_modifying_global('char3_global[0]', '12',
+                                  ['\'\\f\''],
+                                  [r'\((signed )?char\)'])
+        self._try_inspecting_global('char3_global',
+                                   ['(char3)',
+                                    '(12, -22, -33,'])
+
+        self._try_modifying_global('uchar3_global[1]', '\'d\'',
+                                  ['\'d\''],
+                                  [r'\(u(nsigned )?char\)'])
+        self._try_inspecting_global('uchar3_global',
+                                   ['(uchar3)',
+                                    '(0x21, 0x64, 0x37,'])
+
+        self._try_modifying_global('short3_global[2]', '-131',
+                                  ['(short)', '-131'])
+        self._try_inspecting_global('short3_global',
+                                   ['(short3)',
+                                    '(-555, 666, -131,'])
+
+        self._try_modifying_global('ushort3_global[0]', '1414',
+                                  ['1414'],
+                                  [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_global('ushort3_global',
+                                   ['(ushort3)',
+                                    '(1414, 888, 999,'])
+
+        self._try_modifying_global('int3_global[0]', '151515',
+                                  ['(int)', '151515'])
+        self._try_inspecting_global('int3_global',
+                                   ['(int3)',
+                                    '(151515, -1111, 2222,'])
+
+        self._try_modifying_global('uint3_global[1]', '161616',
+                                  ['161616'],
+                                  [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_global('uint3_global',
+                                   ['(uint3)',
+                                    '(2222, 161616, 4444,'])
+
+        self._try_modifying_global('float3_global[2]', '17.5',
+                                  ['(float)', '17.5'])
+        self._try_inspecting_global('float3_global',
+                                   ['(float3)',
+                                    '(4.5, -5, 17.5,'])
+
+        self._try_modifying_global('long3_global[0]', '-181818181818',
+                                  ['-181818181818'],
+                                  [r'\((long )?long\)'])
+        self._try_inspecting_global('long3_global',
+                                   ['(long3)',
+                                    '(-181818181818, 5555, 6666,'])
+
+        self._try_modifying_global('ulong3_global[1]', '191919191919',
+                                  ['191919191919'],
+                                  [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_global('ulong3_global',
+                                   ['(ulong3)',
+                                    '(6666, 191919191919, 8888,'])
+
+        self._try_modifying_global('double3_global[2]', '20.5',
+                                  ['(double)', '20.5'])
+        self._try_inspecting_global('double3_global',
+                                   ['(double3)',
+                                    '(88.5, -99, 20.5,'])
+
+        self._try_modifying_global('char4_global[0]', '-21',
+                                  ['\'\\xeb\''],
+                                  [r'\((signed )?char\)'])
+        self._try_inspecting_global('char4_global',
+                                   ['(char4)',
+                                    '(-21, 11, -22, -33)'])
+
+        self._try_modifying_global('uchar4_global[1]', '22',
+                                  ['\'\\x16\''], [r'\(u(nsigned )?char\)'])
+        self._try_inspecting_global('uchar4_global',
+                                   ['(uchar4)',
+                                    '(0xde, 0x16, 0x2c, 0x37)'])
+
+        self._try_modifying_global('short4_global[2]', '23',
+                                  ['(short)', '23'])
+        self._try_inspecting_global('short4_global',
+                                   ['(short4)',
+                                    '(-444, -555, 23, 777)'])
+
+        self._try_modifying_global('ushort4_global[3]', '24',
+                                  ['24'],
+                                  [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_global('ushort4_global',
+                                   ['(ushort4)',
+                                    '(666, 777, 888, 24)'])
+
+        self._try_modifying_global('int4_global[0]', '-2525',
+                                  ['(int)', '-2525'])
+        self._try_inspecting_global('int4_global',
+                                   ['(int4)',
+                                    '(-2525, 999, -1111, 2222)'])
+
+        self._try_modifying_global('uint4_global[1]', '26262',
+                                  ['26262'],
+                                  [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_global('uint4_global',
+                                   ['(uint4)',
+                                    '(1111, 26262, 3333, 4444)'])
+
+        self._try_modifying_global('float4_global[2]', '27.0f',
+                                  ['(float)', '27'])
+        self._try_inspecting_global('float4_global',
+                                   ['(float4)',
+                                    '(3, 4.5, 27, -6.5)'])
+
+        self._try_modifying_global('long4_global[3]', '-28282828282',
+                                  ['-28282828282'],
+                                  [r'\((long )?long\)'])
+        self._try_inspecting_global('long4_global',
+                                   ['(long4)',
+                                    '(-3333, -4444, 5555, -28282828282)'])
+
+        self._try_modifying_global('ulong4_global[0]', '2929292929',
+                                  ['2929292929'],
+                                  [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_global('ulong4_global',
+                                   ['(ulong4)',
+                                    '(2929292929, 6666, 7777, 8888)'])
+
+        self._try_modifying_global('double4_global[1]', '30.5',
+                                  ['(double)', '30.5'])
+        self._try_inspecting_global('double4_global',
+                                   ['(double4)',
+                                    '(-77, 30.5, -99, 111.5)'])
diff --git a/tests/lldb/tests/jni/test_write_global_jni.py b/tests/lldb/tests/jni/test_write_global_jni.py
new file mode 100644
index 0000000..2d77da0
--- /dev/null
+++ b/tests/lldb/tests/jni/test_write_global_jni.py
@@ -0,0 +1,204 @@
+'''Module that contains the test TestWriteGlobalJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestWriteGlobalJNI(TestBaseRemote):
+    '''Tests modifying global variables of all types in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "JNIKernelVariables"
+
+    def _try_modifying_global(self, global_name, new_value, data_type_in,
+                             expected_output, expected_output_regex=None):
+        '''Modify and then inspect a global and check for the output.
+
+        Run the "expr" command to set a given global to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            global_name: String which is the name of the global to modify.
+            new_value: A string that is the new value of the global.
+            data_type_in: A string containing a c-style parenthesised data type
+                          representing the type of the global.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=too-many-arguments
+
+        self.try_command('expr %s = %s%s' %
+                         (global_name, data_type_in, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('target variable ' + global_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=line-too-long
+        # There is no way we can make this look nice
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_global('char_global', '-2',
+                                  '(signed char)', ['\'\\xfe\''],
+                                  [r'\((signed )?char\)'])
+
+        self._try_modifying_global('uchar_global', '22',
+                                  '(uchar)', ['(uchar)', '\'\\x16\''])
+
+        self._try_modifying_global('short_global', '-33',
+                                  '(short)', ['(short)', '-33'])
+
+        self._try_modifying_global('ushort_global', '44',
+                                  '(ushort)', ['(ushort)', '44'])
+
+        self._try_modifying_global('int_global', '-55',
+                                  '(int)', ['(int)', '-55'])
+
+        self._try_modifying_global('uint_global', '66',
+                                  '(uint)', ['(uint)', '66'])
+
+        self._try_modifying_global('float_global', '-7.5',
+                                  '(float)', ['(float)', '-7.5'])
+
+        self._try_modifying_global('long_global', '-888888',
+                                  '(long long)', ['-888888'],
+                                  [r'\((long )?long\)'])
+
+        self._try_modifying_global('ulong_global', '99999999',
+                                  '(ulong)', ['(ulong)', '99999999'])
+
+        self._try_modifying_global('double_global', '-10101.5',
+                                  '(double)', ['(double)', '-10101.5'])
+
+
+        self._try_modifying_global('char2_global', '{22, 4}',
+                                  '(char2)', ['(char2)', '(22, 4)'])
+
+        self._try_modifying_global('uchar2_global', '{44, 55}',
+                                  '(uchar2)', ['(uchar2)', '(0x2c, 0x37)'])
+
+        self._try_modifying_global('short2_global', '{-66, 77}',
+                                  '(short2)', ['(short2)', '(-66, 77)'])
+
+        self._try_modifying_global('ushort2_global', '{88, 99}',
+                                  '(ushort2)', ['(ushort2)', '(88, 99)'])
+
+        self._try_modifying_global('int2_global', '{111, -222}',
+                                  '(int2)', ['(int2)', '(111, -222)'])
+
+        self._try_modifying_global('uint2_global', '{333, 444}',
+                                  '(uint2)', ['(uint2)', '(333, 444)'])
+
+        self._try_modifying_global('float2_global', '{-55.5f, 6.0}',
+                                  '(float2)', ['(float2)', '(-55.5, 6)'])
+
+        self._try_modifying_global('long2_global', '{666666, -777777}',
+                                  '(long2)', ['(long2)', '(666666, -777777)'])
+
+        self._try_modifying_global('ulong2_global', '{888888, 999999}',
+                                  '(ulong2)', ['(ulong2)', '(888888, 999999)'])
+
+        self._try_modifying_global('double2_global', '{11.0000000, -0.0l}',
+                                  '(double2)', ['(double2)', '(11, -0)'])
+
+        self._try_modifying_global('char3_global', '{2, -3, 4}',
+                                  '(char3)', ['(char3)', '(2, -3, 4,'])
+
+        self._try_modifying_global('uchar3_global', '{\'a\', \'b\', \'c\'}',
+                                  '(uchar3)', ['(uchar3)', '(0x61, 0x62, 0x63,'])
+
+        self._try_modifying_global('short3_global', '{44, -55, 66}',
+                                  '(short3)', ['(short3)', '(44, -55, 66,'])
+
+        self._try_modifying_global('ushort3_global', '{88, 99, 111}',
+                                  '(ushort3)', ['(ushort3)', '(88, 99, 111,'])
+
+        self._try_modifying_global('int3_global', '{-111, 222, -333}',
+                                  '(int3)', ['(int3)', '(-111, 222, -333,'])
+
+        self._try_modifying_global('uint3_global', '{444, 555, 666}',
+                                  '(uint3)', ['(uint3)', '(444, 555, 666,'])
+
+        self._try_modifying_global('float3_global', '{7.5F, 0008.000, 9}',
+                                  '(float3)', ['(float3)', '(7.5, 8, 9,'])
+
+        self._try_modifying_global('long3_global', '{111111, -22222222, 3333333}',
+                                  '(long3)', ['(long3)', '(111111, -22222222, 3333333,'])
+
+        self._try_modifying_global('ulong3_global', '{4444444, 5555555, 66666666}',
+                                  '(ulong3)', ['(ulong3)', '(4444444, 5555555, 66666666,'])
+
+        self._try_modifying_global('double3_global', '{7.5L, -0, 8.9e1}',
+                                  '(double3)', ['(double3)', '(7.5, 0, 89,'])
+
+        self._try_modifying_global('char4_global', '{0x1, 0x2, 0x3, 0x4}',
+                                  '(char4)',
+                                  ['(char4)', '(1, 2, 3, 4)'])
+
+        self._try_modifying_global('uchar4_global', '{0x5, 0x6, 0x7, 0x8}',
+                                  '(uchar4)',
+                                  ['(uchar4)', '(0x05, 0x06, 0x07, 0x08)'])
+
+        self._try_modifying_global('short4_global', '{0x9, 0xa, 0xb, 0xc}',
+                                  '(short4)',
+                                  ['(short4)', '(9, 10, 11, 12)'])
+
+        self._try_modifying_global('ushort4_global', '{0xd, 0xe, 0xf, 0x10}',
+                                  '(ushort4)',
+                                  ['(ushort4)', '(13, 14, 15, 16)'])
+
+        self._try_modifying_global('int4_global', '{0x11, 0x12, 0x13, 0x14}',
+                                  '(int4)',
+                                  ['(int4)', '(17, 18, 19, 20)'])
+
+        self._try_modifying_global('uint4_global', '{0x15, 0x16, 0x17, 0x18}',
+                                  '(uint4)',
+                                  ['(uint4)', '(21, 22, 23, 24)'])
+
+        self._try_modifying_global('float4_global', '{19.0, 20.5, -21, -22.5}',
+                                  '(float4)',
+                                  ['(float4)', '(19, 20.5, -21, -22.5)'])
+
+        self._try_modifying_global('long4_global', '{0x1d, 0x1e, 0x1f, 0x20}',
+                                  '(long4)',
+                                  ['(long4)', '(29, 30, 31, 32)'])
+
+        self._try_modifying_global('ulong4_global', '{0x21, 0x22, 0x23, 0x24}',
+                                  '(ulong4)',
+                                  ['(ulong4)', '(33, 34, 35, 36)'])
+
+        self._try_modifying_global('double4_global', '{25.000, -26, -27.5, 28.0}',
+                                  '(double4)',
+                                  ['(double4)', '(25, -26, -27.5, 28)'])
diff --git a/tests/lldb/tests/jni/test_write_local_element_jni.py b/tests/lldb/tests/jni/test_write_local_element_jni.py
new file mode 100644
index 0000000..84c660d
--- /dev/null
+++ b/tests/lldb/tests/jni/test_write_local_element_jni.py
@@ -0,0 +1,273 @@
+'''Module that contains the test TestWriteLocalElementJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestWriteLocalElementJNI(TestBaseRemote):
+    '''Tests modifying elements of local variables of all types in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "JNIKernelVariables"
+
+    def _try_inspecting_local(self, local_name, expected_output):
+        '''Run the "expr" command on a given local and with a given output.
+
+        Args:
+            local_name: String which is the name of the local to inspect.
+            expected_output: List of strings that should be found in the output.
+
+        Raises:
+            TestFail: The lldb command did not provide the expected output.
+        '''
+        self.try_command('expr ' + local_name, expected_output)
+
+    def _try_modifying_local(self, local_name, new_value, expected_output,
+                             expected_output_regex=None):
+        '''Modify and then inspect a local and check for the output.
+
+        Run the "expr" command to set a given local to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            local_name: String which is the name of the local to modify.
+            new_value: A string that is the new value of the local.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+        self.try_command('expr %s = %s' % (local_name, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('frame variable ' + local_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=too-many-statements
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_local('char2_local[0]', '2',
+                                 ['2'], [r'\((signed )?char\)'])
+        self._try_inspecting_local('char2_local',
+                                 ['(char2)', '(2, -22)'])
+
+        self._try_modifying_local('uchar2_local[1]', '3',
+                                 ['3'], [r'\(u(nsigned )?char\)'])
+        self._try_inspecting_local('uchar2_local',
+                                  ['(uchar2)', '(0x21, 0x03)'])
+
+        self._try_modifying_local('short2_local[0]', '-44',
+                                 ['(short)', '-44'])
+        self._try_inspecting_local('short2_local',
+                                  ['(short2)', '(-44, 666)'])
+
+        self._try_modifying_local('ushort2_local[1]', '55',
+                                 ['55'], [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_local('ushort2_local',
+                                  ['(ushort2)', '(777, 55)'])
+
+        self._try_modifying_local('int2_local[0]', '666',
+                                 ['(int)', '666'])
+        self._try_inspecting_local('int2_local',
+                                  ['(int2)', '(666, -1111)'])
+
+        self._try_modifying_local('uint2_local[1]', '777',
+                                 ['777'], [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_local('uint2_local',
+                                  ['(uint2)', '(2222, 777)'])
+
+        self._try_modifying_local('float2_local[0]', '-8.5',
+                                 ['(float)', '-8.5'])
+        self._try_inspecting_local('float2_local',
+                                  ['(float2)', '(-8.5, -5)'])
+
+        self._try_modifying_local('long2_local[1]', '999999',
+                                 ['999999'],
+                                 [r'\((long )?long\)'])
+        self._try_inspecting_local('long2_local',
+                                  ['(long2)', '(-4444, 999999)'])
+
+        self._try_modifying_local('ulong2_local[0]', '10101010101',
+                                 ['10101010101'],
+                                 [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_local('ulong2_local',
+                                  ['(ulong2)', '(10101010101, 7777)'])
+
+        self._try_modifying_local('double2_local[1]', '-11.000',
+                                 ['(double)', '-11'])
+        self._try_inspecting_local('double2_local',
+                                  ['(double2)', '(88.5, -11)'])
+
+        # For some reason the result of some char and uchar expr is in hex and
+        # that of frame variable in decimal, so calling try_modifying_local
+        # doesn't work, because it reuses the expected output for both commands.
+        self.try_command('expr char3_local[0] = 12',
+                         ['\'\\f\''],
+                         [r'\((signed )?char\)'])
+        self.try_command('frame variable char3_local[0]',
+                         ['12'],
+                         [r'\((signed )?char\)'])
+
+        self._try_inspecting_local('char3_local',
+                                  ['(char3)',
+                                   '(12, -22, -33,'])
+
+        self.try_command('expr uchar3_local[1] = \'d\'',
+                         ['\'d\''],
+                         [r'\(u(nsigned )?char\)'])
+        self.try_command('frame variable uchar3_local[1]',
+                         ['0x64'],
+                         [r'\(u(nsigned )?char\)'])
+
+        self._try_inspecting_local('uchar3_local',
+                                  ['(uchar3)',
+                                   '(0x21, 0x64, 0x37,'])
+
+        self._try_modifying_local('short3_local[2]', '-131',
+                                 ['(short)', '-131'])
+        self._try_inspecting_local('short3_local',
+                                  ['(short3)',
+                                   '(-555, 666, -131,'])
+
+        self._try_modifying_local('ushort3_local[0]', '1414',
+                                 ['1414'], [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_local('ushort3_local',
+                                  ['(ushort3)',
+                                   '(1414, 888, 999,'])
+
+        self._try_modifying_local('int3_local[0]', '151515',
+                                 ['(int)', '151515'])
+        self._try_inspecting_local('int3_local',
+                                  ['(int3)',
+                                   '(151515, -1111, 2222,'])
+
+        self._try_modifying_local('uint3_local[1]', '161616',
+                                 ['161616'], [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_local('uint3_local',
+                                  ['(uint3)',
+                                   '(2222, 161616, 4444,'])
+
+        self._try_modifying_local('float3_local[2]', '17.5',
+                                 ['(float)', '17.5'])
+        self._try_inspecting_local('float3_local',
+                                  ['(float3)',
+                                   '(4.5, -5, 17.5,'])
+
+        self._try_modifying_local('long3_local[0]', '-181818181818',
+                                 ['-181818181818'], [r'\((long )?long\)'])
+        self._try_inspecting_local('long3_local',
+                                  ['(long3)',
+                                   '(-181818181818, 5555, 6666,'])
+
+        self._try_modifying_local('ulong3_local[1]', '191919191919',
+                                 ['191919191919'],
+                                 [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_local('ulong3_local',
+                                  ['(ulong3)',
+                                   '(6666, 191919191919, 8888,'])
+
+        self._try_modifying_local('double3_local[2]', '20.5',
+                                 ['(double)', '20.5'])
+        self._try_inspecting_local('double3_local',
+                                  ['(double3)',
+                                   '(88.5, -99, 20.5,'])
+
+        self.try_command('expr char4_local[0] = -21',
+                         ['\'\\xeb\''],
+                         [r'\((signed )?char\)'])
+        self.try_command('frame variable char4_local[0]',
+                         ['-21'],
+                         [r'\((signed )?char\)'])
+
+        self._try_inspecting_local('char4_local',
+                                  ['(char4)',
+                                   '(-21, 11, -22, -33)'])
+
+        self.try_command('expr uchar4_local[1] = 22',
+                         ['\'\\x16\''],
+                         [r'\(u(nsigned )?char\)'])
+        self.try_command('frame variable uchar4_local[1]',
+                         ['0x16'],
+                         [r'\(u(nsigned )?char\)'])
+
+        self._try_inspecting_local('uchar4_local',
+                                  ['(uchar4)',
+                                   '(0x16, 0x16, 0x2c, 0x37)'])
+
+        self._try_modifying_local('short4_local[2]', '23',
+                                 ['(short)', '23'])
+        self._try_inspecting_local('short4_local',
+                                  ['(short4)',
+                                   '(-444, -555, 23, 777)'])
+
+        self._try_modifying_local('ushort4_local[3]', '24',
+                                 ['24'], [r'\(u(nsigned )?short\)'])
+        self._try_inspecting_local('ushort4_local',
+                                  ['(ushort4)',
+                                   '(666, 777, 888, 24)'])
+
+        self._try_modifying_local('int4_local[0]', '-2525',
+                                 ['(int)', '-2525'])
+        self._try_inspecting_local('int4_local',
+                                  ['(int4)',
+                                   '(-2525, 999, -1111, 2222)'])
+
+        self._try_modifying_local('uint4_local[1]', '26262',
+                                  ['26262'], [r'\(u(nsigned )?int\)'])
+        self._try_inspecting_local('uint4_local',
+                                  ['(uint4)',
+                                   '(1111, 26262, 3333, 4444)'])
+
+        self._try_modifying_local('float4_local[2]', '27.0f',
+                                 ['(float)', '27'])
+        self._try_inspecting_local('float4_local',
+                                  ['(float4)',
+                                   '(3, 4.5, 27, -6.5)'])
+
+        self._try_modifying_local('long4_local[3]', '-28282828282',
+                                 ['-28282828282'], [r'\((long )?long\)'])
+        self._try_inspecting_local('long4_local',
+                                  ['(long4)',
+                                   '(-3333, -4444, 5555, -28282828282)'])
+
+        self._try_modifying_local('ulong4_local[0]', '2929292929',
+                                 ['2929292929'],
+                                 [r'\(u(nsigned )?(long )?long\)'])
+        self._try_inspecting_local('ulong4_local',
+                                  ['(ulong4)',
+                                   '(2929292929, 6666, 7777, 8888)'])
+
+        self._try_modifying_local('double4_local[1]', '30.5',
+                                 ['(double)', '30.5'])
+        self._try_inspecting_local('double4_local',
+                                  ['(double4)',
+                                   '(-77, 30.5, -99, 111.5)'])
diff --git a/tests/lldb/tests/jni/test_write_local_jni.py b/tests/lldb/tests/jni/test_write_local_jni.py
new file mode 100644
index 0000000..c9dada3
--- /dev/null
+++ b/tests/lldb/tests/jni/test_write_local_jni.py
@@ -0,0 +1,203 @@
+'''Module that contains the test TestWriteLocalJNI.'''
+
+from harness.test_base_remote import TestBaseRemote
+
+class TestWriteLocalJNI(TestBaseRemote):
+    '''Tests modifying local variables of all types in a JNI apk.'''
+
+    def get_bundle_target(self):
+        '''Return string with name of bundle executable to run.
+
+        Returns:
+            A string containing the name of the binary that this test can be run
+            with.
+        '''
+        return "JNIKernelVariables"
+
+    def _try_modifying_local(self, local_name, new_value, data_type_in,
+                             expected_output, expected_output_regex=None):
+        '''Try getting lldb to modify a local and check the output.
+
+        Run the "expr" command to set a given local to a new value and
+        check that it is set afterwards by running the "target variable"
+        command.
+
+        Args:
+            local_name: String which is the name of the local to modify.
+            new_value: A string that is the new value of the local.
+            data_type_in: A string containing a c-style parenthesised data type
+                          representing the type of the local.
+            expected_output: List of strings that should be found in the output
+                             of both commands.
+            expected_output_regex: List of regular expressions that should be
+                                   found in the output of the target variable
+                                   command.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=too-many-arguments
+
+        self.try_command('expr %s = %s%s' %
+                         (local_name, data_type_in, new_value),
+                         expected_output,
+                         expected_output_regex)
+        self.try_command('frame variable ' + local_name,
+                         expected_output,
+                         expected_output_regex)
+
+    def test_case(self, _):
+        '''Run the lldb commands that are being tested.
+
+        Raises:
+            TestFail: One of the lldb commands did not provide the expected
+                      output.
+        '''
+
+        # pylint: disable=line-too-long
+        # There is no way we can make this look nice
+
+        self.try_command('language renderscript status',
+                         ['Runtime Library discovered',
+                          'Runtime Driver discovered'])
+
+        self.try_command('b -f simple.rs -l 129', [])
+
+        self.try_command('process continue',
+                         ['resuming',
+                          'stopped',
+                          'stop reason = breakpoint'])
+
+        self._try_modifying_local('char_local', '-2',
+                                 '(signed char)', ['\'\\xfe\''],
+                                 [r'\((signed )?char\)'])
+
+        self._try_modifying_local('uchar_local', '22',
+                                 '(uchar)', ['(uchar)', '\'\\x16\''])
+
+        self._try_modifying_local('short_local', '-33',
+                                 '(short)', ['(short)', '-33'])
+
+        self._try_modifying_local('ushort_local', '44',
+                                 '(ushort)', ['(ushort)', '44'])
+
+        self._try_modifying_local('int_local', '-55',
+                                 '(int)', ['(int)', '-55'])
+
+        self._try_modifying_local('uint_local', '66',
+                                 '(uint)', ['(uint)', '66'])
+
+        self._try_modifying_local('float_local', '-7.5',
+                                 '(float)', ['(float)', '-7.5'])
+
+        self._try_modifying_local('long_local', '-888888',
+                                 '(long long)', ['-888888'],
+                                 [r'\((long )?long\)'])
+
+        self._try_modifying_local('ulong_local', '99999999',
+                                 '(ulong)', ['(ulong)', '99999999'])
+
+        self._try_modifying_local('double_local', '-10101.5',
+                                 '(double)', ['(double)', '-10101.5'])
+
+        self._try_modifying_local('char2_local', '{22, 4}',
+                                 '(char2)', ['(char2)', '(22, 4)'])
+
+        self._try_modifying_local('uchar2_local', '{44, 55}',
+                                 '(uchar2)', ['(uchar2)', '(0x2c, 0x37)'])
+
+        self._try_modifying_local('short2_local', '{-66, 77}',
+                                 '(short2)', ['(short2)', '(-66, 77)'])
+
+        self._try_modifying_local('ushort2_local', '{88, 99}',
+                                 '(ushort2)', ['(ushort2)', '(88, 99)'])
+
+        self._try_modifying_local('int2_local', '{111, -222}',
+                                 '(int2)', ['(int2)', '(111, -222)'])
+
+        self._try_modifying_local('uint2_local', '{333, 444}',
+                                 '(uint2)', ['(uint2)', '(333, 444)'])
+
+        self._try_modifying_local('float2_local', '{-55.5f, 6.0}',
+                                 '(float2)', ['(float2)', '(-55.5, 6)'])
+
+        self._try_modifying_local('long2_local', '{666666, -777777}',
+                                 '(long2)', ['(long2)', '(666666, -777777)'])
+
+        self._try_modifying_local('ulong2_local', '{888888, 999999}',
+                                 '(ulong2)', ['(ulong2)', '(888888, 999999)'])
+
+        self._try_modifying_local('double2_local', '{11.0000000, -0.0l}',
+                                 '(double2)', ['(double2)', '(11, -0)'])
+
+        self._try_modifying_local('char3_local', '{2, -3, 4}',
+                                 '(char3)', ['(char3)', '(2, -3, 4,'])
+
+        self._try_modifying_local('uchar3_local', '{\'a\', \'b\', \'c\'}',
+                                 '(uchar3)', ['(uchar3)', '(0x61, 0x62, 0x63,'])
+
+        self._try_modifying_local('short3_local', '{44, -55, 66}',
+                                 '(short3)', ['(short3)', '(44, -55, 66,'])
+
+        self._try_modifying_local('ushort3_local', '{88, 99, 111}',
+                                 '(ushort3)', ['(ushort3)', '(88, 99, 111,'])
+
+        self._try_modifying_local('int3_local', '{-111, 222, -333}',
+                                 '(int3)', ['(int3)', '(-111, 222, -333,'])
+
+        self._try_modifying_local('uint3_local', '{444, 555, 666}',
+                                 '(uint3)', ['(uint3)', '(444, 555, 666,'])
+
+        self._try_modifying_local('float3_local', '{7.5F, 0008.000, 9}',
+                                 '(float3)', ['(float3)', '(7.5, 8, 9,'])
+
+        self._try_modifying_local('long3_local', '{111111, -22222222, 3333333}',
+                                 '(long3)', ['(long3)', '(111111, -22222222, 3333333,'])
+
+        self._try_modifying_local('ulong3_local', '{4444444, 5555555, 66666666}',
+                                 '(ulong3)', ['(ulong3)', '(4444444, 5555555, 66666666,'])
+
+        self._try_modifying_local('double3_local', '{7.5L, -0, 8.9e1}',
+                                 '(double3)', ['(double3)', '(7.5, 0, 89,'])
+
+        self._try_modifying_local('char4_local', '{0x1, 0x2, 0x3, 0x4}',
+                                 '(char4)',
+                                 ['(char4)', '(1, 2, 3, 4)'])
+
+        self._try_modifying_local('uchar4_local', '{0x5, 0x6, 0x7, 0x8}',
+                                 '(uchar4)',
+                                 ['(uchar4)', '(0x05, 0x06, 0x07, 0x08)'])
+
+        self._try_modifying_local('short4_local', '{0x9, 0xa, 0xb, 0xc}',
+                                 '(short4)',
+                                 ['(short4)', '(9, 10, 11, 12)'])
+
+        self._try_modifying_local('ushort4_local', '{0xd, 0xe, 0xf, 0x10}',
+                                 '(ushort4)',
+                                 ['(ushort4)', '(13, 14, 15, 16)'])
+
+        self._try_modifying_local('int4_local', '{0x11, 0x12, 0x13, 0x14}',
+                                 '(int4)',
+                                 ['(int4)', '(17, 18, 19, 20)'])
+
+        self._try_modifying_local('uint4_local', '{0x15, 0x16, 0x17, 0x18}',
+                                 '(uint4)',
+                                 ['(uint4)', '(21, 22, 23, 24)'])
+
+        self._try_modifying_local('float4_local', '{19.0, 20.5, -21, -22.5}',
+                                 '(float4)',
+                                 ['(float4)', '(19, 20.5, -21, -22.5)'])
+
+        self._try_modifying_local('long4_local', '{0x1d, 0x1e, 0x1f, 0x20}',
+                                 '(long4)',
+                                 ['(long4)', '(29, 30, 31, 32)'])
+
+        self._try_modifying_local('ulong4_local', '{0x21, 0x22, 0x23, 0x24}',
+                                 '(ulong4)',
+                                 ['(ulong4)', '(33, 34, 35, 36)'])
+
+        self._try_modifying_local('double4_local', '{25.000, -26, -27.5, 28.0}',
+                                 '(double4)',
+                                 ['(double4)', '(25, -26, -27.5, 28)'])
diff --git a/tests/lldb/tests/run_test.py b/tests/lldb/tests/run_test.py
new file mode 100644
index 0000000..b9e2145
--- /dev/null
+++ b/tests/lldb/tests/run_test.py
@@ -0,0 +1,363 @@
+#!/usr/bin/env python2.7
+'''This script will run one specific test.'''
+from __future__ import print_function
+
+import sys
+import atexit
+import inspect
+import logging
+import os
+
+import harness
+from harness import util_constants
+from harness import util_log
+from harness import util_warnings
+from harness.util_functions import load_py_module
+from harness.util_lldb import UtilLLDB
+from harness.exception import DisconnectedException
+from harness.exception import TestSuiteException
+from harness.util_timer import Timer
+
+
+def _test_pre_run(state):
+    '''This function is called before a test is executed (setup).
+
+    Args:
+        state: Test suite state collection, instance of State.
+
+    Returns:
+        True if the pre_run step completed without error. Currently the pre-run
+        will launch the target test binary on the device and attach an
+        lldb-server to it in platform mode.
+
+    Raises:
+        AssertionError: If an assertion fails.
+        TestSuiteException: Previous processes of this apk required for this
+                            test could not be killed.
+    '''
+    assert state.test
+    assert state.bundle
+
+    log = util_log.get_logger()
+    log.info('running: {0}'.format(state.name))
+
+    # Remove any cached NDK scripts between tests
+    state.bundle.delete_ndk_cache()
+
+    # query our test case for the remote target app it needs
+    target_name = state.test.get_bundle_target()
+    if not target_name:
+        # test case doesn't require a remote process to debug
+        return True
+    else:
+        # find the pid of our remote test process
+        state.pid = state.bundle.launch(target_name)
+        if not state.pid:
+            log.error('unable to get pid of target')
+            return False
+        state.android.kill_servers()
+        # spawn lldb platform on the target device
+        state.android.launch_lldb_platform(state.device_port)
+        return True
+
+
+def _test_post_run(state):
+    '''This function is called after a test is executed (cleanup).
+
+    Args:
+        state: Test suite state collection, instance of State.
+
+    Raises:
+        AssertionError: If an assertion fails.
+    '''
+    assert state.test
+    assert state.bundle
+
+    target_name = state.test.get_bundle_target()
+    if target_name:
+        if state.bundle.is_apk(target_name):
+            state.android.stop_app(state.bundle.get_package(target_name))
+        else:
+            state.android.kill_process(target_name)
+
+
+def _test_run(state):
+    '''Execute a single test case.
+
+    Args:
+        state: test suite state collection, instance of State.
+
+    Returns:
+        True: if the test case ran successfully and passed.
+        False: if the test case failed or suffered an error.
+
+    Raises:
+        AssertionError: If an assertion fails.
+    '''
+    assert state.lldb
+    assert state.lldb_module
+    assert state.test
+
+    if not state.test.run(state.lldb, state.pid, state.lldb_module,
+                          state.wimpy):
+        util_log.get_logger().error('test {0} failed'.format(state.name))
+        return False
+
+    return True
+
+
+def _initialise_timer(android, interval):
+    '''Start a 'timeout' timer, to catch stalled execution.
+
+    This function will start a timer that will act as a timeout killing this
+    test session if a test becomes un-responsive.
+
+    Args:
+        android: current instance of harness.UtilAndroid
+        interval: the interval for the timeout, in seconds
+
+    Returns:
+        The instance of the Timer class that was created.
+    '''
+
+    def on_timeout():
+        '''This is a callback function that will fire if a test takes longer
+        then a threshold time to complete.'''
+        # Clean up the android properties
+        android.reset_all_props()
+        # pylint: disable=protected-access
+        sys.stdout.flush()
+        # hard exit to force kill all threads that may block our exit
+        os._exit(util_constants.RC_TEST_TIMEOUT)
+
+    timer = Timer(interval, on_timeout)
+    timer.start()
+    atexit.register(Timer.stop, timer)
+    return timer
+
+
+def _quit_test(num, timer):
+    '''This function will exit making sure the timeout thread is killed.
+
+    Args:
+        num: An integer specifying the exit status, 0 meaning "successful
+             termination".
+        timer: The current Timer instance.
+    '''
+    if timer:
+        timer.stop()
+    sys.stdout.flush()
+    sys.exit(num)
+
+
+def _execute_test(state):
+    '''Execute a test case.
+
+    Args:
+        state: The current State object.
+        log: The current Log object.
+    '''
+    log = util_log.get_logger()
+
+    state.test.test_setup(state.android)
+    try:
+        if not _test_pre_run(state):
+            raise TestSuiteException('test_pre_run() failed')
+        if not _test_run(state):
+            raise TestSuiteException('test_run() failed')
+        _test_post_run(state)
+        log.info('Test passed')
+
+    finally:
+        state.test.post_run()
+        state.test.test_shutdown(state.android)
+
+
+def _get_test_case_class(module):
+    '''Inspect a test case module and return the test case class.
+
+    Args:
+        module: A loaded test case module.
+    '''
+    for _, obj in inspect.getmembers(module):
+        if inspect.isclass(obj):
+            if (hasattr(module, "TestBase") and
+                issubclass(obj, module.TestBase) and
+                obj is not module.TestBase):
+                return obj
+            if (hasattr(module, "TestBaseRemote") and
+                issubclass(obj, module.TestBaseRemote) and
+                obj is not module.TestBaseRemote):
+                return obj
+    return None
+
+
+def get_test_dir(test_name):
+    ''' Get the directory that contains a test with a given name.
+
+    Returns:
+        A string that is the directory containing the test.
+
+    Raises:
+        TestSuiteException: If a test with this name does not exist.
+    '''
+    tests_dir = os.path.dirname(os.path.realpath(__file__))
+    for sub_dir in os.listdir(tests_dir):
+        current_test_dir = os.path.join(tests_dir, sub_dir)
+        if (os.path.isdir(current_test_dir) and
+            test_name in os.listdir(current_test_dir)):
+            return current_test_dir
+
+    raise TestSuiteException(
+        'unable to find test: {0}'.format(test_name))
+
+
+def main():
+    '''Test runner entry point.'''
+
+    # re-open stdout with no buffering
+    sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
+
+    android = None
+    timer = None
+    log = None
+
+    try:
+        # parse the command line
+        if len(sys.argv) < 12:
+            raise TestSuiteException('Invalid number of arguments')
+
+        assert sys.argv[8] in ('True', 'False')
+        args = dict(test_name=sys.argv[1],
+                    log_file_path=sys.argv[2],
+                    adb_path=sys.argv[3],
+                    lldb_server_path_device=sys.argv[4],
+                    aosp_product_path=sys.argv[5],
+                    device_port=int(sys.argv[6]),
+                    device=sys.argv[7],
+                    print_to_stdout=sys.argv[8] == 'True',
+                    verbose=sys.argv[9] == 'True',
+                    wimpy=sys.argv[10] == 'True',
+                    timeout=int(sys.argv[11]))
+
+        # create utility classes
+        harness.util_log.initialise(args['test_name'],
+            print_to_stdout=args['print_to_stdout'],
+            level=logging.INFO if not args['verbose'] else logging.DEBUG,
+            file_path=args['log_file_path'],
+            file_mode='a'
+        )
+        log = util_log.get_logger()
+        log.debug('Logger initialised')
+
+        android = harness.UtilAndroid(args['adb_path'],
+                                      args['lldb_server_path_device'],
+                                      args['device'])
+
+        # start the timeout counter
+        timer = _initialise_timer(android, args['timeout'])
+
+        # startup lldb and register teardown handler
+        atexit.register(UtilLLDB.stop)
+        UtilLLDB.start()
+
+        current_test_dir = get_test_dir(args['test_name'])
+
+        # load a test case module
+        test_module = load_py_module(os.path.join(current_test_dir,
+                                                  args['test_name']))
+        assert test_module
+        assert (hasattr(test_module, "TestBase") or
+                hasattr(test_module, "TestBaseRemote"))
+
+        # inspect the test module and locate our test case class
+        test_class = _get_test_case_class(test_module)
+        assert test_class
+
+        # if our test inherits from TestBaseRemote, check we have a valid device
+        if (hasattr(test_module, "TestBaseRemote") and
+            issubclass(test_class, test_module.TestBaseRemote)):
+            android.validate_device()
+
+        # create an instance of our test case
+        test_inst = test_class(args['device_port'], args['device'], timer)
+        assert test_inst
+
+        # instantiate a test target bundle
+        bundle = harness.UtilBundle(android, args['aosp_product_path'])
+
+        # execute the test case
+        try:
+            for _ in range(2):
+                try:
+                    # create an lldb instance
+                    lldb = UtilLLDB.create_debugger()
+
+                    # create state object to encapsulate instances
+                    state = type('State',
+                                 (object,),
+                                 dict(
+                                     android=android,
+                                     bundle=bundle,
+                                     lldb=lldb,
+                                     lldb_module=UtilLLDB.get_module(),
+                                     test=test_inst,
+                                     pid=None,
+                                     name=args['test_name'],
+                                     device_port=args['device_port'],
+                                     wimpy=args['wimpy'])
+                                 )
+
+                    util_warnings.redirect_warnings()
+
+                    _execute_test(state)
+
+                    # tear down the lldb instance
+                    UtilLLDB.destroy_debugger(lldb)
+                    break
+                except DisconnectedException as error:
+                    log.warning(error)
+                    log.warning('Trying again.')
+            else:
+                log.fatal('Not trying again, maximum retries exceeded.')
+                raise TestSuiteException('Lost connection to lldb-server')
+
+        finally:
+            util_warnings.restore_warnings()
+
+        _quit_test(util_constants.RC_TEST_OK, timer)
+
+    except AssertionError:
+        if log:
+            log.critical('Internal test suite error', exc_info=1)
+        print('Internal test suite error', file=sys.stderr)
+        _quit_test(util_constants.RC_TEST_FATAL, timer)
+
+    except TestSuiteException as error:
+        if log:
+            log.exception(str(error))
+        else:
+            print(str(error), file=sys.stderr)
+        _quit_test(util_constants.RC_TEST_ERROR, timer)
+
+    # use a global exception handler to be sure that we will
+    # exit safely and correctly
+    except Exception:
+        if log:
+            log.exception('INTERNAL ERROR')
+        else:
+            import traceback
+            print('Exception {0}'.format(traceback.format_exc()),
+                  file=sys.stderr)
+        _quit_test(util_constants.RC_TEST_FATAL, timer)
+
+    finally:
+        if android:
+            android.reset_all_props()
+        if timer:
+            timer.stop()
+
+
+# execution trampoline
+if __name__ == '__main__':
+    main()
