diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:46:15 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:46:15 +0000 |
commit | dd58ef019b700900793a1eb48b52123db01b654e (patch) | |
tree | fcfbb4df56a744f4ddc6122c50521dd3f1c5e196 /include/llvm/Linker/IRMover.h | |
parent | 2fe5752e3a7c345cdb59e869278d36af33c13fa4 (diff) | |
download | src-dd58ef019b700900793a1eb48b52123db01b654e.tar.gz src-dd58ef019b700900793a1eb48b52123db01b654e.zip |
Vendor import of llvm trunk r256633:
Notes
Notes:
svn path=/vendor/llvm/dist/; revision=292915
Diffstat (limited to 'include/llvm/Linker/IRMover.h')
-rw-r--r-- | include/llvm/Linker/IRMover.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/include/llvm/Linker/IRMover.h b/include/llvm/Linker/IRMover.h new file mode 100644 index 000000000000..a964cc4b72c5 --- /dev/null +++ b/include/llvm/Linker/IRMover.h @@ -0,0 +1,76 @@ +//===- IRMover.h ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#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 GlobalValue; +class MDNode; +class Module; +class StructType; +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); + }; + +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. The source is destroyed. + /// Returns true on error. + bool move(Module &Src, ArrayRef<GlobalValue *> ValuesToLink, + std::function<void(GlobalValue &GV, ValueAdder Add)> AddLazyFor, + DenseMap<unsigned, MDNode *> *ValIDToTempMDMap = nullptr, + bool IsMetadataLinkingPostpass = false); + Module &getModule() { return Composite; } + +private: + Module &Composite; + IdentifiedStructTypeSet IdentifiedStructTypes; +}; + +} // End llvm namespace + +#endif |