1ed7ac42cSChris Lattner //===- Hello.cpp - Example code from "Writing an LLVM Pass" ---------------===//
2ed7ac42cSChris Lattner //
3482202a6SJohn Criswell //                     The LLVM Compiler Infrastructure
4482202a6SJohn Criswell //
5f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source
6f3ebc3f3SChris Lattner // License. See LICENSE.TXT for details.
7482202a6SJohn Criswell //
8482202a6SJohn Criswell //===----------------------------------------------------------------------===//
9482202a6SJohn Criswell //
10ed7ac42cSChris Lattner // This file implements two versions of the LLVM "Hello World" pass described
11ed7ac42cSChris Lattner // in docs/WritingAnLLVMPass.html
12ed7ac42cSChris Lattner //
13ed7ac42cSChris Lattner //===----------------------------------------------------------------------===//
14ed7ac42cSChris Lattner 
151fa216f5SChris Lattner #define DEBUG_TYPE "hello"
162b6d18a6SReid Spencer #include "llvm/ADT/Statistic.h"
179fb823bbSChandler Carruth #include "llvm/IR/Function.h"
18ed0881b2SChandler Carruth #include "llvm/Pass.h"
19ed0881b2SChandler Carruth #include "llvm/Support/raw_ostream.h"
20df3c342aSChris Lattner using namespace llvm;
21960707c3SBrian Gaeke 
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
28a7aed186SOwen Anderson     Hello() : FunctionPass(ID) {}
2909f162caSDevang Patel 
30*3e4c697cSCraig 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   };
37d78c400bSDan Gohman }
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
46a7aed186SOwen Anderson     Hello2() : FunctionPass(ID) {}
4709f162caSDevang Patel 
48*3e4c697cSCraig 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.
56*3e4c697cSCraig Topper     void getAnalysisUsage(AnalysisUsage &AU) const override {
57ed7ac42cSChris Lattner       AU.setPreservesAll();
58740ab38bSDouglas Gregor     }
59ed7ac42cSChris Lattner   };
60ed7ac42cSChris Lattner }
61d78c400bSDan Gohman 
62d78c400bSDan Gohman char Hello2::ID = 0;
636da4d820SOwen Anderson static RegisterPass<Hello2>
646da4d820SOwen Anderson Y("hello2", "Hello World Pass (with getAnalysisUsage implemented)");
65