1ed7ac42cSChris Lattner //===- Hello.cpp - Example code from "Writing an LLVM Pass" ---------------===// 2ed7ac42cSChris Lattner // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6482202a6SJohn Criswell // 7482202a6SJohn Criswell //===----------------------------------------------------------------------===// 8482202a6SJohn Criswell // 9ed7ac42cSChris Lattner // This file implements two versions of the LLVM "Hello World" pass described 10ed7ac42cSChris Lattner // in docs/WritingAnLLVMPass.html 11ed7ac42cSChris Lattner // 12ed7ac42cSChris Lattner //===----------------------------------------------------------------------===// 13ed7ac42cSChris Lattner 142b6d18a6SReid Spencer #include "llvm/ADT/Statistic.h" 159fb823bbSChandler Carruth #include "llvm/IR/Function.h" 16ed0881b2SChandler Carruth #include "llvm/Pass.h" 17ed0881b2SChandler Carruth #include "llvm/Support/raw_ostream.h" 18df3c342aSChris Lattner using namespace llvm; 19960707c3SBrian Gaeke 20964daaafSChandler Carruth #define DEBUG_TYPE "hello" 21964daaafSChandler Carruth 221fa216f5SChris Lattner STATISTIC(HelloCounter, "Counts number of functions greeted"); 231fa216f5SChris Lattner 24ed7ac42cSChris Lattner namespace { 25ed7ac42cSChris Lattner // Hello - The first implementation, without getAnalysisUsage. 26ed7ac42cSChris Lattner struct Hello : public FunctionPass { 27e7da2d6aSNick Lewycky static char ID; // Pass identification, replacement for typeid Hello__anon67c2be150111::Hello28a7aed186SOwen Anderson Hello() : FunctionPass(ID) {} 2909f162caSDevang Patel runOnFunction__anon67c2be150111::Hello303e4c697cSCraig Topper bool runOnFunction(Function &F) override { 31d2d1ae10SDan Gohman ++HelloCounter; 328eff29d8SDaniel Dunbar errs() << "Hello: "; 338eff29d8SDaniel Dunbar errs().write_escaped(F.getName()) << '\n'; 34ed7ac42cSChris Lattner return false; 35ed7ac42cSChris Lattner } 36ed7ac42cSChris Lattner }; 37f00654e3SAlexander Kornienko } 3809f162caSDevang Patel 398c78a0bfSDevang Patel char Hello::ID = 0; 406da4d820SOwen Anderson static RegisterPass<Hello> X("hello", "Hello World Pass"); 41ed7ac42cSChris Lattner 42d78c400bSDan Gohman namespace { 43ed7ac42cSChris Lattner // Hello2 - The second implementation with getAnalysisUsage implemented. 44ed7ac42cSChris Lattner struct Hello2 : public FunctionPass { 45e7da2d6aSNick Lewycky static char ID; // Pass identification, replacement for typeid Hello2__anon67c2be150211::Hello246a7aed186SOwen Anderson Hello2() : FunctionPass(ID) {} 4709f162caSDevang Patel runOnFunction__anon67c2be150211::Hello2483e4c697cSCraig Topper bool runOnFunction(Function &F) override { 49d2d1ae10SDan Gohman ++HelloCounter; 508eff29d8SDaniel Dunbar errs() << "Hello: "; 518eff29d8SDaniel Dunbar errs().write_escaped(F.getName()) << '\n'; 52ed7ac42cSChris Lattner return false; 53ed7ac42cSChris Lattner } 54ed7ac42cSChris Lattner 5574e38de4SPuyan Lotfi // We don't modify the program, so we preserve all analyses. getAnalysisUsage__anon67c2be150211::Hello2563e4c697cSCraig Topper void getAnalysisUsage(AnalysisUsage &AU) const override { 57ed7ac42cSChris Lattner AU.setPreservesAll(); 58740ab38bSDouglas Gregor } 59ed7ac42cSChris Lattner }; 60f00654e3SAlexander Kornienko } 61d78c400bSDan Gohman 62d78c400bSDan Gohman char Hello2::ID = 0; 636da4d820SOwen Anderson static RegisterPass<Hello2> 646da4d820SOwen Anderson Y("hello2", "Hello World Pass (with getAnalysisUsage implemented)"); 65