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