pass.h revision 4f59668b3d51f63601ebe59dbd2b7e8a7c5bd093
14e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler/* 24e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * Copyright (C) 2014 The Android Open Source Project 34e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * 44e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * Licensed under the Apache License, Version 2.0 (the "License"); 54e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * you may not use this file except in compliance with the License. 64e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * You may obtain a copy of the License at 74e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * 84e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * http://www.apache.org/licenses/LICENSE-2.0 94e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * 104e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * Unless required by applicable law or agreed to in writing, software 114e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * distributed under the License is distributed on an "AS IS" BASIS, 124e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * See the License for the specific language governing permissions and 144e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * limitations under the License. 154e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 164e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 174e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler#ifndef ART_COMPILER_DEX_PASS_H_ 184e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler#define ART_COMPILER_DEX_PASS_H_ 194e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 204e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler#include <string> 214e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 224f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott#include "base/macros.h" 234e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beylernamespace art { 244e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 254f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott// Empty Pass Data Class, can be extended by any pass extending the base Pass class. 264f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottclass PassDataHolder { 274e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler}; 284e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 294e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler/** 304e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * @class Pass 314f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief Base Pass class, can be extended to perform a more defined way of doing the work call. 324e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 334e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beylerclass Pass { 344e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler public: 354f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott explicit Pass(const char* name) 364f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott : pass_name_(name) { 374e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 384e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 3975ba13f244098f42584637b8fd3f6d74d2fc291aVladimir Marko virtual ~Pass() { 404e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 414e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 424e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler virtual const char* GetName() const { 434e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler return pass_name_; 444e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 454e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 464e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 474e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * @brief Gate for the pass: determines whether to execute the pass or not considering a CompilationUnit 484f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @param data the PassDataHolder. 494f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @return whether or not to execute the pass. 504e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 514f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott virtual bool Gate(const PassDataHolder* data) const { 524e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Unused parameter. 534f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 544e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 554e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Base class says yes. 564e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler return true; 574e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 584e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 594e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 604f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief Start of the pass: called before the Worker function. 614e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 624f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott virtual void Start(const PassDataHolder* data) const { 634e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Unused parameter. 644f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 654e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 664e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 674e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 684f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief End of the pass: called after the WalkBasicBlocks function. 694e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 704f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott virtual void End(const PassDataHolder* data) const { 714e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Unused parameter. 724f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 734e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 744e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 754e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 764f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @param data the object containing data necessary for the pass. 774e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * @return whether or not there is a change when walking the BasicBlock 784e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 794f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott virtual bool Worker(const PassDataHolder* data) const { 804f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott // Unused parameter. 814f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 824e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 834e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // BasicBlock did not change. 844e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler return false; 854e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 864e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 874e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler protected: 884e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** @brief The pass name: used for searching for a pass when running a particular pass or debugging. */ 894e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler const char* const pass_name_; 904e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 914e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler private: 924e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // In order to make the all passes not copy-friendly. 934e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler DISALLOW_COPY_AND_ASSIGN(Pass); 944e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler}; 954e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler} // namespace art 964e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler#endif // ART_COMPILER_DEX_PASS_H_ 97