profile.h (139731) | profile.h (143063) |
---|---|
1/*- 2 * Copyright (c) 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 13 unchanged lines hidden (view full) --- 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)profile.h 8.1 (Berkeley) 6/11/93 | 1/*- 2 * Copyright (c) 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 13 unchanged lines hidden (view full) --- 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)profile.h 8.1 (Berkeley) 6/11/93 |
30 * $FreeBSD: head/sys/amd64/include/profile.h 139731 2005-01-05 20:17:21Z imp $ | 30 * $FreeBSD: head/sys/amd64/include/profile.h 143063 2005-03-02 21:33:29Z joerg $ |
31 */ 32 33#ifndef _MACHINE_PROFILE_H_ 34#define _MACHINE_PROFILE_H_ 35 | 31 */ 32 33#ifndef _MACHINE_PROFILE_H_ 34#define _MACHINE_PROFILE_H_ 35 |
36#ifndef _SYS_CDEFS_H_ 37#error this file needs sys/cdefs.h as a prerequisite 38#endif 39 |
|
36#ifdef _KERNEL 37 38/* 39 * Config generates something to tell the compiler to align functions on 16 40 * byte boundaries. A strict alignment is good for keeping the tables small. 41 */ 42#define FUNCTION_ALIGNMENT 16 43 --- 4 unchanged lines hidden (view full) --- 48 */ 49#define _MCOUNT_DECL void mcount 50#define MCOUNT 51 52#ifdef GUPROF 53#define MCOUNT_DECL(s) 54#define MCOUNT_ENTER(s) 55#define MCOUNT_EXIT(s) | 40#ifdef _KERNEL 41 42/* 43 * Config generates something to tell the compiler to align functions on 16 44 * byte boundaries. A strict alignment is good for keeping the tables small. 45 */ 46#define FUNCTION_ALIGNMENT 16 47 --- 4 unchanged lines hidden (view full) --- 52 */ 53#define _MCOUNT_DECL void mcount 54#define MCOUNT 55 56#ifdef GUPROF 57#define MCOUNT_DECL(s) 58#define MCOUNT_ENTER(s) 59#define MCOUNT_EXIT(s) |
56#ifdef __GNUC__ | 60#ifdef __GNUCLIKE_ASM |
57#define MCOUNT_OVERHEAD(label) \ 58 __asm __volatile("pushq %0; call __mcount; popq %%rcx" \ 59 : \ 60 : "i" (profil) \ 61 : "ax", "dx", "cx", "di", "si", "r8", "r9", "memory") 62#define MEXITCOUNT_OVERHEAD() \ 63 __asm __volatile("call .mexitcount; 1:" \ 64 : : \ 65 : "ax", "dx", "cx", "di", "si", "r8", "r9", "memory") 66#define MEXITCOUNT_OVERHEAD_GETLABEL(labelp) \ 67 __asm __volatile("movq $1b,%0" : "=rm" (labelp)) 68#elif defined(lint) 69#define MCOUNT_OVERHEAD(label) 70#define MEXITCOUNT_OVERHEAD() 71#define MEXITCOUNT_OVERHEAD_GETLABEL() 72#else | 61#define MCOUNT_OVERHEAD(label) \ 62 __asm __volatile("pushq %0; call __mcount; popq %%rcx" \ 63 : \ 64 : "i" (profil) \ 65 : "ax", "dx", "cx", "di", "si", "r8", "r9", "memory") 66#define MEXITCOUNT_OVERHEAD() \ 67 __asm __volatile("call .mexitcount; 1:" \ 68 : : \ 69 : "ax", "dx", "cx", "di", "si", "r8", "r9", "memory") 70#define MEXITCOUNT_OVERHEAD_GETLABEL(labelp) \ 71 __asm __volatile("movq $1b,%0" : "=rm" (labelp)) 72#elif defined(lint) 73#define MCOUNT_OVERHEAD(label) 74#define MEXITCOUNT_OVERHEAD() 75#define MEXITCOUNT_OVERHEAD_GETLABEL() 76#else |
73#error 74#endif /* __GNUC */ | 77#error this file needs to be ported to your compiler 78#endif /* __GNUCLIKE_ASM */ |
75#else /* !GUPROF */ 76#define MCOUNT_DECL(s) u_long s; 77#ifdef SMP 78extern int mcount_lock; 79#define MCOUNT_ENTER(s) { s = read_rflags(); disable_intr(); \ 80 while (!atomic_cmpset_acq_int(&mcount_lock, 0, 1)) \ 81 /* nothing */ ; } 82#define MCOUNT_EXIT(s) { atomic_store_rel_int(&mcount_lock, 0); \ --- 20 unchanged lines hidden (view full) --- 103#else /* !_KERNEL */ 104 105#define FUNCTION_ALIGNMENT 4 106 107#define _MCOUNT_DECL \ 108static void _mcount(uintfptr_t frompc, uintfptr_t selfpc) __used; \ 109static void _mcount 110 | 79#else /* !GUPROF */ 80#define MCOUNT_DECL(s) u_long s; 81#ifdef SMP 82extern int mcount_lock; 83#define MCOUNT_ENTER(s) { s = read_rflags(); disable_intr(); \ 84 while (!atomic_cmpset_acq_int(&mcount_lock, 0, 1)) \ 85 /* nothing */ ; } 86#define MCOUNT_EXIT(s) { atomic_store_rel_int(&mcount_lock, 0); \ --- 20 unchanged lines hidden (view full) --- 107#else /* !_KERNEL */ 108 109#define FUNCTION_ALIGNMENT 4 110 111#define _MCOUNT_DECL \ 112static void _mcount(uintfptr_t frompc, uintfptr_t selfpc) __used; \ 113static void _mcount 114 |
111#ifdef __GNUC__ | 115#ifdef __GNUCLIKE_ASM |
112#define MCOUNT __asm(" \n\ 113 .globl .mcount \n\ 114 .type .mcount @function \n\ 115.mcount: \n\ 116 pushq %rbp \n\ 117 movq %rsp,%rbp \n\ 118 pushq %rdi \n\ 119 pushq %rsi \n\ --- 41 unchanged lines hidden (view full) --- 161 * the caller's frame pointer. The caller's raddr is in the \ 162 * caller's frame following the caller's caller's frame pointer.\ 163 */ \ 164 __asm("movq (%%rbp),%0" : "=r" (frompc)); \ 165 frompc = ((uintfptr_t *)frompc)[1]; \ 166 _mcount(frompc, selfpc); \ 167} 168#endif | 116#define MCOUNT __asm(" \n\ 117 .globl .mcount \n\ 118 .type .mcount @function \n\ 119.mcount: \n\ 120 pushq %rbp \n\ 121 movq %rsp,%rbp \n\ 122 pushq %rdi \n\ 123 pushq %rsi \n\ --- 41 unchanged lines hidden (view full) --- 165 * the caller's frame pointer. The caller's raddr is in the \ 166 * caller's frame following the caller's caller's frame pointer.\ 167 */ \ 168 __asm("movq (%%rbp),%0" : "=r" (frompc)); \ 169 frompc = ((uintfptr_t *)frompc)[1]; \ 170 _mcount(frompc, selfpc); \ 171} 172#endif |
169#else /* !__GNUC__ */ | 173#else /* !__GNUCLIKE_ASM */ |
170#define MCOUNT \ 171void \ 172mcount() \ 173{ \ 174} | 174#define MCOUNT \ 175void \ 176mcount() \ 177{ \ 178} |
175#endif /* __GNUC__ */ | 179#endif /* __GNUCLIKE_ASM */ |
176 177typedef u_long uintfptr_t; 178 179#endif /* _KERNEL */ 180 181/* 182 * An unsigned integral type that can hold non-negative difference between 183 * function pointers. --- 4 unchanged lines hidden (view full) --- 188 189void mcount(uintfptr_t frompc, uintfptr_t selfpc); 190 191#else /* !_KERNEL */ 192 193#include <sys/cdefs.h> 194 195__BEGIN_DECLS | 180 181typedef u_long uintfptr_t; 182 183#endif /* _KERNEL */ 184 185/* 186 * An unsigned integral type that can hold non-negative difference between 187 * function pointers. --- 4 unchanged lines hidden (view full) --- 192 193void mcount(uintfptr_t frompc, uintfptr_t selfpc); 194 195#else /* !_KERNEL */ 196 197#include <sys/cdefs.h> 198 199__BEGIN_DECLS |
196#ifdef __GNUC__ | 200#ifdef __GNUCLIKE_ASM |
197void mcount(void) __asm(".mcount"); 198#endif 199__END_DECLS 200 201#endif /* _KERNEL */ 202 203#endif /* !_MACHINE_PROFILE_H_ */ | 201void mcount(void) __asm(".mcount"); 202#endif 203__END_DECLS 204 205#endif /* _KERNEL */ 206 207#endif /* !_MACHINE_PROFILE_H_ */ |