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