diff options
| author | 2017-06-06 16:09:59 +0100 | |
|---|---|---|
| committer | 2017-08-10 18:17:47 +0100 | |
| commit | 2b03a1f24600c8c9558fb13d3f8bca1ef0f8ee40 (patch) | |
| tree | 4d5fb728acd7f98f8949c84364375a804ff0ba63 /compiler/driver/compiler_options.cc | |
| parent | 461ec567f16039374dff35e2f3b808986c100249 (diff) | |
Instrument ARM64 generated code to check the Marking Register.
Generate run-time code in the Optimizing compiler checking that
the Marking Register's value matches `self.tls32_.is.gc_marking`
in debug mode (on target; and on host with JIT, or with AOT when
compiling the core image). If a check fails, abort.
Test: m test-art-target
Test: m test-art-target with tree built with ART_USE_READ_BARRIER=false
Test: ARM64 device boot test with libartd.
Bug: 37707231
Change-Id: Ie9b322b22b3d26654a06821e1db71dbda3c43061
Diffstat (limited to 'compiler/driver/compiler_options.cc')
| -rw-r--r-- | compiler/driver/compiler_options.cc | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/compiler/driver/compiler_options.cc b/compiler/driver/compiler_options.cc index 3cacc2cad7..538845de19 100644 --- a/compiler/driver/compiler_options.cc +++ b/compiler/driver/compiler_options.cc @@ -18,6 +18,8 @@ #include <fstream> +#include "runtime.h" + namespace art { CompilerOptions::CompilerOptions() @@ -30,6 +32,7 @@ CompilerOptions::CompilerOptions() inline_max_code_units_(kUnsetInlineMaxCodeUnits), no_inline_from_(nullptr), boot_image_(false), + core_image_(false), app_image_(false), top_k_profile_threshold_(kDefaultTopKProfileThreshold), debuggable_(false), @@ -55,6 +58,19 @@ CompilerOptions::~CompilerOptions() { // because we don't want to include the PassManagerOptions definition from the header file. } +bool CompilerOptions::EmitRunTimeChecksInDebugMode() const { + // Run-time checks (e.g. Marking Register checks) are only emitted + // in debug mode, and + // - when running on device; or + // - when running on host, but only + // - when compiling the core image (which is used only for testing); or + // - when JIT compiling (only relevant for non-native methods). + // This is to prevent these checks from being emitted into pre-opted + // boot image or apps, as these are compiled with dex2oatd. + return kIsDebugBuild && + (kIsTargetBuild || IsCoreImage() || Runtime::Current()->UseJitCompilation()); +} + void CompilerOptions::ParseHugeMethodMax(const StringPiece& option, UsageFn Usage) { ParseUintOption(option, "--huge-method-max", &huge_method_threshold_, Usage); } |