@@ -135,7 +135,6 @@ where
135135 encoding : Encoding ,
136136 length : Offset ,
137137 debug_info_offset : DebugInfoOffset < Offset > ,
138- segment_size : u8 ,
139138 entries : R ,
140139}
141140
@@ -160,16 +159,17 @@ where
160159 let debug_info_offset = rest. read_offset ( format) . map ( DebugInfoOffset ) ?;
161160 let address_size = rest. read_u8 ( ) ?;
162161 let segment_size = rest. read_u8 ( ) ?;
162+ if segment_size != 0 {
163+ return Err ( Error :: UnsupportedSegmentSize ) ;
164+ }
163165
164166 // unit_length + version + offset + address_size + segment_size
165167 let header_length = format. initial_length_size ( ) + 2 + format. word_size ( ) + 1 + 1 ;
166168
167169 // The first tuple following the header in each set begins at an offset that is
168- // a multiple of the size of a single tuple (that is, the size of a segment selector
169- // plus twice the size of an address).
170+ // a multiple of the size of a single tuple (that is, twice the size of an address).
170171 let tuple_length = address_size
171172 . checked_mul ( 2 )
172- . and_then ( |x| x. checked_add ( segment_size) )
173173 . ok_or ( Error :: InvalidAddressRange ) ?;
174174 if tuple_length == 0 {
175175 return Err ( Error :: InvalidAddressRange ) ;
@@ -185,14 +185,12 @@ where
185185 format,
186186 version,
187187 address_size,
188- // TODO: segment_size
189188 } ;
190189 Ok ( ArangeHeader {
191190 offset,
192191 encoding,
193192 length,
194193 debug_info_offset,
195- segment_size,
196194 entries : rest,
197195 } )
198196 }
@@ -215,12 +213,6 @@ where
215213 self . encoding
216214 }
217215
218- /// Return the segment size for this set of entries.
219- #[ inline]
220- pub fn segment_size ( & self ) -> u8 {
221- self . segment_size
222- }
223-
224216 /// Return the offset into the .debug_info section for this set of arange entries.
225217 #[ inline]
226218 pub fn debug_info_offset ( & self ) -> DebugInfoOffset < Offset > {
@@ -233,7 +225,6 @@ where
233225 ArangeEntryIter {
234226 input : self . entries . clone ( ) ,
235227 encoding : self . encoding ,
236- segment_size : self . segment_size ,
237228 }
238229 }
239230}
@@ -246,7 +237,6 @@ where
246237pub struct ArangeEntryIter < R : Reader > {
247238 input : R ,
248239 encoding : Encoding ,
249- segment_size : u8 ,
250240}
251241
252242impl < R : Reader > ArangeEntryIter < R > {
@@ -261,7 +251,7 @@ impl<R: Reader> ArangeEntryIter<R> {
261251 return Ok ( None ) ;
262252 }
263253
264- match ArangeEntry :: parse ( & mut self . input , self . encoding , self . segment_size ) {
254+ match ArangeEntry :: parse ( & mut self . input , self . encoding ) {
265255 Ok ( Some ( entry) ) => Ok ( Some ( entry) ) ,
266256 Ok ( None ) => {
267257 self . input . empty ( ) ;
@@ -288,60 +278,37 @@ impl<R: Reader> fallible_iterator::FallibleIterator for ArangeEntryIter<R> {
288278/// A single parsed arange.
289279#[ derive( Debug , Clone , PartialEq , Eq , PartialOrd , Ord ) ]
290280pub struct ArangeEntry {
291- segment : Option < u64 > ,
292281 range : Range ,
293282 length : u64 ,
294283}
295284
296285impl ArangeEntry {
297286 /// Parse a single arange. Return `None` for the null arange, `Some` for an actual arange.
298- fn parse < R : Reader > (
299- input : & mut R ,
300- encoding : Encoding ,
301- segment_size : u8 ,
302- ) -> Result < Option < Self > > {
287+ fn parse < R : Reader > ( input : & mut R , encoding : Encoding ) -> Result < Option < Self > > {
303288 let address_size = encoding. address_size ;
304289
305- let tuple_length = R :: Offset :: from_u8 ( 2 * address_size + segment_size ) ;
290+ let tuple_length = R :: Offset :: from_u8 ( 2 * address_size) ;
306291 if tuple_length > input. len ( ) {
307292 input. empty ( ) ;
308293 return Ok ( None ) ;
309294 }
310295
311- let segment = if segment_size != 0 {
312- input. read_address ( segment_size) ?
313- } else {
314- 0
315- } ;
316296 let begin = input. read_address ( address_size) ?;
317297 let length = input. read_address ( address_size) ?;
318298 // Calculate end now so that we can handle overflow.
319299 // TODO: handle 32-bit address overflow as well.
320300 let end = begin. checked_add ( length) . ok_or ( Error :: AddressOverflow ) ?;
301+ let range = Range { begin, end } ;
321302
322- match ( segment , begin, length) {
303+ match ( begin, length) {
323304 // This is meant to be a null terminator, but in practice it can occur
324305 // before the end, possibly due to a linker omitting a function and
325306 // leaving an unrelocated entry.
326- ( 0 , 0 , 0 ) => Self :: parse ( input, encoding, segment_size) ,
327- _ => Ok ( Some ( ArangeEntry {
328- segment : if segment_size != 0 {
329- Some ( segment)
330- } else {
331- None
332- } ,
333- range : Range { begin, end } ,
334- length,
335- } ) ) ,
307+ ( 0 , 0 ) => Self :: parse ( input, encoding) ,
308+ _ => Ok ( Some ( ArangeEntry { range, length } ) ) ,
336309 }
337310 }
338311
339- /// Return the segment selector of this arange.
340- #[ inline]
341- pub fn segment ( & self ) -> Option < u64 > {
342- self . segment
343- }
344-
345312 /// Return the beginning address of this arange.
346313 #[ inline]
347314 pub fn address ( & self ) -> u64 {
@@ -426,20 +393,19 @@ mod tests {
426393 fn test_parse_header_ok ( ) {
427394 #[ rustfmt:: skip]
428395 let buf = [
429- // 32-bit length = 32 .
430- 0x20 , 0x00 , 0x00 , 0x00 ,
396+ // 32-bit length = 28 (8 bytes header, 4 bytes padding, 16 bytes tuple data) .
397+ 0x1c , 0x00 , 0x00 , 0x00 ,
431398 // Version.
432399 0x02 , 0x00 ,
433400 // Offset.
434401 0x01 , 0x02 , 0x03 , 0x04 ,
435402 // Address size.
436403 0x08 ,
437404 // Segment size.
438- 0x04 ,
439- // Length to here = 12, tuple length = 20 .
405+ 0x00 ,
406+ // Length to here = 12, tuple length = 16 .
440407 // Padding to tuple length multiple = 4.
441408 0x10 , 0x00 , 0x00 , 0x00 ,
442- 0x00 , 0x00 , 0x00 , 0x00 ,
443409
444410 // Dummy arange tuple data.
445411 0x20 , 0x00 , 0x00 , 0x00 ,
@@ -472,9 +438,8 @@ mod tests {
472438 version: 2 ,
473439 address_size: 8 ,
474440 } ,
475- length: 0x20 ,
441+ length: 0x1c ,
476442 debug_info_offset: DebugInfoOffset ( 0x0403_0201 ) ,
477- segment_size: 4 ,
478443 entries: EndianSlice :: new( & buf[ buf. len( ) - 32 ..buf. len( ) - 16 ] , LittleEndian ) ,
479444 }
480445 ) ;
@@ -493,7 +458,7 @@ mod tests {
493458 // Address size.
494459 0xff ,
495460 // Segment size.
496- 0xff ,
461+ 0x00 ,
497462 // Length to here = 12, tuple length = 20.
498463 // Padding to tuple length multiple = 4.
499464 0x10 , 0x00 , 0x00 , 0x00 ,
@@ -566,52 +531,13 @@ mod tests {
566531 version : 2 ,
567532 address_size : 4 ,
568533 } ;
569- let segment_size = 0 ;
570534 let buf = [ 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 , 0x09 ] ;
571535 let rest = & mut EndianSlice :: new ( & buf, LittleEndian ) ;
572- let entry =
573- ArangeEntry :: parse ( rest, encoding, segment_size) . expect ( "should parse entry ok" ) ;
574- assert_eq ! ( * rest, EndianSlice :: new( & buf[ buf. len( ) - 1 ..] , LittleEndian ) ) ;
575- assert_eq ! (
576- entry,
577- Some ( ArangeEntry {
578- segment: None ,
579- range: Range {
580- begin: 0x0403_0201 ,
581- end: 0x0403_0201 + 0x0807_0605 ,
582- } ,
583- length: 0x0807_0605 ,
584- } )
585- ) ;
586- }
587-
588- #[ test]
589- fn test_parse_entry_segment ( ) {
590- let encoding = Encoding {
591- format : Format :: Dwarf32 ,
592- version : 2 ,
593- address_size : 4 ,
594- } ;
595- let segment_size = 8 ;
596- #[ rustfmt:: skip]
597- let buf = [
598- // Segment.
599- 0x11 , 0x12 , 0x13 , 0x14 , 0x15 , 0x16 , 0x17 , 0x18 ,
600- // Address.
601- 0x01 , 0x02 , 0x03 , 0x04 ,
602- // Length.
603- 0x05 , 0x06 , 0x07 , 0x08 ,
604- // Next tuple.
605- 0x09
606- ] ;
607- let rest = & mut EndianSlice :: new ( & buf, LittleEndian ) ;
608- let entry =
609- ArangeEntry :: parse ( rest, encoding, segment_size) . expect ( "should parse entry ok" ) ;
536+ let entry = ArangeEntry :: parse ( rest, encoding) . expect ( "should parse entry ok" ) ;
610537 assert_eq ! ( * rest, EndianSlice :: new( & buf[ buf. len( ) - 1 ..] , LittleEndian ) ) ;
611538 assert_eq ! (
612539 entry,
613540 Some ( ArangeEntry {
614- segment: Some ( 0x1817_1615_1413_1211 ) ,
615541 range: Range {
616542 begin: 0x0403_0201 ,
617543 end: 0x0403_0201 + 0x0807_0605 ,
@@ -628,7 +554,6 @@ mod tests {
628554 version : 2 ,
629555 address_size : 4 ,
630556 } ;
631- let segment_size = 0 ;
632557 #[ rustfmt:: skip]
633558 let buf = [
634559 // Zero tuple.
@@ -641,13 +566,11 @@ mod tests {
641566 0x09
642567 ] ;
643568 let rest = & mut EndianSlice :: new ( & buf, LittleEndian ) ;
644- let entry =
645- ArangeEntry :: parse ( rest, encoding, segment_size) . expect ( "should parse entry ok" ) ;
569+ let entry = ArangeEntry :: parse ( rest, encoding) . expect ( "should parse entry ok" ) ;
646570 assert_eq ! ( * rest, EndianSlice :: new( & buf[ buf. len( ) - 1 ..] , LittleEndian ) ) ;
647571 assert_eq ! (
648572 entry,
649573 Some ( ArangeEntry {
650- segment: None ,
651574 range: Range {
652575 begin: 0x0403_0201 ,
653576 end: 0x0403_0201 + 0x0807_0605 ,
@@ -664,7 +587,6 @@ mod tests {
664587 version : 2 ,
665588 address_size : 8 ,
666589 } ;
667- let segment_size = 0 ;
668590 #[ rustfmt:: skip]
669591 let buf = [
670592 // Address.
@@ -675,7 +597,7 @@ mod tests {
675597 0x09
676598 ] ;
677599 let rest = & mut EndianSlice :: new ( & buf, LittleEndian ) ;
678- let entry = ArangeEntry :: parse ( rest, encoding, segment_size ) ;
600+ let entry = ArangeEntry :: parse ( rest, encoding) ;
679601 assert_eq ! ( * rest, EndianSlice :: new( & buf[ buf. len( ) - 1 ..] , LittleEndian ) ) ;
680602 assert_eq ! ( entry, Err ( Error :: AddressOverflow ) ) ;
681603 }
0 commit comments