//===-- llvm/SlotCalculator.h - Calculate value slots -----------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This class calculates the slots that values will land in. This is useful for // when writing bytecode or assembly out, because you have to know these things. // // Specifically, this class calculates the "type plane numbering" that you see // for a function if you strip out all of the symbols in it. For assembly // writing, this is used when a symbol does not have a name. For bytecode // writing, this is always used, and the symbol table is added on later. // //===----------------------------------------------------------------------===// #ifndef LLVM_SLOTCALCULATOR_H #define LLVM_SLOTCALCULATOR_H #include #include class Value; class Module; class Function; class SymbolTable; class SlotCalculator { const Module *TheModule; bool IgnoreNamedNodes; // Shall we not count named nodes? typedef std::vector TypePlane; std::vector Table; std::map NodeMap; // ModuleLevel - Used to keep track of which values belong to the module, // and which values belong to the currently incorporated function. // std::vector ModuleLevel; public: SlotCalculator(const Module *M, bool IgnoreNamed); // Start out in incorp state SlotCalculator(const Function *M, bool IgnoreNamed); inline ~SlotCalculator() {} // getSlot returns < 0 on error! int getSlot(const Value *D) const; inline unsigned getNumPlanes() const { return Table.size(); } inline unsigned getModuleLevel(unsigned Plane) const { return Plane < ModuleLevel.size() ? ModuleLevel[Plane] : 0; } inline const TypePlane &getPlane(unsigned Plane) const { return Table[Plane]; } // If you'd like to deal with a function, use these two methods to get its // data into the SlotCalculator! // void incorporateFunction(const Function *F); void purgeFunction(); protected: // getOrCreateSlot - Values can be crammed into here at will... if // they haven't been inserted already, they get inserted, otherwise // they are ignored. // int getOrCreateSlot(const Value *D); // insertValue - Insert a value into the value table... Return the // slot that it occupies, or -1 if the declaration is to be ignored // because of the IgnoreNamedNodes flag. // int insertValue(const Value *D, bool dontIgnore = false); // doInsertValue - Small helper function to be called only be insertVal. int doInsertValue(const Value *D); // processModule - Process all of the module level function declarations and // types that are available. // void processModule(); // processSymbolTable - Insert all of the values in the specified symbol table // into the values table... // void processSymbolTable(const SymbolTable *ST); void processSymbolTableConstants(const SymbolTable *ST); }; #endif