1//===-- Bitcode/Reader/MetadataLoader.h - Load Metadatas -------*- C++ -*-====//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This class handles loading Metadatas.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_BITCODE_READER_METADATALOADER_H
14#define LLVM_LIB_BITCODE_READER_METADATALOADER_H
15
16#include "llvm/Support/Error.h"
17
18#include <functional>
19#include <memory>
20
21namespace llvm {
22class BasicBlock;
23class BitcodeReaderValueList;
24class BitstreamCursor;
25class DISubprogram;
26class Function;
27class Instruction;
28class MDNode;
29class Metadata;
30class Module;
31class Type;
32template <typename T> class ArrayRef;
33
34typedef std::function<Type *(unsigned)> GetTypeByIDTy;
35
36typedef std::function<unsigned(unsigned, unsigned)> GetContainedTypeIDTy;
37
38typedef std::function<void(Metadata **, unsigned, GetTypeByIDTy,
39 GetContainedTypeIDTy)>
40 MDTypeCallbackTy;
41
42struct MetadataLoaderCallbacks {
43 GetTypeByIDTy GetTypeByID;
44 GetContainedTypeIDTy GetContainedTypeID;
45 std::optional<MDTypeCallbackTy> MDType;
46};
47
48/// Helper class that handles loading Metadatas and keeping them available.
49class MetadataLoader {
50 class MetadataLoaderImpl;
51 std::unique_ptr<MetadataLoaderImpl> Pimpl;
52 Error parseMetadata(bool ModuleLevel);
53
54public:
55 ~MetadataLoader();
56 MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
57 BitcodeReaderValueList &ValueList, bool IsImporting,
58 MetadataLoaderCallbacks Callbacks);
59 MetadataLoader &operator=(MetadataLoader &&);
60 MetadataLoader(MetadataLoader &&);
61
62 // Parse a module metadata block
63 Error parseModuleMetadata() { return parseMetadata(ModuleLevel: true); }
64
65 // Parse a function metadata block
66 Error parseFunctionMetadata() { return parseMetadata(ModuleLevel: false); }
67
68 /// Set the mode to strip TBAA metadata on load.
69 void setStripTBAA(bool StripTBAA = true);
70
71 /// Return true if the Loader is stripping TBAA metadata.
72 bool isStrippingTBAA();
73
74 // Return true there are remaining unresolved forward references.
75 bool hasFwdRefs() const;
76
77 /// Return the given metadata, creating a replaceable forward reference if
78 /// necessary.
79 Metadata *getMetadataFwdRefOrLoad(unsigned Idx);
80
81 /// Return the DISubprogram metadata for a Function if any, null otherwise.
82 DISubprogram *lookupSubprogramForFunction(Function *F);
83
84 /// Parse a `METADATA_ATTACHMENT` block for a function.
85 Error parseMetadataAttachment(Function &F,
86 ArrayRef<Instruction *> InstructionList);
87
88 /// Parse a `METADATA_KIND` block for the current module.
89 Error parseMetadataKinds();
90
91 unsigned size() const;
92 void shrinkTo(unsigned N);
93
94 /// Perform bitcode upgrades on llvm.dbg.* calls.
95 void upgradeDebugIntrinsics(Function &F);
96
97 /// Mark any domains in \p ScopeList that don't have a disjointness
98 /// flag as non-disjoint. Returns the original list if there are no changes.
99 MDNode *upgradeAliasScopeList(MDNode *ScopeList);
100};
101}
102
103#endif // LLVM_LIB_BITCODE_READER_METADATALOADER_H
104