lfeng14 / llvm-note

0 stars 0 forks source link

如何增加一个pass #4

Open lfeng14 opened 3 months ago

lfeng14 commented 3 months ago

增加文件

ifndef LLVM_TRANSFORMS_UTILS_MYHELLO_H

define LLVM_TRANSFORMS_UTILS_MYHELLO_H

include "llvm/IR/Function.h"

include "llvm/IR/PassManager.h"

namespace llvm { class MyHelloPass : public PassInfoMixin { public: // run方法可以被new PassManager识别 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; }

endif

- **MyHello.cpp**

cat llvm/lib/Transforms/Utils/MyHello.cpp

include "llvm/InitializePasses.h"

include "llvm/IR/Function.h"

include "llvm/IR/LegacyPassManager.h"

include "llvm/Pass.h"

include "llvm/Support/raw_ostream.h"

include "llvm/Transforms/IPO/PassManagerBuilder.h"

include "llvm/Transforms/Utils.h"

include "llvm/Transforms/Utils/MyHello.h"

using namespace llvm;

namespace { struct MyHello : public FunctionPass { static char ID; MyHello() : FunctionPass(ID) { initializeMyHelloPass(*PassRegistry::getPassRegistry()); } bool runOnFunction(Function &F) override { errs() << "my hello legacy pass on: "; errs().write_escaped(F.getName()) << '\n'; return false; } }; }

char MyHello::ID = 0; INITIALIZE_PASS(MyHello, "myhello", "Print my hello", false, false)

FunctionPass *llvm::createMyHelloPass() { return new MyHello(); }

PreservedAnalyses MyHelloPass::run(Function &F, FunctionAnalysisManager &AM) { errs() << "my hello new pass on: "; errs().write_escaped(F.getName()) << '\n'; return PreservedAnalyses::all();


- 使用pass,**MyHello.cpp**

cat llvm/lib/Transforms/Utils/MyHello.cpp

include "llvm/InitializePasses.h"

include "llvm/IR/Function.h"

include "llvm/IR/LegacyPassManager.h"

include "llvm/Pass.h"

include "llvm/Support/raw_ostream.h"

include "llvm/Transforms/IPO/PassManagerBuilder.h"

include "llvm/Transforms/Utils.h"

include "llvm/Transforms/Utils/MyHello.h"

using namespace llvm;

namespace { struct MyHello : public FunctionPass { static char ID; MyHello() : FunctionPass(ID) { initializeMyHelloPass(*PassRegistry::getPassRegistry()); } bool runOnFunction(Function &F) override { errs() << "my hello legacy pass on: "; errs().write_escaped(F.getName()) << '\n'; return false; } }; }

char MyHello::ID = 0; INITIALIZE_PASS(MyHello, "myhello", "Print my hello", false, false)

FunctionPass *llvm::createMyHelloPass() { return new MyHello(); }

PreservedAnalyses MyHelloPass::run(Function &F, FunctionAnalysisManager &AM) { errs() << "my hello new pass on: "; errs().write_escaped(F.getName()) << '\n'; return PreservedAnalyses::all(); }macdeMacBook-Pro:llvm-project mac$ cat myhellocc.cpp //===- myhellocc.cpp ----------- C++ --===//

include "llvm/IR/LLVMContext.h"

include "llvm/IR/Function.h"

include "llvm/IR/LegacyPassManager.h"

include "llvm/IR/Module.h"

include "llvm/IR/PassManager.h"

include "llvm/IRReader/IRReader.h"

include "llvm/Passes/PassBuilder.h"

include "llvm/Support/SourceMgr.h"

include "llvm/Support/raw_ostream.h"

include "llvm/Transforms/Utils.h"

include "llvm/Transforms/Utils/MyHello.h"

include

include

include

include

using namespace llvm;

static std::unique_ptr GlobalContext; static std::unique_ptr GlobalModule; static std::unique_ptr GlobalLFPM; static std::unique_ptr GlobalPB; static std::unique_ptr GlobalFAM; static std::unique_ptr GlobalFPM;

/**

cat ../case.c float add(float a, float b) { return a + b; } float sub(float a, float b) { return a - b; } float mul(float a, float b) { return a * b; } float div(float a, float b) { return a / b; } int main() { float a = 1.1f, b = 2.2f; float d0 = add(a, b); float d1 = sub(a, b); float d2 = mul(a, b); float d3 = div(a, b); return 0; }

### 修改文件

git diff diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index e4131706aba0..033b19615604 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -298,6 +298,7 @@

include "llvm/Transforms/Vectorize/LoopVectorize.h"

include "llvm/Transforms/Vectorize/SLPVectorizer.h"

include "llvm/Transforms/Vectorize/VectorCombine.h"

+#include "llvm/Transforms/Utils/MyHello.h"

include

using namespace llvm; diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index e5ce6cb7da64..6b25b144e0a8 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -464,6 +464,8 @@ FUNCTION_PASS("view-dom-only", DomOnlyViewer()) FUNCTION_PASS("view-post-dom", PostDomViewer()) FUNCTION_PASS("view-post-dom-only", PostDomOnlyViewer()) FUNCTION_PASS("wasm-eh-prepare", WasmEHPreparePass()) +# "myhello"作为命令行参数,MyHelloPass()是MyHelloPass的构造函数 +FUNCTION_PASS("myhello", MyHelloPass())

undef FUNCTION_PASS

ifndef FUNCTION_PASS_WITH_PARAMS

diff --git a/llvm/lib/Transforms/Utils/CMakeLists.txt b/llvm/lib/Transforms/Utils/CMakeLists.txt index 51e8821773c3..3c5cfa691ef3 100644 --- a/llvm/lib/Transforms/Utils/CMakeLists.txt +++ b/llvm/lib/Transforms/Utils/CMakeLists.txt @@ -14,6 +14,7 @@ add_llvm_component_library(LLVMTransformUtils CloneFunction.cpp CloneModule.cpp CodeExtractor.cpp

构建命令

build_llvm=pwd/build-llvm build_clang=pwd/build-clang installprefix=pwd/install llvm=pwd/llvm-project mkdir -p $build_llvm mkdir -p $installprefix

cmake -G Ninja -S $llvm/llvm -B $build_llvm \ -DLLVM_INSTALL_UTILS=ON \ -DCMAKE_INSTALL_PREFIX=$installprefix \ -DCMAKE_BUILD_TYPE=Release

ninja -C $build_llvm install

cmake -G Ninja -S $llvm/clang -B $build_clang \ -DLLVM_EXTERNAL_LIT=$build_llvm/utils/lit \ -DLLVM_ROOT=$installprefix \ -DLLVM_INCLUDE_TESTS=OFF \ -DCMAKE_INSTALL_PREFIX=$installprefix
ninja -C $build_clang install