xref: /llvm-project/llvm/lib/Bitcode/Reader/MetadataLoader.h (revision 236228f43d018ebf11697610fe6504c167ed6ac8)
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