From 55ae87cb9eeac0d16f7625f93d84b863eff5e31f Mon Sep 17 00:00:00 2001 From: Lavrov-Artyom Date: Thu, 14 Oct 2021 13:21:28 +0300 Subject: [PATCH] Artyom Lavrov 19PMI 1lab --- .../ArtyomLavrov/ArtyomLavrovlab1.h | 14 ++++++ llvm/lib/Passes/CMakeLists.txt | 1 + llvm/lib/Passes/PassBuilder.cpp | 1 + llvm/lib/Passes/PassRegistry.def | 1 + .../ArtyomLavrov/ArtyomLavrovlab1.cpp | 50 +++++++++++++++++++ .../Transforms/ArtyomLavrov/CMakeLists.txt | 13 +++++ llvm/lib/Transforms/CMakeLists.txt | 1 + 7 files changed, 81 insertions(+) create mode 100644 llvm/include/llvm/Transforms/ArtyomLavrov/ArtyomLavrovlab1.h create mode 100644 llvm/lib/Transforms/ArtyomLavrov/ArtyomLavrovlab1.cpp create mode 100644 llvm/lib/Transforms/ArtyomLavrov/CMakeLists.txt diff --git a/llvm/include/llvm/Transforms/ArtyomLavrov/ArtyomLavrovlab1.h b/llvm/include/llvm/Transforms/ArtyomLavrov/ArtyomLavrovlab1.h new file mode 100644 index 0000000000000..86048eae8b2fb --- /dev/null +++ b/llvm/include/llvm/Transforms/ArtyomLavrov/ArtyomLavrovlab1.h @@ -0,0 +1,14 @@ +#ifndef LLVM_TRANSFORMS_ARTYOMLAVROVLAB1_H +#define LLVM_TRANSFORMS_ARTYOMLAVROVLAB1_H + +#include "llvm/IR/PassManager.h" + +namespace llvm { + +class ArtyomLavrovlab1Pass : public PassInfoMixin { +public: + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; + +} // namespace llvm + +#endif // LLVM_TRANSFORMS_ARTYOMLAVROVLAB1_H \ No newline at end of file diff --git a/llvm/lib/Passes/CMakeLists.txt b/llvm/lib/Passes/CMakeLists.txt index 89e960f01e2eb..2d1bc63875f6b 100644 --- a/llvm/lib/Passes/CMakeLists.txt +++ b/llvm/lib/Passes/CMakeLists.txt @@ -25,4 +25,5 @@ add_llvm_component_library(LLVMPasses TransformUtils Vectorize Instrumentation + ArtyomLavrovlab1 ) diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index e118633c7ea61..fb1f075636504 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -135,6 +135,7 @@ #include "llvm/Transforms/Instrumentation/PoisonChecking.h" #include "llvm/Transforms/Instrumentation/SanitizerCoverage.h" #include "llvm/Transforms/Instrumentation/ThreadSanitizer.h" +#include "llvm/Transforms/ArtyomLavrov/ArtyomLavrovlab1.h" #include "llvm/Transforms/ObjCARC.h" #include "llvm/Transforms/Scalar/ADCE.h" #include "llvm/Transforms/Scalar/AlignmentFromAssumptions.h" diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index fef3aba69e25f..2f2a5475caafe 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -239,6 +239,7 @@ FUNCTION_PASS("make-guards-explicit", MakeGuardsExplicitPass()) FUNCTION_PASS("gvn-hoist", GVNHoistPass()) FUNCTION_PASS("gvn-sink", GVNSinkPass()) FUNCTION_PASS("helloworld", HelloWorldPass()) +FUNCTION_PASS("ArtyomLavrovlab1", ArtyomLavrovlab1Pass()) FUNCTION_PASS("infer-address-spaces", InferAddressSpacesPass()) FUNCTION_PASS("instcombine", InstCombinePass()) FUNCTION_PASS("instcount", InstCountPass()) diff --git a/llvm/lib/Transforms/ArtyomLavrov/ArtyomLavrovlab1.cpp b/llvm/lib/Transforms/ArtyomLavrov/ArtyomLavrovlab1.cpp new file mode 100644 index 0000000000000..f7ef225003290 --- /dev/null +++ b/llvm/lib/Transforms/ArtyomLavrov/ArtyomLavrovlab1.cpp @@ -0,0 +1,50 @@ +#include "llvm/Transforms/ArtyomLavrov/ArtyomLavrovlab1.h" +#include "llvm/IR/InstIterator.h" +#include "llvm/Analysis/LoopInfo.h" +#include "llvm/ADT/Statistic.h" +#include + +#define DEBUG_TYPE "ArtyomLavrovlab1" + +using namespace llvm; + +ALWAYS_ENABLED_STATISTIC(FuncCounter, "Function counter"); +ALWAYS_ENABLED_STATISTIC(BlockCounter, "Block counter"); +ALWAYS_ENABLED_STATISTIC(OpCounter, "Arithmetic operation counter"); +ALWAYS_ENABLED_STATISTIC(LoopCounter, "Loop counter"); + +PreservedAnalyses DenisKabanovLab1Pass::run(Function &F, + FunctionAnalysisManager &AM) { + errs() << "function: " << F.getName() << "\n"; + FuncCounter++; + for (auto BB = F.begin(); BB != F.end(); ++BB){ + errs() << " base block: " << BB->getName() << "\n"; + BlockCounter++; + for (auto I = BB->begin(); I != BB->end(); ++I){ + errs() << " instruction: " << I->getOpcode() << "\n"; + // id - instruction + // 1 - return + // 13 - "+" + // 15 - "-" + // 17 - "*" + // 20 - "/" + // 23 - "%" + std::set Operations{13, 15, 17, 20, 23}; + if (Operations.find(I->getOpcode()) != Operations.end()) + OpCounter++; + } + } + + //} + auto& LA = AM.getResult(F); + for (auto& L : LA){ + errs() << " loop:" << L->getName() << "\n"; + LoopCounter++; + } + errs() << "Total stats after function: " << F.getName() + << "\n\tFunction counter: " << FuncCounter + << "\n\tBlock counter: " << BlockCounter + << "\n\tArithmetic operation counter: " << OpCounter + << "\n\tLoop counter: " << LoopCounter << "\n"; + return PreservedAnalyses::all(); +} \ No newline at end of file diff --git a/llvm/lib/Transforms/ArtyomLavrov/CMakeLists.txt b/llvm/lib/Transforms/ArtyomLavrov/CMakeLists.txt new file mode 100644 index 0000000000000..a5ce498652374 --- /dev/null +++ b/llvm/lib/Transforms/ArtyomLavrov/CMakeLists.txt @@ -0,0 +1,13 @@ +add_llvm_component_library(LLVMArtyomLavrovlab1 +ArtyomLavrovlab1.cpp + +DEPENDS +intrinsics_gen + +COMPONENT_NAME +ArtyomLavrovlab1 + +LINK_COMPONENTS +Core +Support +) \ No newline at end of file diff --git a/llvm/lib/Transforms/CMakeLists.txt b/llvm/lib/Transforms/CMakeLists.txt index dda5f6de11e32..c9564d6f67590 100644 --- a/llvm/lib/Transforms/CMakeLists.txt +++ b/llvm/lib/Transforms/CMakeLists.txt @@ -9,3 +9,4 @@ add_subdirectory(Hello) add_subdirectory(ObjCARC) add_subdirectory(Coroutines) add_subdirectory(CFGuard) +add_subdirectory(ArtyomLavrov) \ No newline at end of file