package objdiff:core; use wasi:logging/logging@0.1.0-draft; interface diff { resource diff-config { constructor(); set-property: func(id: string, value: string) -> result<_, string>; get-property: func(id: string) -> result; } record mapping-config { mappings: list>, selecting-left: option, selecting-right: option, } resource object { parse: static func( data: list, config: borrow, ) -> result; hash: func() -> u64; } resource object-diff { find-symbol: func( name: string, section-name: option ) -> option; } record diff-result { left: option, right: option, } run-diff: func( left: option>, right: option>, config: borrow, ) -> result; } interface display { use diff.{ object, object-diff, diff-config }; type symbol-ref = u32; record display-config { show-hidden-symbols: bool, show-mapped-symbols: bool, reverse-fn-order: bool, } record symbol-filter { regex: option, mapping: option, } record section-display-symbol { symbol: symbol-ref, is-mapping-symbol: bool, } record section-display { id: string, name: string, size: u64, match-percent: option, symbols: list, } enum symbol-kind { unknown, function, object, section, } flags symbol-flags { global, local, weak, common, hidden, has-extra, size-inferred, ignored, } record symbol-display { name: string, demangled-name: option, address: u64, size: u64, kind: symbol-kind, section: option, %flags: symbol-flags, align: option, virtual-address: option, target-symbol: option, match-percent: option, diff-score: option>, row-count: u32, } enum symbol-navigation-kind { normal, extab, } record context-item-copy { value: string, label: option, } record context-item-navigate { label: string, symbol: symbol-ref, kind: symbol-navigation-kind, } variant context-item { copy(context-item-copy), navigate(context-item-navigate), separator, } enum hover-item-color { normal, emphasized, special, } record hover-item-text { label: string, value: string, color: hover-item-color, } variant hover-item { text(hover-item-text), separator, } record diff-text-opcode { mnemonic: string, opcode: u16, } record diff-text-symbol { name: string, demangled-name: option, } variant diff-text { // Basic text (not semantically meaningful) basic(string), // Line number line(u32), // Instruction address address(u64), // Instruction mnemonic opcode(diff-text-opcode), // Instruction argument (signed) signed(s64), // Instruction argument (unsigned) unsigned(u64), // Instruction argument (opaque) opaque(string), // Instruction argument (branch destination) branch-dest(u64), // Relocation target name symbol(diff-text-symbol), // Relocation addend addend(s64), // Number of spaces spacing(u8), // End of line eol, } variant diff-text-color { normal, dim, bright, replace, delete, insert, rotating(u8), } record diff-text-segment { // Text to display text: diff-text, // Text color color: diff-text-color, // Number of spaces to pad to pad-to: u8, } record instruction-diff-row { // Text segments segments: list, // Diff kind diff-kind: instruction-diff-kind, } enum instruction-diff-kind { none, op-mismatch, arg-mismatch, replace, insert, delete, } display-sections: func( diff: borrow, filter: symbol-filter, config: display-config, ) -> list; display-symbol: func( diff: borrow, symbol: section-display-symbol, ) -> symbol-display; display-instruction-row: func( diff: borrow, symbol: section-display-symbol, row-index: u32, config: borrow, ) -> instruction-diff-row; symbol-context: func( diff: borrow, symbol: section-display-symbol, ) -> list; symbol-hover: func( diff: borrow, symbol: section-display-symbol, ) -> list; instruction-context: func( diff: borrow, symbol: section-display-symbol, row-index: u32, config: borrow, ) -> result, string>; instruction-hover: func( diff: borrow, symbol: section-display-symbol, row-index: u32, config: borrow, ) -> result, string>; } world api { import logging; use logging.{level}; export diff; export display; export init: func(level: level); export version: func() -> string; }