1ef27db87SMehdi Amini //===-- Bitcode/Reader/MetadataLoader.h - Load Metadatas -------*- C++ -*-====// 2ef27db87SMehdi Amini // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ef27db87SMehdi Amini // 7ef27db87SMehdi Amini //===----------------------------------------------------------------------===// 8ef27db87SMehdi Amini // 9ef27db87SMehdi Amini // This class handles loading Metadatas. 10ef27db87SMehdi Amini // 11ef27db87SMehdi Amini //===----------------------------------------------------------------------===// 12ef27db87SMehdi Amini 13ef27db87SMehdi Amini #ifndef LLVM_LIB_BITCODE_READER_METADATALOADER_H 14ef27db87SMehdi Amini #define LLVM_LIB_BITCODE_READER_METADATALOADER_H 15ef27db87SMehdi Amini 16ef27db87SMehdi Amini #include "llvm/Support/Error.h" 17ef27db87SMehdi Amini 18ef27db87SMehdi Amini #include <functional> 19ef27db87SMehdi Amini #include <memory> 20ef27db87SMehdi Amini 21ef27db87SMehdi Amini namespace llvm { 22ef27db87SMehdi Amini class BitcodeReaderValueList; 23ef27db87SMehdi Amini class BitstreamCursor; 24ef27db87SMehdi Amini class DISubprogram; 25ef27db87SMehdi Amini class Function; 26ef27db87SMehdi Amini class Instruction; 27ef27db87SMehdi Amini class Metadata; 28ef27db87SMehdi Amini class Module; 29ef27db87SMehdi Amini class Type; 30*1237c149Sserge-sans-paille template <typename T> class ArrayRef; 31ef27db87SMehdi Amini 32ef27db87SMehdi Amini /// Helper class that handles loading Metadatas and keeping them available. 33ef27db87SMehdi Amini class MetadataLoader { 34ef27db87SMehdi Amini class MetadataLoaderImpl; 35ef27db87SMehdi Amini std::unique_ptr<MetadataLoaderImpl> Pimpl; 36ef27db87SMehdi Amini Error parseMetadata(bool ModuleLevel); 37ef27db87SMehdi Amini 38ef27db87SMehdi Amini public: 39ef27db87SMehdi Amini ~MetadataLoader(); 40ef27db87SMehdi Amini MetadataLoader(BitstreamCursor &Stream, Module &TheModule, 41a61f5e37STeresa Johnson BitcodeReaderValueList &ValueList, bool IsImporting, 42ef27db87SMehdi Amini std::function<Type *(unsigned)> getTypeByID); 43ef27db87SMehdi Amini MetadataLoader &operator=(MetadataLoader &&); 44ef27db87SMehdi Amini MetadataLoader(MetadataLoader &&); 45ef27db87SMehdi Amini 46ef27db87SMehdi Amini // Parse a module metadata block parseModuleMetadata()47ef27db87SMehdi Amini Error parseModuleMetadata() { return parseMetadata(true); } 48ef27db87SMehdi Amini 49ef27db87SMehdi Amini // Parse a function metadata block parseFunctionMetadata()50ef27db87SMehdi Amini Error parseFunctionMetadata() { return parseMetadata(false); } 51ef27db87SMehdi Amini 528662305bSMehdi Amini /// Set the mode to strip TBAA metadata on load. 538662305bSMehdi Amini void setStripTBAA(bool StripTBAA = true); 548662305bSMehdi Amini 558662305bSMehdi Amini /// Return true if the Loader is stripping TBAA metadata. 568662305bSMehdi Amini bool isStrippingTBAA(); 578662305bSMehdi Amini 58ef27db87SMehdi Amini // Return true there are remaining unresolved forward references. 59ef27db87SMehdi Amini bool hasFwdRefs() const; 60ef27db87SMehdi Amini 61ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if 62ef27db87SMehdi Amini /// necessary. 633bb4d01dSMehdi Amini Metadata *getMetadataFwdRefOrLoad(unsigned Idx); 64ef27db87SMehdi Amini 6577931caeSXin Tong /// Return the DISubprogram metadata for a Function if any, null otherwise. 66ef27db87SMehdi Amini DISubprogram *lookupSubprogramForFunction(Function *F); 67ef27db87SMehdi Amini 68ef27db87SMehdi Amini /// Parse a `METADATA_ATTACHMENT` block for a function. 69*1237c149Sserge-sans-paille Error parseMetadataAttachment(Function &F, 70*1237c149Sserge-sans-paille ArrayRef<Instruction *> InstructionList); 71ef27db87SMehdi Amini 72ef27db87SMehdi Amini /// Parse a `METADATA_KIND` block for the current module. 73ef27db87SMehdi Amini Error parseMetadataKinds(); 74ef27db87SMehdi Amini 75ef27db87SMehdi Amini unsigned size() const; 76ef27db87SMehdi Amini void shrinkTo(unsigned N); 776825fb64SAdrian Prantl 786825fb64SAdrian Prantl /// Perform bitcode upgrades on llvm.dbg.* calls. 796825fb64SAdrian Prantl void upgradeDebugIntrinsics(Function &F); 80ef27db87SMehdi Amini }; 81ef27db87SMehdi Amini } 82ef27db87SMehdi Amini 83ef27db87SMehdi Amini #endif // LLVM_LIB_BITCODE_READER_METADATALOADER_H 84