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