blob: 5b74f5c1fab396ebf089b96560819a713d6ceee5 [file] [log] [blame]
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +00001//===- MemDerefPrinter.cpp - Printer for isDereferenceablePointer ---------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/Analysis/Passes.h"
11#include "llvm/ADT/SetVector.h"
12#include "llvm/Analysis/MemoryDependenceAnalysis.h"
13#include "llvm/IR/CallSite.h"
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000014#include "llvm/IR/DataLayout.h"
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000015#include "llvm/IR/InstIterator.h"
16#include "llvm/IR/LLVMContext.h"
Mehdi Amini46a43552015-03-04 18:43:29 +000017#include "llvm/IR/Module.h"
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000018#include "llvm/Support/ErrorHandling.h"
19#include "llvm/Support/raw_ostream.h"
20using namespace llvm;
21
22namespace {
23 struct MemDerefPrinter : public FunctionPass {
24 SmallVector<Value *, 4> Vec;
25
26 static char ID; // Pass identifcation, replacement for typeid
27 MemDerefPrinter() : FunctionPass(ID) {
28 initializeMemDerefPrinterPass(*PassRegistry::getPassRegistry());
29 }
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000030 void getAnalysisUsage(AnalysisUsage &AU) const override {
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000031 AU.setPreservesAll();
32 }
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000033 bool runOnFunction(Function &F) override;
34 void print(raw_ostream &OS, const Module * = nullptr) const override;
35 void releaseMemory() override {
36 Vec.clear();
37 }
38 };
39}
40
41char MemDerefPrinter::ID = 0;
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000042INITIALIZE_PASS_BEGIN(MemDerefPrinter, "print-memderefs",
43 "Memory Dereferenciblity of pointers in function", false, true)
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000044INITIALIZE_PASS_END(MemDerefPrinter, "print-memderefs",
45 "Memory Dereferenciblity of pointers in function", false, true)
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000046
47FunctionPass *llvm::createMemDerefPrinter() {
48 return new MemDerefPrinter();
49}
50
51bool MemDerefPrinter::runOnFunction(Function &F) {
Mehdi Amini46a43552015-03-04 18:43:29 +000052 const DataLayout &DL = F.getParent()->getDataLayout();
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000053 for (auto &I: inst_range(F)) {
54 if (LoadInst *LI = dyn_cast<LoadInst>(&I)) {
55 Value *PO = LI->getPointerOperand();
Mehdi Amini46a43552015-03-04 18:43:29 +000056 if (PO->isDereferenceablePointer(&DL))
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000057 Vec.push_back(PO);
58 }
59 }
60 return false;
61}
62
63void MemDerefPrinter::print(raw_ostream &OS, const Module *M) const {
64 OS << "The following are dereferenceable:\n";
65 for (auto &V: Vec) {
66 V->print(OS);
67 OS << "\n\n";
68 }
69}