summaryrefslogtreecommitdiff
path: root/dex2oat/driver/compiled_method.cc
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2022-09-30 16:18:02 +0200
committer VladimĂ­r Marko <vmarko@google.com> 2022-10-10 08:23:48 +0000
commitd5a43192e44935605aa9abba6beb31760ef57da0 (patch)
treedab5be3c5a9f93c3197e7d759f8b0970a404f0db /dex2oat/driver/compiled_method.cc
parent81f1cc9ed5ee68ba3bf5163b78151d09ec560e77 (diff)
ART: Move `CompiledMethod{,-Storage}` to dex2oat/.
Introduce a `CompiledCodeStorage` interface for callbacks to `dex2oat` for storing code produced by `libart-compiler`. Using this new interface, move `CompiledMethodStorage` (this is a misnomer as it's also storing non-method thunk code), `CompiledMethod` and `SwapSpace` to dex2oat/. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing --jit Test: run-gtests.sh Test: testrunner.py --target --optimizing Change-Id: Icb7ffc134d00e53c25bd665d044dd1c98bd49a64
Diffstat (limited to 'dex2oat/driver/compiled_method.cc')
-rw-r--r--dex2oat/driver/compiled_method.cc105
1 files changed, 105 insertions, 0 deletions
diff --git a/dex2oat/driver/compiled_method.cc b/dex2oat/driver/compiled_method.cc
new file mode 100644
index 0000000000..0a0a0057d4
--- /dev/null
+++ b/dex2oat/driver/compiled_method.cc
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2011 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 "compiled_method.h"
+
+#include "driver/compiled_method_storage.h"
+#include "utils/swap_space.h"
+
+namespace art {
+
+CompiledCode::CompiledCode(CompiledMethodStorage* storage,
+ InstructionSet instruction_set,
+ const ArrayRef<const uint8_t>& quick_code)
+ : storage_(storage),
+ quick_code_(storage->DeduplicateCode(quick_code)),
+ packed_fields_(InstructionSetField::Encode(instruction_set)) {
+}
+
+CompiledCode::~CompiledCode() {
+ GetStorage()->ReleaseCode(quick_code_);
+}
+
+bool CompiledCode::operator==(const CompiledCode& rhs) const {
+ if (quick_code_ != nullptr) {
+ if (rhs.quick_code_ == nullptr) {
+ return false;
+ } else if (quick_code_->size() != rhs.quick_code_->size()) {
+ return false;
+ } else {
+ return std::equal(quick_code_->begin(), quick_code_->end(), rhs.quick_code_->begin());
+ }
+ }
+ return (rhs.quick_code_ == nullptr);
+}
+
+size_t CompiledCode::AlignCode(size_t offset) const {
+ return AlignCode(offset, GetInstructionSet());
+}
+
+size_t CompiledCode::AlignCode(size_t offset, InstructionSet instruction_set) {
+ return RoundUp(offset, GetInstructionSetCodeAlignment(instruction_set));
+}
+
+size_t CompiledCode::GetEntryPointAdjustment() const {
+ return GetInstructionSetEntryPointAdjustment(GetInstructionSet());
+}
+
+CompiledMethod::CompiledMethod(CompiledMethodStorage* storage,
+ InstructionSet instruction_set,
+ const ArrayRef<const uint8_t>& quick_code,
+ const ArrayRef<const uint8_t>& vmap_table,
+ const ArrayRef<const uint8_t>& cfi_info,
+ const ArrayRef<const linker::LinkerPatch>& patches)
+ : CompiledCode(storage, instruction_set, quick_code),
+ vmap_table_(storage->DeduplicateVMapTable(vmap_table)),
+ cfi_info_(storage->DeduplicateCFIInfo(cfi_info)),
+ patches_(storage->DeduplicateLinkerPatches(patches)) {
+}
+
+CompiledMethod* CompiledMethod::SwapAllocCompiledMethod(
+ CompiledMethodStorage* storage,
+ InstructionSet instruction_set,
+ const ArrayRef<const uint8_t>& quick_code,
+ const ArrayRef<const uint8_t>& vmap_table,
+ const ArrayRef<const uint8_t>& cfi_info,
+ const ArrayRef<const linker::LinkerPatch>& patches) {
+ SwapAllocator<CompiledMethod> alloc(storage->GetSwapSpaceAllocator());
+ CompiledMethod* ret = alloc.allocate(1);
+ alloc.construct(ret,
+ storage,
+ instruction_set,
+ quick_code,
+ vmap_table,
+ cfi_info, patches);
+ return ret;
+}
+
+void CompiledMethod::ReleaseSwapAllocatedCompiledMethod(CompiledMethodStorage* storage,
+ CompiledMethod* m) {
+ SwapAllocator<CompiledMethod> alloc(storage->GetSwapSpaceAllocator());
+ alloc.destroy(m);
+ alloc.deallocate(m, 1);
+}
+
+CompiledMethod::~CompiledMethod() {
+ CompiledMethodStorage* storage = GetStorage();
+ storage->ReleaseLinkerPatches(patches_);
+ storage->ReleaseCFIInfo(cfi_info_);
+ storage->ReleaseVMapTable(vmap_table_);
+}
+
+} // namespace art