//===-- Bitcode/Reader/MetadataLoader.h - Load Metadatas -------*- C++ -*-====// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This class handles loading Metadatas. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_BITCODE_READER_METADATALOADER_H #define LLVM_LIB_BITCODE_READER_METADATALOADER_H #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Error.h" #include <functional> #include <memory> namespace llvm { class BitcodeReaderValueList; class BitstreamCursor; class DISubprogram; class Error; class Function; class Instruction; class Metadata; class MDNode; class Module; class Type; /// Helper class that handles loading Metadatas and keeping them available. class MetadataLoader { class MetadataLoaderImpl; std::unique_ptr<MetadataLoaderImpl> Pimpl; Error parseMetadata(bool ModuleLevel); public: ~MetadataLoader(); MetadataLoader(BitstreamCursor &Stream, Module &TheModule, BitcodeReaderValueList &ValueList, bool IsImporting, std::function<Type *(unsigned)> getTypeByID); MetadataLoader &operator=(MetadataLoader &&); MetadataLoader(MetadataLoader &&); // Parse a module metadata block Error parseModuleMetadata() { return parseMetadata(true); } // Parse a function metadata block Error parseFunctionMetadata() { return parseMetadata(false); } /// Set the mode to strip TBAA metadata on load. void setStripTBAA(bool StripTBAA = true); /// Return true if the Loader is stripping TBAA metadata. bool isStrippingTBAA(); // Return true there are remaining unresolved forward references. bool hasFwdRefs() const; /// Return the given metadata, creating a replaceable forward reference if /// necessary. Metadata *getMetadataFwdRefOrLoad(unsigned Idx); MDNode *getMDNodeFwdRefOrNull(unsigned Idx); /// Return the DISubprogra metadata for a Function if any, null otherwise. DISubprogram *lookupSubprogramForFunction(Function *F); /// Parse a `METADATA_ATTACHMENT` block for a function. Error parseMetadataAttachment( Function &F, const SmallVectorImpl<Instruction *> &InstructionList); /// Parse a `METADATA_KIND` block for the current module. Error parseMetadataKinds(); unsigned size() const; void shrinkTo(unsigned N); /// Perform bitcode upgrades on llvm.dbg.* calls. void upgradeDebugIntrinsics(Function &F); }; } #endif // LLVM_LIB_BITCODE_READER_METADATALOADER_H