runtime_support_builder.h revision b08ed1255fc34b9f34bcea66cd5e0a292af3d698
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
20de479be99328d2113bf483e082c9ecf235a34d69TDYa#include "backend_types.h"
21d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa#include "logging.h"
22d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa#include "runtime_support_func.h"
23d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
24de479be99328d2113bf483e082c9ecf235a34d69TDYa#include <stdint.h>
25de479be99328d2113bf483e082c9ecf235a34d69TDYa
26d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYanamespace llvm {
27d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  class LLVMContext;
28d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  class Module;
29d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  class Function;
30de479be99328d2113bf483e082c9ecf235a34d69TDYa  class Type;
31de479be99328d2113bf483e082c9ecf235a34d69TDYa  class Value;
32d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa}
33d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
34d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYanamespace art {
35d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYanamespace compiler_llvm {
36d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
37d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYaclass IRBuilder;
38d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
39d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
40d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYaclass RuntimeSupportBuilder {
41d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa public:
42d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  RuntimeSupportBuilder(llvm::LLVMContext& context, llvm::Module& module, IRBuilder& irb);
43d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
44de479be99328d2113bf483e082c9ecf235a34d69TDYa  /* Thread */
45de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual llvm::Value* EmitGetCurrentThread();
46de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual llvm::Value* EmitLoadFromThreadOffset(int64_t offset, llvm::Type* type,
47de479be99328d2113bf483e082c9ecf235a34d69TDYa                                                TBAASpecialType s_ty);
48de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual void EmitStoreToThreadOffset(int64_t offset, llvm::Value* value,
49de479be99328d2113bf483e082c9ecf235a34d69TDYa                                       TBAASpecialType s_ty);
50de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual void EmitSetCurrentThread(llvm::Value* thread);
51de479be99328d2113bf483e082c9ecf235a34d69TDYa
52de479be99328d2113bf483e082c9ecf235a34d69TDYa  /* ShadowFrame */
53de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual llvm::Value* EmitPushShadowFrame(llvm::Value* new_shadow_frame,
54de479be99328d2113bf483e082c9ecf235a34d69TDYa                                       llvm::Value* method, uint32_t size);
55de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual llvm::Value* EmitPushShadowFrameNoInline(llvm::Value* new_shadow_frame,
56de479be99328d2113bf483e082c9ecf235a34d69TDYa                                               llvm::Value* method, uint32_t size);
57de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual void EmitPopShadowFrame(llvm::Value* old_shadow_frame);
58de479be99328d2113bf483e082c9ecf235a34d69TDYa
59de479be99328d2113bf483e082c9ecf235a34d69TDYa  /* Check */
60de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual llvm::Value* EmitIsExceptionPending();
61de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual void EmitTestSuspend();
62de479be99328d2113bf483e082c9ecf235a34d69TDYa
63b08ed1255fc34b9f34bcea66cd5e0a292af3d698TDYa  /* Monitor */
64b08ed1255fc34b9f34bcea66cd5e0a292af3d698TDYa  virtual void EmitLockObject(llvm::Value* object);
65b08ed1255fc34b9f34bcea66cd5e0a292af3d698TDYa  virtual void EmitUnlockObject(llvm::Value* object);
66b08ed1255fc34b9f34bcea66cd5e0a292af3d698TDYa
67d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  llvm::Function* GetRuntimeSupportFunction(runtime_support::RuntimeId id) {
68d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa    if (id >= 0 && id < runtime_support::MAX_ID) {
69d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa      return runtime_support_func_decls_[id];
70d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa    } else {
71d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa      LOG(ERROR) << "Unknown runtime function id: " << id;
72d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa      return NULL;
73d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa    }
74d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  }
75d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
76d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  void OptimizeRuntimeSupport();
77d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
78d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  virtual ~RuntimeSupportBuilder() {}
79d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
80d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa protected:
81d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  // Mark a function as inline function.
82d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  // You should implement the function, if mark as inline.
83d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  void MakeFunctionInline(llvm::Function* function);
84d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
85d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  void OverrideRuntimeSupportFunction(runtime_support::RuntimeId id, llvm::Function* function);
86d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
87d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
88d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa protected:
89d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  llvm::LLVMContext& context_;
90d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  llvm::Module& module_;
91d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  IRBuilder& irb_;
92d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
93d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa private:
94d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  llvm::Function* runtime_support_func_decls_[runtime_support::MAX_ID];
95d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  bool target_runtime_support_func_[runtime_support::MAX_ID];
96d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa};
97d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
98d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
99d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa} // namespace compiler_llvm
100d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa} // namespace art
101d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
102d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa#endif // ART_SRC_COMPILER_LLVM_RUNTIME_SUPPORT_BUILDER_H_
103