Hello.cpp revision f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9c
1f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman//===- Hello.cpp - Example code from "Writing an LLVM Pass" ---------------===//
2f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman//
3f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman//                     The LLVM Compiler Infrastructure
4f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman//
5f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// This file was developed by the LLVM research group and is distributed under
6f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman// the University of Illinois Open Source 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"
18f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/ADT/StringExtras.h"
19f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/Support/Streams.h"
20f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman#include "llvm/ADT/Statistic.h"
21f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohmanusing namespace llvm;
22f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman
23f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan GohmanSTATISTIC(HelloCounter, "Counts number of functions greeted");
24f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman
25f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohmannamespace {
26f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman  // Hello - The first implementation, without getAnalysisUsage.
27f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman  struct Hello : public FunctionPass {
28f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    static char ID; // Pass identification, replacement for typeid
29f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    Hello() : FunctionPass((intptr_t)&ID) {}
30f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman
31f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    virtual bool runOnFunction(Function &F) {
32f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      HelloCounter++;
33f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      std::string fname = F.getName();
34f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      EscapeString(fname);
35f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      cerr << "Hello: " << fname << "\n";
36f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      return false;
37f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    }
38f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman  };
39f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman
40f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman  char Hello::ID = 0;
41f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman  RegisterPass<Hello> X("hello", "Hello World Pass");
42f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman
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
46f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    Hello2() : FunctionPass((intptr_t)&ID) {}
47f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman
48f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    virtual bool runOnFunction(Function &F) {
49f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      HelloCounter++;
50f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      std::string fname = F.getName();
51f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      EscapeString(fname);
52f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      cerr << "Hello: " << fname << "\n";
53f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      return false;
54f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    }
55f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman
56f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    // We don't modify the program, so we preserve all analyses
57f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
58f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman      AU.setPreservesAll();
59f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman    };
60f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman  };
61f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman  char Hello2::ID = 0;
62f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman  RegisterPass<Hello2> Y("hello2",
63f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman                        "Hello World Pass (with getAnalysisUsage implemented)");
64f17a25c88b892d30c2b41ba7ecdfbdfb2b4be9cDan Gohman}
65