diff options
author | Chris Lattner <sabre@nondot.org> | 2007-04-23 16:04:05 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-04-23 16:04:05 +0000 |
commit | 36d5e7d31be61f631ace0488f0d6cd71b8f31a16 (patch) | |
tree | ab799d8bdf8f375e4d530cc9babfd8f7314a6a6d /include/llvm/Bitcode/BitCodes.h | |
parent | a18b9657528916b9bd5edcc1d3b6db571327d40c (diff) | |
download | llvm-36d5e7d31be61f631ace0488f0d6cd71b8f31a16.tar.gz llvm-36d5e7d31be61f631ace0488f0d6cd71b8f31a16.tar.bz2 llvm-36d5e7d31be61f631ace0488f0d6cd71b8f31a16.tar.xz |
first part of implementation of abbrevs. The writer isn't fully there yet and the
reader doesn't handle them at all yet.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36363 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Bitcode/BitCodes.h')
-rw-r--r-- | include/llvm/Bitcode/BitCodes.h | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/include/llvm/Bitcode/BitCodes.h b/include/llvm/Bitcode/BitCodes.h index a3b741b2e9..98d18b194b 100644 --- a/include/llvm/Bitcode/BitCodes.h +++ b/include/llvm/Bitcode/BitCodes.h @@ -18,6 +18,10 @@ #ifndef LLVM_BITCODE_BITCODES_H #define LLVM_BITCODE_BITCODES_H +#include "llvm/ADT/SmallVector.h" +#include "llvm/Support/DataTypes.h" +#include <cassert> + namespace llvm { namespace bitc { enum StandardWidths { @@ -31,16 +35,71 @@ namespace bitc { enum FixedCodes { END_BLOCK = 0, // Must be zero to guarantee termination for broken bitcode. ENTER_SUBBLOCK = 1, + + /// DEFINE_ABBREV - Defines an abbrev for the current block. It consists + /// of a vbr5 for # operand infos. Each operand info is emitted with a + /// single bit to indicate if it is a literal encoding. If so, the value is + /// emitted with a vbr8. If not, the encoding is emitted as 3 bits followed + /// by the info value as a vbr5 if needed. + DEFINE_ABBREV = 2, - // Two codes are reserved for defining abbrevs and for emitting an - // unabbreviated record. - DEFINE_ABBREVS = 2, + // UNABBREV_RECORDs are emitted with a vbr6 for the record code, followed by + // a vbr6 for the # operands, followed by vbr6's for each operand. UNABBREV_RECORD = 3, // This is not a code, this is a marker for the first abbrev assignment. FIRST_ABBREV = 4 }; } // End bitc namespace + +/// BitCodeAbbrevOp - This describes one or more operands in an abbreviation. +/// This is actually a union of two different things: +/// 1. It could be a literal integer value ("the operand is always 17"). +/// 2. It could be an encoding specification ("this operand encoded like so"). +/// +class BitCodeAbbrevOp { + uint64_t Val; // A literal value or data for an encoding. + bool IsLiteral : 1; // Indicate whether this is a literal value or not. + unsigned Enc : 3; // The encoding to use. +public: + enum Encoding { + FixedWidth = 1, // A fixed with field, Val specifies number of bits. + VBR = 2 // A VBR field where Val specifies the width of each chunk. + }; + + BitCodeAbbrevOp(uint64_t V) : Val(V), IsLiteral(true) {} + BitCodeAbbrevOp(Encoding E, uint64_t Data) + : Val(Data), IsLiteral(false), Enc(E) {} + + bool isLiteral() const { return IsLiteral; } + bool isEncoding() const { return !IsLiteral; } + + // Accessors for literals. + uint64_t getLiteralValue() const { assert(isLiteral()); return Val; } + + // Accessors for encoding info. + Encoding getEncoding() const { assert(isEncoding()); return (Encoding)Enc; } + uint64_t getEncodingData() const { assert(isEncoding()); return Val; } + + bool hasEncodingData() const { return hasEncodingData(getEncoding()); } + static bool hasEncodingData(Encoding E) { + return true; + } +}; + +class BitCodeAbbrev { + SmallVector<BitCodeAbbrevOp, 8> OperandList; +public: + + unsigned getNumOperandInfos() const { return OperandList.size(); } + const BitCodeAbbrevOp &getOperandInfo(unsigned N) const { + return OperandList[N]; + } + + void Add(const BitCodeAbbrevOp &OpInfo) { + OperandList.push_back(OpInfo); + } +}; } // End llvm namespace #endif |