1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ART_COMPILER_SEA_IR_TYPES_TYPE_INFERENCE_VISITOR_H_ 18 #define ART_COMPILER_SEA_IR_TYPES_TYPE_INFERENCE_VISITOR_H_ 19 20 21 #include "dex_file-inl.h" 22 #include "sea_ir/ir/visitor.h" 23 #include "sea_ir/types/types.h" 24 25 namespace sea_ir { 26 27 // The TypeInferenceVisitor visits each instruction and computes its type taking into account 28 // the current type of the operands. The type is stored in the visitor. 29 // We may be better off by using a separate visitor type hierarchy that has return values 30 // or that passes data as parameters, than to use fields to store information that should 31 // in fact be returned after visiting each element. Ideally, I would prefer to use templates 32 // to specify the returned value type, but I am not aware of a possible implementation 33 // that does not horribly duplicate the visitor infrastructure code (version 1: no return value, 34 // version 2: with template return value). 35 class TypeInferenceVisitor: public IRVisitor { 36 public: TypeInferenceVisitor(SeaGraph * graph,TypeData * type_data,art::verifier::RegTypeCache * types)37 TypeInferenceVisitor(SeaGraph* graph, TypeData* type_data, 38 art::verifier::RegTypeCache* types): 39 graph_(graph), type_data_(type_data), type_cache_(types), crt_type_() { 40 } 41 // There are no type related actions to be performed on these classes. Initialize(SeaGraph * graph)42 void Initialize(SeaGraph* graph) { } 43 void Visit(SeaGraph* graph); Visit(Region * region)44 void Visit(Region* region) { } 45 46 void Visit(PhiInstructionNode* instruction); 47 void Visit(SignatureNode* parameter); Visit(InstructionNode * instruction)48 void Visit(InstructionNode* instruction) { } 49 void Visit(UnnamedConstInstructionNode* instruction); Visit(ConstInstructionNode * instruction)50 void Visit(ConstInstructionNode* instruction) { } Visit(ReturnInstructionNode * instruction)51 void Visit(ReturnInstructionNode* instruction) { } Visit(IfNeInstructionNode * instruction)52 void Visit(IfNeInstructionNode* instruction) { } 53 void Visit(MoveResultInstructionNode* instruction); 54 void Visit(InvokeStaticInstructionNode* instruction); 55 void Visit(AddIntInstructionNode* instruction); Visit(GotoInstructionNode * instruction)56 void Visit(GotoInstructionNode* instruction) { } Visit(IfEqzInstructionNode * instruction)57 void Visit(IfEqzInstructionNode* instruction) { } 58 59 const Type* MergeTypes(std::vector<const Type*>& types) const; 60 const Type* MergeTypes(const Type* t1, const Type* t2) const; 61 std::vector<const Type*> GetOperandTypes(InstructionNode* instruction) const; GetType()62 const Type* GetType() { 63 // TODO: Currently multiple defined types are not supported. 64 if (!crt_type_.empty()) { 65 const Type* single_type = crt_type_.at(0); 66 crt_type_.clear(); 67 return single_type; 68 } 69 return NULL; 70 } 71 72 protected: 73 const SeaGraph* const graph_; 74 TypeData* type_data_; 75 art::verifier::RegTypeCache* type_cache_; 76 std::vector<const Type*> crt_type_; // Stored temporarily between two calls to Visit. 77 }; 78 79 } // namespace sea_ir 80 81 #endif // ART_COMPILER_SEA_IR_TYPES_TYPE_INFERENCE_VISITOR_H_ 82