rjc@CS.UCLA.EDU (Robert Collins) (10/28/89)
I am running on Sun4/330 machines, with SunOS 4.0.3. Oct 17 version of g++. The problem is that functions that I declare `inline' are not being inlined. Here is a pared down version of the kind of code I am dealing with. No warning (about not inlining) is issued. G++ options are -O and -S. rob collins rjc@cs.ucla.edu ------------------------------------------------------------------------------ extern "C" { typedef int CM_field_id_t; CM_field_id_t CM_allocate_heap_field(unsigned); void CM_deallocate_heap_field(CM_field_id_t); void CM_s_add_2_1L(CM_field_id_t d, CM_field_id_t s, unsigned l); void CM_s_add_3_3L(CM_field_id_t d, CM_field_id_t s1, CM_field_id_t s2, unsigned dl, unsigned s1l, unsigned s2l); }; class CM_int; void CM_add(const CM_int& dest, const CM_int& source); class CM_int { private: const CM_field_id_t the_field; const unsigned the_length; public: CM_int(unsigned l); ~CM_int(void); unsigned length(void) const; operator CM_field_id_t() const; void operator+=(const CM_int&); }; inline CM_int::CM_int(unsigned l) : the_length(l), the_field(CM_allocate_heap_field(the_length)) { } inline CM_int::~CM_int(void) { CM_deallocate_heap_field(the_field); } inline unsigned CM_int::length(void) const { return the_length; } inline CM_int::operator CM_field_id_t() const { return the_field; } inline void CM_int::operator+=(const CM_int& rhs) { CM_add(*this, rhs); } inline void CM_add(const CM_int& dest, const CM_int& source) { if (dest.length() == source.length()) { CM_s_add_2_1L(dest, source, dest.length()); } else { CM_s_add_3_3L(dest, dest, source, dest.length(), dest.length(), source.length()); }; } main() { CM_int a(32), b(32); a += b; CM_int c(32), d(16); c += d; } ------------------------------------------------------------------------------ gcc_compiled.: .text .align 4 .proc 1 _CM_add__FRC6CM_intT0: !#PROLOGUE# 0 save %sp,-112,%sp !#PROLOGUE# 1 mov %i0,%o2 mov %i1,%o5 ld [%o2+4],%o3 ld [%o5+4],%o0 cmp %o3,%o0 bne L32 nop ld [%o2],%o0 ld [%o5],%o1 call _CM_s_add_2_1L,0 mov %o3,%o2 b,a L31 L32: ld [%o2],%o1 ld [%o2+4],%o4 mov %o1,%o0 ld [%o5],%o2 mov %o4,%o3 call _CM_s_add_3_3L,0 ld [%o5+4],%o5 L31: ret restore .align 4 .global _main .proc 1 _main: !#PROLOGUE# 0 save %sp,-144,%sp !#PROLOGUE# 1 call ___main,0 nop add %fp,-24,%l0 mov 32,%o2 st %o2,[%l0+4] call _CM_allocate_heap_field,0 mov 32,%o0 st %o0,[%l0] add %fp,-32,%l1 mov 32,%o2 st %o2,[%l1+4] call _CM_allocate_heap_field,0 mov 32,%o0 st %o0,[%l1] mov %l0,%o0 call _CM_add__FRC6CM_intT0,0 mov %l1,%o1 add %fp,-40,%l2 mov 32,%o2 st %o2,[%l2+4] call _CM_allocate_heap_field,0 mov 32,%o0 st %o0,[%l2] add %fp,-48,%l3 mov 16,%o2 st %o2,[%l3+4] call _CM_allocate_heap_field,0 mov 16,%o0 st %o0,[%l3] mov %l2,%o0 call _CM_add__FRC6CM_intT0,0 mov %l3,%o1 call _CM_deallocate_heap_field,0 ld [%l3],%o0 call _CM_deallocate_heap_field,0 ld [%l2],%o0 call _CM_deallocate_heap_field,0 ld [%l1],%o0 call _CM_deallocate_heap_field,0 ld [%l0],%o0 mov 0,%i0 ret restore ------------------------------------------------------------------------------