mirror of
https://github.com/encounter/objdiff.git
synced 2026-03-30 11:32:16 -07:00
Add symbol kind and structured flags to diff proto output (#337)
* Add symbol kind to diff proto output Expose SymbolKind (Function, Object, Section, Unknown) in the DiffSymbol proto message, allowing CLI oneshot diff consumers to distinguish symbol types without inferring from instruction/data presence. * Stop filtering symbols from diff output, replace flags bitmask with message Remove the symbol filter (size == 0 / Ignored) from DiffObject so all symbols are emitted. This fixes target_symbol indices being invalid after filtering. Replace the DiffSymbolFlag bitmask enum + uint32 field with a DiffSymbolFlags message of booleans, adding ignored and size_inferred flags so consumers can filter on their end.
This commit is contained in:
@@ -39,7 +39,8 @@ message DiffSymbol {
|
||||
optional string demangled_name = 2;
|
||||
uint64 address = 3;
|
||||
uint64 size = 4;
|
||||
uint32 flags = 5;
|
||||
DiffSymbolFlags flags = 5;
|
||||
DiffSymbolKind kind = 10;
|
||||
// The symbol index in the _other_ object that this symbol was diffed against
|
||||
optional uint32 target_symbol = 6;
|
||||
optional float match_percent = 7;
|
||||
@@ -49,14 +50,22 @@ message DiffSymbol {
|
||||
repeated DiffDataSegment data_diff = 9;
|
||||
}
|
||||
|
||||
// Symbol visibility flags (bitmask)
|
||||
enum DiffSymbolFlag {
|
||||
SYMBOL_NONE = 0;
|
||||
SYMBOL_GLOBAL = 1;
|
||||
SYMBOL_LOCAL = 2;
|
||||
SYMBOL_WEAK = 4;
|
||||
SYMBOL_COMMON = 8;
|
||||
SYMBOL_HIDDEN = 16;
|
||||
enum DiffSymbolKind {
|
||||
SYMBOL_UNKNOWN = 0;
|
||||
SYMBOL_FUNCTION = 1;
|
||||
SYMBOL_OBJECT = 2;
|
||||
SYMBOL_SECTION = 3;
|
||||
}
|
||||
|
||||
// Symbol flags
|
||||
message DiffSymbolFlags {
|
||||
bool global = 1;
|
||||
bool local = 2;
|
||||
bool weak = 3;
|
||||
bool common = 4;
|
||||
bool hidden = 5;
|
||||
bool ignored = 6;
|
||||
bool size_inferred = 7;
|
||||
}
|
||||
|
||||
// A single instruction diff row
|
||||
|
||||
Binary file not shown.
@@ -43,9 +43,6 @@ impl DiffObject {
|
||||
let mut symbols = Vec::with_capacity(obj.symbols.len());
|
||||
for (symbol_idx, symbol) in obj.symbols.iter().enumerate() {
|
||||
let symbol_diff = &diff.symbols[symbol_idx];
|
||||
if symbol.size == 0 || symbol.flags.contains(SymbolFlag::Ignored) {
|
||||
continue;
|
||||
}
|
||||
symbols.push(DiffSymbol::new(obj, symbol_idx, symbol, symbol_diff, diff_config)?);
|
||||
}
|
||||
|
||||
@@ -112,6 +109,7 @@ impl DiffSymbol {
|
||||
address: symbol.address,
|
||||
size: symbol.size,
|
||||
flags: symbol_flags(&symbol.flags),
|
||||
kind: DiffSymbolKind::from(symbol.kind) as i32,
|
||||
// Diff information
|
||||
target_symbol: symbol_diff.target_symbol.map(|i| i as u32),
|
||||
match_percent: symbol_diff.match_percent,
|
||||
@@ -121,24 +119,27 @@ impl DiffSymbol {
|
||||
}
|
||||
}
|
||||
|
||||
fn symbol_flags(flags: &obj::SymbolFlagSet) -> u32 {
|
||||
let mut result = 0u32;
|
||||
if flags.contains(SymbolFlag::Global) {
|
||||
result |= DiffSymbolFlag::SymbolGlobal as u32;
|
||||
impl From<obj::SymbolKind> for DiffSymbolKind {
|
||||
fn from(value: obj::SymbolKind) -> Self {
|
||||
match value {
|
||||
obj::SymbolKind::Unknown => DiffSymbolKind::SymbolUnknown,
|
||||
obj::SymbolKind::Function => DiffSymbolKind::SymbolFunction,
|
||||
obj::SymbolKind::Object => DiffSymbolKind::SymbolObject,
|
||||
obj::SymbolKind::Section => DiffSymbolKind::SymbolSection,
|
||||
}
|
||||
}
|
||||
if flags.contains(SymbolFlag::Local) {
|
||||
result |= DiffSymbolFlag::SymbolLocal as u32;
|
||||
}
|
||||
if flags.contains(SymbolFlag::Weak) {
|
||||
result |= DiffSymbolFlag::SymbolWeak as u32;
|
||||
}
|
||||
if flags.contains(SymbolFlag::Common) {
|
||||
result |= DiffSymbolFlag::SymbolCommon as u32;
|
||||
}
|
||||
if flags.contains(SymbolFlag::Hidden) {
|
||||
result |= DiffSymbolFlag::SymbolHidden as u32;
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn symbol_flags(flags: &obj::SymbolFlagSet) -> Option<DiffSymbolFlags> {
|
||||
Some(DiffSymbolFlags {
|
||||
global: flags.contains(SymbolFlag::Global),
|
||||
local: flags.contains(SymbolFlag::Local),
|
||||
weak: flags.contains(SymbolFlag::Weak),
|
||||
common: flags.contains(SymbolFlag::Common),
|
||||
hidden: flags.contains(SymbolFlag::Hidden),
|
||||
ignored: flags.contains(SymbolFlag::Ignored),
|
||||
size_inferred: flags.contains(SymbolFlag::SizeInferred),
|
||||
})
|
||||
}
|
||||
|
||||
impl DiffInstructionRow {
|
||||
|
||||
Reference in New Issue
Block a user