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