1d88c1a5aSDimitry Andric //===-- Bitcode/Reader/MetadataLoader.h - Load Metadatas -------*- C++ -*-====// 2d88c1a5aSDimitry Andric // 3d88c1a5aSDimitry Andric // The LLVM Compiler Infrastructure 4d88c1a5aSDimitry Andric // 5d88c1a5aSDimitry Andric // This file is distributed under the University of Illinois Open Source 6d88c1a5aSDimitry Andric // License. See LICENSE.TXT for details. 7d88c1a5aSDimitry Andric // 8d88c1a5aSDimitry Andric //===----------------------------------------------------------------------===// 9d88c1a5aSDimitry Andric // 10d88c1a5aSDimitry Andric // This class handles loading Metadatas. 11d88c1a5aSDimitry Andric // 12d88c1a5aSDimitry Andric //===----------------------------------------------------------------------===// 13d88c1a5aSDimitry Andric 14d88c1a5aSDimitry Andric #ifndef LLVM_LIB_BITCODE_READER_METADATALOADER_H 15d88c1a5aSDimitry Andric #define LLVM_LIB_BITCODE_READER_METADATALOADER_H 16d88c1a5aSDimitry Andric 17d88c1a5aSDimitry Andric #include "llvm/ADT/SmallVector.h" 18d88c1a5aSDimitry Andric #include "llvm/Support/Error.h" 19d88c1a5aSDimitry Andric 20d88c1a5aSDimitry Andric #include <functional> 21d88c1a5aSDimitry Andric #include <memory> 22d88c1a5aSDimitry Andric 23d88c1a5aSDimitry Andric namespace llvm { 24d88c1a5aSDimitry Andric class BitcodeReaderValueList; 25d88c1a5aSDimitry Andric class BitstreamCursor; 26d88c1a5aSDimitry Andric class DISubprogram; 27d88c1a5aSDimitry Andric class Error; 28d88c1a5aSDimitry Andric class Function; 29d88c1a5aSDimitry Andric class Instruction; 30d88c1a5aSDimitry Andric class Metadata; 31d88c1a5aSDimitry Andric class MDNode; 32d88c1a5aSDimitry Andric class Module; 33d88c1a5aSDimitry Andric class Type; 34d88c1a5aSDimitry Andric 35d88c1a5aSDimitry Andric /// Helper class that handles loading Metadatas and keeping them available. 36d88c1a5aSDimitry Andric class MetadataLoader { 37d88c1a5aSDimitry Andric class MetadataLoaderImpl; 38d88c1a5aSDimitry Andric std::unique_ptr<MetadataLoaderImpl> Pimpl; 39d88c1a5aSDimitry Andric Error parseMetadata(bool ModuleLevel); 40d88c1a5aSDimitry Andric 41d88c1a5aSDimitry Andric public: 42d88c1a5aSDimitry Andric ~MetadataLoader(); 43d88c1a5aSDimitry Andric MetadataLoader(BitstreamCursor &Stream, Module &TheModule, 44d88c1a5aSDimitry Andric BitcodeReaderValueList &ValueList, bool IsImporting, 45d88c1a5aSDimitry Andric std::function<Type *(unsigned)> getTypeByID); 46d88c1a5aSDimitry Andric MetadataLoader &operator=(MetadataLoader &&); 47d88c1a5aSDimitry Andric MetadataLoader(MetadataLoader &&); 48d88c1a5aSDimitry Andric 49d88c1a5aSDimitry Andric // Parse a module metadata block parseModuleMetadata()50d88c1a5aSDimitry Andric Error parseModuleMetadata() { return parseMetadata(true); } 51d88c1a5aSDimitry Andric 52d88c1a5aSDimitry Andric // Parse a function metadata block parseFunctionMetadata()53d88c1a5aSDimitry Andric Error parseFunctionMetadata() { return parseMetadata(false); } 54d88c1a5aSDimitry Andric 55d88c1a5aSDimitry Andric /// Set the mode to strip TBAA metadata on load. 56d88c1a5aSDimitry Andric void setStripTBAA(bool StripTBAA = true); 57d88c1a5aSDimitry Andric 58d88c1a5aSDimitry Andric /// Return true if the Loader is stripping TBAA metadata. 59d88c1a5aSDimitry Andric bool isStrippingTBAA(); 60d88c1a5aSDimitry Andric 61d88c1a5aSDimitry Andric // Return true there are remaining unresolved forward references. 62d88c1a5aSDimitry Andric bool hasFwdRefs() const; 63d88c1a5aSDimitry Andric 64d88c1a5aSDimitry Andric /// Return the given metadata, creating a replaceable forward reference if 65d88c1a5aSDimitry Andric /// necessary. 66f8496407SDimitry Andric Metadata *getMetadataFwdRefOrLoad(unsigned Idx); 67d88c1a5aSDimitry Andric 68*b5893f02SDimitry Andric /// Return the DISubprogram metadata for a Function if any, null otherwise. 69d88c1a5aSDimitry Andric DISubprogram *lookupSubprogramForFunction(Function *F); 70d88c1a5aSDimitry Andric 71d88c1a5aSDimitry Andric /// Parse a `METADATA_ATTACHMENT` block for a function. 72d88c1a5aSDimitry Andric Error parseMetadataAttachment( 73d88c1a5aSDimitry Andric Function &F, const SmallVectorImpl<Instruction *> &InstructionList); 74d88c1a5aSDimitry Andric 75d88c1a5aSDimitry Andric /// Parse a `METADATA_KIND` block for the current module. 76d88c1a5aSDimitry Andric Error parseMetadataKinds(); 77d88c1a5aSDimitry Andric 78d88c1a5aSDimitry Andric unsigned size() const; 79d88c1a5aSDimitry Andric void shrinkTo(unsigned N); 806bc11b14SDimitry Andric 816bc11b14SDimitry Andric /// Perform bitcode upgrades on llvm.dbg.* calls. 826bc11b14SDimitry Andric void upgradeDebugIntrinsics(Function &F); 83d88c1a5aSDimitry Andric }; 84d88c1a5aSDimitry Andric } 85d88c1a5aSDimitry Andric 86d88c1a5aSDimitry Andric #endif // LLVM_LIB_BITCODE_READER_METADATALOADER_H 87