blob: ef2de41e120921a5eeaf50681e659d3b0bbda8ff [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"
Philip Reames5461d452015-04-23 17:36:48 +000013#include "llvm/Analysis/ValueTracking.h"
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000014#include "llvm/IR/CallSite.h"
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000015#include "llvm/IR/DataLayout.h"
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000016#include "llvm/IR/InstIterator.h"
17#include "llvm/IR/LLVMContext.h"
Mehdi Amini46a43552015-03-04 18:43:29 +000018#include "llvm/IR/Module.h"
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000019#include "llvm/Support/ErrorHandling.h"
20#include "llvm/Support/raw_ostream.h"
21using namespace llvm;
22
23namespace {
24 struct MemDerefPrinter : public FunctionPass {
25 SmallVector<Value *, 4> Vec;
26
Artur Pilipenko0f90c862015-05-21 11:57:38 +000027 static char ID; // Pass identification, replacement for typeid
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000028 MemDerefPrinter() : FunctionPass(ID) {
29 initializeMemDerefPrinterPass(*PassRegistry::getPassRegistry());
30 }
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000031 void getAnalysisUsage(AnalysisUsage &AU) const override {
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000032 AU.setPreservesAll();
33 }
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000034 bool runOnFunction(Function &F) override;
35 void print(raw_ostream &OS, const Module * = nullptr) const override;
36 void releaseMemory() override {
37 Vec.clear();
38 }
39 };
Alexander Kornienkof00654e2015-06-23 09:49:53 +000040}
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000041
42char MemDerefPrinter::ID = 0;
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000043INITIALIZE_PASS_BEGIN(MemDerefPrinter, "print-memderefs",
44 "Memory Dereferenciblity of pointers in function", false, true)
Ramkumar Ramachandra82ab65c2015-02-09 21:50:03 +000045INITIALIZE_PASS_END(MemDerefPrinter, "print-memderefs",
46 "Memory Dereferenciblity of pointers in function", false, true)
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000047
48FunctionPass *llvm::createMemDerefPrinter() {
49 return new MemDerefPrinter();
50}
51
52bool MemDerefPrinter::runOnFunction(Function &F) {
Mehdi Amini46a43552015-03-04 18:43:29 +000053 const DataLayout &DL = F.getParent()->getDataLayout();
Nico Rieck78199512015-08-06 19:10:45 +000054 for (auto &I: instructions(F)) {
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000055 if (LoadInst *LI = dyn_cast<LoadInst>(&I)) {
56 Value *PO = LI->getPointerOperand();
Philip Reames5461d452015-04-23 17:36:48 +000057 if (isDereferenceablePointer(PO, DL))
Ramkumar Ramachandra8378ac32015-02-06 01:46:42 +000058 Vec.push_back(PO);
59 }
60 }
61 return false;
62}
63
64void MemDerefPrinter::print(raw_ostream &OS, const Module *M) const {
65 OS << "The following are dereferenceable:\n";
66 for (auto &V: Vec) {
67 V->print(OS);
68 OS << "\n\n";
69 }
70}