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