diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2013-11-09 13:09:08 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2013-11-09 13:09:08 +0000 |
commit | ea9988447c5bd59827baf1b45dd5b62b4065d553 (patch) | |
tree | 90d6e01f21110d8bdd2a1e8e017a81971922b73c /unittests | |
parent | 49837ef8111fbeace7ae6379ca733c8f8fa94cfe (diff) | |
download | external_llvm-ea9988447c5bd59827baf1b45dd5b62b4065d553.zip external_llvm-ea9988447c5bd59827baf1b45dd5b62b4065d553.tar.gz external_llvm-ea9988447c5bd59827baf1b45dd5b62b4065d553.tar.bz2 |
[PM] Start sketching out the new module and function pass manager.
This is still just a skeleton. I'm trying to pull together the
experimentation I've done into committable chunks, and this is the first
coherent one. Others will follow in hopefully short order that move this
more toward a useful initial implementation. I still expect the design
to continue evolving in small ways as I work through the different
requirements and features needed here though.
Keep in mind, all of this is off by default.
Currently, this mostly exercises the use of a polymorphic smart pointer
and templates to hide the polymorphism for the pass manager from the
pass implementation. The next step will be more significant, adding the
first framework of analysis support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194325 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests')
-rw-r--r-- | unittests/IR/CMakeLists.txt | 1 | ||||
-rw-r--r-- | unittests/IR/PassManagerTest.cpp | 88 |
2 files changed, 89 insertions, 0 deletions
diff --git a/unittests/IR/CMakeLists.txt b/unittests/IR/CMakeLists.txt index 1ab8e38..fd0831f 100644 --- a/unittests/IR/CMakeLists.txt +++ b/unittests/IR/CMakeLists.txt @@ -13,6 +13,7 @@ set(IRSources LegacyPassManagerTest.cpp MDBuilderTest.cpp MetadataTest.cpp + PassManagerTest.cpp PatternMatch.cpp TypeBuilderTest.cpp TypesTest.cpp diff --git a/unittests/IR/PassManagerTest.cpp b/unittests/IR/PassManagerTest.cpp new file mode 100644 index 0000000..f2e04d9 --- /dev/null +++ b/unittests/IR/PassManagerTest.cpp @@ -0,0 +1,88 @@ +//===- llvm/unittest/IR/PassManager.cpp - PassManager tests ---------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Assembly/Parser.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/PassManager.h" +#include "llvm/Support/SourceMgr.h" +#include "gtest/gtest.h" + +using namespace llvm; + +namespace { + +struct TestModulePass { + TestModulePass(int &RunCount) : RunCount(RunCount) {} + + bool run(Module *M) { + ++RunCount; + return true; + } + + int &RunCount; +}; + +struct TestFunctionPass { + TestFunctionPass(int &RunCount) : RunCount(RunCount) {} + + bool run(Function *F) { + ++RunCount; + return true; + } + + int &RunCount; +}; + +Module *parseIR(const char *IR) { + LLVMContext &C = getGlobalContext(); + SMDiagnostic Err; + return ParseAssemblyString(IR, 0, Err, C); +} + +class PassManagerTest : public ::testing::Test { +protected: + OwningPtr<Module> M; + +public: + PassManagerTest() + : M(parseIR("define void @f() {\n" + "entry:\n" + " call void @g()\n" + " call void @h()\n" + " ret void\n" + "}\n" + "define void @g() {\n" + " ret void\n" + "}\n" + "define void @h() {\n" + " ret void\n" + "}\n")) {} +}; + +TEST_F(PassManagerTest, Basic) { + ModulePassManager MPM(M.get()); + FunctionPassManager FPM; + + // Count the runs over a module. + int ModulePassRunCount = 0; + MPM.addPass(TestModulePass(ModulePassRunCount)); + + // Count the runs over a Function. + int FunctionPassRunCount = 0; + FPM.addPass(TestFunctionPass(FunctionPassRunCount)); + MPM.addPass(FPM); + + MPM.run(); + EXPECT_EQ(1, ModulePassRunCount); + EXPECT_EQ(3, FunctionPassRunCount); +} + +} |