/* * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * and/or other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "pcc_prefix.s" #define BLANK #define BANNER(str) BLANK .VERSION str #define ENTRY(Name) BLANK M_ENTRY (Name,PROF_/**/Name) #define ENTRYC(Name) BLANK M_ENTRYC(Name,PROF_/**/Name) #define EXIT(Name) BLANK M_EXIT (Name,PROF_/**/Name) #define EXITC(Name) BLANK M_EXITC (Name,PROF_/**/Name) #if 0 #define TEXT_SEGMENT \ .SPACE $TEXT$ !\ .SUBSPA $CODE$ #define RO_SEGMENT \ .SPACE $TEXT$ !\ .SUBSPA $lit$ #define DATA_SEGMENT \ .SPACE $PRIVATE$ !\ .SUBSPA $data$ #define BSS_SEGMENT \ .SPACE $PRIVATE$ !\ .SUBSPA $bss$ #else #define TEXT_SEGMENT .text #define RO_SEGMENT .rodata #define DATA_SEGMENT .data #define BSS_SEGMENT .bss #endif #ifdef PROF ; ; All four argument registers are saved into caller save registers ; and restored after the call to _mcount. This is possible because ; the mcount routine does not modify them, so we can. Mcount takes ; 3 arguments; the first argument is the incoming 'rp', the second ; is the starting address of the profiled routine, and the third is ; the address of the PROF label (which is where mcount stores the ; profile data). ; #define M_ENTRY(name,prof) \ TEXT_SEGMENT !\ .label name !\ .PROC !\ .CALLINFO CALLER,SAVE_RP !\ .ENTRY !\ stw rp,-20(sp) !\ ldo 48(sp),sp !\ or arg0,r0,r19 !\ or arg1,r0,r20 !\ or arg2,r0,r21 !\ or arg3,r0,r22 !\ or rp,r0,arg0 !\ ldil L%name,r1 !\ ldo R%name(r1),arg1 !\ addil L%prof-$global$,dp !\ bl _mcount,rp !\ ldo R%prof-$global$(r1),arg2 !\ ldw -68(sp),rp !\ ldo -48(sp),sp !\ or r19,r0,arg0 !\ or r20,r0,arg1 !\ or r21,r0,arg2 !\ or r22,r0,arg3 !\ #define M_ENTRYC(name,prof) \ TEXT_SEGMENT !\ .label name !\ .PROC !\ .CALLINFO CALLER,SAVE_RP !\ .ENTRY !\ stw rp,-20(sp) !\ ldo 128(sp),sp !\ or arg0,r0,r19 !\ or arg1,r0,r20 !\ or arg2,r0,r21 !\ or arg3,r0,r22 !\ or rp,r0,arg0 !\ ldil L%name,r1 !\ ldo R%name(r1),arg1 !\ addil L%prof-$global$,dp !\ bl _mcount,rp !\ ldo R%prof-$global$(r1),arg2 !\ ldw -148(sp),rp !\ or r19,r0,arg0 !\ or r20,r0,arg1 !\ or r21,r0,arg2 !\ or r22,r0,arg3 !\ ; ; The HPUX profiler uses a word for each entrypoint to store the profiling ; information. The setup code passes the address to the _mcount routine. ; The EXIT macro defines a label (PROF_foo), and a word of storage. ; #define M_EXIT(name,prof) \ bv,n r0(rp) !\ .EXIT !\ .PROCEND !\ .EXPORT name,ENTRY !\ DATA_SEGMENT !\ .label prof !\ .WORD 0 !\ .IMPORT $global$,DATA !\ .IMPORT _mcount,CODE #define M_EXITC(name,prof) \ bv r0(rp) !\ ldo -128(sp),sp !\ .EXIT !\ .PROCEND !\ .EXPORT name,ENTRY !\ DATA_SEGMENT !\ .label prof !\ .WORD 0 !\ .IMPORT $global$,DATA !\ .IMPORT _mcount,CODE #else /* NOT profiling */ #define M_ENTRY(name,prof) \ TEXT_SEGMENT !\ .label name !\ .PROC !\ .CALLINFO !\ .ENTRY #define M_ENTRYC(name,prof) \ TEXT_SEGMENT !\ .label name !\ .PROC !\ .CALLINFO CALLER,SAVE_RP !\ .ENTRY !\ stw rp,-20(sp) !\ ldo 128(sp),sp #define M_EXIT(name,prof) \ bv,n r0(rp) !\ .EXIT !\ .PROCEND !\ .EXPORT name,ENTRY #define M_EXITC(name,prof) \ ldw -148(sp),rp !\ bv r0(rp) !\ ldo -128(sp),sp !\ .EXIT !\ .PROCEND !\ .EXPORT name,ENTRY #define ENTRY(Name) BLANK M_ENTRY (Name,PROF_/**/Name) #define ENTRYC(Name) BLANK M_ENTRYC(Name,PROF_/**/Name) #define EXIT(Name) BLANK M_EXIT (Name,PROF_/**/Name) #define EXITC(Name) BLANK M_EXITC (Name,PROF_/**/Name) #endif