23 Limit.MaxLength = MaxLength;
24 Limit.BeginOffset = getCurrentOffset();
48 int PaddingBytes = 4 -
Align;
49 while (PaddingBytes > 0) {
50 char Pad =
static_cast<uint8_t
>(LF_PAD0 + PaddingBytes);
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!");
94 uint8_t Leaf = Reader->
peek();
99 unsigned BytesToAdvance = Leaf & 0x0F;
100 return Reader->
skip(BytesToAdvance);
104 const Twine &Comment) {
106 emitComment(Comment);
108 incrStreamedLen(Bytes.
size());
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()));
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());
233 StringRef((
reinterpret_cast<const char *
>(&
Guid)), GuidSize);
234 emitComment(Comment);
236 incrStreamedLen(GuidSize);
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) {
264 uint8_t FinalZero = 0;
280void CodeViewRecordIO::emitEncodedSignedInteger(
const int64_t &
Value,
281 const Twine &Comment) {
285 if (Value < LF_NUMERIC && Value >= 0) {
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()) {
304 emitComment(Comment);
309 emitComment(Comment);
315void CodeViewRecordIO::emitEncodedUnsignedInteger(
const uint64_t &
Value,
316 const Twine &Comment) {
317 if (
Value < LF_NUMERIC) {
318 emitComment(Comment);
321 }
else if (
Value <= std::numeric_limits<uint16_t>::max()) {
323 emitComment(Comment);
326 }
else if (
Value <= std::numeric_limits<uint32_t>::max()) {
328 emitComment(Comment);
334 emitComment(Comment);
340Error CodeViewRecordIO::writeEncodedSignedInteger(
const int64_t &
Value) {
341 if (Value < LF_NUMERIC && Value >= 0) {
344 }
else if (
Value >= std::numeric_limits<int8_t>::min() &&
345 Value <= std::numeric_limits<int8_t>::max()) {
350 }
else if (
Value >= std::numeric_limits<int16_t>::min() &&
351 Value <= std::numeric_limits<int16_t>::max()) {
356 }
else if (
Value >= std::numeric_limits<int32_t>::min() &&
357 Value <= std::numeric_limits<int32_t>::max()) {
372 if (
Value < LF_NUMERIC) {
375 }
else if (
Value <= std::numeric_limits<uint16_t>::max()) {
380 }
else if (
Value <= std::numeric_limits<uint32_t>::max()) {
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
Error readCString(StringRef &Dest)
Read a null terminated string from Dest.
Error readBytes(ArrayRef< uint8_t > &Buffer, uint32_t Size)
Read Size bytes from the underlying stream at the current offset and and set Buffer to the resulting ...
uint8_t peek() const
Examine the next byte of the underlying stream without advancing the stream's offset.
Error readInteger(T &Dest)
Read an integer of the specified endianness into Dest and update the stream's offset.
uint64_t bytesRemaining() const
Error padToAlignment(uint32_t Align)
Error skip(uint64_t Amount)
Advance the stream's offset by Amount bytes.
Error writeCString(StringRef Str)
Write the string Str to the underlying stream followed by a null terminator.
Error writeInteger(T Value)
Write the integer Value to the underlying stream in the specified endianness.
Error writeBytes(ArrayRef< uint8_t > Buffer)
Write the bytes specified in Buffer to the underlying stream.
Error padToAlignment(uint32_t Align)
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
void push_back(const T &Elt)
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.
Error padToAlignment(uint32_t Align)
Error mapInteger(TypeIndex &TypeInd, const Twine &Comment="")
Error mapGuid(GUID &Guid, const Twine &Comment="")
Error mapStringZVectorZ(std::vector< StringRef > &Value, const Twine &Comment="")
Error mapStringZ(StringRef &Value, const Twine &Comment="")
uint64_t getStreamedLen()
Error mapEncodedInteger(int64_t &Value, const Twine &Comment="")
Error beginRecord(std::optional< uint32_t > MaxLength)
Error mapByteVectorTail(ArrayRef< uint8_t > &Bytes, const Twine &Comment="")
uint32_t maxFieldLength() const
virtual void emitBytes(StringRef Data)=0
virtual void emitIntValue(uint64_t Value, unsigned Size)=0
virtual void emitBinaryData(StringRef Data)=0
virtual std::string getTypeName(TypeIndex TI)=0
void setIndex(uint32_t I)
uint32_t getIndex() const
StringRef toStringRef(const std::optional< DWARFFormValue > &V, StringRef Default={})
Take an optional DWARFFormValue and try to extract a string value from it.
This is an optimization pass for GlobalISel generic memory operations.
This struct is a compact representation of a valid (non-zero power of two) alignment.
This represents the 'GUID' type from windows.h.