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