[gnu.g++.help] Gprof for g++; fixed - here's how.

devooght@ads.com (Lawrence De Vooght) (06/26/91)

I sent this letter out the other day:

===================================
>> Subject: Gprof -gnu profiler - I need advise
>> Message-ID: <ugenblf3ra@ads.com>
>> Sender: usenet@ads.com (USENET News)
>>Organization: Advanced Decision Systems, Mtn. View, CA (415) 960-7300
>>Distribution: usa
>>Date: Fri, 21 Jun 91 10:15:23 PDT
>>Lines: 34

>>   I am trying to find out if it us possible to use the Gnu Profiler -
>>Gprof - with g++ compiled code. 

>>   I have quite a large image (20mg) that I want to profile and I am
>>having problems getting the GPROF to work. I have done the following.


>>On a Sparc station:

>>the code consists of, Xwindow, Interviews and g++

>>compiled the source with the -pg option -- g++ compiler

>>linked the o's with the -pg option

>>make sure that the program executes in the prescribed manner - with
>>exit(0)

>>---- 

>>result is no gmon.out is generated, any suggestion or insights ?

>>	Thanks in advance,
>>	devooght@ads.com

====================

I received a number of answers to my problem some of them complex
other simple. I choose the most simple -- and it worked with one
exception. I defined the extern function as 
- extern "C" void monitor() --. 

The following is the fix ---- Thanks Miron Cuperman.



From: miron@cs.sfu.ca (Miron Cuperman)
Newsgroups: gnu.emacs.help,gnu.g++.help,gnu.gcc.help,gnu.emac
Subject: Re: Gprof -gnu profiler - I need advise
Message-ID: <1991Jun22.022027.1185@cs.sfu.ca>
Date: 22 Jun 91 02:20:27 GMT
References: <ugenblf3ra@ads.com>
Distribution: usa
Organization: Simon Fraser University
Lines: 9



You have to execute the following code before exiting:

extern void monitor(int);
monitor(0);

--	
	by Miron Cuperman <miron@cs.sfu.ca>

fox@allegra.ATt.COM (David Fox) (06/27/91)

This is a workable solution, but it has a number of drawbacks:

 1) The documentation says you should get a gmon.out file even
    if you don't call monitor before exiting.
 2) You shouldn't have to change your source code to do profiling.
 3) You need to load with a profiling version of libg++ to get
    profiling data for the library routines.

Here is my solution.  First, apply this patch to gcc.c and recompile
to produce the executable g++:

*** gcc.c~	Tue Apr 30 23:46:57 1991
--- gcc.c	Mon Jun 17 09:03:02 1991
***************
*** 311,315 ****
   %{A} %{d} %{e*} %{N} %{n} %{r} %{s} %{S} %{T*} %{t} %{u*} %{X} %{x} %{z}\
   %{y*} %{!nostdlib:%S} \
!  %{L*} %o %{!nostdlib:-lg++ gnulib%s %{g:-lg} %L}\n }}}}";
  #else
  /* Here is the spec for running the linker, after compiling all files.  */
--- 311,315 ----
   %{A} %{d} %{e*} %{N} %{n} %{r} %{s} %{S} %{T*} %{t} %{u*} %{X} %{x} %{z}\
   %{y*} %{!nostdlib:%S} \
!  %{L*} %o %{!nostdlib:-lg++%{p:_p}%{pg:_p} gnulib%s %{g:-lg} %L}\n }}}}";
  #else
  /* Here is the spec for running the linker, after compiling all files.  */
***************
*** 317,321 ****
   %{A} %{d} %{e*} %{N} %{n} %{r} %{s} %{S} %{T*} %{t} %{u*} %{X} %{x} %{z}\
   %{y*} %{!nostdlib:%S} \
!  %{L*} %o %{!nostdlib:-lg++ gnulib%s %{g:-lg} %L}\n }}}}";
  #endif
  
--- 317,321 ----
   %{A} %{d} %{e*} %{N} %{n} %{r} %{s} %{S} %{T*} %{t} %{u*} %{X} %{x} %{z}\
   %{y*} %{!nostdlib:%S} \
!  %{L*} %o %{!nostdlib:-lg++%{p:_p}%{pg:_p} gnulib%s %{g:-lg} %L}\n }}}}";
  #endif
  

Next apply this patch to gnulib3.c in libg++:

*** gnulib3.c~	Sat Nov 25 10:16:43 1989
--- gnulib3.c	Mon Jun  3 21:45:28 1991
***************
*** 35,43 ****
  */
  
- #if 0
  #if defined(sun)
  #define ON_EXIT(PROCP, ARG) \
    do { extern void PROCP (); on_exit (PROCP, ARG); } while (0)
- #endif
  #endif
  
--- 35,41 ----

(That is, delete the #if 0 ... #endif pair.)
Recompile libg++ with the -pg flag and install the result with the
name libg++_p.a in the same directory as libg++.a.  Now the compiler
should work as documented.  While you're at it, apply this patch and
recompile ccplus1 to get operator delete to work correctly:

*** cplus-decl.c~	Tue Apr 30 23:46:53 1991
--- cplus-decl.c	Mon Jun  3 10:55:54 1991
***************
*** 7954,7958 ****
  	exprstmt = build_method_call (build1 (NOP_EXPR, TYPE_POINTER_TO (current_class_type), error_mark_node),
  				      get_identifier (OPERATOR_DELETE_FORMAT),
! 				      build_tree_list (NULL_TREE, integer_zero_node),
  				      NULL_TREE, LOOKUP_NORMAL);
        else if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
--- 7954,7958 ----
  	exprstmt = build_method_call (build1 (NOP_EXPR, TYPE_POINTER_TO (current_class_type), error_mark_node),
  				      get_identifier (OPERATOR_DELETE_FORMAT),
! 				      build_tree_list (NULL_TREE, current_class_decl),
  				      NULL_TREE, LOOKUP_NORMAL);
        else if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))