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