123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #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
|