llvm-6502/lib/Bytecode/Writer/SlotCalculator.h
Chris Lattner 8ce750145d The only clients of the slot calculator are now the asmwriter and bcwriter.
Since this really only makes sense for these two, change hte instance variable
to reflect whether we are writing a bytecode file or not.  This makes it
reasonable to add bcwriter specific stuff to it as necessary.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10837 91177308-0d34-0410-b5e6-96231b3b80d8
2004-01-14 02:49:34 +00:00

106 lines
3.4 KiB
C++

//===-- 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 <vector>
#include <map>
namespace llvm {
class Value;
class Module;
class Function;
class SymbolTable;
class SlotCalculator {
const Module *TheModule;
// BuildBytecodeInfo - If true, this is the creating information for the
// bytecode writer, if false, we are building information for the assembly
// emitter. The assembly emitter doesn't need named objects numbered, among
// other differences.
bool BuildBytecodeInfo;
typedef std::vector<const Value*> TypePlane;
std::vector<TypePlane> Table;
std::map<const Value *, unsigned> NodeMap;
// ModuleLevel - Used to keep track of which values belong to the module,
// and which values belong to the currently incorporated function.
//
std::vector<unsigned> ModuleLevel;
public:
SlotCalculator(const Module *M, bool BuildBytecodeInfo);
// Start out in incorp state
SlotCalculator(const Function *M, bool BuildBytecodeInfo);
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);
};
} // End llvm namespace
#endif