10967373eSDavid Greenman #define ALIGN_DATA .align 2 /* 4 byte alignment, zero filled */ 20967373eSDavid Greenman #define ALIGN_TEXT .align 2,0x90 /* 4-byte alignment, nop filled */ 30967373eSDavid Greenman #define SUPERALIGN_TEXT .align 4,0x90 /* 16-byte alignment (better for 486), nop filled */ 40967373eSDavid Greenman 50967373eSDavid Greenman #define GEN_ENTRY(name) ALIGN_TEXT; .globl name; name: 60967373eSDavid Greenman #define NON_GPROF_ENTRY(name) GEN_ENTRY(_/**/name) 70967373eSDavid Greenman 80967373eSDavid Greenman #ifdef GPROF 90967373eSDavid Greenman /* 100967373eSDavid Greenman * ALTENTRY() must be before a corresponding ENTRY() so that it can jump 110967373eSDavid Greenman * over the mcounting. 120967373eSDavid Greenman */ 130967373eSDavid Greenman #define ALTENTRY(name) GEN_ENTRY(_/**/name); MCOUNT; jmp 2f 140967373eSDavid Greenman #define ENTRY(name) GEN_ENTRY(_/**/name); MCOUNT; 2: 150967373eSDavid Greenman /* 160967373eSDavid Greenman * The call to mcount supports the usual (bad) conventions. We allocate 170967373eSDavid Greenman * some data and pass a pointer to it although the FreeBSD doesn't use 180967373eSDavid Greenman * the data. We set up a frame before calling mcount because that is 190967373eSDavid Greenman * the standard convention although it makes work for both mcount and 200967373eSDavid Greenman * callers. 210967373eSDavid Greenman */ 220967373eSDavid Greenman #define MCOUNT .data; ALIGN_DATA; 1:; .long 0; .text; \ 230967373eSDavid Greenman pushl %ebp; movl %esp,%ebp; \ 240967373eSDavid Greenman movl $1b,%eax; call mcount; popl %ebp 250967373eSDavid Greenman #else 260967373eSDavid Greenman /* 270967373eSDavid Greenman * ALTENTRY() has to align because it is before a corresponding ENTRY(). 280967373eSDavid Greenman * ENTRY() has to align to because there may be no ALTENTRY() before it. 290967373eSDavid Greenman * If there is a previous ALTENTRY() then the alignment code is empty. 300967373eSDavid Greenman */ 310967373eSDavid Greenman #define ALTENTRY(name) GEN_ENTRY(_/**/name) 320967373eSDavid Greenman #define ENTRY(name) GEN_ENTRY(_/**/name) 330967373eSDavid Greenman 340967373eSDavid Greenman #endif 350967373eSDavid Greenman 360967373eSDavid Greenman #ifdef DUMMY_NOPS /* this will break some older machines */ 370967373eSDavid Greenman #define FASTER_NOP 380967373eSDavid Greenman #define NOP 390967373eSDavid Greenman #else 400967373eSDavid Greenman #define FASTER_NOP pushl %eax ; inb $0x84,%al ; popl %eax 410967373eSDavid Greenman #define NOP pushl %eax ; inb $0x84,%al ; inb $0x84,%al ; popl %eax 420967373eSDavid Greenman #endif 430967373eSDavid Greenman 44