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
------------------------------------------------------------------------------