diff options
Diffstat (limited to 'src/binary-reader-ir.cc')
-rw-r--r-- | src/binary-reader-ir.cc | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/binary-reader-ir.cc b/src/binary-reader-ir.cc index 9fae6168..9f16a380 100644 --- a/src/binary-reader-ir.cc +++ b/src/binary-reader-ir.cc @@ -247,6 +247,17 @@ class BinaryReaderIR : public BinaryReaderNop { Result OnInitExprRefNull(Index index) override; Result OnInitExprRefFunc(Index index, Index func_index) override; + Result OnDataSymbol(Index index, uint32_t flags, string_view name, + Index segment, uint32_t offset, uint32_t size) override; + Result OnFunctionSymbol(Index index, uint32_t flags, string_view name, + Index func_index) override; + Result OnGlobalSymbol(Index index, uint32_t flags, string_view name, + Index global_index) override; + Result OnSectionSymbol(Index index, uint32_t flags, + Index section_index) override; + Result OnEventSymbol(Index index, uint32_t flags, string_view name, + Index event_index) override; + private: Location GetLocation() const; void PrintError(const char* format, ...); @@ -1238,6 +1249,73 @@ Result BinaryReaderIR::OnEventType(Index index, Index sig_index) { return Result::Ok; } +Result BinaryReaderIR::OnDataSymbol(Index index, uint32_t flags, + string_view name, Index segment, + uint32_t offset, uint32_t size) { + if (name.empty()) { + return Result::Ok; + } + if (offset) { + // If it is pointing into the data segment, then it's not really naming + // the whole segment. + return Result::Ok; + } + DataSegment* seg = module_->data_segments[segment]; + std::string dollar_name = + GetUniqueName(&module_->data_segment_bindings, MakeDollarName(name)); + seg->name = dollar_name; + module_->data_segment_bindings.emplace(dollar_name, Binding(segment)); + return Result::Ok; +} + +Result BinaryReaderIR::OnFunctionSymbol(Index index, uint32_t flags, + string_view name, Index func_index) { + if (name.empty()) { + return Result::Ok; + } + Func* func = module_->funcs[func_index]; + if (!func->name.empty()) { + // The name section has already named this function. + return Result::Ok; + } + std::string dollar_name = + GetUniqueName(&module_->func_bindings, MakeDollarName(name)); + func->name = dollar_name; + module_->func_bindings.emplace(dollar_name, Binding(func_index)); + return Result::Ok; +} + +Result BinaryReaderIR::OnGlobalSymbol(Index index, uint32_t flags, + string_view name, Index global_index) { + if (name.empty()) { + return Result::Ok; + } + Global* glob = module_->globals[global_index]; + std::string dollar_name = + GetUniqueName(&module_->global_bindings, MakeDollarName(name)); + glob->name = dollar_name; + module_->global_bindings.emplace(dollar_name, Binding(global_index)); + return Result::Ok; +} + +Result BinaryReaderIR::OnSectionSymbol(Index index, uint32_t flags, + Index section_index) { + return Result::Ok; +} + +Result BinaryReaderIR::OnEventSymbol(Index index, uint32_t flags, + string_view name, Index event_index) { + if (name.empty()) { + return Result::Ok; + } + Event* event = module_->events[event_index]; + std::string dollar_name = + GetUniqueName(&module_->event_bindings, MakeDollarName(name)); + event->name = dollar_name; + module_->event_bindings.emplace(dollar_name, Binding(event_index)); + return Result::Ok; +} + } // end anonymous namespace Result ReadBinaryIr(const char* filename, |