Hello.cpp revision a203b1b92475a53692d2d544fc92eabce48fbb3e
1f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman//===- Hello.cpp - Example code from "Writing an LLVM Pass" ---------------===// 2f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 3f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// The LLVM Compiler Infrastructure 4f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 5081ce940e7351e90fff829320b7dc6738a6b3815Chris Lattner// This file is distributed under the University of Illinois Open Source 6081ce940e7351e90fff829320b7dc6738a6b3815Chris Lattner// License. See LICENSE.TXT for details. 7f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 8f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman//===----------------------------------------------------------------------===// 9f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 10f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// This file implements two versions of the LLVM "Hello World" pass described 11f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// in docs/WritingAnLLVMPass.html 12f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// 13f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman//===----------------------------------------------------------------------===// 14f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 15f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#define DEBUG_TYPE "hello" 16f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/Pass.h" 17f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/Function.h" 180588d2da0980b653e2862e8742e0fa7923b9f170Benjamin Kramer#include "llvm/Support/raw_ostream.h" 19f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/ADT/Statistic.h" 20f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohmanusing namespace llvm; 21f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 22f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan GohmanSTATISTIC(HelloCounter, "Counts number of functions greeted"); 23f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 24f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohmannamespace { 25f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman // Hello - The first implementation, without getAnalysisUsage. 26f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman struct Hello : public FunctionPass { 27f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman static char ID; // Pass identification, replacement for typeid 287569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson Hello() : FunctionPass(ID) {} 29f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 30f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman virtual bool runOnFunction(Function &F) { 31559d513348a11936bc90b64aad75e2540b26c6a4Dan Gohman ++HelloCounter; 32f89f4be5637df6ac149e83c3aa7b52bc4e6d7db0Daniel Dunbar errs() << "Hello: "; 33f89f4be5637df6ac149e83c3aa7b52bc4e6d7db0Daniel Dunbar errs().write_escaped(F.getName()) << '\n'; 34f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman return false; 35f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman } 36f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman }; 37089efffd7d1ca0d10522ace38d36e0a67f4fac2dDan Gohman} 38f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 39089efffd7d1ca0d10522ace38d36e0a67f4fac2dDan Gohmanchar Hello::ID = 0; 40a203b1b92475a53692d2d544fc92eabce48fbb3eOwen Andersonstatic RegisterPass<Hello> X("hello", "Hello World Pass"); 41f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 42089efffd7d1ca0d10522ace38d36e0a67f4fac2dDan Gohmannamespace { 43f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman // Hello2 - The second implementation with getAnalysisUsage implemented. 44f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman struct Hello2 : public FunctionPass { 45f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman static char ID; // Pass identification, replacement for typeid 467569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson Hello2() : FunctionPass(ID) {} 47f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 48f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman virtual bool runOnFunction(Function &F) { 49559d513348a11936bc90b64aad75e2540b26c6a4Dan Gohman ++HelloCounter; 50f89f4be5637df6ac149e83c3aa7b52bc4e6d7db0Daniel Dunbar errs() << "Hello: "; 51f89f4be5637df6ac149e83c3aa7b52bc4e6d7db0Daniel Dunbar errs().write_escaped(F.getName()) << '\n'; 52f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman return false; 53f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman } 54f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman 55f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman // We don't modify the program, so we preserve all analyses 56f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman virtual void getAnalysisUsage(AnalysisUsage &AU) const { 57f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman AU.setPreservesAll(); 588cb4138c0eca1101911d01679a35a9013a73fd78Douglas Gregor } 59f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman }; 60f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman} 61089efffd7d1ca0d10522ace38d36e0a67f4fac2dDan Gohman 62089efffd7d1ca0d10522ace38d36e0a67f4fac2dDan Gohmanchar Hello2::ID = 0; 63a203b1b92475a53692d2d544fc92eabce48fbb3eOwen Andersonstatic RegisterPass<Hello2> 64a203b1b92475a53692d2d544fc92eabce48fbb3eOwen AndersonY("hello2", "Hello World Pass (with getAnalysisUsage implemented)"); 65