runtime_support_builder.h revision d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0fa
1d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa/*
2d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa * Copyright (C) 2012 The Android Open Source Project
3d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa *
4d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa * Licensed under the Apache License, Version 2.0 (the "License");
5d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa * you may not use this file except in compliance with the License.
6d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa * You may obtain a copy of the License at
7d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa *
8d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa *      http://www.apache.org/licenses/LICENSE-2.0
9d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa *
10d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa * Unless required by applicable law or agreed to in writing, software
11d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa * distributed under the License is distributed on an "AS IS" BASIS,
12d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa * See the License for the specific language governing permissions and
14d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa * limitations under the License.
15d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa */
16d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
17d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa#ifndef ART_SRC_COMPILER_LLVM_RUNTIME_SUPPORT_BUILDER_H_
18d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa#define ART_SRC_COMPILER_LLVM_RUNTIME_SUPPORT_BUILDER_H_
19d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
20d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa#include "logging.h"
21d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa#include "runtime_support_func.h"
22d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
23d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYanamespace llvm {
24d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  class LLVMContext;
25d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  class Module;
26d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  class Function;
27d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa}
28d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
29d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYanamespace art {
30d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYanamespace compiler_llvm {
31d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
32d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYaclass IRBuilder;
33d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
34d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
35d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYaclass RuntimeSupportBuilder {
36d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa public:
37d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  RuntimeSupportBuilder(llvm::LLVMContext& context, llvm::Module& module, IRBuilder& irb);
38d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
39d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  llvm::Function* GetRuntimeSupportFunction(runtime_support::RuntimeId id) {
40d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa    if (id >= 0 && id < runtime_support::MAX_ID) {
41d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa      return runtime_support_func_decls_[id];
42d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa    } else {
43d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa      LOG(ERROR) << "Unknown runtime function id: " << id;
44d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa      return NULL;
45d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa    }
46d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  }
47d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
48d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  void OptimizeRuntimeSupport();
49d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
50d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  virtual ~RuntimeSupportBuilder() {}
51d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
52d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa protected:
53d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  // Mark a function as inline function.
54d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  // You should implement the function, if mark as inline.
55d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  void MakeFunctionInline(llvm::Function* function);
56d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
57d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  void OverrideRuntimeSupportFunction(runtime_support::RuntimeId id, llvm::Function* function);
58d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
59d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa private:
60d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  // Target can override this function to make some runtime support more efficient.
61d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  virtual void TargetOptimizeRuntimeSupport() {}
62d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
63d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
64d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa protected:
65d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  llvm::LLVMContext& context_;
66d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  llvm::Module& module_;
67d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  IRBuilder& irb_;
68d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
69d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa private:
70d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  llvm::Function* runtime_support_func_decls_[runtime_support::MAX_ID];
71d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  bool target_runtime_support_func_[runtime_support::MAX_ID];
72d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa};
73d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
74d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
75d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa} // namespace compiler_llvm
76d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa} // namespace art
77d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
78d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa#endif // ART_SRC_COMPILER_LLVM_RUNTIME_SUPPORT_BUILDER_H_
79