mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 03:39:40 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			189 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{
 | 
						|
    $Id$
 | 
						|
    Copyright (c) 1998-2002 by Pierre Muller
 | 
						|
 | 
						|
    Simple unit to add source line and column to each
 | 
						|
    memory allocation made with heaptrc unit
 | 
						|
 | 
						|
    This program is free software; you can redistribute it and/or modify
 | 
						|
    it under the terms of the GNU General Public License as published by
 | 
						|
    the Free Software Foundation; either version 2 of the License, or
 | 
						|
    (at your option) any later version.
 | 
						|
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
    GNU General Public License for more details.
 | 
						|
 | 
						|
    You should have received a copy of the GNU General Public License
 | 
						|
    along with this program; if not, write to the Free Software
 | 
						|
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
 | 
						|
 ****************************************************************************}
 | 
						|
unit ppheap;
 | 
						|
 | 
						|
{$i fpcdefs.inc}
 | 
						|
 | 
						|
interface
 | 
						|
 | 
						|
    uses heaptrc;
 | 
						|
 | 
						|
    { call this function before any memory allocation
 | 
						|
      in a unit initialization code (PM) }
 | 
						|
 | 
						|
    procedure pp_heap_init;
 | 
						|
 | 
						|
    procedure ppheap_register_file(name : string;index : longint);
 | 
						|
 | 
						|
 | 
						|
implementation
 | 
						|
 | 
						|
    uses
 | 
						|
       cutils,globtype,globals,fmodule;
 | 
						|
 | 
						|
{*****************************************************************************
 | 
						|
                            Filename registration
 | 
						|
*****************************************************************************}
 | 
						|
 | 
						|
    const
 | 
						|
      MaxFiles = 1024;
 | 
						|
      MaxNameLength = 39;
 | 
						|
 | 
						|
    type
 | 
						|
      theapfileinfo = record
 | 
						|
        name : string[MaxNameLength];
 | 
						|
        index : longint;
 | 
						|
      end;
 | 
						|
 | 
						|
      tfileinfoarray = array [1..MaxFiles] of theapfileinfo;
 | 
						|
 | 
						|
    var
 | 
						|
      fileinfoarray : tfileinfoarray;
 | 
						|
      last_index : longint;
 | 
						|
 | 
						|
 | 
						|
    procedure ppheap_register_file(name : string;index : longint);
 | 
						|
      begin
 | 
						|
        inc(last_index);
 | 
						|
        if last_index <= MaxFiles then
 | 
						|
          begin
 | 
						|
            fileinfoarray[last_index].name:=copy(name,1,MaxNameLength);
 | 
						|
            fileinfoarray[last_index].index:=index;
 | 
						|
          end
 | 
						|
        else
 | 
						|
          writeln(stderr,'file',name,' has index ',index);
 | 
						|
      end;
 | 
						|
 | 
						|
 | 
						|
    function getfilename(index : longint) : string;
 | 
						|
      var
 | 
						|
        i : longint;
 | 
						|
      begin
 | 
						|
        for i:=1 to last_index do
 | 
						|
          begin
 | 
						|
            if fileinfoarray[i].index=index then
 | 
						|
              begin
 | 
						|
                getfilename:=fileinfoarray[i].name;
 | 
						|
                exit;
 | 
						|
              end;
 | 
						|
          end;
 | 
						|
        getfilename:=tostr(index);
 | 
						|
      end;
 | 
						|
 | 
						|
 | 
						|
{*****************************************************************************
 | 
						|
                              Heaptrc callbacks
 | 
						|
*****************************************************************************}
 | 
						|
 | 
						|
    type
 | 
						|
      pextra_info = ^textra_info;
 | 
						|
      textra_info = record
 | 
						|
        line,
 | 
						|
        col,
 | 
						|
        fileindex : longint;
 | 
						|
      end;
 | 
						|
 | 
						|
    procedure set_extra_info(p : pointer);
 | 
						|
      begin
 | 
						|
        with pextra_info(p)^ do
 | 
						|
         begin
 | 
						|
           line:=aktfilepos.line;
 | 
						|
           col:=aktfilepos.column;
 | 
						|
           if assigned(current_module) then
 | 
						|
            fileindex:=current_module.unit_index*100000+aktfilepos.fileindex
 | 
						|
           else
 | 
						|
            fileindex:=aktfilepos.fileindex;
 | 
						|
         end;
 | 
						|
      end;
 | 
						|
 | 
						|
 | 
						|
{$ifdef VER1_0}
 | 
						|
    function get_extra_info(p : pointer) : string;
 | 
						|
      begin
 | 
						|
        with pextra_info(p)^ do
 | 
						|
         begin
 | 
						|
           get_extra_info:=getfilename(fileindex)+'('+tostr(line)+','+tostr(col)+
 | 
						|
             ') ';
 | 
						|
         end;
 | 
						|
      end;
 | 
						|
{$else}
 | 
						|
    procedure show_extra_info(var t : text;p : pointer);
 | 
						|
      begin
 | 
						|
        with pextra_info(p)^ do
 | 
						|
         begin
 | 
						|
           writeln(t,getfilename(fileindex)+'('+tostr(line)+','+tostr(col)+') ');
 | 
						|
         end;
 | 
						|
      end;
 | 
						|
{$endif}
 | 
						|
 | 
						|
 | 
						|
  const
 | 
						|
     pp_heap_inited : boolean = false;
 | 
						|
 | 
						|
  procedure pp_heap_init;
 | 
						|
    begin
 | 
						|
       if not pp_heap_inited then
 | 
						|
         begin
 | 
						|
            keepreleased:=true;
 | 
						|
            SetHeapTraceOutput('heap.log');
 | 
						|
{$ifdef VER1_0}
 | 
						|
            SetExtraInfoString({$ifdef FPC}@{$endif}get_extra_info);
 | 
						|
{$else}
 | 
						|
            SetHeapExtraInfo(sizeof(textra_info),
 | 
						|
                             {$ifdef FPCPROCVAR}@{$endif}set_extra_info,
 | 
						|
                             {$ifdef FPCPROCVAR}@{$endif}show_extra_info);
 | 
						|
{$endif}
 | 
						|
         end;
 | 
						|
       pp_heap_inited:=true;
 | 
						|
    end;
 | 
						|
 | 
						|
 | 
						|
begin
 | 
						|
  pp_heap_init;
 | 
						|
end.
 | 
						|
{
 | 
						|
  $Log$
 | 
						|
  Revision 1.12  2002-11-19 12:08:24  pierre
 | 
						|
   * fix compilation failure
 | 
						|
 | 
						|
  Revision 1.11  2002/11/15 01:58:53  peter
 | 
						|
    * merged changes from 1.0.7 up to 04-11
 | 
						|
      - -V option for generating bug report tracing
 | 
						|
      - more tracing for option parsing
 | 
						|
      - errors for cdecl and high()
 | 
						|
      - win32 import stabs
 | 
						|
      - win32 records<=8 are returned in eax:edx (turned off by default)
 | 
						|
      - heaptrc update
 | 
						|
      - more info for temp management in .s file with EXTDEBUG
 | 
						|
 | 
						|
  Revision 1.10  2002/05/18 13:34:13  peter
 | 
						|
    * readded missing revisions
 | 
						|
 | 
						|
  Revision 1.9  2002/05/16 19:46:43  carl
 | 
						|
  + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
 | 
						|
  + try to fix temp allocation (still in ifdef)
 | 
						|
  + generic constructor calls
 | 
						|
  + start of tassembler / tmodulebase class cleanup
 | 
						|
 | 
						|
}
 |