asmacros.h revision 1321
1#define ALIGN_DATA .align 2 /* 4 byte alignment, zero filled */ 2#define ALIGN_TEXT .align 2,0x90 /* 4-byte alignment, nop filled */ 3#define SUPERALIGN_TEXT .align 4,0x90 /* 16-byte alignment (better for 486), nop filled */ 4 5#define GEN_ENTRY(name) ALIGN_TEXT; .globl name; name: 6#define NON_GPROF_ENTRY(name) GEN_ENTRY(_/**/name) 7 8/* These three are place holders for future changes to the profiling code */ 9#define MCOUNT_LABEL(name) 10#define MEXITCOUNT 11#define FAKE_MCOUNT(caller) 12 13#ifdef GPROF 14/* 15 * ALTENTRY() must be before a corresponding ENTRY() so that it can jump 16 * over the mcounting. 17 */ 18#define ALTENTRY(name) GEN_ENTRY(_/**/name); MCOUNT; jmp 2f 19#define ENTRY(name) GEN_ENTRY(_/**/name); MCOUNT; 2: 20/* 21 * The call to mcount supports the usual (bad) conventions. We allocate 22 * some data and pass a pointer to it although the FreeBSD doesn't use 23 * the data. We set up a frame before calling mcount because that is 24 * the standard convention although it makes work for both mcount and 25 * callers. 26 */ 27#define MCOUNT .data; ALIGN_DATA; 1:; .long 0; .text; \ 28 pushl %ebp; movl %esp,%ebp; \ 29 movl $1b,%eax; call mcount; popl %ebp 30#else 31/* 32 * ALTENTRY() has to align because it is before a corresponding ENTRY(). 33 * ENTRY() has to align to because there may be no ALTENTRY() before it. 34 * If there is a previous ALTENTRY() then the alignment code is empty. 35 */ 36#define ALTENTRY(name) GEN_ENTRY(_/**/name) 37#define ENTRY(name) GEN_ENTRY(_/**/name) 38#define MCOUNT 39 40#endif 41 42#ifdef DUMMY_NOPS /* this will break some older machines */ 43#define FASTER_NOP 44#define NOP 45#else 46#define FASTER_NOP pushl %eax ; inb $0x84,%al ; popl %eax 47#define NOP pushl %eax ; inb $0x84,%al ; inb $0x84,%al ; popl %eax 48#endif 49 50