aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm12/include/llvm/Linker/IRMover.h
blob: 39fd7b02c63d9a165a963db5fcd4c4240f32dce4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#pragma once 
 
#ifdef __GNUC__ 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wunused-parameter" 
#endif 
 
//===- IRMover.h ------------------------------------------------*- C++ -*-===// 
// 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
// See https://llvm.org/LICENSE.txt for license information. 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
// 
//===----------------------------------------------------------------------===// 
 
#ifndef LLVM_LINKER_IRMOVER_H 
#define LLVM_LINKER_IRMOVER_H 
 
#include "llvm/ADT/ArrayRef.h" 
#include "llvm/ADT/DenseSet.h" 
#include <functional> 
 
namespace llvm { 
class Error; 
class GlobalValue; 
class Metadata; 
class Module; 
class StructType; 
class TrackingMDRef; 
class Type; 
 
class IRMover { 
  struct StructTypeKeyInfo { 
    struct KeyTy { 
      ArrayRef<Type *> ETypes; 
      bool IsPacked; 
      KeyTy(ArrayRef<Type *> E, bool P); 
      KeyTy(const StructType *ST); 
      bool operator==(const KeyTy &that) const; 
      bool operator!=(const KeyTy &that) const; 
    }; 
    static StructType *getEmptyKey(); 
    static StructType *getTombstoneKey(); 
    static unsigned getHashValue(const KeyTy &Key); 
    static unsigned getHashValue(const StructType *ST); 
    static bool isEqual(const KeyTy &LHS, const StructType *RHS); 
    static bool isEqual(const StructType *LHS, const StructType *RHS); 
  }; 
 
  /// Type of the Metadata map in \a ValueToValueMapTy. 
  typedef DenseMap<const Metadata *, TrackingMDRef> MDMapT; 
 
public: 
  class IdentifiedStructTypeSet { 
    // The set of opaque types is the composite module. 
    DenseSet<StructType *> OpaqueStructTypes; 
 
    // The set of identified but non opaque structures in the composite module. 
    DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypes; 
 
  public: 
    void addNonOpaque(StructType *Ty); 
    void switchToNonOpaque(StructType *Ty); 
    void addOpaque(StructType *Ty); 
    StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked); 
    bool hasType(StructType *Ty); 
  }; 
 
  IRMover(Module &M); 
 
  typedef std::function<void(GlobalValue &)> ValueAdder; 
 
  /// Move in the provide values in \p ValuesToLink from \p Src. 
  /// 
  /// - \p AddLazyFor is a call back that the IRMover will call when a global 
  ///   value is referenced by one of the ValuesToLink (transitively) but was 
  ///   not present in ValuesToLink. The GlobalValue and a ValueAdder callback 
  ///   are passed as an argument, and the callback is expected to be called 
  ///   if the GlobalValue needs to be added to the \p ValuesToLink and linked. 
  /// - \p IsPerformingImport is true when this IR link is to perform ThinLTO 
  ///   function importing from Src. 
  Error move(std::unique_ptr<Module> Src, ArrayRef<GlobalValue *> ValuesToLink, 
             std::function<void(GlobalValue &GV, ValueAdder Add)> AddLazyFor, 
             bool IsPerformingImport); 
  Module &getModule() { return Composite; } 
 
private: 
  Module &Composite; 
  IdentifiedStructTypeSet IdentifiedStructTypes; 
  MDMapT SharedMDs; ///< A Metadata map to use for all calls to \a move(). 
}; 
 
} // End llvm namespace 
 
#endif 
 
#ifdef __GNUC__ 
#pragma GCC diagnostic pop 
#endif