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 226a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers#include "base/logging.h" 236a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers 244e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beylernamespace art { 254e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 2644e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beyler// Forward declarations. 276a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersclass BasicBlock; 2844e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beylerclass Pass; 2944e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beyler 304f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott// Empty Pass Data Class, can be extended by any pass extending the base Pass class. 314f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottclass PassDataHolder { 324e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler}; 334e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 344e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler/** 354e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * @class Pass 364f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief Base Pass class, can be extended to perform a more defined way of doing the work call. 374e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 384e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beylerclass Pass { 394e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler public: 404f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott explicit Pass(const char* name) 414f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott : pass_name_(name) { 424e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 434e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 4475ba13f244098f42584637b8fd3f6d74d2fc291aVladimir Marko virtual ~Pass() { 454e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 464e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 474e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler virtual const char* GetName() const { 484e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler return pass_name_; 494e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 504e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 514e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 524e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * @brief Gate for the pass: determines whether to execute the pass or not considering a CompilationUnit 534f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @param data the PassDataHolder. 544f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @return whether or not to execute the pass. 554e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 564f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott virtual bool Gate(const PassDataHolder* data) const { 574e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Unused parameter. 584f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 594e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 604e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Base class says yes. 614e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler return true; 624e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 634e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 644e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 654f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief Start of the pass: called before the Worker function. 664e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 67e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler virtual void Start(PassDataHolder* data) const { 684e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Unused parameter. 694f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 704e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 714e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 724e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 734f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief End of the pass: called after the WalkBasicBlocks function. 744e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 75e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler virtual void End(PassDataHolder* data) const { 764e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Unused parameter. 774f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 784e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 794e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 804e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 814f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @param data the object containing data necessary for the pass. 824e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * @return whether or not there is a change when walking the BasicBlock 834e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 846a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers virtual bool Worker(PassDataHolder* data ATTRIBUTE_UNUSED) const { 85aa7b8a329561c6e1f05938ddc5e9c4be795cd8a5Vladimir Marko // Passes that do all their work in Start() or End() should not allow useless node iteration. 866a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers LOG(FATAL) << "Unsupported default Worker() used for " << GetName(); 876a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers UNREACHABLE(); 884e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 894e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 904e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler protected: 914e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** @brief The pass name: used for searching for a pass when running a particular pass or debugging. */ 924e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler const char* const pass_name_; 934e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 944e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler private: 954e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // In order to make the all passes not copy-friendly. 964e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler DISALLOW_COPY_AND_ASSIGN(Pass); 974e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler}; 984e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler} // namespace art 994e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler#endif // ART_COMPILER_DEX_PASS_H_ 100