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