Coverage Report

Created: 2019-03-22 08:08

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/Analysis/ObjCARCAliasAnalysis.h
Line
Count
Source (jump to first uncovered line)
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<ObjCARCAAResult> {
38
  friend AAResultBase<ObjCARCAAResult>;
39
40
  const DataLayout &DL;
41
42
public:
43
33
  explicit ObjCARCAAResult(const DataLayout &DL) : AAResultBase(), DL(DL) {}
44
  ObjCARCAAResult(ObjCARCAAResult &&Arg)
45
      : AAResultBase(std::move(Arg)), DL(Arg.DL) {}
46
47
  /// Handle invalidation events from the new pass manager.
48
  ///
49
  /// By definition, this result is stateless and so remains valid.
50
  bool invalidate(Function &, const PreservedAnalyses &,
51
                  FunctionAnalysisManager::Invalidator &) {
52
    return false;
53
  }
54
55
  AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB);
56
  bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal);
57
58
  using AAResultBase::getModRefBehavior;
59
  FunctionModRefBehavior getModRefBehavior(const Function *F);
60
61
  using AAResultBase::getModRefInfo;
62
  ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc);
63
};
64
65
/// Analysis pass providing a never-invalidated alias analysis result.
66
class ObjCARCAA : public AnalysisInfoMixin<ObjCARCAA> {
67
  friend AnalysisInfoMixin<ObjCARCAA>;
68
  static AnalysisKey Key;
69
70
public:
71
  typedef ObjCARCAAResult Result;
72
73
  ObjCARCAAResult run(Function &F, FunctionAnalysisManager &AM);
74
};
75
76
/// Legacy wrapper pass to provide the ObjCARCAAResult object.
77
class ObjCARCAAWrapperPass : public ImmutablePass {
78
  std::unique_ptr<ObjCARCAAResult> Result;
79
80
public:
81
  static char ID;
82
83
  ObjCARCAAWrapperPass();
84
85
1.37k
  ObjCARCAAResult &getResult() { return *Result; }
86
0
  const ObjCARCAAResult &getResult() const { return *Result; }
87
88
  bool doInitialization(Module &M) override;
89
  bool doFinalization(Module &M) override;
90
  void getAnalysisUsage(AnalysisUsage &AU) const override;
91
};
92
93
} // namespace objcarc
94
} // namespace llvm
95
96
#endif