Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- ObjCARCAliasAnalysis.h - ObjC ARC Alias Analysis ---------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
/// \file
9
/// This file declares a simple ARC-aware AliasAnalysis using special knowledge
10
/// of Objective C to enhance other optimization passes which rely on the Alias
11
/// Analysis infrastructure.
12
///
13
/// WARNING: This file knows about certain library functions. It recognizes them
14
/// by name, and hardwires knowledge of their semantics.
15
///
16
/// WARNING: This file knows about how certain Objective-C library functions are
17
/// used. Naive LLVM IR transformations which would otherwise be
18
/// behavior-preserving may break these assumptions.
19
///
20
//===----------------------------------------------------------------------===//
21
 
22
#ifndef LLVM_ANALYSIS_OBJCARCALIASANALYSIS_H
23
#define LLVM_ANALYSIS_OBJCARCALIASANALYSIS_H
24
 
25
#include "llvm/Analysis/AliasAnalysis.h"
26
#include "llvm/Pass.h"
27
 
28
namespace llvm {
29
namespace objcarc {
30
 
31
/// This is a simple alias analysis implementation that uses knowledge
32
/// of ARC constructs to answer queries.
33
///
34
/// TODO: This class could be generalized to know about other ObjC-specific
35
/// tricks. Such as knowing that ivars in the non-fragile ABI are non-aliasing
36
/// even though their offsets are dynamic.
37
class ObjCARCAAResult : public AAResultBase {
38
  const DataLayout &DL;
39
 
40
public:
41
  explicit ObjCARCAAResult(const DataLayout &DL) : DL(DL) {}
42
  ObjCARCAAResult(ObjCARCAAResult &&Arg)
43
      : AAResultBase(std::move(Arg)), DL(Arg.DL) {}
44
 
45
  /// Handle invalidation events from the new pass manager.
46
  ///
47
  /// By definition, this result is stateless and so remains valid.
48
  bool invalidate(Function &, const PreservedAnalyses &,
49
                  FunctionAnalysisManager::Invalidator &) {
50
    return false;
51
  }
52
 
53
  AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB,
54
                    AAQueryInfo &AAQI, const Instruction *CtxI);
55
  ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI,
56
                               bool IgnoreLocals);
57
 
58
  using AAResultBase::getMemoryEffects;
59
  MemoryEffects getMemoryEffects(const Function *F);
60
 
61
  using AAResultBase::getModRefInfo;
62
  ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc,
63
                           AAQueryInfo &AAQI);
64
};
65
 
66
/// Analysis pass providing a never-invalidated alias analysis result.
67
class ObjCARCAA : public AnalysisInfoMixin<ObjCARCAA> {
68
  friend AnalysisInfoMixin<ObjCARCAA>;
69
  static AnalysisKey Key;
70
 
71
public:
72
  typedef ObjCARCAAResult Result;
73
 
74
  ObjCARCAAResult run(Function &F, FunctionAnalysisManager &AM);
75
};
76
 
77
} // namespace objcarc
78
} // namespace llvm
79
 
80
#endif