diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/parser/context-decls.cpp | 22 | ||||
-rw-r--r-- | src/parser/contexts.h | 29 | ||||
-rw-r--r-- | src/parser/parsers.h | 36 | ||||
-rw-r--r-- | src/parser/wat-parser.cpp | 3 | ||||
-rw-r--r-- | src/wasm/wasm-ir-builder.cpp | 18 |
5 files changed, 76 insertions, 32 deletions
diff --git a/src/parser/context-decls.cpp b/src/parser/context-decls.cpp index d9279a0b6..c78c47d60 100644 --- a/src/parser/context-decls.cpp +++ b/src/parser/context-decls.cpp @@ -68,12 +68,14 @@ Result<> ParseDeclsCtx::addFunc(Name name, ImportNames* import, TypeUseT type, std::optional<LocalsT>, + std::vector<Annotation>&& annotations, Index pos) { CHECK_ERR(checkImport(pos, import)); auto f = addFuncDecl(pos, name, import); CHECK_ERR(f); CHECK_ERR(addExports(in, wasm, *f, exports, ExternalKind::Function)); - funcDefs.push_back({name, pos, Index(funcDefs.size())}); + funcDefs.push_back( + {name, pos, Index(funcDefs.size()), std::move(annotations)}); return Ok{}; } @@ -109,7 +111,8 @@ Result<> ParseDeclsCtx::addTable(Name name, auto t = addTableDecl(pos, name, import, limits); CHECK_ERR(t); CHECK_ERR(addExports(in, wasm, *t, exports, ExternalKind::Table)); - tableDefs.push_back({name, pos, Index(tableDefs.size())}); + // TODO: table annotations + tableDefs.push_back({name, pos, Index(tableDefs.size()), {}}); return Ok{}; } @@ -164,7 +167,8 @@ Result<> ParseDeclsCtx::addMemory(Name name, auto m = addMemoryDecl(pos, name, import, type); CHECK_ERR(m); CHECK_ERR(addExports(in, wasm, *m, exports, ExternalKind::Memory)); - memoryDefs.push_back({name, pos, Index(memoryDefs.size())}); + // TODO: memory annotations + memoryDefs.push_back({name, pos, Index(memoryDefs.size()), {}}); return Ok{}; } @@ -209,7 +213,8 @@ Result<> ParseDeclsCtx::addGlobal(Name name, auto g = addGlobalDecl(pos, name, import); CHECK_ERR(g); CHECK_ERR(addExports(in, wasm, *g, exports, ExternalKind::Global)); - globalDefs.push_back({name, pos, Index(globalDefs.size())}); + // TODO: global annotations + globalDefs.push_back({name, pos, Index(globalDefs.size()), {}}); return Ok{}; } @@ -228,7 +233,8 @@ Result<> ParseDeclsCtx::addElem( name = Names::getValidElementSegmentName(wasm, name); e->name = name; } - elemDefs.push_back({name, pos, Index(wasm.elementSegments.size())}); + // TODO: element segment annotations + elemDefs.push_back({name, pos, Index(wasm.elementSegments.size()), {}}); wasm.addElementSegment(std::move(e)); return Ok{}; } @@ -252,7 +258,8 @@ Result<> ParseDeclsCtx::addData(Name name, d->name = name; } d->data = std::move(data); - dataDefs.push_back({name, pos, Index(wasm.dataSegments.size())}); + // TODO: data segment annotations + dataDefs.push_back({name, pos, Index(wasm.dataSegments.size()), {}}); wasm.addDataSegment(std::move(d)); return Ok{}; } @@ -285,7 +292,8 @@ Result<> ParseDeclsCtx::addTag(Name name, auto t = addTagDecl(pos, name, import); CHECK_ERR(t); CHECK_ERR(addExports(in, wasm, *t, exports, ExternalKind::Tag)); - tagDefs.push_back({name, pos, Index(tagDefs.size())}); + // TODO: tag annotations + tagDefs.push_back({name, pos, Index(tagDefs.size()), {}}); return Ok{}; } diff --git a/src/parser/contexts.h b/src/parser/contexts.h index 08cebe33b..e79330871 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -61,6 +61,7 @@ struct DefPos { Name name; Index pos; Index index; + std::vector<Annotation> annotations; }; struct GlobalType { @@ -406,7 +407,7 @@ struct NullInstrParserCtx { TagLabelListT makeTagLabelList() { return Ok{}; } void appendTagLabel(TagLabelListT&, TagIdxT, LabelIdxT) {} - void setSrcLoc(const Annotation&) {} + void setSrcLoc(const std::vector<Annotation>&) {} Result<> makeUnreachable(Index, const std::vector<Annotation>&) { return Ok{}; @@ -908,12 +909,14 @@ struct ParseDeclsCtx : NullTypeParserCtx, NullInstrParserCtx { void setOpen() {} Result<> addSubtype(Index) { return Ok{}; } void finishSubtype(Name name, Index pos) { - subtypeDefs.push_back({name, pos, Index(subtypeDefs.size())}); + // TODO: type annotations + subtypeDefs.push_back({name, pos, Index(subtypeDefs.size()), {}}); } size_t getRecGroupStartIndex() { return 0; } void addRecGroup(Index, size_t) {} void finishDeftype(Index pos) { - typeDefs.push_back({{}, pos, Index(typeDefs.size())}); + // TODO: type annotations + typeDefs.push_back({{}, pos, Index(typeDefs.size()), {}}); } Limits makeLimits(uint64_t n, std::optional<uint64_t> m) { @@ -957,6 +960,7 @@ struct ParseDeclsCtx : NullTypeParserCtx, NullInstrParserCtx { ImportNames* import, TypeUseT type, std::optional<LocalsT>, + std::vector<Annotation>&&, Index pos); Result<Table*> @@ -991,7 +995,8 @@ struct ParseDeclsCtx : NullTypeParserCtx, NullInstrParserCtx { if (!startDefs.empty()) { return Err{"unexpected extra 'start' function"}; } - startDefs.push_back({{}, pos, 0}); + // TODO: start function annotations. + startDefs.push_back({{}, pos, 0, {}}); return Ok{}; } @@ -1245,6 +1250,7 @@ struct ParseModuleTypesCtx : TypeParserCtx<ParseModuleTypesCtx>, ImportNames*, TypeUse type, std::optional<LocalsT> locals, + std::vector<Annotation>&&, Index pos) { auto& f = wasm.functions[index]; if (!type.type.isSignature()) { @@ -1606,6 +1612,7 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { ImportNames*, TypeUseT, std::optional<LocalsT>, + std::vector<Annotation>&&, Index) { return Ok{}; } @@ -1692,9 +1699,17 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { return wasm.memories[0]->name; } - void setSrcLoc(const Annotation& annotation) { - assert(annotation.kind == srcAnnotationKind); - Lexer lexer(annotation.contents); + void setSrcLoc(const std::vector<Annotation>& annotations) { + const Annotation* annotation = nullptr; + for (auto& a : annotations) { + if (a.kind == srcAnnotationKind) { + annotation = &a; + } + } + if (!annotation) { + return; + } + Lexer lexer(annotation->contents); auto contents = lexer.takeKeyword(); if (!contents || !lexer.empty()) { return; diff --git a/src/parser/parsers.h b/src/parser/parsers.h index 0dde4b765..0150af811 100644 --- a/src/parser/parsers.h +++ b/src/parser/parsers.h @@ -844,20 +844,11 @@ template<typename Ctx> Result<uint32_t> tupleArity(Ctx& ctx) { // Instructions // ============ -template<typename Ctx> -void setSrcLoc(Ctx& ctx, const std::vector<Annotation>& annotations) { - for (const auto& annotation : annotations) { - if (annotation.kind == srcAnnotationKind) { - ctx.setSrcLoc(annotation); - } - } -} - // blockinstr ::= block | loop | if-else | try-catch | try_table template<typename Ctx> MaybeResult<> foldedBlockinstr(Ctx& ctx, const std::vector<Annotation>& annotations) { - setSrcLoc(ctx, annotations); + ctx.setSrcLoc(annotations); if (auto i = block(ctx, annotations, true)) { return i; } @@ -879,7 +870,7 @@ MaybeResult<> foldedBlockinstr(Ctx& ctx, template<typename Ctx> MaybeResult<> unfoldedBlockinstr(Ctx& ctx, const std::vector<Annotation>& annotations) { - setSrcLoc(ctx, annotations); + ctx.setSrcLoc(annotations); if (auto i = block(ctx, annotations, false)) { return i; } @@ -912,7 +903,7 @@ MaybeResult<> blockinstr(Ctx& ctx, const std::vector<Annotation>& annotations) { // plaininstr ::= ... all plain instructions ... template<typename Ctx> MaybeResult<> plaininstr(Ctx& ctx, const std::vector<Annotation>& annotations) { - setSrcLoc(ctx, annotations); + ctx.setSrcLoc(annotations); auto pos = ctx.in.getPos(); auto keyword = ctx.in.takeKeyword(); if (!keyword) { @@ -1061,6 +1052,7 @@ Result<typename Ctx::MemargT> memarg(Ctx& ctx, uint32_t n) { // blocktype ::= (t:result)? => t? | x,I:typeuse => x if I = {} template<typename Ctx> Result<typename Ctx::BlockTypeT> blocktype(Ctx& ctx) { auto pos = ctx.in.getPos(); + auto initialLexer = ctx.in; if (auto res = results(ctx)) { CHECK_ERR(res); @@ -1071,7 +1063,7 @@ template<typename Ctx> Result<typename Ctx::BlockTypeT> blocktype(Ctx& ctx) { // We either had no results or multiple results. Reset and parse again as a // type use. - ctx.in.setIndex(pos); + ctx.in = initialLexer; auto use = typeuse(ctx); CHECK_ERR(use); @@ -1138,6 +1130,7 @@ ifelse(Ctx& ctx, const std::vector<Annotation>& annotations, bool folded) { if (folded) { CHECK_ERR(foldedinstrs(ctx)); + ctx.setSrcLoc(annotations); } ctx.makeIf(pos, annotations, label, *type); @@ -2928,8 +2921,9 @@ template<typename Ctx> MaybeResult<> import_(Ctx& ctx) { auto name = ctx.in.takeID(); auto type = typeuse(ctx); CHECK_ERR(type); - CHECK_ERR( - ctx.addFunc(name ? *name : Name{}, {}, &names, *type, std::nullopt, pos)); + // TODO: function import annotations + CHECK_ERR(ctx.addFunc( + name ? *name : Name{}, {}, &names, *type, std::nullopt, {}, pos)); } else if (ctx.in.takeSExprStart("table"sv)) { auto name = ctx.in.takeID(); auto type = tabletype(ctx); @@ -2971,6 +2965,8 @@ template<typename Ctx> MaybeResult<> import_(Ctx& ctx) { // '(' 'import' mod:name nm:name ')' typeuse ')' template<typename Ctx> MaybeResult<> func(Ctx& ctx) { auto pos = ctx.in.getPos(); + auto annotations = ctx.in.getAnnotations(); + if (!ctx.in.takeSExprStart("func"sv)) { return {}; } @@ -2996,14 +2992,20 @@ template<typename Ctx> MaybeResult<> func(Ctx& ctx) { localVars = *l; } CHECK_ERR(instrs(ctx)); + ctx.setSrcLoc(ctx.in.takeAnnotations()); } if (!ctx.in.takeRParen()) { return ctx.in.err("expected end of function"); } - CHECK_ERR( - ctx.addFunc(name, *exports, import.getPtr(), *type, localVars, pos)); + CHECK_ERR(ctx.addFunc(name, + *exports, + import.getPtr(), + *type, + localVars, + std::move(annotations), + pos)); return Ok{}; } diff --git a/src/parser/wat-parser.cpp b/src/parser/wat-parser.cpp index ff0dea768..8675f4e36 100644 --- a/src/parser/wat-parser.cpp +++ b/src/parser/wat-parser.cpp @@ -184,10 +184,11 @@ Result<> parseModule(Module& wasm, std::string_view input) { for (Index i = 0; i < decls.funcDefs.size(); ++i) { ctx.index = i; auto* f = wasm.functions[i].get(); + WithPosition with(ctx, decls.funcDefs[i].pos); + ctx.setSrcLoc(decls.funcDefs[i].annotations); if (!f->imported()) { CHECK_ERR(ctx.visitFunctionStart(f)); } - WithPosition with(ctx, decls.funcDefs[i].pos); if (auto parsed = func(ctx)) { CHECK_ERR(parsed); } else { diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 628a257c7..ffd0b8674 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -211,12 +211,17 @@ Result<Expression*> IRBuilder::build() { } void IRBuilder::setDebugLocation(const Function::DebugLocation& loc) { + DBG(std::cerr << "setting debugloc " << loc.fileIndex << ":" << loc.lineNumber + << ":" << loc.columnNumber << "\n";); debugLoc = loc; } void IRBuilder::applyDebugLoc(Expression* expr) { if (debugLoc) { if (func) { + DBG(std::cerr << "applying debugloc " << debugLoc->fileIndex << ":" + << debugLoc->lineNumber << ":" << debugLoc->columnNumber + << " to expression " << ShallowExpression{expr} << "\n"); func->debugLocations[expr] = *debugLoc; } debugLoc.reset(); @@ -698,6 +703,10 @@ Result<> IRBuilder::visitFunctionStart(Function* func) { if (!scopeStack.empty()) { return Err{"unexpected start of function"}; } + if (debugLoc) { + func->prologLocation.insert(*debugLoc); + debugLoc.reset(); + } scopeStack.push_back(ScopeCtx::makeFunc(func)); this->func = func; return Ok{}; @@ -740,6 +749,11 @@ Result<> IRBuilder::visitTryTableStart(TryTable* trytable, Name label) { } Result<Expression*> IRBuilder::finishScope(Block* block) { + if (debugLoc) { + DBG(std::cerr << "discarding debugloc " << debugLoc->fileIndex << ":" + << debugLoc->lineNumber << ":" << debugLoc->columnNumber + << "\n"); + } debugLoc.reset(); if (scopeStack.empty() || scopeStack.back().isNone()) { @@ -966,6 +980,10 @@ Result<> IRBuilder::visitEnd() { if (scope.isNone()) { return Err{"unexpected end"}; } + if (auto* func = scope.getFunction(); func && debugLoc) { + func->epilogLocation.insert(*debugLoc); + debugLoc.reset(); + } auto expr = finishScope(scope.getBlock()); CHECK_ERR(expr); |