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