summaryrefslogtreecommitdiff
path: root/source/slang/ir-serialize.h
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2019-05-31 17:20:37 -0400
committerGitHub <noreply@github.com>2019-05-31 17:20:37 -0400
commit6cbc3929a54d37bd23cb5efa8e3320ba02f78b2f (patch)
tree5a23cb47782e9e2a77762c90dd35da1005eba8d0 /source/slang/ir-serialize.h
parentb81ff3ef968d1cc4e954b31a1812b3c391d17b02 (diff)
Use slang- prefix on slang compiler and core source (#973)
* Prefixing source files in source/slang with slang- * Prefix source in source/slang with slang- prefix. * Rename core source files with slang- prefix. * Update project files. * Fix problems from automatic merge.
Diffstat (limited to 'source/slang/ir-serialize.h')
-rw-r--r--source/slang/ir-serialize.h549
1 files changed, 0 insertions, 549 deletions
diff --git a/source/slang/ir-serialize.h b/source/slang/ir-serialize.h
deleted file mode 100644
index 8be852e95..000000000
--- a/source/slang/ir-serialize.h
+++ /dev/null
@@ -1,549 +0,0 @@
-// ir-serialize.h
-#ifndef SLANG_IR_SERIALIZE_H_INCLUDED
-#define SLANG_IR_SERIALIZE_H_INCLUDED
-
-#include "../core/basic.h"
-#include "../core/stream.h"
-
-#include "../core/slang-object-scope-manager.h"
-
-#include "ir.h"
-
-// For TranslationUnitRequest
-#include "compiler.h"
-
-namespace Slang {
-
-class StringRepresentationCache
-{
- public:
- typedef StringSlicePool::Handle Handle;
-
- struct Entry
- {
- uint32_t m_startIndex;
- uint32_t m_numChars;
- RefObject* m_object; ///< Could be nullptr, Name, or StringRepresentation.
- };
-
- /// Get as a name
- Name* getName(Handle handle);
- /// Get as a string
- String getString(Handle handle);
- /// Get as string representation
- StringRepresentation* getStringRepresentation(Handle handle);
- /// Get as a string slice
- UnownedStringSlice getStringSlice(Handle handle) const;
- /// Get as a 0 terminated 'c style' string
- char* getCStr(Handle handle);
-
- /// Initialize a cache to use a string table, namePool and scopeManager
- void init(const List<char>* stringTable, NamePool* namePool, ObjectScopeManager* scopeManager);
-
- /// Ctor
- StringRepresentationCache();
-
- protected:
- ObjectScopeManager* m_scopeManager;
- NamePool* m_namePool;
- const List<char>* m_stringTable;
- List<Entry> m_entries;
-};
-
-struct SerialStringTableUtil
-{
- /// Convert a pool into a string table
- static void encodeStringTable(const StringSlicePool& pool, List<char>& stringTable);
- static void encodeStringTable(const UnownedStringSlice* slices, size_t numSlices, List<char>& stringTable);
- /// Appends the decoded strings into slicesOut
- static void appendDecodedStringTable(const List<char>& stringTable, List<UnownedStringSlice>& slicesOut);
- /// Decodes a string table (and does so such that the indices are compatible with StringSlicePool)
- static void decodeStringTable(const List<char>& stringTable, List<UnownedStringSlice>& slicesOut);
-
- /// Produces an index map, from slices to indices in pool
- static void calcStringSlicePoolMap(const List<UnownedStringSlice>& slices, StringSlicePool& pool, List<StringSlicePool::Handle>& indexMap);
-};
-
-// Pre-declare
-class Name;
-
-struct IRSerialData
-{
- typedef IRSerialData ThisType;
-
- enum class InstIndex : uint32_t;
- enum class StringIndex : uint32_t;
- enum class ArrayIndex : uint32_t;
-
- enum class RawSourceLoc : SourceLoc::RawValue; ///< This is just to copy over source loc data (ie not strictly serialize)
- enum class StringOffset : uint32_t; ///< Offset into the m_stringsBuffer
-
- typedef uint32_t SizeType;
-
- static const StringIndex kNullStringIndex = StringIndex(StringSlicePool::kNullHandle);
- static const StringIndex kEmptyStringIndex = StringIndex(StringSlicePool::kEmptyHandle);
-
- /// A run of instructions
- struct InstRun
- {
- typedef InstRun ThisType;
- SLANG_FORCE_INLINE bool operator==(const ThisType& rhs) const
- {
- return m_parentIndex == rhs.m_parentIndex &&
- m_startInstIndex == rhs.m_startInstIndex &&
- m_numChildren == rhs.m_numChildren;
- }
- SLANG_FORCE_INLINE bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }
-
- InstIndex m_parentIndex; ///< The parent instruction
- InstIndex m_startInstIndex; ///< The index to the first instruction
- SizeType m_numChildren; ///< The number of children
- };
-
- struct SourceLocRun
- {
- typedef SourceLocRun ThisType;
-
- bool operator==(const ThisType& rhs) const { return m_sourceLoc == rhs.m_sourceLoc && m_startInstIndex == rhs.m_startInstIndex && m_numInst == rhs.m_numInst; }
- bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }
- bool operator<(const ThisType& rhs) const { return m_sourceLoc < rhs.m_sourceLoc; }
-
- uint32_t m_sourceLoc; ///< The source location
- InstIndex m_startInstIndex; ///< The index to the first instruction
- SizeType m_numInst; ///< The number of children
- };
-
- struct PayloadInfo
- {
- uint8_t m_numOperands;
- uint8_t m_numStrings;
- };
-
- struct DebugSourceInfo
- {
- typedef DebugSourceInfo ThisType;
-
- bool operator==(const ThisType& rhs) const
- {
- return m_pathIndex == rhs.m_pathIndex &&
- m_startSourceLoc == rhs.m_startSourceLoc &&
- m_endSourceLoc == rhs.m_endSourceLoc &&
- m_numLineInfos == rhs.m_numLineInfos &&
- m_lineInfosStartIndex == rhs.m_lineInfosStartIndex &&
- m_numLineInfos == rhs.m_numLineInfos;
- }
- bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }
-
- bool isSourceLocInRange(uint32_t sourceLoc) const { return sourceLoc >= m_startSourceLoc && sourceLoc <= m_endSourceLoc; }
-
- StringIndex m_pathIndex; ///< Index to the string table
- uint32_t m_startSourceLoc; ///< The offset to the source
- uint32_t m_endSourceLoc; ///< The number of bytes in the source
-
- uint32_t m_numLines; ///< Total number of lines in source file
-
- uint32_t m_lineInfosStartIndex; ///< Index into m_debugLineInfos
- uint32_t m_numLineInfos; ///< The number of line infos
-
- uint32_t m_adjustedLineInfosStartIndex; ///< Adjusted start index
- uint32_t m_numAdjustedLineInfos; ///< The number of line infos
- };
-
- struct DebugLineInfo
- {
- typedef DebugLineInfo ThisType;
- bool operator<(const ThisType& rhs) const { return m_lineStartOffset < rhs.m_lineStartOffset; }
- bool operator==(const ThisType& rhs) const
- {
- return m_lineStartOffset == rhs.m_lineStartOffset &&
- m_lineIndex == rhs.m_lineIndex;
- }
- bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }
-
- uint32_t m_lineStartOffset; ///< The offset into the source file
- uint32_t m_lineIndex; ///< Original line index
- };
-
- struct DebugAdjustedLineInfo
- {
- typedef DebugAdjustedLineInfo ThisType;
- bool operator==(const ThisType& rhs) const
- {
- return m_lineInfo == rhs.m_lineInfo &&
- m_adjustedLineIndex == rhs.m_adjustedLineIndex &&
- m_pathStringIndex == rhs.m_pathStringIndex;
- }
- bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }
- bool operator<(const ThisType& rhs) const { return m_lineInfo < rhs.m_lineInfo; }
-
- DebugLineInfo m_lineInfo;
- uint32_t m_adjustedLineIndex; ///< The line index with the adjustment (if there is any). Is 0 if m_pathStringIndex is 0.
- StringIndex m_pathStringIndex; ///< The path as an index
- };
-
- // Instruction...
- // We can store SourceLoc values separately. Just store per index information.
- // Parent information is stored in m_childRuns
- // Decoration information is stored in m_decorationRuns
- struct Inst
- {
- typedef Inst ThisType;
- enum
- {
- kMaxOperands = 2, ///< Maximum number of operands that can be held in an instruction (otherwise held 'externally')
- };
-
- // NOTE! Can't change order or list without changing appropriate s_payloadInfos
- enum class PayloadType : uint8_t
- {
- // First 3 must be in this order so a cast from 0-2 is directly represented as number of operands
- Empty, ///< Has no payload (or operands)
- Operand_1, ///< 1 Operand
- Operand_2, ///< 2 Operands
-
- OperandAndUInt32, ///< 1 Operand and a single UInt32
- OperandExternal, ///< Operands are held externally
- String_1, ///< 1 String
- String_2, ///< 2 Strings
- UInt32, ///< Holds an unsigned 32 bit integral (might represent a type)
- Float64,
- Int64,
-
- CountOf,
- };
-
- /// Get the number of operands
- SLANG_FORCE_INLINE int getNumOperands() const;
-
- bool operator==(const ThisType& rhs) const;
-
- SLANG_FORCE_INLINE bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }
-
- uint8_t m_op; ///< For now one of IROp
- PayloadType m_payloadType; ///< The type of payload
- uint16_t m_pad0; ///< Not currently used
-
- InstIndex m_resultTypeIndex; //< 0 if has no type. The result type of this instruction
-
- struct ExternalOperandPayload
- {
- ArrayIndex m_arrayIndex; ///< Index into the m_externalOperands table
- SizeType m_size; ///< The amount of entries in that table
- };
-
- struct OperandAndUInt32
- {
- InstIndex m_operand;
- uint32_t m_uint32;
- };
-
- union Payload
- {
- double m_float64;
- int64_t m_int64;
- uint32_t m_uint32; ///< Unsigned integral value
- IRFloatingPointValue m_float; ///< Floating point value
- IRIntegerValue m_int; ///< Integral value
- InstIndex m_operands[kMaxOperands]; ///< For items that 2 or less operands it can use this.
- StringIndex m_stringIndices[kMaxOperands];
- ExternalOperandPayload m_externalOperand; ///< Operands are stored in an an index of an operand array
- OperandAndUInt32 m_operandAndUInt32;
- };
-
- Payload m_payload;
- };
-
- /// Clear to initial state
- void clear();
- /// Get the operands of an instruction
- SLANG_FORCE_INLINE int getOperands(const Inst& inst, const InstIndex** operandsOut) const;
-
- /// ==
- bool operator==(const ThisType& rhs) const;
- SLANG_FORCE_INLINE bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }
-
- /// Calculate the amount of memory used by this IRSerialData
- size_t calcSizeInBytes() const;
-
- /// Ctor
- IRSerialData();
-
- List<Inst> m_insts; ///< The instructions
-
- List<InstRun> m_childRuns; ///< Holds the information about children that belong to an instruction
-
- List<InstIndex> m_externalOperands; ///< Holds external operands (for instructions with more than kNumOperands)
-
- List<char> m_stringTable; ///< All strings. Indexed into by StringIndex
-
- List<RawSourceLoc> m_rawSourceLocs; ///< A source location per instruction (saved without modification from IRInst)s
-
- // Data only set if we have debug information
-
- List<char> m_debugStringTable; ///< String table for debug use only
- List<DebugLineInfo> m_debugLineInfos; ///< Debug line information
- List<DebugAdjustedLineInfo> m_debugAdjustedLineInfos; ///< Adjusted line infos
- List<DebugSourceInfo> m_debugSourceInfos; ///< Debug source information
- List<SourceLocRun> m_debugSourceLocRuns; ///< Runs of instructions that use a source loc
-
- static const PayloadInfo s_payloadInfos[int(Inst::PayloadType::CountOf)];
-};
-
-// --------------------------------------------------------------------------
-SLANG_FORCE_INLINE int IRSerialData::Inst::getNumOperands() const
-{
- return (m_payloadType == PayloadType::OperandExternal) ? m_payload.m_externalOperand.m_size : s_payloadInfos[int(m_payloadType)].m_numOperands;
-}
-
-// --------------------------------------------------------------------------
-SLANG_FORCE_INLINE bool IRSerialData::Inst::operator==(const ThisType& rhs) const
-{
- if (m_op == rhs.m_op &&
- m_payloadType == rhs.m_payloadType &&
- m_resultTypeIndex == rhs.m_resultTypeIndex)
- {
- switch (m_payloadType)
- {
- case PayloadType::Empty:
- {
- return true;
- }
- case PayloadType::Operand_1:
- case PayloadType::String_1:
- case PayloadType::UInt32:
- {
- return m_payload.m_operands[0] == rhs.m_payload.m_operands[0];
- }
- case PayloadType::OperandAndUInt32:
- case PayloadType::OperandExternal:
- case PayloadType::Operand_2:
- case PayloadType::String_2:
- {
- return m_payload.m_operands[0] == rhs.m_payload.m_operands[0] &&
- m_payload.m_operands[1] == rhs.m_payload.m_operands[1];
- }
- case PayloadType::Float64:
- case PayloadType::Int64:
- {
- return m_payload.m_int64 == rhs.m_payload.m_int64;
- }
- default: break;
- }
- }
-
- return false;
-}
-// --------------------------------------------------------------------------
-SLANG_FORCE_INLINE int IRSerialData::getOperands(const Inst& inst, const InstIndex** operandsOut) const
-{
- if (inst.m_payloadType == Inst::PayloadType::OperandExternal)
- {
- *operandsOut = m_externalOperands.begin() + int(inst.m_payload.m_externalOperand.m_arrayIndex);
- return int(inst.m_payload.m_externalOperand.m_size);
- }
- else
- {
- *operandsOut = inst.m_payload.m_operands;
- return s_payloadInfos[int(inst.m_payloadType)].m_numOperands;
- }
-}
-
-
-#define SLANG_FOUR_CC(c0, c1, c2, c3) ((uint32_t(c0) << 0) | (uint32_t(c1) << 8) | (uint32_t(c2) << 16) | (uint32_t(c3) << 24))
-
-#define SLANG_MAKE_COMPRESSED_FOUR_CC(fourCc) (((fourCc) & 0xffff00ff) | (uint32_t('c') << 8))
-
-struct IRSerialBinary
-{
- // http://fileformats.archiveteam.org/wiki/RIFF
- // http://www.fileformat.info/format/riff/egff.htm
-
- struct Chunk
- {
- uint32_t m_type;
- uint32_t m_size;
- };
-
- enum class CompressionType
- {
- None,
- VariableByteLite,
- };
-
-
- static const uint32_t kRiffFourCc = SLANG_FOUR_CC('R', 'I', 'F', 'F');
- static const uint32_t kSlangFourCc = SLANG_FOUR_CC('S', 'L', 'N', 'G'); ///< Holds all the slang specific chunks
-
- static const uint32_t kInstFourCc = SLANG_FOUR_CC('S', 'L', 'i', 'n');
- static const uint32_t kChildRunFourCc = SLANG_FOUR_CC('S', 'L', 'c', 'r');
- static const uint32_t kExternalOperandsFourCc = SLANG_FOUR_CC('S', 'L', 'e', 'o');
-
- static const uint32_t kCompressedInstFourCc = SLANG_MAKE_COMPRESSED_FOUR_CC(kInstFourCc);
- static const uint32_t kCompressedChildRunFourCc = SLANG_MAKE_COMPRESSED_FOUR_CC(kChildRunFourCc);
- static const uint32_t kCompressedExternalOperandsFourCc = SLANG_MAKE_COMPRESSED_FOUR_CC(kExternalOperandsFourCc);
-
- static const uint32_t kStringFourCc = SLANG_FOUR_CC('S', 'L', 's', 't');
-
- static const uint32_t kUInt32SourceLocFourCc = SLANG_FOUR_CC('S', 'r', 's', '4');
-
- static const uint32_t kDebugStringFourCc = SLANG_FOUR_CC('S', 'd', 's', 't');
- static const uint32_t kDebugLineInfoFourCc = SLANG_FOUR_CC('S', 'd', 'l', 'n');
- static const uint32_t kDebugAdjustedLineInfoFourCc = SLANG_FOUR_CC('S', 'd', 'a', 'l');
- static const uint32_t kDebugSourceInfoFourCc = SLANG_FOUR_CC('S', 'd', 's', 'o');
- static const uint32_t kDebugSourceLocRunFourCc = SLANG_FOUR_CC('S', 'd', 's', 'r');
-
- struct SlangHeader
- {
- Chunk m_chunk;
- uint32_t m_compressionType; ///< Holds the compression type used (if used at all)
- };
- struct ArrayHeader
- {
- Chunk m_chunk;
- uint32_t m_numEntries;
- };
- struct CompressedArrayHeader
- {
- Chunk m_chunk;
- uint32_t m_numEntries; ///< The number of entries
- uint32_t m_numCompressedEntries; ///< The amount of compressed entries
- };
-};
-
-
-struct IRSerialWriter
-{
- typedef IRSerialData Ser;
- typedef IRSerialBinary Bin;
-
- struct OptionFlag
- {
- typedef uint32_t Type;
- enum Enum: Type
- {
- RawSourceLocation = 0x01,
- DebugInfo = 0x02,
- };
- };
- typedef OptionFlag::Type OptionFlags;
-
- Result write(IRModule* module, SourceManager* sourceManager, OptionFlags options, IRSerialData* serialData);
-
- static Result writeStream(const IRSerialData& data, Bin::CompressionType compressionType, Stream* stream);
-
- /// Get an instruction index from an instruction
- Ser::InstIndex getInstIndex(IRInst* inst) const { return inst ? Ser::InstIndex(m_instMap[inst]) : Ser::InstIndex(0); }
-
- /// Get a slice from an index
- UnownedStringSlice getStringSlice(Ser::StringIndex index) const { return m_stringSlicePool.getSlice(StringSlicePool::Handle(index)); }
- /// Get index from string representations
- Ser::StringIndex getStringIndex(StringRepresentation* string) { return Ser::StringIndex(m_stringSlicePool.add(string)); }
- Ser::StringIndex getStringIndex(const UnownedStringSlice& slice) { return Ser::StringIndex(m_stringSlicePool.add(slice)); }
- Ser::StringIndex getStringIndex(Name* name) { return name ? getStringIndex(name->text) : Ser::kNullStringIndex; }
- Ser::StringIndex getStringIndex(const char* chars) { return Ser::StringIndex(m_stringSlicePool.add(chars)); }
- Ser::StringIndex getStringIndex(const String& string) { return Ser::StringIndex(m_stringSlicePool.add(string.getUnownedSlice())); }
-
- StringSlicePool& getStringPool() { return m_stringSlicePool; }
- StringSlicePool& getDebugStringPool() { return m_debugStringSlicePool; }
-
- IRSerialWriter() :
- m_serialData(nullptr)
- {}
-
-protected:
- class DebugSourceFile : public RefObject
- {
- public:
- DebugSourceFile(SourceFile* sourceFile, SourceLoc::RawValue baseSourceLoc):
- m_sourceFile(sourceFile),
- m_baseSourceLoc(baseSourceLoc)
- {
- // Need to know how many lines there are
- const List<uint32_t>& lineOffsets = sourceFile->getLineBreakOffsets();
-
- const auto numLineIndices = lineOffsets.getCount();
-
- // Set none as being used initially
- m_lineIndexUsed.setCount(numLineIndices);
- ::memset(m_lineIndexUsed.begin(), 0, numLineIndices * sizeof(uint8_t));
- }
- /// True if we have information on that line index
- bool hasLineIndex(int lineIndex) const { return m_lineIndexUsed[lineIndex] != 0; }
- void setHasLineIndex(int lineIndex) { m_lineIndexUsed[lineIndex] = 1; }
-
- SourceLoc::RawValue m_baseSourceLoc; ///< The base source location
-
- SourceFile* m_sourceFile; ///< The source file
- List<uint8_t> m_lineIndexUsed; ///< Has 1 if the line is used
- List<uint32_t> m_usedLineIndices; ///< Holds the lines that have been hit
-
- List<IRSerialData::DebugLineInfo> m_lineInfos; ///< The line infos
- List<IRSerialData::DebugAdjustedLineInfo> m_adjustedLineInfos; ///< The adjusted line infos
- };
-
- void _addInstruction(IRInst* inst);
- Result _calcDebugInfo();
- /// Returns the remapped sourceLoc, or 0 if sourceLoc couldn't be added
- void _addDebugSourceLocRun(SourceLoc sourceLoc, uint32_t startInstIndex, uint32_t numInst);
-
- List<IRInst*> m_insts; ///< Instructions in same order as stored in the
-
- List<IRDecoration*> m_decorations; ///< Holds all decorations in order of the instructions as found
- List<IRInst*> m_instWithFirstDecoration; ///< All decorations are held in this order after all the regular instructions
-
- Dictionary<IRInst*, Ser::InstIndex> m_instMap; ///< Map an instruction to an instruction index
-
- StringSlicePool m_stringSlicePool;
- IRSerialData* m_serialData; ///< Where the data is stored
-
- StringSlicePool m_debugStringSlicePool; ///< Slices held just for debug usage
-
- SourceLoc::RawValue m_debugFreeSourceLoc; /// Locations greater than this are free
- Dictionary<SourceFile*, RefPtr<DebugSourceFile> > m_debugSourceFileMap;
-
- SourceManager* m_sourceManager; ///< The source manager
-};
-
-struct IRSerialReader
-{
- typedef IRSerialData Ser;
- typedef StringRepresentationCache::Handle StringHandle;
-
- /// Read a stream to fill in dataOut IRSerialData
- static Result readStream(Stream* stream, IRSerialData* dataOut);
-
- /// Read a module from serial data
- Result read(const IRSerialData& data, Session* session, SourceManager* sourceManager, RefPtr<IRModule>& moduleOut);
-
- /// Get the representation cache
- StringRepresentationCache& getStringRepresentationCache() { return m_stringRepresentationCache; }
-
- IRSerialReader():
- m_serialData(nullptr),
- m_module(nullptr)
- {
- }
-
- protected:
-
- static Result _skip(const IRSerialBinary::Chunk& chunk, Stream* stream, int64_t* remainingBytesInOut);
-
- StringRepresentationCache m_stringRepresentationCache;
-
- const IRSerialData* m_serialData;
- IRModule* m_module;
-};
-
-struct IRSerialUtil
-{
- /// Produces an instruction list which is in same order as written through IRSerialWriter
- static void calcInstructionList(IRModule* module, List<IRInst*>& instsOut);
-
- /// Verify serialization
- static SlangResult verifySerialize(IRModule* module, Session* session, SourceManager* sourceManager, IRSerialBinary::CompressionType compressionType, IRSerialWriter::OptionFlags optionFlags);
-};
-
-
-} // namespace Slang
-
-#endif