Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/Linker/IRMover.h
Line
Count
Source
1
//===- IRMover.h ------------------------------------------------*- 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
9
#ifndef LLVM_LINKER_IRMOVER_H
10
#define LLVM_LINKER_IRMOVER_H
11
12
#include "llvm/ADT/ArrayRef.h"
13
#include "llvm/ADT/DenseSet.h"
14
#include <functional>
15
16
namespace llvm {
17
class Error;
18
class GlobalValue;
19
class Metadata;
20
class Module;
21
class StructType;
22
class TrackingMDRef;
23
class Type;
24
25
class IRMover {
26
  struct StructTypeKeyInfo {
27
    struct KeyTy {
28
      ArrayRef<Type *> ETypes;
29
      bool IsPacked;
30
      KeyTy(ArrayRef<Type *> E, bool P);
31
      KeyTy(const StructType *ST);
32
      bool operator==(const KeyTy &that) const;
33
      bool operator!=(const KeyTy &that) const;
34
    };
35
    static StructType *getEmptyKey();
36
    static StructType *getTombstoneKey();
37
    static unsigned getHashValue(const KeyTy &Key);
38
    static unsigned getHashValue(const StructType *ST);
39
    static bool isEqual(const KeyTy &LHS, const StructType *RHS);
40
    static bool isEqual(const StructType *LHS, const StructType *RHS);
41
  };
42
43
  /// Type of the Metadata map in \a ValueToValueMapTy.
44
  typedef DenseMap<const Metadata *, TrackingMDRef> MDMapT;
45
46
public:
47
  class IdentifiedStructTypeSet {
48
    // The set of opaque types is the composite module.
49
    DenseSet<StructType *> OpaqueStructTypes;
50
51
    // The set of identified but non opaque structures in the composite module.
52
    DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypes;
53
54
  public:
55
    void addNonOpaque(StructType *Ty);
56
    void switchToNonOpaque(StructType *Ty);
57
    void addOpaque(StructType *Ty);
58
    StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked);
59
    bool hasType(StructType *Ty);
60
  };
61
62
  IRMover(Module &M);
63
64
  typedef std::function<void(GlobalValue &)> ValueAdder;
65
66
  /// Move in the provide values in \p ValuesToLink from \p Src.
67
  ///
68
  /// - \p AddLazyFor is a call back that the IRMover will call when a global
69
  ///   value is referenced by one of the ValuesToLink (transitively) but was
70
  ///   not present in ValuesToLink. The GlobalValue and a ValueAdder callback
71
  ///   are passed as an argument, and the callback is expected to be called
72
  ///   if the GlobalValue needs to be added to the \p ValuesToLink and linked.
73
  /// - \p IsPerformingImport is true when this IR link is to perform ThinLTO
74
  ///   function importing from Src.
75
  Error move(std::unique_ptr<Module> Src, ArrayRef<GlobalValue *> ValuesToLink,
76
             std::function<void(GlobalValue &GV, ValueAdder Add)> AddLazyFor,
77
             bool IsPerformingImport);
78
2.09k
  Module &getModule() { return Composite; }
79
80
private:
81
  Module &Composite;
82
  IdentifiedStructTypeSet IdentifiedStructTypes;
83
  MDMapT SharedMDs; ///< A Metadata map to use for all calls to \a move().
84
};
85
86
} // End llvm namespace
87
88
#endif