Open lfeng14 opened 3 months ago
cat llvm/include/llvm/Transforms/Utils/MyHello.h //===- llvm/include/llvm/Transforms/Utils/MyHello.h ----------*- C++ -*-===//
namespace llvm { class MyHelloPass : public PassInfoMixin { public: // run方法可以被new PassManager识别 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; }
- **MyHello.cpp**
cat llvm/lib/Transforms/Utils/MyHello.cpp
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**
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++ --===//
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;
/**
@param argv[1] IR file name */ int main(int argc, char** argv) {
// 从命令行获取IR文件名 if (argc < 2) { errs() << "Usage: " << argv[0] << " \n"; return 1; } std::string filename = argv[1];
GlobalContext = std::make_unique(); SMDiagnostic err;
// 读取文件中的IR,并加入到Module容器中 GlobalModule = parseIRFile(filename, err, *GlobalContext); if (!GlobalModule) { err.print(argv[0], errs()); return 1; }
// 初始化legacy PassManager GlobalLFPM = std::make_unique(GlobalModule.get()); GlobalLFPM->add(createMyHelloPass()); GlobalLFPM->doInitialization();
// 初始化new PassManager GlobalPB = std::make_unique(); GlobalFAM = std::make_unique(); GlobalFPM = std::make_unique(); GlobalPB->registerFunctionAnalyses(*GlobalFAM); GlobalFPM->addPass(MyHelloPass());
// 遍历Module中所有非内建函数 // 内建函数是编译器前端自动内联进去的,这里只处理用户编写的函数 for (Function &func : GlobalModule) { if (!func.isIntrinsic()) { GlobalLFPM->run(func); // 调用legacy pass GlobalFPM->run(func, GlobalFAM); // 调用new pass } }
return 0; }
- 输入ir
clang -O0 -emit-llvm case.c -S -o case.ll
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/Utils/MyHello.h"
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())
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
cat ../build-llvm.sh #!/bin/sh
build_llvm=pwd/build-llvm build_clang=pwd/build-clang installprefix=pwd/install llvm=pwd/llvm-project mkdir -p $build_llvm mkdir -p $installprefix
pwd
cmake -G Ninja -S $llvm/llvm -B $build_llvm \ -DLLVM_INSTALL_UTILS=ON \ -DCMAKE_INSTALL_PREFIX=$installprefix \ -DCMAKE_BUILD_TYPE=Release
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
增加文件
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
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();
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;
/**
@param argv[1] IR file name */ int main(int argc, char** argv) {
// 从命令行获取IR文件名 if (argc < 2) { errs() << "Usage: " << argv[0] << "\n";
return 1;
}
std::string filename = argv[1];
GlobalContext = std::make_unique();
SMDiagnostic err;
// 读取文件中的IR,并加入到Module容器中 GlobalModule = parseIRFile(filename, err, *GlobalContext); if (!GlobalModule) { err.print(argv[0], errs()); return 1; }
// 初始化legacy PassManager GlobalLFPM = std::make_unique(GlobalModule.get());
GlobalLFPM->add(createMyHelloPass());
GlobalLFPM->doInitialization();
// 初始化new PassManager GlobalPB = std::make_unique();
GlobalFAM = std::make_unique();
GlobalFPM = std::make_unique();
GlobalPB->registerFunctionAnalyses(*GlobalFAM);
GlobalFPM->addPass(MyHelloPass());
// 遍历Module中所有非内建函数 // 内建函数是编译器前端自动内联进去的,这里只处理用户编写的函数 for (Function &func : GlobalModule) { if (!func.isIntrinsic()) { GlobalLFPM->run(func); // 调用legacy pass GlobalFPM->run(func, GlobalFAM); // 调用new pass } }
return 0; }
clang -O0 -emit-llvm case.c -S -o case.ll
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 $installprefixcmake -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