gcc forgets to decrease esp after function call

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

Compiling some complex templated & inlined C++
code by gcc 4.1.1/4.1.2 I've met a problem with -O2
optimization. Objdump'ed text is below.

In line 30 the code calls method which returns
object via shadow pointer(in %esp). Calling
function has "ret 4" at the end as it should be.
But the problem code does not have
"sub 0x4,%esp" to fix esp after the call.

Obviously, codegenerator knows about calling
function prototype(it creates shadow parameter).
But by some reason it does not emit "sub 0x4,%esp"
and uses esp in line 41 as if esp's value is not
changed by called in line 30 function.
If I "sub 0x4,%esp" in line 33 in gdb all is working
fine.

Any hints about workarround the problem will be very
appritiated.

Best regards
Vladimir Simonov


-----------------------------------------------
00000000 <some_function>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   57                      push   %edi
   4:   56                      push   %esi
   5:   53                      push   %ebx
   6:   83 ec 3c                sub    $0x3c,%esp
   9:   8b 45 08                mov    0x8(%ebp),%eax
   c:   e8 fc ff ff ff          call   d
                        d: R_386_PC32   __i686.get_pc_thunk.bx
  11:   81 c3 02 00 00 00       add    $0x2,%ebx
                        13: R_386_GOTPC _GLOBAL_OFFSET_TABLE_
#include "pragmas.h"
          FORCE_INLINE static typename PrototypeAnalyser<Func>::ReturnType
          Call(ObjectType* object, Func function, const ArgumentsType&)
        {
          return (object->*function)();
  17:   8b 10                   mov    (%eax),%edx
  19:   8b 72 cc                mov    0xffffffcc(%edx),%esi
  1c:   8d 55 d4                lea    0xffffffd4(%ebp),%edx
  1f:   89 55 d0                mov    %edx,0xffffffd0(%ebp)
  22:   01 f0                   add    %esi,%eax
  24:   8b 10                   mov    (%eax),%edx
  26:   89 44 24 04             mov    %eax,0x4(%esp)
  2a:   8b 45 d0                mov    0xffffffd0(%ebp),%eax
  2d:   89 04 24                mov    %eax,(%esp)
  30:   ff 52 08                call   *0x8(%edx)

LARGE AMOUNT OF INLINED TEMPLATED CODE

        }
      };

  33:   8b 4d 14                mov    0x14(%ebp),%ecx
  36:   85 c9                   test   %ecx,%ecx
  38:   74 7c                   je     b6 <>
      }

      void* operator new(size_t itemSize)
      {
        char* mem = reinterpret_cast<char*>(FomatikAlloc(itemSize));
  3a:   8b 45 d8                mov    0xffffffd8(%ebp),%eax
  3d:   8d 7c 00 18             lea    0x18(%eax,%eax,1),%edi
  41:   89 3c 24                mov    %edi,(%esp)
  44:   e8 fc ff ff ff          call
  45: R_386_PLT32       MyAlloc

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux