summaryrefslogtreecommitdiff
path: root/compiler/optimizing/code_generator.cc
diff options
context:
space:
mode:
authorEvgeny Astigeevich <evgeny.astigeevich@linaro.org>2019-09-09 14:52:12 +0100
committerEvgeny Astigeevich <evgeny.astigeevich@linaro.org>2019-10-10 13:06:08 +0100
commit98416bf06592493ee6fde039af5eaa5efab73acc (patch)
treea0052ec5364ce1068639a9b7d7355683eb691371 /compiler/optimizing/code_generator.cc
parent63b0c26aae3e7237166dd781eb7a15fbc7c091c2 (diff)
Fix uses of MaybeRecordImplicitNullCheck without special scopes
MaybeRecordImplicitNullCheck is a function which uses CodeGenerator::RecordPcInfo() and requires an exact PC. However for ARM32/ARM64, when CodeGenerator::RecordPcInfo() is used without VIXL special scopes (EmissionCheckScope, ExactAssemblyScope) there is no guarantee of an exact PC. Without the special scopes VIXL might emit veneer/literal pools affecting a PC. The ARM32 code generator has uses of MaybeRecordImplicitNullCheck without the special scopes. This CL fixes missing special scopes in the ARM32/ARM64 code generators. It also changes API to prevent such cases: 1. A variant of CodeGenerator::RecordPcInfo with native_pc as a parameter is added. The old variant (where Assembler::CodePosition is used) is kept and documented that Assembler::CodePosition is target-dependent and might be imprecise. 2. CodeGenerator::MaybeRecordImplicitNullCheck is made virtual. Checks are added to ARM32/ARM64 code generators that MaybeRecordImplicitNullCheck is invoked within VIXL special scopes. Test: test.py --host --optimizing --jit --gtest Test: test.py --target --optimizing --jit Test: run-gtests.sh Change-Id: Ic66c16e7bdf4751cbc19a9de05846fba005b7f55
Diffstat (limited to 'compiler/optimizing/code_generator.cc')
-rw-r--r--compiler/optimizing/code_generator.cc13
1 files changed, 9 insertions, 4 deletions
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc
index 6d3a5c6a73..bef7169da1 100644
--- a/compiler/optimizing/code_generator.cc
+++ b/compiler/optimizing/code_generator.cc
@@ -1116,6 +1116,14 @@ void CodeGenerator::RecordPcInfo(HInstruction* instruction,
uint32_t dex_pc,
SlowPathCode* slow_path,
bool native_debug_info) {
+ RecordPcInfo(instruction, dex_pc, GetAssembler()->CodePosition(), slow_path, native_debug_info);
+}
+
+void CodeGenerator::RecordPcInfo(HInstruction* instruction,
+ uint32_t dex_pc,
+ uint32_t native_pc,
+ SlowPathCode* slow_path,
+ bool native_debug_info) {
if (instruction != nullptr) {
// The code generated for some type conversions
// may call the runtime, thus normally requiring a subsequent
@@ -1139,9 +1147,6 @@ void CodeGenerator::RecordPcInfo(HInstruction* instruction,
}
}
- // Collect PC infos for the mapping table.
- uint32_t native_pc = GetAssembler()->CodePosition();
-
StackMapStream* stack_map_stream = GetStackMapStream();
if (instruction == nullptr) {
// For stack overflow checks and native-debug-info entries without dex register
@@ -1493,7 +1498,7 @@ bool CodeGenerator::CanMoveNullCheckToUser(HNullCheck* null_check) {
void CodeGenerator::MaybeRecordImplicitNullCheck(HInstruction* instr) {
HNullCheck* null_check = instr->GetImplicitNullCheck();
if (null_check != nullptr) {
- RecordPcInfo(null_check, null_check->GetDexPc());
+ RecordPcInfo(null_check, null_check->GetDexPc(), GetAssembler()->CodePosition());
}
}