96 lines
2.8 KiB
C++
96 lines
2.8 KiB
C++
//===- Pass.h ---------------------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_SANDBOXIR_PASS_H
|
|
#define LLVM_SANDBOXIR_PASS_H
|
|
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
namespace llvm {
|
|
|
|
class AAResults;
|
|
class ScalarEvolution;
|
|
class TargetTransformInfo;
|
|
|
|
namespace sandboxir {
|
|
|
|
class Function;
|
|
class Region;
|
|
|
|
class Analyses {
|
|
AAResults *AA = nullptr;
|
|
ScalarEvolution *SE = nullptr;
|
|
TargetTransformInfo *TTI = nullptr;
|
|
|
|
Analyses() = default;
|
|
|
|
public:
|
|
Analyses(AAResults &AA, ScalarEvolution &SE, TargetTransformInfo &TTI)
|
|
: AA(&AA), SE(&SE), TTI(&TTI) {}
|
|
|
|
public:
|
|
AAResults &getAA() const { return *AA; }
|
|
ScalarEvolution &getScalarEvolution() const { return *SE; }
|
|
TargetTransformInfo &getTTI() const { return *TTI; }
|
|
/// For use by unit tests.
|
|
static Analyses emptyForTesting() { return Analyses(); }
|
|
};
|
|
|
|
/// The base class of a Sandbox IR Pass.
|
|
class Pass {
|
|
protected:
|
|
/// The pass name. This is also used as a command-line flag and should not
|
|
/// contain whitespaces.
|
|
const std::string Name;
|
|
|
|
public:
|
|
/// \p Name can't contain any spaces or start with '-'.
|
|
Pass(StringRef Name) : Name(Name) {
|
|
assert(!Name.contains(' ') &&
|
|
"A pass name should not contain whitespaces!");
|
|
assert(!Name.starts_with('-') && "A pass name should not start with '-'!");
|
|
}
|
|
virtual ~Pass() = default;
|
|
/// \Returns the name of the pass.
|
|
StringRef getName() const { return Name; }
|
|
#ifndef NDEBUG
|
|
friend raw_ostream &operator<<(raw_ostream &OS, const Pass &Pass) {
|
|
Pass.print(OS);
|
|
return OS;
|
|
}
|
|
virtual void print(raw_ostream &OS) const { OS << Name; }
|
|
LLVM_ABI_FOR_TEST LLVM_DUMP_METHOD virtual void dump() const;
|
|
#endif
|
|
/// Similar to print() but adds a newline. Used for testing.
|
|
virtual void printPipeline(raw_ostream &OS) const { OS << Name << "\n"; }
|
|
};
|
|
|
|
/// A pass that runs on a sandbox::Function.
|
|
class FunctionPass : public Pass {
|
|
public:
|
|
/// \p Name can't contain any spaces or start with '-'.
|
|
FunctionPass(StringRef Name) : Pass(Name) {}
|
|
/// \Returns true if it modifies \p F.
|
|
virtual bool runOnFunction(Function &F, const Analyses &A) = 0;
|
|
};
|
|
|
|
/// A pass that runs on a sandbox::Region.
|
|
class RegionPass : public Pass {
|
|
public:
|
|
/// \p Name can't contain any spaces or start with '-'.
|
|
RegionPass(StringRef Name) : Pass(Name) {}
|
|
/// \Returns true if it modifies \p R.
|
|
virtual bool runOnRegion(Region &R, const Analyses &A) = 0;
|
|
};
|
|
|
|
} // namespace sandboxir
|
|
} // namespace llvm
|
|
|
|
#endif // LLVM_SANDBOXIR_PASS_H
|