1 /* 2 * Copyright (C) 2014 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_DEX_PASS_H_ 18 #define ART_COMPILER_DEX_PASS_H_ 19 20 #include <string> 21 22 #include "base/logging.h" 23 24 namespace art { 25 26 // Forward declarations. 27 class BasicBlock; 28 class Pass; 29 30 // Empty Pass Data Class, can be extended by any pass extending the base Pass class. 31 class PassDataHolder { 32 }; 33 34 /** 35 * @class Pass 36 * @brief Base Pass class, can be extended to perform a more defined way of doing the work call. 37 */ 38 class Pass { 39 public: Pass(const char * name)40 explicit Pass(const char* name) 41 : pass_name_(name) { 42 } 43 ~Pass()44 virtual ~Pass() { 45 } 46 GetName()47 virtual const char* GetName() const { 48 return pass_name_; 49 } 50 51 /** 52 * @brief Gate for the pass: determines whether to execute the pass or not considering a CompilationUnit 53 * @param data the PassDataHolder. 54 * @return whether or not to execute the pass. 55 */ Gate(const PassDataHolder * data)56 virtual bool Gate(const PassDataHolder* data) const { 57 // Unused parameter. 58 UNUSED(data); 59 60 // Base class says yes. 61 return true; 62 } 63 64 /** 65 * @brief Start of the pass: called before the Worker function. 66 */ Start(PassDataHolder * data)67 virtual void Start(PassDataHolder* data) const { 68 // Unused parameter. 69 UNUSED(data); 70 } 71 72 /** 73 * @brief End of the pass: called after the WalkBasicBlocks function. 74 */ End(PassDataHolder * data)75 virtual void End(PassDataHolder* data) const { 76 // Unused parameter. 77 UNUSED(data); 78 } 79 80 /** 81 * @param data the object containing data necessary for the pass. 82 * @return whether or not there is a change when walking the BasicBlock 83 */ Worker(PassDataHolder * data ATTRIBUTE_UNUSED)84 virtual bool Worker(PassDataHolder* data ATTRIBUTE_UNUSED) const { 85 // Passes that do all their work in Start() or End() should not allow useless node iteration. 86 LOG(FATAL) << "Unsupported default Worker() used for " << GetName(); 87 UNREACHABLE(); 88 } 89 90 protected: 91 /** @brief The pass name: used for searching for a pass when running a particular pass or debugging. */ 92 const char* const pass_name_; 93 94 private: 95 // In order to make the all passes not copy-friendly. 96 DISALLOW_COPY_AND_ASSIGN(Pass); 97 }; 98 } // namespace art 99 #endif // ART_COMPILER_DEX_PASS_H_ 100