diff options
| author | 2016-03-09 12:02:11 +0000 | |
|---|---|---|
| committer | 2016-08-26 16:07:58 +0100 | |
| commit | da8ffec70e9019fe1208ac38444a7048958fc206 (patch) | |
| tree | a6dc41bc2dfe6c5afc6fcc3bdd77c35063ad4e6a | |
| parent | c0ee1f5af12298e11aaadab4c9838b2f1395972e (diff) | |
Add entrypoint type information.
For some of the runtime calls we do not need to generate stack maps. For
example, the Optimizing compiler implements HRem Floating Point by
calling libm's fmod().
Since this is a leaf method that does not suspend the execution, we do
not need to treat the fmod() invoke as a possible suspend point and thus
we do not need to create a stack map for the particular PC.
For now conservatively only tag the maths runtime entrypoints with this
information.
Test: m test-art-target
Change-Id: Iab73dcf8047d2edaa7a570113ee792e46ccbc464
| -rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 4 | ||||
| -rw-r--r-- | compiler/optimizing/code_generator_arm64.cc | 4 | ||||
| -rw-r--r-- | runtime/Android.bp | 1 | ||||
| -rw-r--r-- | runtime/entrypoints/quick/quick_entrypoints_enum.cc | 69 | ||||
| -rw-r--r-- | runtime/entrypoints/quick/quick_entrypoints_enum.h | 2 |
5 files changed, 78 insertions, 2 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 5ac7d17607..55083c384f 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -1209,7 +1209,9 @@ void CodeGeneratorARM::InvokeRuntime(QuickEntrypointEnum entrypoint, SlowPathCode* slow_path) { ValidateInvokeRuntime(instruction, slow_path); GenerateInvokeRuntime(GetThreadOffset<kArmPointerSize>(entrypoint).Int32Value()); - RecordPcInfo(instruction, dex_pc, slow_path); + if (EntrypointRequiresStackMap(entrypoint)) { + RecordPcInfo(instruction, dex_pc, slow_path); + } } void CodeGeneratorARM::InvokeRuntimeWithoutRecordingPcInfo(int32_t entry_point_offset, diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index 17fc13cf65..933f3e6883 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -1485,7 +1485,9 @@ void CodeGeneratorARM64::InvokeRuntime(QuickEntrypointEnum entrypoint, SlowPathCode* slow_path) { ValidateInvokeRuntime(instruction, slow_path); GenerateInvokeRuntime(GetThreadOffset<kArm64PointerSize>(entrypoint).Int32Value()); - RecordPcInfo(instruction, dex_pc, slow_path); + if (EntrypointRequiresStackMap(entrypoint)) { + RecordPcInfo(instruction, dex_pc, slow_path); + } } void CodeGeneratorARM64::InvokeRuntimeWithoutRecordingPcInfo(int32_t entry_point_offset, diff --git a/runtime/Android.bp b/runtime/Android.bp index 012256e5fa..dce74a035a 100644 --- a/runtime/Android.bp +++ b/runtime/Android.bp @@ -220,6 +220,7 @@ cc_defaults { "entrypoints/quick/quick_cast_entrypoints.cc", "entrypoints/quick/quick_deoptimization_entrypoints.cc", "entrypoints/quick/quick_dexcache_entrypoints.cc", + "entrypoints/quick/quick_entrypoints_enum.cc", "entrypoints/quick/quick_field_entrypoints.cc", "entrypoints/quick/quick_fillarray_entrypoints.cc", "entrypoints/quick/quick_instrumentation_entrypoints.cc", diff --git a/runtime/entrypoints/quick/quick_entrypoints_enum.cc b/runtime/entrypoints/quick/quick_entrypoints_enum.cc new file mode 100644 index 0000000000..5153f0f48e --- /dev/null +++ b/runtime/entrypoints/quick/quick_entrypoints_enum.cc @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2016 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. + */ + +#include "quick_entrypoints_enum.h" + +namespace art { + +bool EntrypointRequiresStackMap(QuickEntrypointEnum trampoline) { + // Entrypoints that do not require a stackmap. In general leaf methods + // outside of the VM that are not safepoints. + switch (trampoline) { + // Listed in the same order as in quick_entrypoints_list.h. + case kQuickCmpgDouble: + case kQuickCmpgFloat: + case kQuickCmplDouble: + case kQuickCmplFloat: + case kQuickCos: + case kQuickSin: + case kQuickAcos: + case kQuickAsin: + case kQuickAtan: + case kQuickAtan2: + case kQuickCbrt: + case kQuickCosh: + case kQuickExp: + case kQuickExpm1: + case kQuickHypot: + case kQuickLog: + case kQuickLog10: + case kQuickNextAfter: + case kQuickSinh: + case kQuickTan: + case kQuickTanh: + case kQuickFmod: + case kQuickL2d: + case kQuickFmodf: + case kQuickL2f: + case kQuickD2iz: + case kQuickF2iz: + case kQuickIdivmod: + case kQuickD2l: + case kQuickF2l: + case kQuickLdiv: + case kQuickLmod: + case kQuickLmul: + case kQuickShlLong: + case kQuickShrLong: + case kQuickUshrLong: + return false; + + default: + return true; + } +} + +} // namespace art diff --git a/runtime/entrypoints/quick/quick_entrypoints_enum.h b/runtime/entrypoints/quick/quick_entrypoints_enum.h index 8de1137feb..7674873731 100644 --- a/runtime/entrypoints/quick/quick_entrypoints_enum.h +++ b/runtime/entrypoints/quick/quick_entrypoints_enum.h @@ -62,6 +62,8 @@ template <> inline void CheckEntrypointTypes<kQuick ## name, __VA_ARGS__>() {}; #undef QUICK_ENTRYPOINT_LIST #undef ENTRYPOINT_ENUM +bool EntrypointRequiresStackMap(QuickEntrypointEnum trampoline); + } // namespace art #endif // ART_RUNTIME_ENTRYPOINTS_QUICK_QUICK_ENTRYPOINTS_ENUM_H_ |