mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-27 14:34:58 +00:00
d2bb887cd1
outweight its computational costs. This patch removes all compaction table handling from the bcreader and bcwriter. For the record, here's the difference betweeen having and not having compaction tables for some tests: Test With Without Size Chg Olden/mst 5,602 5,598 +0.1% viterbi 18,026 17,795 +1.3% obsequi 162,133 166,663 -2.8% burg 224,090 228,148 -1.8% kimwitu++ 4,933,263 5,121,159 -3.8% 176.gcc 8,470,424 9,141,539 -7.3% It seems that it is more beneficial to larger files, but even on the largest test case we have (176.gcc) it only amounts ot an I/O saving of 7.3%. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33661 91177308-0d34-0410-b5e6-96231b3b80d8
143 lines
4.9 KiB
C++
143 lines
4.9 KiB
C++
//===-- Analysis/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_ANALYSIS_SLOTCALCULATOR_H
|
|
#define LLVM_ANALYSIS_SLOTCALCULATOR_H
|
|
|
|
#include <vector>
|
|
#include <map>
|
|
|
|
namespace llvm {
|
|
|
|
class Value;
|
|
class Type;
|
|
class Module;
|
|
class Function;
|
|
class SymbolTable;
|
|
class TypeSymbolTable;
|
|
class ConstantArray;
|
|
|
|
class SlotCalculator {
|
|
const Module *TheModule;
|
|
|
|
typedef std::vector<const Type*> TypeList;
|
|
typedef std::vector<const Value*> TypePlane;
|
|
std::vector<TypePlane> Table;
|
|
TypeList Types;
|
|
typedef std::map<const Value*, unsigned> NodeMapType;
|
|
NodeMapType NodeMap;
|
|
|
|
typedef std::map<const Type*, unsigned> TypeMapType;
|
|
TypeMapType TypeMap;
|
|
|
|
/// ConstantStrings - If we are indexing for a bytecode file, this keeps track
|
|
/// of all of the constants strings that need to be emitted.
|
|
std::vector<const ConstantArray*> ConstantStrings;
|
|
|
|
/// 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;
|
|
unsigned ModuleTypeLevel;
|
|
|
|
/// ModuleContainsAllFunctionConstants - This flag is set to true if all
|
|
/// function constants are incorporated into the module constant table. This
|
|
/// is only possible if building information for a bytecode file.
|
|
bool ModuleContainsAllFunctionConstants;
|
|
|
|
SlotCalculator(const SlotCalculator &); // DO NOT IMPLEMENT
|
|
void operator=(const SlotCalculator &); // DO NOT IMPLEMENT
|
|
public:
|
|
SlotCalculator(const Module *M);
|
|
// Start out in incorp state
|
|
SlotCalculator(const Function *F);
|
|
|
|
/// getSlot - Return the slot number of the specified value in it's type
|
|
/// plane. This returns < 0 on error!
|
|
///
|
|
int getSlot(const Value *V) const;
|
|
int getSlot(const Type* T) const;
|
|
|
|
inline unsigned getNumPlanes() const { return Table.size(); }
|
|
inline unsigned getNumTypes() const { return Types.size(); }
|
|
|
|
inline unsigned getModuleLevel(unsigned Plane) const {
|
|
return Plane < ModuleLevel.size() ? ModuleLevel[Plane] : 0;
|
|
}
|
|
|
|
/// Returns the number of types in the type list that are at module level
|
|
inline unsigned getModuleTypeLevel() const {
|
|
return ModuleTypeLevel;
|
|
}
|
|
|
|
TypePlane &getPlane(unsigned Plane);
|
|
TypeList& getTypes() { return Types; }
|
|
|
|
/// incorporateFunction/purgeFunction - 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();
|
|
|
|
/// string_iterator/string_begin/end - Access the list of module-level
|
|
/// constant strings that have been incorporated. This is only applicable to
|
|
/// bytecode files.
|
|
typedef std::vector<const ConstantArray*>::const_iterator string_iterator;
|
|
string_iterator string_begin() const { return ConstantStrings.begin(); }
|
|
string_iterator string_end() const { return ConstantStrings.end(); }
|
|
|
|
private:
|
|
// 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 *V);
|
|
int getOrCreateSlot(const Type *T);
|
|
|
|
// 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);
|
|
int insertType(const Type *T, bool dontIgnore = false);
|
|
|
|
// doInsertValue - Small helper function to be called only be insertVal.
|
|
int doInsertValue(const Value *V);
|
|
int doInsertType(const Type *T);
|
|
|
|
// 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 processTypeSymbolTable(const TypeSymbolTable *ST);
|
|
void processValueSymbolTable(const SymbolTable *ST);
|
|
void processSymbolTableConstants(const SymbolTable *ST);
|
|
|
|
// insertPrimitives - helper for constructors to insert primitive types.
|
|
void insertPrimitives();
|
|
};
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif
|