1//===- llvm/IR/TypeFinder.h - Class to find used struct types ---*- 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 file contains the declaration of the TypeFinder class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_IR_TYPEFINDER_H
14#define LLVM_IR_TYPEFINDER_H
15
16#include "llvm/ADT/DenseSet.h"
17#include "llvm/IR/Attributes.h"
18#include <cstddef>
19#include <vector>
20
21namespace llvm {
22
23class MDNode;
24class Module;
25class StructType;
26class Type;
27class Value;
28
29/// TypeFinder - Walk over a module, identifying all of the types that are
30/// used by the module.
31class TypeFinder {
32 // To avoid walking constant expressions multiple times and other IR
33 // objects, we keep several helper maps.
34 DenseSet<const Value*> VisitedConstants;
35 DenseSet<const MDNode *> VisitedMetadata;
36 DenseSet<AttributeList> VisitedAttributes;
37 DenseSet<Type*> VisitedTypes;
38
39 std::vector<StructType*> StructTypes;
40 bool OnlyNamed = false;
41
42public:
43 TypeFinder() = default;
44
45 void run(const Module &M, bool onlyNamed);
46 void clear();
47
48 using iterator = std::vector<StructType*>::iterator;
49 using const_iterator = std::vector<StructType*>::const_iterator;
50
51 iterator begin() { return StructTypes.begin(); }
52 iterator end() { return StructTypes.end(); }
53
54 const_iterator begin() const { return StructTypes.begin(); }
55 const_iterator end() const { return StructTypes.end(); }
56
57 bool empty() const { return StructTypes.empty(); }
58 size_t size() const { return StructTypes.size(); }
59 iterator erase(iterator I, iterator E) { return StructTypes.erase(first: I, last: E); }
60
61 StructType *&operator[](unsigned Idx) { return StructTypes[Idx]; }
62
63 DenseSet<const MDNode *> &getVisitedMetadata() { return VisitedMetadata; }
64
65private:
66 /// incorporateType - This method adds the type to the list of used
67 /// structures if it's not in there already.
68 void incorporateType(Type *Ty);
69
70 /// incorporateValue - This method is used to walk operand lists finding types
71 /// hiding in constant expressions and other operands that won't be walked in
72 /// other ways. GlobalValues, basic blocks, instructions, and inst operands
73 /// are all explicitly enumerated.
74 void incorporateValue(const Value *V);
75
76 /// incorporateMDNode - This method is used to walk the operands of an MDNode
77 /// to find types hiding within.
78 void incorporateMDNode(const MDNode *V);
79
80 /// Incorporate types referenced by attributes.
81 void incorporateAttributes(AttributeList AL);
82};
83
84} // end namespace llvm
85
86#endif // LLVM_IR_TYPEFINDER_H
87

source code of llvm/include/llvm/IR/TypeFinder.h