@@ -1350,6 +1350,10 @@ impl<I: VCodeInst> MachBuffer<I> {
13501350
13511351 /// Add a call-site record at the current offset.
13521352 pub fn add_call_site ( & mut self , srcloc : SourceLoc , opcode : Opcode ) {
1353+ debug_assert ! (
1354+ opcode. is_call( ) ,
1355+ "adding call site info for a non-call instruction."
1356+ ) ;
13531357 self . call_sites . push ( MachCallSite {
13541358 ret_addr : self . data . len ( ) as CodeOffset ,
13551359 srcloc,
@@ -1446,7 +1450,6 @@ impl MachBufferFinalized {
14461450
14471451 let mut next_reloc = 0 ;
14481452 let mut next_trap = 0 ;
1449- let mut next_call_site = 0 ;
14501453 for ( idx, byte) in self . data . iter ( ) . enumerate ( ) {
14511454 while next_reloc < self . relocs . len ( )
14521455 && self . relocs [ next_reloc] . offset == idx as CodeOffset
@@ -1461,13 +1464,6 @@ impl MachBufferFinalized {
14611464 sink. trap ( trap. code , trap. srcloc ) ;
14621465 next_trap += 1 ;
14631466 }
1464- while next_call_site < self . call_sites . len ( )
1465- && self . call_sites [ next_call_site] . ret_addr == idx as CodeOffset
1466- {
1467- let call_site = & self . call_sites [ next_call_site] ;
1468- sink. add_call_site ( call_site. opcode , call_site. srcloc ) ;
1469- next_call_site += 1 ;
1470- }
14711467 sink. put1 ( * byte) ;
14721468 }
14731469 }
@@ -1476,6 +1472,11 @@ impl MachBufferFinalized {
14761472 pub fn stack_maps ( & self ) -> & [ MachStackMap ] {
14771473 & self . stack_maps [ ..]
14781474 }
1475+
1476+ /// Get the list of call sites for this code.
1477+ pub fn call_sites ( & self ) -> & [ MachCallSite ] {
1478+ & self . call_sites [ ..]
1479+ }
14791480}
14801481
14811482/// A constant that is deferred to the next constant-pool opportunity.
@@ -1531,13 +1532,14 @@ struct MachTrap {
15311532}
15321533
15331534/// A call site record resulting from a compilation.
1534- struct MachCallSite {
1535+ #[ derive( Clone , Debug ) ]
1536+ pub struct MachCallSite {
15351537 /// The offset of the call's return address, *relative to the containing section*.
1536- ret_addr : CodeOffset ,
1538+ pub ret_addr : CodeOffset ,
15371539 /// The original source location.
1538- srcloc : SourceLoc ,
1540+ pub srcloc : SourceLoc ,
15391541 /// The call's opcode.
1540- opcode : Opcode ,
1542+ pub opcode : Opcode ,
15411543}
15421544
15431545/// A source-location mapping resulting from a compilation.
@@ -2073,7 +2075,6 @@ mod test {
20732075 struct TestCodeSink {
20742076 offset : CodeOffset ,
20752077 traps : Vec < ( CodeOffset , TrapCode ) > ,
2076- callsites : Vec < ( CodeOffset , Opcode ) > ,
20772078 relocs : Vec < ( CodeOffset , Reloc ) > ,
20782079 }
20792080 impl CodeSink for TestCodeSink {
@@ -2086,9 +2087,6 @@ mod test {
20862087 fn trap ( & mut self , t : TrapCode , _: SourceLoc ) {
20872088 self . traps . push ( ( self . offset , t) ) ;
20882089 }
2089- fn add_call_site ( & mut self , op : Opcode , _: SourceLoc ) {
2090- self . callsites . push ( ( self . offset , op) ) ;
2091- }
20922090 }
20932091
20942092 let mut sink = TestCodeSink :: default ( ) ;
@@ -2103,7 +2101,13 @@ mod test {
21032101 ( 2 , TrapCode :: IntegerDivisionByZero )
21042102 ]
21052103 ) ;
2106- assert_eq ! ( sink. callsites, vec![ ( 2 , Opcode :: Call ) , ] ) ;
2104+ assert_eq ! (
2105+ buf. call_sites( )
2106+ . iter( )
2107+ . map( |call_site| ( call_site. ret_addr, call_site. opcode) )
2108+ . collect:: <Vec <_>>( ) ,
2109+ vec![ ( 2 , Opcode :: Call ) ]
2110+ ) ;
21072111 assert_eq ! ( sink. relocs, vec![ ( 2 , Reloc :: Abs4 ) , ( 3 , Reloc :: Abs8 ) ] ) ;
21082112 }
21092113}
0 commit comments