![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /usr/include/llvm-10/llvm/Linker/ |
Upload File : |
//===- 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