//===- 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. // // Note that the performance of this library is not terribly important, because // it shouldn't be used by JIT type applications... so it is not a huge focus // at least. :) // //===----------------------------------------------------------------------===// #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 "Support/DataTypes.h" #include #include namespace llvm { class BytecodeWriter { std::vector &Out; SlotCalculator Table; public: BytecodeWriter(std::vector &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 &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 outputSymbolTable(const SymbolTable &ST); void outputTypes(unsigned StartNo); void outputConstantsInPlane(const std::vector &Plane, unsigned StartNo); void outputConstant(const Constant *CPV); 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); /// Emit the minimal number of bytes that will bring us to 32 bit alignment. /// @brief 32-bit alignment output primitive inline void align32(); inline void output(const std::string &s, bool Aligned = true); 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