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