1//===- ObjCARCAliasAnalysis.h - ObjC ARC Optimization -*- C++ -*-----------===// 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/// \file 10/// This file declares a simple ARC-aware AliasAnalysis using special knowledge 11/// of Objective C to enhance other optimization passes which rely on the Alias 12/// Analysis infrastructure. 13/// 14/// WARNING: This file knows about certain library functions. It recognizes them 15/// by name, and hardwires knowledge of their semantics. 16/// 17/// WARNING: This file knows about how certain Objective-C library functions are 18/// used. Naive LLVM IR transformations which would otherwise be 19/// behavior-preserving may break these assumptions. 20/// 21//===----------------------------------------------------------------------===// 22 23#ifndef LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H 24#define LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H 25 26#include "llvm/Analysis/AliasAnalysis.h" 27#include "llvm/Pass.h" 28 29namespace llvm { 30namespace objcarc { 31 32 /// \brief This is a simple alias analysis implementation that uses knowledge 33 /// of ARC constructs to answer queries. 34 /// 35 /// TODO: This class could be generalized to know about other ObjC-specific 36 /// tricks. Such as knowing that ivars in the non-fragile ABI are non-aliasing 37 /// even though their offsets are dynamic. 38 class ObjCARCAliasAnalysis : public ImmutablePass, 39 public AliasAnalysis { 40 public: 41 static char ID; // Class identification, replacement for typeinfo 42 ObjCARCAliasAnalysis() : ImmutablePass(ID) { 43 initializeObjCARCAliasAnalysisPass(*PassRegistry::getPassRegistry()); 44 } 45 46 private: 47 void initializePass() override { 48 InitializeAliasAnalysis(this); 49 } 50 51 /// This method is used when a pass implements an analysis interface through 52 /// multiple inheritance. If needed, it should override this to adjust the 53 /// this pointer as needed for the specified pass info. 54 void *getAdjustedAnalysisPointer(const void *PI) override { 55 if (PI == &AliasAnalysis::ID) 56 return static_cast<AliasAnalysis *>(this); 57 return this; 58 } 59 60 void getAnalysisUsage(AnalysisUsage &AU) const override; 61 AliasResult alias(const Location &LocA, const Location &LocB) override; 62 bool pointsToConstantMemory(const Location &Loc, bool OrLocal) override; 63 ModRefBehavior getModRefBehavior(ImmutableCallSite CS) override; 64 ModRefBehavior getModRefBehavior(const Function *F) override; 65 ModRefResult getModRefInfo(ImmutableCallSite CS, 66 const Location &Loc) override; 67 ModRefResult getModRefInfo(ImmutableCallSite CS1, 68 ImmutableCallSite CS2) override; 69 }; 70 71} // namespace objcarc 72} // namespace llvm 73 74#endif // LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H 75