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 { 2205b86a8fSNikita Popov class BasicBlock; 23ef27db87SMehdi Amini class BitcodeReaderValueList; 24ef27db87SMehdi Amini class BitstreamCursor; 25ef27db87SMehdi Amini class DISubprogram; 26ef27db87SMehdi Amini class Function; 27ef27db87SMehdi Amini class Instruction; 28ef27db87SMehdi Amini class Metadata; 29ef27db87SMehdi Amini class Module; 30ef27db87SMehdi Amini class Type; 311237c149Sserge-sans-paille template <typename T> class ArrayRef; 32ef27db87SMehdi Amini 33c33b9395SSebastian Neubauer typedef std::function<Type *(unsigned)> GetTypeByIDTy; 34c33b9395SSebastian Neubauer 35c33b9395SSebastian Neubauer typedef std::function<unsigned(unsigned, unsigned)> GetContainedTypeIDTy; 36c33b9395SSebastian Neubauer 37c33b9395SSebastian Neubauer typedef std::function<void(Metadata **, unsigned, GetTypeByIDTy, 38c33b9395SSebastian Neubauer GetContainedTypeIDTy)> 39c33b9395SSebastian Neubauer MDTypeCallbackTy; 40c33b9395SSebastian Neubauer 41c33b9395SSebastian Neubauer struct MetadataLoaderCallbacks { 42c33b9395SSebastian Neubauer GetTypeByIDTy GetTypeByID; 43c33b9395SSebastian Neubauer GetContainedTypeIDTy GetContainedTypeID; 44c33b9395SSebastian Neubauer std::optional<MDTypeCallbackTy> MDType; 45c33b9395SSebastian Neubauer }; 46c33b9395SSebastian Neubauer 47ef27db87SMehdi Amini /// Helper class that handles loading Metadatas and keeping them available. 48ef27db87SMehdi Amini class MetadataLoader { 49ef27db87SMehdi Amini class MetadataLoaderImpl; 50ef27db87SMehdi Amini std::unique_ptr<MetadataLoaderImpl> Pimpl; 51*236228f4SNikita Popov Error parseMetadata(bool ModuleLevel); 52ef27db87SMehdi Amini 53ef27db87SMehdi Amini public: 54ef27db87SMehdi Amini ~MetadataLoader(); 55ef27db87SMehdi Amini MetadataLoader(BitstreamCursor &Stream, Module &TheModule, 56a61f5e37STeresa Johnson BitcodeReaderValueList &ValueList, bool IsImporting, 57c33b9395SSebastian Neubauer MetadataLoaderCallbacks Callbacks); 58ef27db87SMehdi Amini MetadataLoader &operator=(MetadataLoader &&); 59ef27db87SMehdi Amini MetadataLoader(MetadataLoader &&); 60ef27db87SMehdi Amini 61ef27db87SMehdi Amini // Parse a module metadata block parseModuleMetadata()62ef27db87SMehdi Amini Error parseModuleMetadata() { return parseMetadata(true); } 63ef27db87SMehdi Amini 64ef27db87SMehdi Amini // Parse a function metadata block parseFunctionMetadata()65*236228f4SNikita Popov Error parseFunctionMetadata() { return parseMetadata(false); } 66ef27db87SMehdi Amini 678662305bSMehdi Amini /// Set the mode to strip TBAA metadata on load. 688662305bSMehdi Amini void setStripTBAA(bool StripTBAA = true); 698662305bSMehdi Amini 708662305bSMehdi Amini /// Return true if the Loader is stripping TBAA metadata. 718662305bSMehdi Amini bool isStrippingTBAA(); 728662305bSMehdi Amini 73ef27db87SMehdi Amini // Return true there are remaining unresolved forward references. 74ef27db87SMehdi Amini bool hasFwdRefs() const; 75ef27db87SMehdi Amini 76ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if 77ef27db87SMehdi Amini /// necessary. 783bb4d01dSMehdi Amini Metadata *getMetadataFwdRefOrLoad(unsigned Idx); 79ef27db87SMehdi Amini 8077931caeSXin Tong /// Return the DISubprogram metadata for a Function if any, null otherwise. 81ef27db87SMehdi Amini DISubprogram *lookupSubprogramForFunction(Function *F); 82ef27db87SMehdi Amini 83ef27db87SMehdi Amini /// Parse a `METADATA_ATTACHMENT` block for a function. 841237c149Sserge-sans-paille Error parseMetadataAttachment(Function &F, 851237c149Sserge-sans-paille ArrayRef<Instruction *> InstructionList); 86ef27db87SMehdi Amini 87ef27db87SMehdi Amini /// Parse a `METADATA_KIND` block for the current module. 88ef27db87SMehdi Amini Error parseMetadataKinds(); 89ef27db87SMehdi Amini 90ef27db87SMehdi Amini unsigned size() const; 91ef27db87SMehdi Amini void shrinkTo(unsigned N); 926825fb64SAdrian Prantl 936825fb64SAdrian Prantl /// Perform bitcode upgrades on llvm.dbg.* calls. 946825fb64SAdrian Prantl void upgradeDebugIntrinsics(Function &F); 95ef27db87SMehdi Amini }; 96ef27db87SMehdi Amini } 97ef27db87SMehdi Amini 98ef27db87SMehdi Amini #endif // LLVM_LIB_BITCODE_READER_METADATALOADER_H 99