Lines Matching defs:Ctx
83 static uint8_t readUint8(WasmObjectFile::ReadContext &Ctx) {
84 if (Ctx.Ptr == Ctx.End)
86 return *Ctx.Ptr++;
89 static uint32_t readUint32(WasmObjectFile::ReadContext &Ctx) {
90 if (Ctx.Ptr + 4 > Ctx.End)
92 uint32_t Result = support::endian::read32le(Ctx.Ptr);
93 Ctx.Ptr += 4;
97 static int32_t readFloat32(WasmObjectFile::ReadContext &Ctx) {
98 if (Ctx.Ptr + 4 > Ctx.End)
101 memcpy(&Result, Ctx.Ptr, sizeof(Result));
102 Ctx.Ptr += sizeof(Result);
106 static int64_t readFloat64(WasmObjectFile::ReadContext &Ctx) {
107 if (Ctx.Ptr + 8 > Ctx.End)
110 memcpy(&Result, Ctx.Ptr, sizeof(Result));
111 Ctx.Ptr += sizeof(Result);
115 static uint64_t readULEB128(WasmObjectFile::ReadContext &Ctx) {
118 uint64_t Result = decodeULEB128(Ctx.Ptr, &Count, Ctx.End, &Error);
121 Ctx.Ptr += Count;
125 static StringRef readString(WasmObjectFile::ReadContext &Ctx) {
126 uint32_t StringLen = readULEB128(Ctx);
127 if (Ctx.Ptr + StringLen > Ctx.End)
130 StringRef(reinterpret_cast<const char *>(Ctx.Ptr), StringLen);
131 Ctx.Ptr += StringLen;
135 static int64_t readLEB128(WasmObjectFile::ReadContext &Ctx) {
138 uint64_t Result = decodeSLEB128(Ctx.Ptr, &Count, Ctx.End, &Error);
141 Ctx.Ptr += Count;
145 static uint8_t readVaruint1(WasmObjectFile::ReadContext &Ctx) {
146 int64_t Result = readLEB128(Ctx);
152 static int32_t readVarint32(WasmObjectFile::ReadContext &Ctx) {
153 int64_t Result = readLEB128(Ctx);
159 static uint32_t readVaruint32(WasmObjectFile::ReadContext &Ctx) {
160 uint64_t Result = readULEB128(Ctx);
166 static int64_t readVarint64(WasmObjectFile::ReadContext &Ctx) {
167 return readLEB128(Ctx);
170 static uint64_t readVaruint64(WasmObjectFile::ReadContext &Ctx) {
171 return readULEB128(Ctx);
174 static uint8_t readOpcode(WasmObjectFile::ReadContext &Ctx) {
175 return readUint8(Ctx);
178 static wasm::ValType parseValType(WasmObjectFile::ReadContext &Ctx,
194 /* Discard HeapType */ readVarint64(Ctx);
200 WasmObjectFile::ReadContext &Ctx) {
201 auto Start = Ctx.Ptr;
204 Expr.Inst.Opcode = readOpcode(Ctx);
207 Expr.Inst.Value.Int32 = readVarint32(Ctx);
210 Expr.Inst.Value.Int64 = readVarint64(Ctx);
213 Expr.Inst.Value.Float32 = readFloat32(Ctx);
216 Expr.Inst.Value.Float64 = readFloat64(Ctx);
219 Expr.Inst.Value.Global = readULEB128(Ctx);
222 /* Discard type */ parseValType(Ctx, readVaruint32(Ctx));
230 uint8_t EndOpcode = readOpcode(Ctx);
236 Ctx.Ptr = Start;
238 uint8_t Opcode = readOpcode(Ctx);
245 readULEB128(Ctx);
248 readFloat32(Ctx);
251 readFloat64(Ctx);
269 readULEB128(Ctx); // heap type index
272 readULEB128(Ctx); // heap type index
273 readULEB128(Ctx); // array size
278 Expr.Body = ArrayRef<uint8_t>(Start, Ctx.Ptr - Start);
291 static wasm::WasmLimits readLimits(WasmObjectFile::ReadContext &Ctx) {
293 Result.Flags = readVaruint32(Ctx);
294 Result.Minimum = readVaruint64(Ctx);
296 Result.Maximum = readVaruint64(Ctx);
300 static wasm::WasmTableType readTableType(WasmObjectFile::ReadContext &Ctx) {
302 auto ElemType = parseValType(Ctx, readVaruint32(Ctx));
304 TableType.Limits = readLimits(Ctx);
308 static Error readSection(WasmSection &Section, WasmObjectFile::ReadContext &Ctx,
310 Section.Type = readUint8(Ctx);
314 const uint8_t *PreSizePtr = Ctx.Ptr;
315 uint32_t Size = readVaruint32(Ctx);
316 Section.HeaderSecSizeEncodingLen = Ctx.Ptr - PreSizePtr;
317 Section.Offset = Ctx.Ptr - Ctx.Start;
321 if (Ctx.Ptr + Size > Ctx.End)
326 SectionCtx.Start = Ctx.Ptr;
327 SectionCtx.Ptr = Ctx.Ptr;
328 SectionCtx.End = Ctx.Ptr + Size;
333 Ctx.Ptr += SectionNameSize;
343 Section.Content = ArrayRef<uint8_t>(Ctx.Ptr, Size);
344 Ctx.Ptr += Size;
358 ReadContext Ctx;
359 Ctx.Start = getData().bytes_begin();
360 Ctx.Ptr = Ctx.Start + 4;
361 Ctx.End = Ctx.Start + getData().size();
363 if (Ctx.Ptr + 4 > Ctx.End) {
369 Header.Version = readUint32(Ctx);
378 while (Ctx.Ptr < Ctx.End) {
380 if ((Err = readSection(Sec, Ctx, Checker)))
390 ReadContext Ctx;
391 Ctx.Start = Sec.Content.data();
392 Ctx.End = Ctx.Start + Sec.Content.size();
393 Ctx.Ptr = Ctx.Start;
396 return parseCustomSection(Sec, Ctx);
398 return parseTypeSection(Ctx);
400 return parseImportSection(Ctx);
402 return parseFunctionSection(Ctx);
404 return parseTableSection(Ctx);
406 return parseMemorySection(Ctx);
408 return parseTagSection(Ctx);
410 return parseGlobalSection(Ctx);
412 return parseExportSection(Ctx);
414 return parseStartSection(Ctx);
416 return parseElemSection(Ctx);
418 return parseCodeSection(Ctx);
420 return parseDataSection(Ctx);
422 return parseDataCountSection(Ctx);
429 Error WasmObjectFile::parseDylinkSection(ReadContext &Ctx) {
433 DylinkInfo.MemorySize = readVaruint32(Ctx);
434 DylinkInfo.MemoryAlignment = readVaruint32(Ctx);
435 DylinkInfo.TableSize = readVaruint32(Ctx);
436 DylinkInfo.TableAlignment = readVaruint32(Ctx);
437 uint32_t Count = readVaruint32(Ctx);
439 DylinkInfo.Needed.push_back(readString(Ctx));
442 if (Ctx.Ptr != Ctx.End)
448 Error WasmObjectFile::parseDylink0Section(ReadContext &Ctx) {
453 const uint8_t *OrigEnd = Ctx.End;
454 while (Ctx.Ptr < OrigEnd) {
455 Ctx.End = OrigEnd;
456 uint8_t Type = readUint8(Ctx);
457 uint32_t Size = readVaruint32(Ctx);
460 Ctx.End = Ctx.Ptr + Size;
464 DylinkInfo.MemorySize = readVaruint32(Ctx);
465 DylinkInfo.MemoryAlignment = readVaruint32(Ctx);
466 DylinkInfo.TableSize = readVaruint32(Ctx);
467 DylinkInfo.TableAlignment = readVaruint32(Ctx);
470 Count = readVaruint32(Ctx);
472 DylinkInfo.Needed.push_back(readString(Ctx));
476 uint32_t Count = readVaruint32(Ctx);
478 DylinkInfo.ExportInfo.push_back({readString(Ctx), readVaruint32(Ctx)});
483 uint32_t Count = readVaruint32(Ctx);
486 {readString(Ctx), readString(Ctx), readVaruint32(Ctx)});
492 Ctx.Ptr += Size;
495 if (Ctx.Ptr != Ctx.End) {
501 if (Ctx.Ptr != Ctx.End)
507 Error WasmObjectFile::parseNameSection(ReadContext &Ctx) {
521 while (Ctx.Ptr < Ctx.End) {
522 uint8_t Type = readUint8(Ctx);
523 uint32_t Size = readVaruint32(Ctx);
524 const uint8_t *SubSectionEnd = Ctx.Ptr + Size;
530 uint32_t Count = readVaruint32(Ctx);
532 uint32_t Index = readVaruint32(Ctx);
533 StringRef Name = readString(Ctx);
603 Ctx.Ptr += Size;
606 if (Ctx.Ptr != SubSectionEnd)
611 if (Ctx.Ptr != Ctx.End)
617 Error WasmObjectFile::parseLinkingSection(ReadContext &Ctx) {
620 LinkingData.Version = readVaruint32(Ctx);
628 const uint8_t *OrigEnd = Ctx.End;
629 while (Ctx.Ptr < OrigEnd) {
630 Ctx.End = OrigEnd;
631 uint8_t Type = readUint8(Ctx);
632 uint32_t Size = readVaruint32(Ctx);
635 Ctx.End = Ctx.Ptr + Size;
638 if (Error Err = parseLinkingSectionSymtab(Ctx))
642 uint32_t Count = readVaruint32(Ctx);
647 DataSegments[I].Data.Name = readString(Ctx);
648 DataSegments[I].Data.Alignment = readVaruint32(Ctx);
649 DataSegments[I].Data.LinkingFlags = readVaruint32(Ctx);
654 uint32_t Count = readVaruint32(Ctx);
658 Init.Priority = readVaruint32(Ctx);
659 Init.Symbol = readVaruint32(Ctx);
669 if (Error Err = parseLinkingSectionComdat(Ctx))
673 Ctx.Ptr += Size;
676 if (Ctx.Ptr != Ctx.End)
680 if (Ctx.Ptr != OrigEnd)
686 Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) {
687 uint32_t Count = readVaruint32(Ctx);
719 Info.Kind = readUint8(Ctx);
720 Info.Flags = readVaruint32(Ctx);
725 Info.ElementIndex = readVaruint32(Ctx);
731 Info.Name = readString(Ctx);
740 Info.Name = readString(Ctx);
751 Info.ElementIndex = readVaruint32(Ctx);
761 Info.Name = readString(Ctx);
770 Info.Name = readString(Ctx);
781 Info.ElementIndex = readVaruint32(Ctx);
791 Info.Name = readString(Ctx);
800 Info.Name = readString(Ctx);
811 Info.Name = readString(Ctx);
813 auto Index = readVaruint32(Ctx);
814 auto Offset = readVaruint64(Ctx);
815 auto Size = readVaruint64(Ctx);
839 Info.ElementIndex = readVaruint32(Ctx);
847 Info.ElementIndex = readVaruint32(Ctx);
857 Info.Name = readString(Ctx);
867 Info.Name = readString(Ctx);
897 Error WasmObjectFile::parseLinkingSectionComdat(ReadContext &Ctx) {
898 uint32_t ComdatCount = readVaruint32(Ctx);
901 StringRef Name = readString(Ctx);
907 uint32_t Flags = readVaruint32(Ctx);
912 uint32_t EntryCount = readVaruint32(Ctx);
914 unsigned Kind = readVaruint32(Ctx);
915 unsigned Index = readVaruint32(Ctx);
953 Error WasmObjectFile::parseProducersSection(ReadContext &Ctx) {
955 uint32_t Fields = readVaruint32(Ctx);
957 StringRef FieldName = readString(Ctx);
975 uint32_t ValueCount = readVaruint32(Ctx);
978 StringRef Name = readString(Ctx);
979 StringRef Version = readString(Ctx);
988 if (Ctx.Ptr != Ctx.End)
994 Error WasmObjectFile::parseTargetFeaturesSection(ReadContext &Ctx) {
996 uint32_t FeatureCount = readVaruint32(Ctx);
999 Feature.Prefix = readUint8(Ctx);
1009 Feature.Name = std::string(readString(Ctx));
1017 if (Ctx.Ptr != Ctx.End)
1024 Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) {
1025 uint32_t SectionIndex = readVaruint32(Ctx);
1030 uint32_t RelocCount = readVaruint32(Ctx);
1035 uint32_t type = readVaruint32(Ctx);
1037 Reloc.Offset = readVaruint32(Ctx);
1049 Reloc.Index = readVaruint32(Ctx);
1094 Reloc.Addend = readVarint32(Ctx);
1103 Reloc.Addend = readVarint64(Ctx);
1108 Reloc.Addend = readVarint32(Ctx);
1113 Reloc.Addend = readVarint64(Ctx);
1118 Reloc.Addend = readVarint32(Ctx);
1152 if (Ctx.Ptr != Ctx.End)
1158 Error WasmObjectFile::parseCustomSection(WasmSection &Sec, ReadContext &Ctx) {
1160 if (Error Err = parseDylinkSection(Ctx))
1163 if (Error Err = parseDylink0Section(Ctx))
1166 if (Error Err = parseNameSection(Ctx))
1169 if (Error Err = parseLinkingSection(Ctx))
1172 if (Error Err = parseProducersSection(Ctx))
1175 if (Error Err = parseTargetFeaturesSection(Ctx))
1178 if (Error Err = parseRelocSection(Sec.Name, Ctx))
1184 Error WasmObjectFile::parseTypeSection(ReadContext &Ctx) {
1186 uint32_t TypeCode = readVaruint32((Ctx));
1187 /* Discard StorageType */ parseValType(Ctx, TypeCode);
1188 /* Discard Mutability */ readVaruint32(Ctx);
1191 uint32_t Count = readVaruint32(Ctx);
1195 uint8_t Form = readUint8(Ctx);
1199 uint32_t RecSize = readVaruint32(Ctx);
1215 uint32_t Supers = readVaruint32(Ctx);
1220 /* Discard SuperIndex */ readVaruint32(Ctx);
1222 Form = readVaruint32(Ctx);
1225 uint32_t FieldCount = readVaruint32(Ctx);
1241 uint32_t ParamCount = readVaruint32(Ctx);
1244 uint32_t ParamType = readUint8(Ctx);
1245 Sig.Params.push_back(parseValType(Ctx, ParamType));
1248 uint32_t ReturnCount = readVaruint32(Ctx);
1250 uint32_t ReturnType = readUint8(Ctx);
1251 Sig.Returns.push_back(parseValType(Ctx, ReturnType));
1256 if (Ctx.Ptr != Ctx.End)
1262 Error WasmObjectFile::parseImportSection(ReadContext &Ctx) {
1263 uint32_t Count = readVaruint32(Ctx);
1268 Im.Module = readString(Ctx);
1269 Im.Field = readString(Ctx);
1270 Im.Kind = readUint8(Ctx);
1274 Im.SigIndex = readVaruint32(Ctx);
1281 Im.Global.Type = readUint8(Ctx);
1282 Im.Global.Mutable = readVaruint1(Ctx);
1285 Im.Memory = readLimits(Ctx);
1290 Im.Table = readTableType(Ctx);
1303 if (readUint8(Ctx) != 0) // Reserved 'attribute' field
1306 Im.SigIndex = readVaruint32(Ctx);
1317 if (Ctx.Ptr != Ctx.End)
1323 Error WasmObjectFile::parseFunctionSection(ReadContext &Ctx) {
1324 uint32_t Count = readVaruint32(Ctx);
1328 uint32_t Type = readVaruint32(Ctx);
1336 if (Ctx.Ptr != Ctx.End)
1342 Error WasmObjectFile::parseTableSection(ReadContext &Ctx) {
1344 uint32_t Count = readVaruint32(Ctx);
1348 T.Type = readTableType(Ctx);
1360 if (Ctx.Ptr != Ctx.End)
1366 Error WasmObjectFile::parseMemorySection(ReadContext &Ctx) {
1367 uint32_t Count = readVaruint32(Ctx);
1370 auto Limits = readLimits(Ctx);
1375 if (Ctx.Ptr != Ctx.End)
1381 Error WasmObjectFile::parseTagSection(ReadContext &Ctx) {
1383 uint32_t Count = readVaruint32(Ctx);
1387 if (readUint8(Ctx) != 0) // Reserved 'attribute' field
1390 uint32_t Type = readVaruint32(Ctx);
1401 if (Ctx.Ptr != Ctx.End)
1407 Error WasmObjectFile::parseGlobalSection(ReadContext &Ctx) {
1409 const uint8_t *SectionStart = Ctx.Ptr;
1410 uint32_t Count = readVaruint32(Ctx);
1415 const uint8_t *GlobalStart = Ctx.Ptr;
1417 auto GlobalOpcode = readVaruint32(Ctx);
1418 Global.Type.Type = (uint8_t)parseValType(Ctx, GlobalOpcode);
1419 Global.Type.Mutable = readVaruint1(Ctx);
1420 if (Error Err = readInitExpr(Global.InitExpr, Ctx))
1422 Global.Size = static_cast<uint32_t>(Ctx.Ptr - GlobalStart);
1425 if (Ctx.Ptr != Ctx.End)
1431 Error WasmObjectFile::parseExportSection(ReadContext &Ctx) {
1432 uint32_t Count = readVaruint32(Ctx);
1437 Ex.Name = readString(Ctx);
1438 Ex.Kind = readUint8(Ctx);
1439 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);
1666 Segment.TableNumber = readVaruint32(Ctx);
1679 if (Error Err = readInitExpr(Segment.Offset, Ctx))
1684 auto ElemKind = readVaruint32(Ctx);
1686 Segment.ElemKind = parseValType(Ctx, ElemKind);
1701 auto ElemType = parseValType(Ctx, readVaruint32(Ctx));
1707 uint32_t NumElems = readVaruint32(Ctx);
1712 if (Error Err = readInitExpr(Expr, Ctx))
1717 Segment.Functions.push_back(readVaruint32(Ctx));
1722 if (Ctx.Ptr != Ctx.End)
1728 Error WasmObjectFile::parseDataSection(ReadContext &Ctx) {
1730 uint32_t Count = readVaruint32(Ctx);
1737 Segment.Data.InitFlags = readVaruint32(Ctx);
1740 ? readVaruint32(Ctx)
1743 if (Error Err = readInitExpr(Segment.Data.Offset, Ctx))
1750 uint32_t Size = readVaruint32(Ctx);
1751 if (Size > (size_t)(Ctx.End - Ctx.Ptr))
1754 Segment.Data.Content = ArrayRef<uint8_t>(Ctx.Ptr, Size);
1760 Segment.SectionOffset = Ctx.Ptr - Ctx.Start;
1761 Ctx.Ptr += Size;
1764 if (Ctx.Ptr != Ctx.End)
1770 Error WasmObjectFile::parseDataCountSection(ReadContext &Ctx) {
1771 DataCount = readVaruint32(Ctx);