23 Limit.MaxLength = MaxLength;
24 Limit.BeginOffset = getCurrentOffset();
25 Limits.push_back(Limit);
30 assert(!Limits.empty() &&
"Not in a record!");
48 int PaddingBytes = 4 -
Align;
49 while (PaddingBytes > 0) {
50 char Pad =
static_cast<uint8_t>(LF_PAD0 + PaddingBytes);
52 Streamer->emitBytes(BytesSR);
64 assert(!Limits.empty() &&
"Not in a record!");
71 std::optional<uint32_t> Min = Limits.front().bytesRemaining(
Offset);
72 for (
auto X :
ArrayRef(Limits).drop_front()) {
73 std::optional<uint32_t> ThisMin =
X.bytesRemaining(
Offset);
75 Min = Min ? std::min(*Min, *ThisMin) : *ThisMin;
77 assert(Min &&
"Every field must have a maximum length!");
84 return Reader->padToAlignment(
Align);
85 return Writer->padToAlignment(
Align);
91 if (Reader->bytesRemaining() == 0)
99 unsigned BytesToAdvance = Leaf & 0x0F;
100 return Reader->skip(BytesToAdvance);
104 const Twine &Comment) {
106 emitComment(Comment);
108 incrStreamedLen(Bytes.
size());
110 if (
auto EC = Writer->writeBytes(Bytes))
113 if (
auto EC = Reader->readBytes(Bytes, Reader->bytesRemaining()))
120 const Twine &Comment) {
125 Bytes.assign(BytesRef.
begin(), BytesRef.
end());
132 std::string TypeNameStr = Streamer->getTypeName(TypeInd);
133 if (!TypeNameStr.empty())
134 emitComment(Comment +
": " + TypeNameStr);
136 emitComment(Comment);
138 incrStreamedLen(
sizeof(TypeInd.
getIndex()));
140 if (
auto EC = Writer->writeInteger(TypeInd.
getIndex()))
144 if (
auto EC = Reader->readInteger(
I))
152 const Twine &Comment) {
155 emitEncodedUnsignedInteger(
static_cast<uint64_t>(
Value), Comment);
157 emitEncodedSignedInteger(
Value, Comment);
160 if (
auto EC = writeEncodedUnsignedInteger(
static_cast<uint64_t>(
Value)))
163 if (
auto EC = writeEncodedSignedInteger(
Value))
177 const Twine &Comment) {
179 emitEncodedUnsignedInteger(
Value, Comment);
181 if (
auto EC = writeEncodedUnsignedInteger(
Value))
196 if (
Value.isSigned())
197 emitEncodedSignedInteger(
Value.getSExtValue(), Comment);
199 emitEncodedUnsignedInteger(
Value.getZExtValue(), Comment);
201 if (
Value.isSigned())
202 return writeEncodedSignedInteger(
204 return writeEncodedUnsignedInteger(
Value.getLimitedValue());
213 emitComment(Comment);
214 Streamer->emitBytes(NullTerminatedString);
215 incrStreamedLen(NullTerminatedString.size());
219 if (
auto EC = Writer->writeCString(S))
222 if (
auto EC = Reader->readCString(
Value))
233 StringRef((
reinterpret_cast<const char *
>(&
Guid)), GuidSize);
234 emitComment(Comment);
235 Streamer->emitBytes(GuidSR);
236 incrStreamedLen(GuidSize);
244 if (
auto EC = Writer->writeBytes(
Guid.Guid))
248 if (
auto EC = Reader->readBytes(GuidBytes, GuidSize))
250 memcpy(
Guid.Guid, GuidBytes.
data(), GuidSize);
256 const Twine &Comment) {
259 emitComment(Comment);
260 for (
auto V :
Value) {
280void CodeViewRecordIO::emitEncodedSignedInteger(
const int64_t &
Value,
281 const Twine &Comment) {
286 emitComment(Comment);
289 }
else if (
Value >= std::numeric_limits<int8_t>::min() &&
290 Value <= std::numeric_limits<int8_t>::max()) {
292 emitComment(Comment);
295 }
else if (
Value >= std::numeric_limits<int16_t>::min() &&
296 Value <= std::numeric_limits<int16_t>::max()) {
298 emitComment(Comment);
301 }
else if (
Value >= std::numeric_limits<int32_t>::min() &&
302 Value <= std::numeric_limits<int32_t>::max()) {
303 Streamer->emitIntValue(LF_LONG, 2);
304 emitComment(Comment);
305 Streamer->emitIntValue(
Value, 4);
308 Streamer->emitIntValue(LF_QUADWORD, 2);
309 emitComment(Comment);
310 Streamer->emitIntValue(
Value, 4);
315void CodeViewRecordIO::emitEncodedUnsignedInteger(
const uint64_t &
Value,
316 const Twine &Comment) {
317 if (
Value < LF_NUMERIC) {
318 emitComment(Comment);
319 Streamer->emitIntValue(
Value, 2);
321 }
else if (
Value <= std::numeric_limits<uint16_t>::max()) {
322 Streamer->emitIntValue(LF_USHORT, 2);
323 emitComment(Comment);
324 Streamer->emitIntValue(
Value, 2);
326 }
else if (
Value <= std::numeric_limits<uint32_t>::max()) {
327 Streamer->emitIntValue(LF_ULONG, 2);
328 emitComment(Comment);
329 Streamer->emitIntValue(
Value, 4);
333 Streamer->emitIntValue(LF_UQUADWORD, 2);
334 emitComment(Comment);
335 Streamer->emitIntValue(
Value, 8);
340Error CodeViewRecordIO::writeEncodedSignedInteger(
const int64_t &
Value) {
342 if (
auto EC = Writer->writeInteger<int16_t>(
Value))
344 }
else if (
Value >= std::numeric_limits<int8_t>::min() &&
345 Value <= std::numeric_limits<int8_t>::max()) {
346 if (
auto EC = Writer->writeInteger<uint16_t>(LF_CHAR))
348 if (
auto EC = Writer->writeInteger<int8_t>(
Value))
350 }
else if (
Value >= std::numeric_limits<int16_t>::min() &&
351 Value <= std::numeric_limits<int16_t>::max()) {
352 if (
auto EC = Writer->writeInteger<uint16_t>(LF_SHORT))
354 if (
auto EC = Writer->writeInteger<int16_t>(
Value))
356 }
else if (
Value >= std::numeric_limits<int32_t>::min() &&
357 Value <= std::numeric_limits<int32_t>::max()) {
358 if (
auto EC = Writer->writeInteger<uint16_t>(LF_LONG))
360 if (
auto EC = Writer->writeInteger<int32_t>(
Value))
363 if (
auto EC = Writer->writeInteger<uint16_t>(LF_QUADWORD))
365 if (
auto EC = Writer->writeInteger(
Value))
371Error CodeViewRecordIO::writeEncodedUnsignedInteger(
const uint64_t &
Value) {
372 if (
Value < LF_NUMERIC) {
373 if (
auto EC = Writer->writeInteger<uint16_t>(
Value))
375 }
else if (
Value <= std::numeric_limits<uint16_t>::max()) {
376 if (
auto EC = Writer->writeInteger<uint16_t>(LF_USHORT))
378 if (
auto EC = Writer->writeInteger<uint16_t>(
Value))
380 }
else if (
Value <= std::numeric_limits<uint32_t>::max()) {
381 if (
auto EC = Writer->writeInteger<uint16_t>(LF_ULONG))
383 if (
auto EC = Writer->writeInteger<uint32_t>(
Value))
386 if (
auto EC = Writer->writeInteger<uint16_t>(LF_UQUADWORD))
388 if (
auto EC = Writer->writeInteger(
Value))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
An arbitrary precision integer that knows its signedness.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
LLVM_ABI Error padToAlignment(uint32_t Align)
LLVM_ABI Error endRecord()
LLVM_ABI Error mapInteger(TypeIndex &TypeInd, const Twine &Comment="")
LLVM_ABI Error mapGuid(GUID &Guid, const Twine &Comment="")
LLVM_ABI Error mapStringZVectorZ(std::vector< StringRef > &Value, const Twine &Comment="")
LLVM_ABI Error skipPadding()
LLVM_ABI Error mapStringZ(StringRef &Value, const Twine &Comment="")
uint64_t getStreamedLen()
LLVM_ABI Error mapEncodedInteger(int64_t &Value, const Twine &Comment="")
LLVM_ABI Error beginRecord(std::optional< uint32_t > MaxLength)
LLVM_ABI Error mapByteVectorTail(ArrayRef< uint8_t > &Bytes, const Twine &Comment="")
LLVM_ABI uint32_t maxFieldLength() const
virtual void emitIntValue(uint64_t Value, unsigned Size)=0
void setIndex(uint32_t I)
uint32_t getIndex() const
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
ArrayRef(const T &OneElt) -> ArrayRef< T >
StringRef toStringRef(bool B)
Construct a string ref from a boolean.
This struct is a compact representation of a valid (non-zero power of two) alignment.
This represents the 'GUID' type from windows.h.