14068e1af9ff68b6b5fdb3233f1304e53f1bf179aChandler Carruth//===-- llvm/IR/TypeFinder.h - Class to find used struct types --*- C++ -*-===//
2573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling//
3573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling//                     The LLVM Compiler Infrastructure
4573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling//
5573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling// This file is distributed under the University of Illinois Open Source
6573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling// License. See LICENSE.TXT for details.
7573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling//
8573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling//===----------------------------------------------------------------------===//
9573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling//
10573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling// This file contains the declaration of the TypeFinder class.
11573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling//
12573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling//===----------------------------------------------------------------------===//
13573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
144068e1af9ff68b6b5fdb3233f1304e53f1bf179aChandler Carruth#ifndef LLVM_IR_TYPEFINDER_H
154068e1af9ff68b6b5fdb3233f1304e53f1bf179aChandler Carruth#define LLVM_IR_TYPEFINDER_H
16573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
17573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling#include "llvm/ADT/DenseSet.h"
18573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling#include <vector>
19573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
20573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendlingnamespace llvm {
21573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
22573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendlingclass MDNode;
23573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendlingclass Module;
24573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendlingclass StructType;
25573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendlingclass Type;
26573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendlingclass Value;
27573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
28573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling/// TypeFinder - Walk over a module, identifying all of the types that are
29573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling/// used by the module.
30573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendlingclass TypeFinder {
31573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  // To avoid walking constant expressions multiple times and other IR
32573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  // objects, we keep several helper maps.
33573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  DenseSet<const Value*> VisitedConstants;
34573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  DenseSet<Type*> VisitedTypes;
35573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
36573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  std::vector<StructType*> StructTypes;
37573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  bool OnlyNamed;
38573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
39573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendlingpublic:
40573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  TypeFinder() : OnlyNamed(false) {}
41573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
42573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  void run(const Module &M, bool onlyNamed);
43573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  void clear();
44573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
45573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  typedef std::vector<StructType*>::iterator iterator;
46573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  typedef std::vector<StructType*>::const_iterator const_iterator;
47573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
48573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  iterator begin() { return StructTypes.begin(); }
49573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  iterator end() { return StructTypes.end(); }
50573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
51573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  const_iterator begin() const { return StructTypes.begin(); }
52573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  const_iterator end() const { return StructTypes.end(); }
53573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
54573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  bool empty() const { return StructTypes.empty(); }
55573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  size_t size() const { return StructTypes.size(); }
56573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  iterator erase(iterator I, iterator E) { return StructTypes.erase(I, E); }
57573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
58573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  StructType *&operator[](unsigned Idx) { return StructTypes[Idx]; }
59573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
60573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendlingprivate:
61573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  /// incorporateType - This method adds the type to the list of used
62573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  /// structures if it's not in there already.
63573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  void incorporateType(Type *Ty);
64573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
65573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  /// incorporateValue - This method is used to walk operand lists finding types
66573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  /// hiding in constant expressions and other operands that won't be walked in
67573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  /// other ways.  GlobalValues, basic blocks, instructions, and inst operands
68573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  /// are all explicitly enumerated.
69573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  void incorporateValue(const Value *V);
70573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
71573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  /// incorporateMDNode - This method is used to walk the operands of an MDNode
72573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  /// to find types hiding within.
73573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling  void incorporateMDNode(const MDNode *V);
74573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling};
75573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
76573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling} // end llvm namespace
77573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling
78573e97326766359d3a9747eed7b7d47b6c33fa0fBill Wendling#endif
79