summaryrefslogtreecommitdiff
path: root/compiler/optimizing/fast_compiler.h
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing/fast_compiler.h')
-rw-r--r--compiler/optimizing/fast_compiler.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/compiler/optimizing/fast_compiler.h b/compiler/optimizing/fast_compiler.h
new file mode 100644
index 0000000000..65d1380eb8
--- /dev/null
+++ b/compiler/optimizing/fast_compiler.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+
+#ifndef ART_COMPILER_OPTIMIZING_FAST_COMPILER_H_
+#define ART_COMPILER_OPTIMIZING_FAST_COMPILER_H_
+
+#include <memory>
+#include <vector>
+
+#include "arch/instruction_set.h"
+#include "base/array_ref.h"
+#include "base/macros.h"
+#include "base/scoped_arena_containers.h"
+#include "driver/compiler_options.h"
+#include "handle_scope.h"
+
+namespace art HIDDEN {
+
+class ArenaAllocator;
+class ArtMethod;
+class DexCompilationUnit;
+class VariableSizedHandleScope;
+
+namespace mirror {
+class Object;
+}
+
+/**
+ * A lightweight, one-pass compiler. Goes over each dex instruction and emits
+ * native code for it.
+ */
+class FastCompiler {
+ public:
+ static std::unique_ptr<FastCompiler> Compile(
+ ArtMethod* method,
+ [[maybe_unused]] ArenaAllocator* allocator,
+ [[maybe_unused]] ArenaStack* arena_stack,
+ [[maybe_unused]] VariableSizedHandleScope* handles,
+ [[maybe_unused]] const CompilerOptions& compiler_options,
+ [[maybe_unused]] const DexCompilationUnit& dex_compilation_unit) {
+ if (method == nullptr) {
+ return nullptr;
+ }
+ switch (compiler_options.GetInstructionSet()) {
+#ifdef ART_ENABLE_CODEGEN_arm64
+ case InstructionSet::kArm64:
+ return CompileARM64(method,
+ allocator,
+ arena_stack,
+ handles,
+ compiler_options,
+ dex_compilation_unit);
+#endif
+ default:
+ return nullptr;
+ }
+ }
+
+ virtual ArrayRef<const uint8_t> GetCode() const = 0;
+ virtual ScopedArenaVector<uint8_t> GetStackMaps() const = 0;
+ virtual ArrayRef<const uint8_t> GetCfiData() const = 0;
+ virtual int32_t GetFrameSize() const = 0;
+ virtual uint32_t GetNumberOfJitRoots() const = 0;
+ virtual void EmitJitRoots(uint8_t* code,
+ const uint8_t* roots_data,
+ /*out*/std::vector<Handle<mirror::Object>>* roots)
+ REQUIRES_SHARED(Locks::mutator_lock_) = 0;
+
+ virtual ~FastCompiler() = default;
+
+ private:
+#ifdef ART_ENABLE_CODEGEN_arm64
+ static std::unique_ptr<FastCompiler> CompileARM64(ArtMethod* method,
+ ArenaAllocator* allocator,
+ ArenaStack* arena_stack,
+ VariableSizedHandleScope* handles,
+ const CompilerOptions& compiler_options,
+ const DexCompilationUnit& dex_compilation_unit);
+#endif
+};
+
+} // namespace art
+
+#endif // ART_COMPILER_OPTIMIZING_FAST_COMPILER_H_