llvm-6502/lib/Bytecode/Writer/WriterInternals.h
Reid Spencer ef9b9a7939 For PR411:
This patch replaces the SymbolTable class with ValueSymbolTable which does
not support types planes. This means that all symbol names in LLVM must now
be unique. The patch addresses the necessary changes to deal with this and
removes code no longer needed as a result. This completes the bulk of the
changes for this PR. Some cleanup patches will follow.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33918 91177308-0d34-0410-b5e6-96231b3b80d8
2007-02-05 20:47:22 +00:00

142 lines
5.1 KiB
C++

//===- WriterInternals.h - Data structures shared by the Writer -*- 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 header defines the interface used between components of the bytecode
// writer.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIB_BYTECODE_WRITER_WRITERINTERNALS_H
#define LLVM_LIB_BYTECODE_WRITER_WRITERINTERNALS_H
#include "SlotCalculator.h"
#include "llvm/Bytecode/Writer.h"
#include "llvm/Bytecode/Format.h"
#include "llvm/Instruction.h"
#include "llvm/Support/DataTypes.h"
#include <string>
#include <vector>
namespace llvm {
class InlineAsm;
class TypeSymbolTable;
class ValueSymbolTable;
class BytecodeWriter {
std::vector<unsigned char> &Out;
SlotCalculator Table;
public:
BytecodeWriter(std::vector<unsigned char> &o, const Module *M);
private:
void outputConstants(bool isFunction);
void outputConstantStrings();
void outputFunction(const Function *F);
void outputCompactionTable();
void outputCompactionTypes(unsigned StartNo);
void outputCompactionTablePlane(unsigned PlaneNo,
const std::vector<const Value*> &TypePlane,
unsigned StartNo);
void outputInstructions(const Function *F);
void outputInstruction(const Instruction &I);
void outputInstructionFormat0(const Instruction *I, unsigned Opcode,
const SlotCalculator &Table,
unsigned Type);
void outputInstrVarArgsCall(const Instruction *I,
unsigned Opcode,
const SlotCalculator &Table,
unsigned Type) ;
inline void outputInstructionFormat1(const Instruction *I,
unsigned Opcode,
unsigned *Slots,
unsigned Type) ;
inline void outputInstructionFormat2(const Instruction *I,
unsigned Opcode,
unsigned *Slots,
unsigned Type) ;
inline void outputInstructionFormat3(const Instruction *I,
unsigned Opcode,
unsigned *Slots,
unsigned Type) ;
void outputModuleInfoBlock(const Module *C);
void outputTypeSymbolTable(const TypeSymbolTable &TST);
void outputValueSymbolTable(const ValueSymbolTable &ST);
void outputTypes(unsigned StartNo);
void outputConstantsInPlane(const std::vector<const Value*> &Plane,
unsigned StartNo);
void outputConstant(const Constant *CPV);
void outputInlineAsm(const InlineAsm *IA);
void outputType(const Type *T);
/// @brief Unsigned integer output primitive
inline void output(unsigned i, int pos = -1);
/// @brief Signed integer output primitive
inline void output(int i);
/// @brief 64-bit variable bit rate output primitive.
inline void output_vbr(uint64_t i);
/// @brief 32-bit variable bit rate output primitive.
inline void output_vbr(unsigned i);
/// @brief Signed 64-bit variable bit rate output primitive.
inline void output_vbr(int64_t i);
/// @brief Signed 32-bit variable bit rate output primitive.
inline void output_vbr(int i);
inline void output(const std::string &s);
inline void output_data(const void *Ptr, const void *End);
inline void output_float(float& FloatVal);
inline void output_double(double& DoubleVal);
inline void output_typeid(unsigned i);
inline size_t size() const { return Out.size(); }
inline void resize(size_t S) { Out.resize(S); }
friend class BytecodeBlock;
};
/// BytecodeBlock - Little helper class is used by the bytecode writer to help
/// do backpatching of bytecode block sizes really easily. It backpatches when
/// it goes out of scope.
///
class BytecodeBlock {
unsigned Id;
unsigned Loc;
BytecodeWriter& Writer;
/// ElideIfEmpty - If this is true and the bytecode block ends up being empty,
/// the block can remove itself from the output stream entirely.
bool ElideIfEmpty;
/// If this is true then the block is written with a long format header using
/// a uint (32-bits) for both the block id and size. Otherwise, it uses the
/// short format which is a single uint with 27 bits for size and 5 bits for
/// the block id. Both formats are used in a bc file with version 1.3.
/// Previously only the long format was used.
bool HasLongFormat;
BytecodeBlock(const BytecodeBlock &); // do not implement
void operator=(const BytecodeBlock &); // do not implement
public:
inline BytecodeBlock(unsigned ID, BytecodeWriter& w,
bool elideIfEmpty = false, bool hasLongFormat = false);
inline ~BytecodeBlock();
};
} // End llvm namespace
#endif