1 //===- Hello.cpp - Example code from "Writing an LLVM Pass" ---------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements two versions of the LLVM "Hello World" pass described 10 // in docs/WritingAnLLVMPass.html 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/ADT/Statistic.h" 15 #include "llvm/IR/Function.h" 16 #include "llvm/Pass.h" 17 #include "llvm/Support/raw_ostream.h" 18 using namespace llvm; 19 20 #define DEBUG_TYPE "hello" 21 22 STATISTIC(HelloCounter, "Counts number of functions greeted"); 23 24 namespace { 25 // Hello - The first implementation, without getAnalysisUsage. 26 struct Hello : public FunctionPass { 27 static char ID; // Pass identification, replacement for typeid Hello__anone020812e0111::Hello28 Hello() : FunctionPass(ID) {} 29 runOnFunction__anone020812e0111::Hello30 bool runOnFunction(Function &F) override { 31 ++HelloCounter; 32 errs() << "Hello: "; 33 errs().write_escaped(F.getName()) << '\n'; 34 return false; 35 } 36 }; 37 } 38 39 char Hello::ID = 0; 40 static RegisterPass<Hello> X("hello", "Hello World Pass"); 41 42 namespace { 43 // Hello2 - The second implementation with getAnalysisUsage implemented. 44 struct Hello2 : public FunctionPass { 45 static char ID; // Pass identification, replacement for typeid Hello2__anone020812e0211::Hello246 Hello2() : FunctionPass(ID) {} 47 runOnFunction__anone020812e0211::Hello248 bool runOnFunction(Function &F) override { 49 ++HelloCounter; 50 errs() << "Hello: "; 51 errs().write_escaped(F.getName()) << '\n'; 52 return false; 53 } 54 55 // We don't modify the program, so we preserve all analyses. getAnalysisUsage__anone020812e0211::Hello256 void getAnalysisUsage(AnalysisUsage &AU) const override { 57 AU.setPreservesAll(); 58 } 59 }; 60 } 61 62 char Hello2::ID = 0; 63 static RegisterPass<Hello2> 64 Y("hello2", "Hello World Pass (with getAnalysisUsage implemented)"); 65