//===- llvm/Analysis/FindUnsafePointerTypes.h - Unsafe pointers ---*- C++ -*-=// // // This file defines a pass that can be used to determine, interprocedurally, // which pointer types are accessed unsafely in a program. If there is an // "unsafe" access to a specific pointer type, transformations that depend on // type safety cannot be permitted. // // The result of running this analysis over a program is a set of unsafe pointer // types that cannot be transformed. Safe pointer types are not tracked. // // Additionally, this analysis exports a hidden command line argument that (when // enabled) prints out the reasons a type was determined to be unsafe. Just add // -printunsafeptrinst to the command line of the tool you want to get it. // //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_UNSAFEPOINTERTYPES_H #define LLVM_ANALYSIS_UNSAFEPOINTERTYPES_H #include "llvm/Pass.h" #include class PointerType; struct FindUnsafePointerTypes : public Pass { // UnsafeTypes - Set of types that are not safe to transform. std::set UnsafeTypes; public: // Accessor for underlying type set... inline const std::set &getUnsafeTypes() const { return UnsafeTypes; } // run - Inspect the operations that the specified module does on // values of various types. If they are deemed to be 'unsafe' note that the // type is not safe to transform. // virtual bool run(Module &M); // print - Loop over the results of the analysis, printing out unsafe types. // void print(std::ostream &o, const Module *Mod) const; // getAnalysisUsage - Of course, we provide ourself... // virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } }; #endif