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