Lines Matching defs:Ctx

80 static uint8_t readUint8(WasmObjectFile::ReadContext &Ctx) {
81 if (Ctx.Ptr == Ctx.End)
83 return *Ctx.Ptr++;
86 static uint32_t readUint32(WasmObjectFile::ReadContext &Ctx) {
87 if (Ctx.Ptr + 4 > Ctx.End)
89 uint32_t Result = support::endian::read32le(Ctx.Ptr);
90 Ctx.Ptr += 4;
94 static int32_t readFloat32(WasmObjectFile::ReadContext &Ctx) {
95 if (Ctx.Ptr + 4 > Ctx.End)
98 memcpy(&Result, Ctx.Ptr, sizeof(Result));
99 Ctx.Ptr += sizeof(Result);
103 static int64_t readFloat64(WasmObjectFile::ReadContext &Ctx) {
104 if (Ctx.Ptr + 8 > Ctx.End)
107 memcpy(&Result, Ctx.Ptr, sizeof(Result));
108 Ctx.Ptr += sizeof(Result);
112 static uint64_t readULEB128(WasmObjectFile::ReadContext &Ctx) {
115 uint64_t Result = decodeULEB128(Ctx.Ptr, &Count, Ctx.End, &Error);
118 Ctx.Ptr += Count;
122 static StringRef readString(WasmObjectFile::ReadContext &Ctx) {
123 uint32_t StringLen = readULEB128(Ctx);
124 if (Ctx.Ptr + StringLen > Ctx.End)
127 StringRef(reinterpret_cast<const char *>(Ctx.Ptr), StringLen);
128 Ctx.Ptr += StringLen;
132 static int64_t readLEB128(WasmObjectFile::ReadContext &Ctx) {
135 uint64_t Result = decodeSLEB128(Ctx.Ptr, &Count, Ctx.End, &Error);
138 Ctx.Ptr += Count;
142 static uint8_t readVaruint1(WasmObjectFile::ReadContext &Ctx) {
143 int64_t Result = readLEB128(Ctx);
149 static int32_t readVarint32(WasmObjectFile::ReadContext &Ctx) {
150 int64_t Result = readLEB128(Ctx);
156 static uint32_t readVaruint32(WasmObjectFile::ReadContext &Ctx) {
157 uint64_t Result = readULEB128(Ctx);
163 static int64_t readVarint64(WasmObjectFile::ReadContext &Ctx) {
164 return readLEB128(Ctx);
167 static uint64_t readVaruint64(WasmObjectFile::ReadContext &Ctx) {
168 return readULEB128(Ctx);
171 static uint8_t readOpcode(WasmObjectFile::ReadContext &Ctx) {
172 return readUint8(Ctx);
175 static wasm::ValType parseValType(WasmObjectFile::ReadContext &Ctx,
191 /* Discard HeapType */ readVarint64(Ctx);
197 WasmObjectFile::ReadContext &Ctx) {
198 auto Start = Ctx.Ptr;
201 Expr.Inst.Opcode = readOpcode(Ctx);
204 Expr.Inst.Value.Int32 = readVarint32(Ctx);
207 Expr.Inst.Value.Int64 = readVarint64(Ctx);
210 Expr.Inst.Value.Float32 = readFloat32(Ctx);
213 Expr.Inst.Value.Float64 = readFloat64(Ctx);
216 Expr.Inst.Value.Global = readULEB128(Ctx);
219 /* Discard type */ parseValType(Ctx, readVaruint32(Ctx));
227 uint8_t EndOpcode = readOpcode(Ctx);
233 Ctx.Ptr = Start;
235 uint8_t Opcode = readOpcode(Ctx);
242 readULEB128(Ctx);
245 readFloat32(Ctx);
248 readFloat64(Ctx);
266 readULEB128(Ctx); // heap type index
269 readULEB128(Ctx); // heap type index
270 readULEB128(Ctx); // array size
275 Expr.Body = ArrayRef<uint8_t>(Start, Ctx.Ptr - Start);
288 static wasm::WasmLimits readLimits(WasmObjectFile::ReadContext &Ctx) {
290 Result.Flags = readVaruint32(Ctx);
291 Result.Minimum = readVaruint64(Ctx);
293 Result.Maximum = readVaruint64(Ctx);
297 static wasm::WasmTableType readTableType(WasmObjectFile::ReadContext &Ctx) {
299 auto ElemType = parseValType(Ctx, readVaruint32(Ctx));
301 TableType.Limits = readLimits(Ctx);
305 static Error readSection(WasmSection &Section, WasmObjectFile::ReadContext &Ctx,
307 Section.Type = readUint8(Ctx);
311 const uint8_t *PreSizePtr = Ctx.Ptr;
312 uint32_t Size = readVaruint32(Ctx);
313 Section.HeaderSecSizeEncodingLen = Ctx.Ptr - PreSizePtr;
314 Section.Offset = Ctx.Ptr - Ctx.Start;
318 if (Ctx.Ptr + Size > Ctx.End)
323 SectionCtx.Start = Ctx.Ptr;
324 SectionCtx.Ptr = Ctx.Ptr;
325 SectionCtx.End = Ctx.Ptr + Size;
330 Ctx.Ptr += SectionNameSize;
340 Section.Content = ArrayRef<uint8_t>(Ctx.Ptr, Size);
341 Ctx.Ptr += Size;
355 ReadContext Ctx;
356 Ctx.Start = getData().bytes_begin();
357 Ctx.Ptr = Ctx.Start + 4;
358 Ctx.End = Ctx.Start + getData().size();
360 if (Ctx.Ptr + 4 > Ctx.End) {
366 Header.Version = readUint32(Ctx);
375 while (Ctx.Ptr < Ctx.End) {
377 if ((Err = readSection(Sec, Ctx, Checker)))
387 ReadContext Ctx;
388 Ctx.Start = Sec.Content.data();
389 Ctx.End = Ctx.Start + Sec.Content.size();
390 Ctx.Ptr = Ctx.Start;
393 return parseCustomSection(Sec, Ctx);
395 return parseTypeSection(Ctx);
397 return parseImportSection(Ctx);
399 return parseFunctionSection(Ctx);
401 return parseTableSection(Ctx);
403 return parseMemorySection(Ctx);
405 return parseTagSection(Ctx);
407 return parseGlobalSection(Ctx);
409 return parseExportSection(Ctx);
411 return parseStartSection(Ctx);
413 return parseElemSection(Ctx);
415 return parseCodeSection(Ctx);
417 return parseDataSection(Ctx);
419 return parseDataCountSection(Ctx);
426 Error WasmObjectFile::parseDylinkSection(ReadContext &Ctx) {
430 DylinkInfo.MemorySize = readVaruint32(Ctx);
431 DylinkInfo.MemoryAlignment = readVaruint32(Ctx);
432 DylinkInfo.TableSize = readVaruint32(Ctx);
433 DylinkInfo.TableAlignment = readVaruint32(Ctx);
434 uint32_t Count = readVaruint32(Ctx);
436 DylinkInfo.Needed.push_back(readString(Ctx));
439 if (Ctx.Ptr != Ctx.End)
445 Error WasmObjectFile::parseDylink0Section(ReadContext &Ctx) {
450 const uint8_t *OrigEnd = Ctx.End;
451 while (Ctx.Ptr < OrigEnd) {
452 Ctx.End = OrigEnd;
453 uint8_t Type = readUint8(Ctx);
454 uint32_t Size = readVaruint32(Ctx);
457 Ctx.End = Ctx.Ptr + Size;
461 DylinkInfo.MemorySize = readVaruint32(Ctx);
462 DylinkInfo.MemoryAlignment = readVaruint32(Ctx);
463 DylinkInfo.TableSize = readVaruint32(Ctx);
464 DylinkInfo.TableAlignment = readVaruint32(Ctx);
467 Count = readVaruint32(Ctx);
469 DylinkInfo.Needed.push_back(readString(Ctx));
473 uint32_t Count = readVaruint32(Ctx);
475 DylinkInfo.ExportInfo.push_back({readString(Ctx), readVaruint32(Ctx)});
480 uint32_t Count = readVaruint32(Ctx);
483 {readString(Ctx), readString(Ctx), readVaruint32(Ctx)});
489 Ctx.Ptr += Size;
492 if (Ctx.Ptr != Ctx.End) {
498 if (Ctx.Ptr != Ctx.End)
504 Error WasmObjectFile::parseNameSection(ReadContext &Ctx) {
518 while (Ctx.Ptr < Ctx.End) {
519 uint8_t Type = readUint8(Ctx);
520 uint32_t Size = readVaruint32(Ctx);
521 const uint8_t *SubSectionEnd = Ctx.Ptr + Size;
527 uint32_t Count = readVaruint32(Ctx);
529 uint32_t Index = readVaruint32(Ctx);
530 StringRef Name = readString(Ctx);
600 Ctx.Ptr += Size;
603 if (Ctx.Ptr != SubSectionEnd)
608 if (Ctx.Ptr != Ctx.End)
614 Error WasmObjectFile::parseLinkingSection(ReadContext &Ctx) {
617 LinkingData.Version = readVaruint32(Ctx);
625 const uint8_t *OrigEnd = Ctx.End;
626 while (Ctx.Ptr < OrigEnd) {
627 Ctx.End = OrigEnd;
628 uint8_t Type = readUint8(Ctx);
629 uint32_t Size = readVaruint32(Ctx);
632 Ctx.End = Ctx.Ptr + Size;
635 if (Error Err = parseLinkingSectionSymtab(Ctx))
639 uint32_t Count = readVaruint32(Ctx);
644 DataSegments[I].Data.Name = readString(Ctx);
645 DataSegments[I].Data.Alignment = readVaruint32(Ctx);
646 DataSegments[I].Data.LinkingFlags = readVaruint32(Ctx);
651 uint32_t Count = readVaruint32(Ctx);
655 Init.Priority = readVaruint32(Ctx);
656 Init.Symbol = readVaruint32(Ctx);
666 if (Error Err = parseLinkingSectionComdat(Ctx))
670 Ctx.Ptr += Size;
673 if (Ctx.Ptr != Ctx.End)
677 if (Ctx.Ptr != OrigEnd)
683 Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {
684 uint32_t Count = readVaruint32(Ctx);
716 Info.Kind = readUint8(Ctx);
717 Info.Flags = readVaruint32(Ctx);
722 Info.ElementIndex = readVaruint32(Ctx);
728 Info.Name = readString(Ctx);
737 Info.Name = readString(Ctx);
748 Info.ElementIndex = readVaruint32(Ctx);
758 Info.Name = readString(Ctx);
767 Info.Name = readString(Ctx);
778 Info.ElementIndex = readVaruint32(Ctx);
788 Info.Name = readString(Ctx);
797 Info.Name = readString(Ctx);
808 Info.Name = readString(Ctx);
810 auto Index = readVaruint32(Ctx);
811 auto Offset = readVaruint64(Ctx);
812 auto Size = readVaruint64(Ctx);
836 Info.ElementIndex = readVaruint32(Ctx);
844 Info.ElementIndex = readVaruint32(Ctx);
854 Info.Name = readString(Ctx);
864 Info.Name = readString(Ctx);
894 Error WasmObjectFile::parseLinkingSectionComdat(ReadContext &Ctx) {
895 uint32_t ComdatCount = readVaruint32(Ctx);
898 StringRef Name = readString(Ctx);
904 uint32_t Flags = readVaruint32(Ctx);
909 uint32_t EntryCount = readVaruint32(Ctx);
911 unsigned Kind = readVaruint32(Ctx);
912 unsigned Index = readVaruint32(Ctx);
950 Error WasmObjectFile::parseProducersSection(ReadContext &Ctx) {
952 uint32_t Fields = readVaruint32(Ctx);
954 StringRef FieldName = readString(Ctx);
972 uint32_t ValueCount = readVaruint32(Ctx);
975 StringRef Name = readString(Ctx);
976 StringRef Version = readString(Ctx);
985 if (Ctx.Ptr != Ctx.End)
991 Error WasmObjectFile::parseTargetFeaturesSection(ReadContext &Ctx) {
993 uint32_t FeatureCount = readVaruint32(Ctx);
996 Feature.Prefix = readUint8(Ctx);
1005 Feature.Name = std::string(readString(Ctx));
1013 if (Ctx.Ptr != Ctx.End)
1020 Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {
1021 uint32_t SectionIndex = readVaruint32(Ctx);
1026 uint32_t RelocCount = readVaruint32(Ctx);
1031 uint32_t type = readVaruint32(Ctx);
1033 Reloc.Offset = readVaruint32(Ctx);
1045 Reloc.Index = readVaruint32(Ctx);
1090 Reloc.Addend = readVarint32(Ctx);
1099 Reloc.Addend = readVarint64(Ctx);
1104 Reloc.Addend = readVarint32(Ctx);
1109 Reloc.Addend = readVarint64(Ctx);
1114 Reloc.Addend = readVarint32(Ctx);
1148 if (Ctx.Ptr != Ctx.End)
1154 Error WasmObjectFile::parseCustomSection(WasmSection &Sec, ReadContext &Ctx) {
1156 if (Error Err = parseDylinkSection(Ctx))
1159 if (Error Err = parseDylink0Section(Ctx))
1162 if (Error Err = parseNameSection(Ctx))
1165 if (Error Err = parseLinkingSection(Ctx))
1168 if (Error Err = parseProducersSection(Ctx))
1171 if (Error Err = parseTargetFeaturesSection(Ctx))
1174 if (Error Err = parseRelocSection(Sec.Name, Ctx))
1180 Error WasmObjectFile::parseTypeSection(ReadContext &Ctx) {
1182 uint32_t TypeCode = readVaruint32((Ctx));
1183 /* Discard StorageType */ parseValType(Ctx, TypeCode);
1184 /* Discard Mutability */ readVaruint32(Ctx);
1187 uint32_t Count = readVaruint32(Ctx);
1191 uint8_t Form = readUint8(Ctx);
1195 uint32_t RecSize = readVaruint32(Ctx);
1211 uint32_t Supers = readVaruint32(Ctx);
1216 /* Discard SuperIndex */ readVaruint32(Ctx);
1218 Form = readVaruint32(Ctx);
1221 uint32_t FieldCount = readVaruint32(Ctx);
1237 uint32_t ParamCount = readVaruint32(Ctx);
1240 uint32_t ParamType = readUint8(Ctx);
1241 Sig.Params.push_back(parseValType(Ctx, ParamType));
1243 uint32_t ReturnCount = readVaruint32(Ctx);
1245 uint32_t ReturnType = readUint8(Ctx);
1246 Sig.Returns.push_back(parseValType(Ctx, ReturnType));
1251 if (Ctx.Ptr != Ctx.End)
1257 Error WasmObjectFile::parseImportSection(ReadContext &Ctx) {
1258 uint32_t Count = readVaruint32(Ctx);
1263 Im.Module = readString(Ctx);
1264 Im.Field = readString(Ctx);
1265 Im.Kind = readUint8(Ctx);
1269 Im.SigIndex = readVaruint32(Ctx);
1276 Im.Global.Type = readUint8(Ctx);
1277 Im.Global.Mutable = readVaruint1(Ctx);
1280 Im.Memory = readLimits(Ctx);
1285 Im.Table = readTableType(Ctx);
1298 if (readUint8(Ctx) != 0) // Reserved 'attribute' field
1301 Im.SigIndex = readVaruint32(Ctx);
1312 if (Ctx.Ptr != Ctx.End)
1318 Error WasmObjectFile::parseFunctionSection(ReadContext &Ctx) {
1319 uint32_t Count = readVaruint32(Ctx);
1323 uint32_t Type = readVaruint32(Ctx);
1331 if (Ctx.Ptr != Ctx.End)
1337 Error WasmObjectFile::parseTableSection(ReadContext &Ctx) {
1339 uint32_t Count = readVaruint32(Ctx);
1343 T.Type = readTableType(Ctx);
1355 if (Ctx.Ptr != Ctx.End)
1361 Error WasmObjectFile::parseMemorySection(ReadContext &Ctx) {
1362 uint32_t Count = readVaruint32(Ctx);
1365 auto Limits = readLimits(Ctx);
1370 if (Ctx.Ptr != Ctx.End)
1376 Error WasmObjectFile::parseTagSection(ReadContext &Ctx) {
1378 uint32_t Count = readVaruint32(Ctx);
1382 if (readUint8(Ctx) != 0) // Reserved 'attribute' field
1385 uint32_t Type = readVaruint32(Ctx);
1396 if (Ctx.Ptr != Ctx.End)
1402 Error WasmObjectFile::parseGlobalSection(ReadContext &Ctx) {
1404 const uint8_t *SectionStart = Ctx.Ptr;
1405 uint32_t Count = readVaruint32(Ctx);
1410 const uint8_t *GlobalStart = Ctx.Ptr;
1412 auto GlobalOpcode = readVaruint32(Ctx);
1413 Global.Type.Type = (uint8_t)parseValType(Ctx, GlobalOpcode);
1414 Global.Type.Mutable = readVaruint1(Ctx);
1415 if (Error Err = readInitExpr(Global.InitExpr, Ctx))
1417 Global.Size = static_cast<uint32_t>(Ctx.Ptr - GlobalStart);
1420 if (Ctx.Ptr != Ctx.End)
1426 Error WasmObjectFile::parseExportSection(ReadContext &Ctx) {
1427 uint32_t Count = readVaruint32(Ctx);
1432 Ex.Name = readString(Ctx);
1433 Ex.Kind = readUint8(Ctx);
1434 Ex.Index = readVaruint32(Ctx);
1502 if (Ctx.Ptr != Ctx.End)
1585 Error WasmObjectFile::parseStartSection(ReadContext &Ctx) {
1586 StartFunction = readVaruint32(Ctx);
1593 Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) {
1595 uint32_t FunctionCount = readVaruint32(Ctx);
1603 const uint8_t *FunctionStart = Ctx.Ptr;
1604 uint32_t Size = readVaruint32(Ctx);
1605 const uint8_t *FunctionEnd = Ctx.Ptr + Size;
1607 Function.CodeOffset = Ctx.Ptr - FunctionStart;
1609 Function.CodeSectionOffset = FunctionStart - Ctx.Start;
1612 uint32_t NumLocalDecls = readVaruint32(Ctx);
1616 Decl.Count = readVaruint32(Ctx);
1617 Decl.Type = readUint8(Ctx);
1621 uint32_t BodySize = FunctionEnd - Ctx.Ptr;
1622 // Ensure that Function is within Ctx's buffer.
1623 if (Ctx.Ptr + BodySize > Ctx.End) {
1627 Function.Body = ArrayRef<uint8_t>(Ctx.Ptr, BodySize);
1630 Ctx.Ptr += BodySize;
1631 assert(Ctx.Ptr == FunctionEnd);
1633 if (Ctx.Ptr != Ctx.End)
1639 Error WasmObjectFile::parseElemSection(ReadContext &Ctx) {
1640 uint32_t Count = readVaruint32(Ctx);
1644 Segment.Flags = readVaruint32(Ctx);
1674 Segment.TableNumber = readVaruint32(Ctx);
1687 if (Error Err = readInitExpr(Segment.Offset, Ctx))
1692 auto ElemKind = readVaruint32(Ctx);
1694 Segment.ElemKind = parseValType(Ctx, ElemKind);
1709 auto ElemType = parseValType(Ctx, readVaruint32(Ctx));
1715 uint32_t NumElems = readVaruint32(Ctx);
1720 if (Error Err = readInitExpr(Expr, Ctx))
1725 Segment.Functions.push_back(readVaruint32(Ctx));
1730 if (Ctx.Ptr != Ctx.End)
1736 Error WasmObjectFile::parseDataSection(ReadContext &Ctx) {
1738 uint32_t Count = readVaruint32(Ctx);
1745 Segment.Data.InitFlags = readVaruint32(Ctx);
1748 ? readVaruint32(Ctx)
1751 if (Error Err = readInitExpr(Segment.Data.Offset, Ctx))
1758 uint32_t Size = readVaruint32(Ctx);
1759 if (Size > (size_t)(Ctx.End - Ctx.Ptr))
1762 Segment.Data.Content = ArrayRef<uint8_t>(Ctx.Ptr, Size);
1768 Segment.SectionOffset = Ctx.Ptr - Ctx.Start;
1769 Ctx.Ptr += Size;
1772 if (Ctx.Ptr != Ctx.End)
1778 Error WasmObjectFile::parseDataCountSection(ReadContext &Ctx) {
1779 DataCount = readVaruint32(Ctx);