@@ -8,7 +8,7 @@ use similar::{capture_diff_slices_deadline, get_diff_ratio, Algorithm};
8
8
9
9
use super :: code:: section_name_eq;
10
10
use crate :: {
11
- diff:: { ObjDataDiff , ObjDataDiffKind , ObjSectionDiff , ObjSymbolDiff } ,
11
+ diff:: { ObjDataDiff , ObjDataDiffKind , ObjDataRelocDiff , ObjSectionDiff , ObjSymbolDiff } ,
12
12
obj:: { ObjInfo , ObjReloc , ObjSection , ObjSymbolFlags , SymbolRef } ,
13
13
} ;
14
14
@@ -103,7 +103,7 @@ fn diff_data_relocs_for_range(
103
103
let right_offset = r. address as usize - right_range. start ;
104
104
right_offset == left_offset
105
105
} ) else {
106
- diffs. push ( ( ObjDataDiffKind :: Replace , Some ( left_reloc. clone ( ) ) , None ) ) ;
106
+ diffs. push ( ( ObjDataDiffKind :: Delete , Some ( left_reloc. clone ( ) ) , None ) ) ;
107
107
continue ;
108
108
} ;
109
109
if reloc_eq ( left_obj, right_obj, left_reloc, right_reloc) {
@@ -132,7 +132,7 @@ fn diff_data_relocs_for_range(
132
132
let left_offset = r. address as usize - left_range. start ;
133
133
left_offset == right_offset
134
134
} ) else {
135
- diffs. push ( ( ObjDataDiffKind :: Replace , None , Some ( right_reloc. clone ( ) ) ) ) ;
135
+ diffs. push ( ( ObjDataDiffKind :: Insert , None , Some ( right_reloc. clone ( ) ) ) ) ;
136
136
continue ;
137
137
} ;
138
138
// No need to check the cases for relocations being deleted or matching again.
@@ -176,94 +176,6 @@ pub fn diff_data_section(
176
176
ObjDataDiffKind :: Replace
177
177
}
178
178
} ;
179
- if kind == ObjDataDiffKind :: None {
180
- let mut found_any_relocs = false ;
181
- let mut left_curr_addr = left_range. start ;
182
- let mut right_curr_addr = right_range. start ;
183
- for ( diff_kind, left_reloc, right_reloc) in diff_data_relocs_for_range (
184
- left_obj,
185
- right_obj,
186
- left,
187
- right,
188
- left_range. clone ( ) ,
189
- right_range. clone ( ) ,
190
- ) {
191
- found_any_relocs = true ;
192
-
193
- if let Some ( left_reloc) = left_reloc {
194
- let left_reloc_addr = left_reloc. address as usize ;
195
- if left_reloc_addr > left_curr_addr {
196
- let len = left_reloc_addr - left_curr_addr;
197
- let left_data = & left. data [ left_curr_addr..left_reloc_addr] ;
198
- left_diff. push ( ObjDataDiff {
199
- data : left_data[ ..min ( len, left_data. len ( ) ) ] . to_vec ( ) ,
200
- kind : ObjDataDiffKind :: None ,
201
- len,
202
- ..Default :: default ( )
203
- } ) ;
204
- }
205
- let reloc_diff_len = left_obj. arch . get_reloc_byte_size ( left_reloc. flags ) ;
206
- let left_data = & left. data [ left_reloc_addr..left_reloc_addr + reloc_diff_len] ;
207
- left_diff. push ( ObjDataDiff {
208
- data : left_data[ ..min ( reloc_diff_len, left_data. len ( ) ) ] . to_vec ( ) ,
209
- kind : diff_kind,
210
- len : reloc_diff_len,
211
- reloc : Some ( left_reloc. clone ( ) ) ,
212
- ..Default :: default ( )
213
- } ) ;
214
- left_curr_addr = left_reloc_addr + reloc_diff_len;
215
- }
216
-
217
- if let Some ( right_reloc) = right_reloc {
218
- let right_reloc_addr = right_reloc. address as usize ;
219
- if right_reloc_addr > right_curr_addr {
220
- let len = right_reloc_addr - right_curr_addr;
221
- let right_data = & right. data [ right_curr_addr..right_reloc_addr] ;
222
- right_diff. push ( ObjDataDiff {
223
- data : right_data[ ..min ( len, right_data. len ( ) ) ] . to_vec ( ) ,
224
- kind : ObjDataDiffKind :: None ,
225
- len,
226
- ..Default :: default ( )
227
- } ) ;
228
- }
229
- let reloc_diff_len = right_obj. arch . get_reloc_byte_size ( right_reloc. flags ) ;
230
- let right_data =
231
- & right. data [ right_reloc_addr..right_reloc_addr + reloc_diff_len] ;
232
- right_diff. push ( ObjDataDiff {
233
- data : right_data[ ..min ( reloc_diff_len, right_data. len ( ) ) ] . to_vec ( ) ,
234
- kind : diff_kind,
235
- len : reloc_diff_len,
236
- reloc : Some ( right_reloc. clone ( ) ) ,
237
- ..Default :: default ( )
238
- } ) ;
239
- right_curr_addr = right_reloc_addr + reloc_diff_len;
240
- }
241
- }
242
-
243
- if found_any_relocs {
244
- if left_curr_addr < left_range. end - 1 {
245
- let len = left_range. end - left_curr_addr;
246
- let left_data = & left. data [ left_curr_addr..left_range. end ] ;
247
- left_diff. push ( ObjDataDiff {
248
- data : left_data[ ..min ( len, left_data. len ( ) ) ] . to_vec ( ) ,
249
- kind : ObjDataDiffKind :: None ,
250
- len,
251
- ..Default :: default ( )
252
- } ) ;
253
- }
254
- if right_curr_addr < right_range. end - 1 {
255
- let len = right_range. end - right_curr_addr;
256
- let right_data = & right. data [ right_curr_addr..right_range. end ] ;
257
- right_diff. push ( ObjDataDiff {
258
- data : right_data[ ..min ( len, right_data. len ( ) ) ] . to_vec ( ) ,
259
- kind : ObjDataDiffKind :: None ,
260
- len,
261
- ..Default :: default ( )
262
- } ) ;
263
- }
264
- continue ;
265
- }
266
- }
267
179
let left_data = & left. data [ left_range] ;
268
180
let right_data = & right. data [ right_range] ;
269
181
left_diff. push ( ObjDataDiff {
@@ -315,12 +227,35 @@ pub fn diff_data_section(
315
227
}
316
228
}
317
229
230
+ let mut left_reloc_diffs = Vec :: new ( ) ;
231
+ let mut right_reloc_diffs = Vec :: new ( ) ;
232
+ for ( diff_kind, left_reloc, right_reloc) in diff_data_relocs_for_range (
233
+ left_obj,
234
+ right_obj,
235
+ left,
236
+ right,
237
+ 0 ..left_max as usize ,
238
+ 0 ..right_max as usize ,
239
+ ) {
240
+ if let Some ( left_reloc) = left_reloc {
241
+ let len = left_obj. arch . get_reloc_byte_size ( left_reloc. flags ) ;
242
+ let range = left_reloc. address as usize ..left_reloc. address as usize + len;
243
+ left_reloc_diffs. push ( ObjDataRelocDiff { reloc : left_reloc, kind : diff_kind, range } ) ;
244
+ }
245
+ if let Some ( right_reloc) = right_reloc {
246
+ let len = right_obj. arch . get_reloc_byte_size ( right_reloc. flags ) ;
247
+ let range = right_reloc. address as usize ..right_reloc. address as usize + len;
248
+ right_reloc_diffs. push ( ObjDataRelocDiff { reloc : right_reloc, kind : diff_kind, range } ) ;
249
+ }
250
+ }
251
+
318
252
let ( mut left_section_diff, mut right_section_diff) =
319
253
diff_generic_section ( left, right, left_section_diff, right_section_diff) ?;
320
- let all_left_relocs_match =
321
- left_diff. iter ( ) . all ( |d| d. kind == ObjDataDiffKind :: None || d. reloc . is_none ( ) ) ;
254
+ let all_left_relocs_match = left_reloc_diffs. iter ( ) . all ( |d| d. kind == ObjDataDiffKind :: None ) ;
322
255
left_section_diff. data_diff = left_diff;
323
256
right_section_diff. data_diff = right_diff;
257
+ left_section_diff. reloc_diff = left_reloc_diffs;
258
+ right_section_diff. reloc_diff = right_reloc_diffs;
324
259
if all_left_relocs_match {
325
260
// Use the highest match percent between two options:
326
261
// - Left symbols matching right symbols by name
@@ -430,8 +365,18 @@ pub fn diff_generic_section(
430
365
/ left. size as f32
431
366
} ;
432
367
Ok ( (
433
- ObjSectionDiff { symbols : vec ! [ ] , data_diff : vec ! [ ] , match_percent : Some ( match_percent) } ,
434
- ObjSectionDiff { symbols : vec ! [ ] , data_diff : vec ! [ ] , match_percent : Some ( match_percent) } ,
368
+ ObjSectionDiff {
369
+ symbols : vec ! [ ] ,
370
+ data_diff : vec ! [ ] ,
371
+ reloc_diff : vec ! [ ] ,
372
+ match_percent : Some ( match_percent) ,
373
+ } ,
374
+ ObjSectionDiff {
375
+ symbols : vec ! [ ] ,
376
+ data_diff : vec ! [ ] ,
377
+ reloc_diff : vec ! [ ] ,
378
+ match_percent : Some ( match_percent) ,
379
+ } ,
435
380
) )
436
381
}
437
382
@@ -456,7 +401,17 @@ pub fn diff_bss_section(
456
401
}
457
402
458
403
Ok ( (
459
- ObjSectionDiff { symbols : vec ! [ ] , data_diff : vec ! [ ] , match_percent : Some ( match_percent) } ,
460
- ObjSectionDiff { symbols : vec ! [ ] , data_diff : vec ! [ ] , match_percent : Some ( match_percent) } ,
404
+ ObjSectionDiff {
405
+ symbols : vec ! [ ] ,
406
+ data_diff : vec ! [ ] ,
407
+ reloc_diff : vec ! [ ] ,
408
+ match_percent : Some ( match_percent) ,
409
+ } ,
410
+ ObjSectionDiff {
411
+ symbols : vec ! [ ] ,
412
+ data_diff : vec ! [ ] ,
413
+ reloc_diff : vec ! [ ] ,
414
+ match_percent : Some ( match_percent) ,
415
+ } ,
461
416
) )
462
417
}
0 commit comments