runtime_support_builder.h revision de479be99328d2113bf483e082c9ecf235a34d69
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 63d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa llvm::Function* GetRuntimeSupportFunction(runtime_support::RuntimeId id) { 64d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa if (id >= 0 && id < runtime_support::MAX_ID) { 65d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa return runtime_support_func_decls_[id]; 66d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa } else { 67d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa LOG(ERROR) << "Unknown runtime function id: " << id; 68d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa return NULL; 69d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa } 70d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa } 71d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 72d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa void OptimizeRuntimeSupport(); 73d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 74d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa virtual ~RuntimeSupportBuilder() {} 75d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 76d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa protected: 77d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa // Mark a function as inline function. 78d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa // You should implement the function, if mark as inline. 79d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa void MakeFunctionInline(llvm::Function* function); 80d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 81d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa void OverrideRuntimeSupportFunction(runtime_support::RuntimeId id, llvm::Function* function); 82d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 83d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 84d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa protected: 85d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa llvm::LLVMContext& context_; 86d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa llvm::Module& module_; 87d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa IRBuilder& irb_; 88d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 89d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa private: 90d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa llvm::Function* runtime_support_func_decls_[runtime_support::MAX_ID]; 91d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa bool target_runtime_support_func_[runtime_support::MAX_ID]; 92d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa}; 93d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 94d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 95d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa} // namespace compiler_llvm 96d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa} // namespace art 97d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa 98d668a06b5dcc3b0f7f788da4d756cd4ee6f1d0faTDYa#endif // ART_SRC_COMPILER_LLVM_RUNTIME_SUPPORT_BUILDER_H_ 99