16447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea/* 26447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * Copyright (C) 2013 The Android Open Source Project 36447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * 46447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * Licensed under the Apache License, Version 2.0 (the "License"); 56447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * you may not use this file except in compliance with the License. 66447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * You may obtain a copy of the License at 76447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * 86447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * http://www.apache.org/licenses/LICENSE-2.0 96447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * 106447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * Unless required by applicable law or agreed to in writing, software 116447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * distributed under the License is distributed on an "AS IS" BASIS, 126447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * See the License for the specific language governing permissions and 146447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea * limitations under the License. 156447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea */ 166447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea 176447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea#ifndef ART_COMPILER_SEA_IR_TYPES_TYPES_H_ 186447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea#define ART_COMPILER_SEA_IR_TYPES_TYPES_H_ 196447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea 206547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea#include "safe_map.h" 216447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea#include "verifier/reg_type.h" 226447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea#include "verifier/reg_type_cache.h" 236447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea 246447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirleanamespace sea_ir { 256447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea 266447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea// TODO: Replace typedef with an actual class implementation when we have more types. 276447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirleatypedef art::verifier::RegType Type; 286447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea 296547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea// Stores information about the result type of each instruction. 306547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea// Note: Main purpose is to encapsulate the map<instruction id, type*>, 316547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea// so that we can replace the underlying storage at any time. 326547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirleaclass TypeData { 336547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea public: 346547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea art::SafeMap<int, const Type*>* GetTypeMap() { 356547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea return &type_map_; 366547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea } 376547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea // Returns the type associated with instruction with @instruction_id. 386547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea const Type* FindTypeOf(int instruction_id) { 396547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea art::SafeMap<int, const Type*>::const_iterator result_it = type_map_.find(instruction_id); 406547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea if (type_map_.end() != result_it) { 416547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea return result_it->second; 426547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea } 436547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea return NULL; 446547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea } 456547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea 466547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea // Saves the fact that instruction @instruction_id produces a value of type @type. 476547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea void SetTypeOf(int instruction_id, const Type* type) { 486547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea type_map_.Overwrite(instruction_id, type); 496547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea } 506547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea 516547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea private: 526547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea art::SafeMap<int, const Type*> type_map_; 536547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea}; 546547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea 556547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea 566547fa9749d0e32cc367d64f8cc6b3d65bf43a5dDragos Sbirlea 576447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea} // namespace sea_ir 586447919b5ee8d34c4767f908c7cd7223c224544cDragos Sbirlea#endif // ART_COMPILER_SEA_IR_TYPES_TYPES_H_ 59