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