Project

General

Profile

Bug #10080

Updated by normalperson (Eric Wong) almost 10 years ago

Since GCC 4.8.3, some static inline functions (such as rb_call0) are not 
 inlined in the generated machine code. This happens in both x86-64 and ppc64 
 platforms and it can be verified by using the following commands: 

 ~~~ 
 (in ppc64) 

  objdump -dS ruby | grep bl.*rb_call0 

    155838:         c1 f8 ff 4b       bl        1550f8 <rb_call0+0x8> 
    1558a4:         55 f8 ff 4b       bl        1550f8 <rb_call0+0x8> 
    1559e4:         15 f7 ff 4b       bl        1550f8 <rb_call0+0x8> 
    158b88:         71 c5 ff 4b       bl        1550f8 <rb_call0+0x8> 
    15bf40:         b9 91 ff 4b       bl        1550f8 <rb_call0+0x8> 
    15c0f8:         01 90 ff 4b       bl        1550f8 <rb_call0+0x8> 
    15c490:         69 8c ff 4b       bl        1550f8 <rb_call0+0x8> 
    15c4cc:         2d 8c ff 4b       bl        1550f8 <rb_call0+0x8> 
    15c8bc:         3d 88 ff 4b       bl        1550f8 <rb_call0+0x8> 
    15cc94:         65 84 ff 4b       bl        1550f8 <rb_call0+0x8> 
    15d344:         b5 7d ff 4b       bl        1550f8 <rb_call0+0x8> 
    15d3c4:         35 7d ff 4b       bl        1550f8 <rb_call0+0x8> 
   
 (in x86-64) 
  
  objdump -dS ruby | grep call\.*rb_call0 
  
    126280:         e8 cb f9 ff ff            callq    125c50 <rb_call0> 
    126347:         e8 04 f9 ff ff            callq    125c50 <rb_call0> 
    1264cc:         e8 7f f7 ff ff            callq    125c50 <rb_call0> 
    128a9e:         e8 ad d1 ff ff            callq    125c50 <rb_call0> 
    12ade9:         e8 62 ae ff ff            callq    125c50 <rb_call0> 
    12af6a:         e8 e1 ac ff ff            callq    125c50 <rb_call0> 
    12b2e6:         e8 65 a9 ff ff            callq    125c50 <rb_call0> 
    12b5d7:         e8 74 a6 ff ff            callq    125c50 <rb_call0> 
    12b899:         e8 b2 a3 ff ff            callq    125c50 <rb_call0> 
    12bccd:         e8 7e 9f ff ff            callq    125c50 <rb_call0> 
    12bdf0:         e8 5b 9e ff ff            callq    125c50 <rb_call0> 
 ~~~ 

 This behaviour can be fixed if every inlined function were marked with the always_inline attribute when compiling with GCC. 

Back