pass.h revision 6a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866f
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 "compiler_ir.h" 236a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers#include "base/logging.h" 246a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers 254e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beylernamespace art { 264e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 2744e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beyler// Forward declarations. 286a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersclass BasicBlock; 2944e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beylerstruct CompilationUnit; 3044e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beylerclass Pass; 3144e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beyler 324f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott// Empty Pass Data Class, can be extended by any pass extending the base Pass class. 334f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottclass PassDataHolder { 344e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler}; 354e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 364e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler/** 374e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * @class Pass 384f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief Base Pass class, can be extended to perform a more defined way of doing the work call. 394e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 404e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beylerclass Pass { 414e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler public: 424f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott explicit Pass(const char* name) 434f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott : pass_name_(name) { 444e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 454e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 4675ba13f244098f42584637b8fd3f6d74d2fc291aVladimir Marko virtual ~Pass() { 474e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 484e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 494e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler virtual const char* GetName() const { 504e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler return pass_name_; 514e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 524e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 534e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 544e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * @brief Gate for the pass: determines whether to execute the pass or not considering a CompilationUnit 554f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @param data the PassDataHolder. 564f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @return whether or not to execute the pass. 574e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 584f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott virtual bool Gate(const PassDataHolder* data) const { 594e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Unused parameter. 604f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 614e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 624e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Base class says yes. 634e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler return true; 644e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 654e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 664e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 674f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief Start of the pass: called before the Worker function. 684e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 69e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler virtual void Start(PassDataHolder* data) const { 704e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Unused parameter. 714f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 724e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 734e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 744e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 754f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief End of the pass: called after the WalkBasicBlocks function. 764e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 77e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler virtual void End(PassDataHolder* data) const { 784e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // Unused parameter. 794f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott UNUSED(data); 804e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 814e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 824e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** 834f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @param data the object containing data necessary for the pass. 844e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler * @return whether or not there is a change when walking the BasicBlock 854e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler */ 866a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers virtual bool Worker(PassDataHolder* data ATTRIBUTE_UNUSED) const { 87aa7b8a329561c6e1f05938ddc5e9c4be795cd8a5Vladimir Marko // Passes that do all their work in Start() or End() should not allow useless node iteration. 886a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers LOG(FATAL) << "Unsupported default Worker() used for " << GetName(); 896a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers UNREACHABLE(); 904e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler } 914e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 928bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler static void BasePrintMessage(CompilationUnit* c_unit, const char* pass_name, const char* message, ...) { 938bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler // Check if we want to log something or not. 948bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler if (c_unit->print_pass) { 958bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler // Stringify the message. 968bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler va_list args; 978bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler va_start(args, message); 988bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler std::string stringified_message; 998bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler StringAppendV(&stringified_message, message, args); 1008bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler va_end(args); 1018bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler 1028bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler // Log the message and ensure to include pass name. 1038bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler LOG(INFO) << pass_name << ": " << stringified_message; 1048bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler } 1058bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler } 1068bceccec7eddff8cd872aa20505b4a3a6be60a16Jean Christophe Beyler 1074e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler protected: 1084e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler /** @brief The pass name: used for searching for a pass when running a particular pass or debugging. */ 1094e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler const char* const pass_name_; 1104e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler 1114e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler private: 1124e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler // In order to make the all passes not copy-friendly. 1134e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler DISALLOW_COPY_AND_ASSIGN(Pass); 1144e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler}; 1154e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler} // namespace art 1164e97c539408f47145526f0062c1c06df99146a73Jean Christophe Beyler#endif // ART_COMPILER_DEX_PASS_H_ 117