1180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner//===- Hello.cpp - Example code from "Writing an LLVM Pass" ---------------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner// 10180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner// This file implements two versions of the LLVM "Hello World" pass described 11180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner// in docs/WritingAnLLVMPass.html 12180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner// 13180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner//===----------------------------------------------------------------------===// 14180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Statistic.h" 160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Pass.h" 18cfa6ec92e61a1ab040c2b79db5de3a39df732ff6Benjamin Kramer#include "llvm/Support/raw_ostream.h" 19f7703df4968084c18c248c1feea9961c19a32e6aChris Lattnerusing namespace llvm; 20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "hello" 22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 23cbfdd1f840630d8a899020e7fb05aa7fbdb52963Chris LattnerSTATISTIC(HelloCounter, "Counts number of functions greeted"); 24cbfdd1f840630d8a899020e7fb05aa7fbdb52963Chris Lattner 25180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattnernamespace { 26180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner // Hello - The first implementation, without getAnalysisUsage. 27180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner struct Hello : public FunctionPass { 28ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky static char ID; // Pass identification, replacement for typeid 2990c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson Hello() : FunctionPass(ID) {} 30794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnFunction(Function &F) override { 32fe60104ac97f3a8736dcfbfdf9547c7b7cc7b951Dan Gohman ++HelloCounter; 333446cf142eb3113679cbc11c3f63b133423d4c8bDaniel Dunbar errs() << "Hello: "; 343446cf142eb3113679cbc11c3f63b133423d4c8bDaniel Dunbar errs().write_escaped(F.getName()) << '\n'; 35180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner return false; 36180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner } 37fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman }; 38844731a7f1909f55935e3514c9e713a62d67662eDan Gohman} 39794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 40844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar Hello::ID = 0; 41cce7f7cd033dfae8a5828ecc104a684a11156458Owen Andersonstatic RegisterPass<Hello> X("hello", "Hello World Pass"); 42180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner 43844731a7f1909f55935e3514c9e713a62d67662eDan Gohmannamespace { 44180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner // Hello2 - The second implementation with getAnalysisUsage implemented. 45180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner struct Hello2 : public FunctionPass { 46ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky static char ID; // Pass identification, replacement for typeid 4790c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson Hello2() : FunctionPass(ID) {} 48794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnFunction(Function &F) override { 50fe60104ac97f3a8736dcfbfdf9547c7b7cc7b951Dan Gohman ++HelloCounter; 513446cf142eb3113679cbc11c3f63b133423d4c8bDaniel Dunbar errs() << "Hello: "; 523446cf142eb3113679cbc11c3f63b133423d4c8bDaniel Dunbar errs().write_escaped(F.getName()) << '\n'; 53180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner return false; 54180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner } 55180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner 566b4fa2256c1a7e379443447c19c0ade6790a25dePuyan Lotfi // We don't modify the program, so we preserve all analyses. 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 58180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner AU.setPreservesAll(); 59cabdd7425d30f7eb659ecb0cc5efbc4052dd78a8Douglas Gregor } 60fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman }; 61180e568a70580e177cda71e354f6620aeaaa1b63Chris Lattner} 62844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 63844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar Hello2::ID = 0; 64cce7f7cd033dfae8a5828ecc104a684a11156458Owen Andersonstatic RegisterPass<Hello2> 65cce7f7cd033dfae8a5828ecc104a684a11156458Owen AndersonY("hello2", "Hello World Pass (with getAnalysisUsage implemented)"); 66