1ed7ac42cSChris Lattner //===- Hello.cpp - Example code from "Writing an LLVM Pass" ---------------===// 2ed7ac42cSChris Lattner // 3482202a6SJohn Criswell // The LLVM Compiler Infrastructure 4482202a6SJohn Criswell // 5*f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source 6*f3ebc3f3SChris 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" 16ed7ac42cSChris Lattner #include "llvm/Pass.h" 17ed7ac42cSChris Lattner #include "llvm/Function.h" 182b6d18a6SReid Spencer #include "llvm/ADT/StringExtras.h" 19a7459ca8SBill Wendling #include "llvm/Support/Streams.h" 202b6d18a6SReid Spencer #include "llvm/ADT/Statistic.h" 21df3c342aSChris Lattner using namespace llvm; 22960707c3SBrian Gaeke 231fa216f5SChris Lattner STATISTIC(HelloCounter, "Counts number of functions greeted"); 241fa216f5SChris Lattner 25ed7ac42cSChris Lattner namespace { 26ed7ac42cSChris Lattner // Hello - The first implementation, without getAnalysisUsage. 27ed7ac42cSChris Lattner struct Hello : public FunctionPass { 28e7da2d6aSNick Lewycky static char ID; // Pass identification, replacement for typeid 2909f162caSDevang Patel Hello() : FunctionPass((intptr_t)&ID) {} 3009f162caSDevang Patel 31ed7ac42cSChris Lattner virtual bool runOnFunction(Function &F) { 322b6d18a6SReid Spencer HelloCounter++; 332b6d18a6SReid Spencer std::string fname = F.getName(); 342b6d18a6SReid Spencer EscapeString(fname); 35f3baad3eSBill Wendling cerr << "Hello: " << fname << "\n"; 36ed7ac42cSChris Lattner return false; 37ed7ac42cSChris Lattner } 38ed7ac42cSChris Lattner }; 3909f162caSDevang Patel 408c78a0bfSDevang Patel char Hello::ID = 0; 41c2d3d311SChris Lattner RegisterPass<Hello> X("hello", "Hello World Pass"); 42ed7ac42cSChris Lattner 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 4609f162caSDevang Patel Hello2() : FunctionPass((intptr_t)&ID) {} 4709f162caSDevang Patel 48ed7ac42cSChris Lattner virtual bool runOnFunction(Function &F) { 492b6d18a6SReid Spencer HelloCounter++; 502b6d18a6SReid Spencer std::string fname = F.getName(); 512b6d18a6SReid Spencer EscapeString(fname); 52f3baad3eSBill Wendling cerr << "Hello: " << fname << "\n"; 53ed7ac42cSChris Lattner return false; 54ed7ac42cSChris Lattner } 55ed7ac42cSChris Lattner 56ed7ac42cSChris Lattner // We don't modify the program, so we preserve all analyses 57ed7ac42cSChris Lattner virtual void getAnalysisUsage(AnalysisUsage &AU) const { 58ed7ac42cSChris Lattner AU.setPreservesAll(); 59ed7ac42cSChris Lattner }; 60ed7ac42cSChris Lattner }; 618c78a0bfSDevang Patel char Hello2::ID = 0; 62c2d3d311SChris Lattner RegisterPass<Hello2> Y("hello2", 63c2d3d311SChris Lattner "Hello World Pass (with getAnalysisUsage implemented)"); 64ed7ac42cSChris Lattner } 65