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
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_COMPILER_LLVM_RUNTIME_SUPPORT_BUILDER_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_COMPILER_LLVM_RUNTIME_SUPPORT_BUILDER_H_
19d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
20de479be99328d2113bf483e082c9ecf235a34d69TDYa#include "backend_types.h"
2107ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h"
2251c2467e8771b56e25ae4f17f66522f979f57a7eBrian Carlstrom#include "runtime_support_llvm_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 {
354c1c283a7410784e9cab309f868248690b788a9cIan Rogersnamespace llvm {
36d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
37d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYaclass IRBuilder;
38d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
39d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
40d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYaclass RuntimeSupportBuilder {
41d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa public:
424c1c283a7410784e9cab309f868248690b788a9cIan Rogers  RuntimeSupportBuilder(::llvm::LLVMContext& context, ::llvm::Module& module, IRBuilder& irb);
43d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
44de479be99328d2113bf483e082c9ecf235a34d69TDYa  /* Thread */
454c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual ::llvm::Value* EmitGetCurrentThread();
464c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual ::llvm::Value* EmitLoadFromThreadOffset(int64_t offset, ::llvm::Type* type,
47de479be99328d2113bf483e082c9ecf235a34d69TDYa                                                TBAASpecialType s_ty);
484c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual void EmitStoreToThreadOffset(int64_t offset, ::llvm::Value* value,
49de479be99328d2113bf483e082c9ecf235a34d69TDYa                                       TBAASpecialType s_ty);
504c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual ::llvm::Value* EmitSetCurrentThread(::llvm::Value* thread);
51de479be99328d2113bf483e082c9ecf235a34d69TDYa
52de479be99328d2113bf483e082c9ecf235a34d69TDYa  /* ShadowFrame */
534c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual ::llvm::Value* EmitPushShadowFrame(::llvm::Value* new_shadow_frame,
544c1c283a7410784e9cab309f868248690b788a9cIan Rogers                                           ::llvm::Value* method, uint32_t num_vregs);
554c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual ::llvm::Value* EmitPushShadowFrameNoInline(::llvm::Value* new_shadow_frame,
564c1c283a7410784e9cab309f868248690b788a9cIan Rogers                                                   ::llvm::Value* method, uint32_t num_vregs);
574c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual void EmitPopShadowFrame(::llvm::Value* old_shadow_frame);
58de479be99328d2113bf483e082c9ecf235a34d69TDYa
59823433dbf4afec17169d5ca738031af5b374e140TDYa  /* Exception */
604c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual ::llvm::Value* EmitGetAndClearException();
614c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual ::llvm::Value* EmitIsExceptionPending();
62823433dbf4afec17169d5ca738031af5b374e140TDYa
63823433dbf4afec17169d5ca738031af5b374e140TDYa  /* Suspend */
64de479be99328d2113bf483e082c9ecf235a34d69TDYa  virtual void EmitTestSuspend();
65de479be99328d2113bf483e082c9ecf235a34d69TDYa
66b08ed1255fc34b9f34bcea66cd5e0a292af3d698TDYa  /* Monitor */
67d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers  void EmitLockObject(::llvm::Value* object);
68d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers  void EmitUnlockObject(::llvm::Value* object);
69b08ed1255fc34b9f34bcea66cd5e0a292af3d698TDYa
709a129457c233b653c7a8f65c963509267252b0a7TDYa  /* MarkGCCard */
714c1c283a7410784e9cab309f868248690b788a9cIan Rogers  virtual void EmitMarkGCCard(::llvm::Value* value, ::llvm::Value* target_addr);
729a129457c233b653c7a8f65c963509267252b0a7TDYa
734c1c283a7410784e9cab309f868248690b788a9cIan Rogers  ::llvm::Function* GetRuntimeSupportFunction(runtime_support::RuntimeId id) {
74d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa    if (id >= 0 && id < runtime_support::MAX_ID) {
75d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa      return runtime_support_func_decls_[id];
76d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa    } else {
77d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa      LOG(ERROR) << "Unknown runtime function id: " << id;
78d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa      return NULL;
79d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa    }
80d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  }
81d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
82d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  virtual ~RuntimeSupportBuilder() {}
83d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
84d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa protected:
854c1c283a7410784e9cab309f868248690b788a9cIan Rogers  ::llvm::LLVMContext& context_;
864c1c283a7410784e9cab309f868248690b788a9cIan Rogers  ::llvm::Module& module_;
87d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  IRBuilder& irb_;
88d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
89d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa private:
904c1c283a7410784e9cab309f868248690b788a9cIan Rogers  ::llvm::Function* runtime_support_func_decls_[runtime_support::MAX_ID];
91d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa  bool target_runtime_support_func_[runtime_support::MAX_ID];
92d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa};
93d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
94d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
957934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom}  // namespace llvm
967934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom}  // namespace art
97d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa
98fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_COMPILER_LLVM_RUNTIME_SUPPORT_BUILDER_H_
99