yann@1: From http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/alpha/dl-machine.h.diff?r1=1.56&r2=1.57&cvsroot=glibc yann@1: (minus first hunk) yann@1: Lets glibc-2.2.5 compile with gcc-3.3 yann@1: yann@1: =================================================================== yann@1: RCS file: /cvs/glibc/libc/sysdeps/alpha/dl-machine.h,v yann@1: retrieving revision 1.56 yann@1: retrieving revision 1.57 yann@1: diff -u -r1.56 -r1.57 yann@1: --- libc/sysdeps/alpha/dl-machine.h 2001/12/12 00:10:27 1.56 yann@1: +++ libc/sysdeps/alpha/dl-machine.h 2001/12/31 17:33:59 1.57 yann@1: @@ -156,125 +157,126 @@ yann@1: #define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name, IMB) \ yann@1: extern void tramp_name (void); \ yann@1: asm ( "\ yann@1: - .globl " #tramp_name " yann@1: - .ent " #tramp_name " yann@1: -" #tramp_name ": yann@1: - lda $sp, -44*8($sp) yann@1: - .frame $sp, 44*8, $26 yann@1: - /* Preserve all integer registers that C normally doesn't. */ yann@1: - stq $26, 0*8($sp) yann@1: - stq $0, 1*8($sp) yann@1: - stq $1, 2*8($sp) yann@1: - stq $2, 3*8($sp) yann@1: - stq $3, 4*8($sp) yann@1: - stq $4, 5*8($sp) yann@1: - stq $5, 6*8($sp) yann@1: - stq $6, 7*8($sp) yann@1: - stq $7, 8*8($sp) yann@1: - stq $8, 9*8($sp) yann@1: - stq $16, 10*8($sp) yann@1: - stq $17, 11*8($sp) yann@1: - stq $18, 12*8($sp) yann@1: - stq $19, 13*8($sp) yann@1: - stq $20, 14*8($sp) yann@1: - stq $21, 15*8($sp) yann@1: - stq $22, 16*8($sp) yann@1: - stq $23, 17*8($sp) yann@1: - stq $24, 18*8($sp) yann@1: - stq $25, 19*8($sp) yann@1: - stq $29, 20*8($sp) yann@1: - stt $f0, 21*8($sp) yann@1: - stt $f1, 22*8($sp) yann@1: - stt $f10, 23*8($sp) yann@1: - stt $f11, 24*8($sp) yann@1: - stt $f12, 25*8($sp) yann@1: - stt $f13, 26*8($sp) yann@1: - stt $f14, 27*8($sp) yann@1: - stt $f15, 28*8($sp) yann@1: - stt $f16, 29*8($sp) yann@1: - stt $f17, 30*8($sp) yann@1: - stt $f18, 31*8($sp) yann@1: - stt $f19, 32*8($sp) yann@1: - stt $f20, 33*8($sp) yann@1: - stt $f21, 34*8($sp) yann@1: - stt $f22, 35*8($sp) yann@1: - stt $f23, 36*8($sp) yann@1: - stt $f24, 37*8($sp) yann@1: - stt $f25, 38*8($sp) yann@1: - stt $f26, 39*8($sp) yann@1: - stt $f27, 40*8($sp) yann@1: - stt $f28, 41*8($sp) yann@1: - stt $f29, 42*8($sp) yann@1: - stt $f30, 43*8($sp) yann@1: - .mask 0x27ff01ff, -44*8 yann@1: - .fmask 0xfffffc03, -(44-21)*8 yann@1: - /* Set up our $gp */ yann@1: - br $gp, .+4 yann@1: - ldgp $gp, 0($gp) yann@1: - .prologue 0 yann@1: - /* Set up the arguments for fixup: */ yann@1: - /* $16 = link_map out of plt0 */ yann@1: - /* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */ yann@1: - /* $18 = return address */ yann@1: - subq $28, $27, $17 yann@1: - ldq $16, 8($27) yann@1: - subq $17, 20, $17 yann@1: - mov $26, $18 yann@1: - addq $17, $17, $17 yann@1: - /* Do the fixup */ yann@1: - bsr $26, " ASM_ALPHA_NG_SYMBOL_PREFIX #fixup_name "..ng yann@1: - /* Move the destination address into position. */ yann@1: - mov $0, $27 yann@1: - /* Restore program registers. */ yann@1: - ldq $26, 0*8($sp) yann@1: - ldq $0, 1*8($sp) yann@1: - ldq $1, 2*8($sp) yann@1: - ldq $2, 3*8($sp) yann@1: - ldq $3, 4*8($sp) yann@1: - ldq $4, 5*8($sp) yann@1: - ldq $5, 6*8($sp) yann@1: - ldq $6, 7*8($sp) yann@1: - ldq $7, 8*8($sp) yann@1: - ldq $8, 9*8($sp) yann@1: - ldq $16, 10*8($sp) yann@1: - ldq $17, 11*8($sp) yann@1: - ldq $18, 12*8($sp) yann@1: - ldq $19, 13*8($sp) yann@1: - ldq $20, 14*8($sp) yann@1: - ldq $21, 15*8($sp) yann@1: - ldq $22, 16*8($sp) yann@1: - ldq $23, 17*8($sp) yann@1: - ldq $24, 18*8($sp) yann@1: - ldq $25, 19*8($sp) yann@1: - ldq $29, 20*8($sp) yann@1: - ldt $f0, 21*8($sp) yann@1: - ldt $f1, 22*8($sp) yann@1: - ldt $f10, 23*8($sp) yann@1: - ldt $f11, 24*8($sp) yann@1: - ldt $f12, 25*8($sp) yann@1: - ldt $f13, 26*8($sp) yann@1: - ldt $f14, 27*8($sp) yann@1: - ldt $f15, 28*8($sp) yann@1: - ldt $f16, 29*8($sp) yann@1: - ldt $f17, 30*8($sp) yann@1: - ldt $f18, 31*8($sp) yann@1: - ldt $f19, 32*8($sp) yann@1: - ldt $f20, 33*8($sp) yann@1: - ldt $f21, 34*8($sp) yann@1: - ldt $f22, 35*8($sp) yann@1: - ldt $f23, 36*8($sp) yann@1: - ldt $f24, 37*8($sp) yann@1: - ldt $f25, 38*8($sp) yann@1: - ldt $f26, 39*8($sp) yann@1: - ldt $f27, 40*8($sp) yann@1: - ldt $f28, 41*8($sp) yann@1: - ldt $f29, 42*8($sp) yann@1: - ldt $f30, 43*8($sp) yann@1: - /* Flush the Icache after having modified the .plt code. */ yann@1: - " #IMB " yann@1: - /* Clean up and turn control to the destination */ yann@1: - lda $sp, 44*8($sp) yann@1: - jmp $31, ($27) yann@1: + .globl " #tramp_name " \n\ yann@1: + .ent " #tramp_name " \n\ yann@1: +" #tramp_name ": \n\ yann@1: + lda $sp, -44*8($sp) \n\ yann@1: + .frame $sp, 44*8, $26 \n\ yann@1: + /* Preserve all integer registers that C normally \n\ yann@1: + doesn't. */ \n\ yann@1: + stq $26, 0*8($sp) \n\ yann@1: + stq $0, 1*8($sp) \n\ yann@1: + stq $1, 2*8($sp) \n\ yann@1: + stq $2, 3*8($sp) \n\ yann@1: + stq $3, 4*8($sp) \n\ yann@1: + stq $4, 5*8($sp) \n\ yann@1: + stq $5, 6*8($sp) \n\ yann@1: + stq $6, 7*8($sp) \n\ yann@1: + stq $7, 8*8($sp) \n\ yann@1: + stq $8, 9*8($sp) \n\ yann@1: + stq $16, 10*8($sp) \n\ yann@1: + stq $17, 11*8($sp) \n\ yann@1: + stq $18, 12*8($sp) \n\ yann@1: + stq $19, 13*8($sp) \n\ yann@1: + stq $20, 14*8($sp) \n\ yann@1: + stq $21, 15*8($sp) \n\ yann@1: + stq $22, 16*8($sp) \n\ yann@1: + stq $23, 17*8($sp) \n\ yann@1: + stq $24, 18*8($sp) \n\ yann@1: + stq $25, 19*8($sp) \n\ yann@1: + stq $29, 20*8($sp) \n\ yann@1: + stt $f0, 21*8($sp) \n\ yann@1: + stt $f1, 22*8($sp) \n\ yann@1: + stt $f10, 23*8($sp) \n\ yann@1: + stt $f11, 24*8($sp) \n\ yann@1: + stt $f12, 25*8($sp) \n\ yann@1: + stt $f13, 26*8($sp) \n\ yann@1: + stt $f14, 27*8($sp) \n\ yann@1: + stt $f15, 28*8($sp) \n\ yann@1: + stt $f16, 29*8($sp) \n\ yann@1: + stt $f17, 30*8($sp) \n\ yann@1: + stt $f18, 31*8($sp) \n\ yann@1: + stt $f19, 32*8($sp) \n\ yann@1: + stt $f20, 33*8($sp) \n\ yann@1: + stt $f21, 34*8($sp) \n\ yann@1: + stt $f22, 35*8($sp) \n\ yann@1: + stt $f23, 36*8($sp) \n\ yann@1: + stt $f24, 37*8($sp) \n\ yann@1: + stt $f25, 38*8($sp) \n\ yann@1: + stt $f26, 39*8($sp) \n\ yann@1: + stt $f27, 40*8($sp) \n\ yann@1: + stt $f28, 41*8($sp) \n\ yann@1: + stt $f29, 42*8($sp) \n\ yann@1: + stt $f30, 43*8($sp) \n\ yann@1: + .mask 0x27ff01ff, -44*8 \n\ yann@1: + .fmask 0xfffffc03, -(44-21)*8 \n\ yann@1: + /* Set up our $gp */ \n\ yann@1: + br $gp, .+4 \n\ yann@1: + ldgp $gp, 0($gp) \n\ yann@1: + .prologue 0 \n\ yann@1: + /* Set up the arguments for fixup: */ \n\ yann@1: + /* $16 = link_map out of plt0 */ \n\ yann@1: + /* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */\n\ yann@1: + /* $18 = return address */ \n\ yann@1: + subq $28, $27, $17 \n\ yann@1: + ldq $16, 8($27) \n\ yann@1: + subq $17, 20, $17 \n\ yann@1: + mov $26, $18 \n\ yann@1: + addq $17, $17, $17 \n\ yann@1: + /* Do the fixup */ \n\ yann@1: + bsr $26, " ASM_ALPHA_NG_SYMBOL_PREFIX #fixup_name "..ng\n\ yann@1: + /* Move the destination address into position. */ \n\ yann@1: + mov $0, $27 \n\ yann@1: + /* Restore program registers. */ \n\ yann@1: + ldq $26, 0*8($sp) \n\ yann@1: + ldq $0, 1*8($sp) \n\ yann@1: + ldq $1, 2*8($sp) \n\ yann@1: + ldq $2, 3*8($sp) \n\ yann@1: + ldq $3, 4*8($sp) \n\ yann@1: + ldq $4, 5*8($sp) \n\ yann@1: + ldq $5, 6*8($sp) \n\ yann@1: + ldq $6, 7*8($sp) \n\ yann@1: + ldq $7, 8*8($sp) \n\ yann@1: + ldq $8, 9*8($sp) \n\ yann@1: + ldq $16, 10*8($sp) \n\ yann@1: + ldq $17, 11*8($sp) \n\ yann@1: + ldq $18, 12*8($sp) \n\ yann@1: + ldq $19, 13*8($sp) \n\ yann@1: + ldq $20, 14*8($sp) \n\ yann@1: + ldq $21, 15*8($sp) \n\ yann@1: + ldq $22, 16*8($sp) \n\ yann@1: + ldq $23, 17*8($sp) \n\ yann@1: + ldq $24, 18*8($sp) \n\ yann@1: + ldq $25, 19*8($sp) \n\ yann@1: + ldq $29, 20*8($sp) \n\ yann@1: + ldt $f0, 21*8($sp) \n\ yann@1: + ldt $f1, 22*8($sp) \n\ yann@1: + ldt $f10, 23*8($sp) \n\ yann@1: + ldt $f11, 24*8($sp) \n\ yann@1: + ldt $f12, 25*8($sp) \n\ yann@1: + ldt $f13, 26*8($sp) \n\ yann@1: + ldt $f14, 27*8($sp) \n\ yann@1: + ldt $f15, 28*8($sp) \n\ yann@1: + ldt $f16, 29*8($sp) \n\ yann@1: + ldt $f17, 30*8($sp) \n\ yann@1: + ldt $f18, 31*8($sp) \n\ yann@1: + ldt $f19, 32*8($sp) \n\ yann@1: + ldt $f20, 33*8($sp) \n\ yann@1: + ldt $f21, 34*8($sp) \n\ yann@1: + ldt $f22, 35*8($sp) \n\ yann@1: + ldt $f23, 36*8($sp) \n\ yann@1: + ldt $f24, 37*8($sp) \n\ yann@1: + ldt $f25, 38*8($sp) \n\ yann@1: + ldt $f26, 39*8($sp) \n\ yann@1: + ldt $f27, 40*8($sp) \n\ yann@1: + ldt $f28, 41*8($sp) \n\ yann@1: + ldt $f29, 42*8($sp) \n\ yann@1: + ldt $f30, 43*8($sp) \n\ yann@1: + /* Flush the Icache after having modified the .plt code. */\n\ yann@1: + " #IMB " \n\ yann@1: + /* Clean up and turn control to the destination */ \n\ yann@1: + lda $sp, 44*8($sp) \n\ yann@1: + jmp $31, ($27) \n\ yann@1: .end " #tramp_name) yann@1: yann@1: #ifndef PROF yann@1: @@ -292,85 +294,87 @@ yann@1: its return value is the user program's entry point. */ yann@1: yann@1: #define RTLD_START asm ("\ yann@1: -.text yann@1: - .set at yann@1: - .globl _start yann@1: - .ent _start yann@1: -_start: yann@1: - br $gp, 0f yann@1: -0: ldgp $gp, 0($gp) yann@1: - .prologue 0 yann@1: - /* Pass pointer to argument block to _dl_start. */ yann@1: - mov $sp, $16 yann@1: - bsr $26, "ASM_ALPHA_NG_SYMBOL_PREFIX"_dl_start..ng yann@1: - .end _start yann@1: - /* FALLTHRU */ yann@1: - .globl _dl_start_user yann@1: - .ent _dl_start_user yann@1: -_dl_start_user: yann@1: - .frame $30,0,$31,0 yann@1: - .prologue 0 yann@1: - /* Save the user entry point address in s0. */ yann@1: - mov $0, $9 yann@1: - /* Store the highest stack address. */ yann@1: - stq $30, __libc_stack_end yann@1: - /* See if we were run as a command with the executable file yann@1: - name as an extra leading argument. */ yann@1: - ldl $1, _dl_skip_args yann@1: - bne $1, $fixup_stack yann@1: -$fixup_stack_ret: yann@1: - /* The special initializer gets called with the stack just yann@1: - as the application's entry point will see it; it can yann@1: - switch stacks if it moves these contents over. */ yann@1: -" RTLD_START_SPECIAL_INIT " yann@1: - /* Call _dl_init(_dl_loaded, argc, argv, envp) to run initializers. */ yann@1: - ldq $16, _dl_loaded yann@1: - ldq $17, 0($sp) yann@1: - lda $18, 8($sp) yann@1: - s8addq $17, 8, $19 yann@1: - addq $19, $18, $19 yann@1: - jsr $26, _dl_init yann@1: - /* Pass our finalizer function to the user in $0. */ yann@1: - lda $0, _dl_fini yann@1: - /* Jump to the user's entry point. */ yann@1: - mov $9, $27 yann@1: - jmp ($9) yann@1: -$fixup_stack: yann@1: - /* Adjust the stack pointer to skip _dl_skip_args words. This yann@1: - involves copying everything down, since the stack pointer must yann@1: - always be 16-byte aligned. */ yann@1: - ldq $2, 0($sp) yann@1: - ldq $5, _dl_argv yann@1: - subq $31, $1, $6 yann@1: - subq $2, $1, $2 yann@1: - s8addq $6, $5, $5 yann@1: - mov $sp, $4 yann@1: - s8addq $1, $sp, $3 yann@1: - stq $2, 0($sp) yann@1: - stq $5, _dl_argv yann@1: - /* Copy down argv. */ yann@1: -0: ldq $5, 8($3) yann@1: - addq $4, 8, $4 yann@1: - addq $3, 8, $3 yann@1: - stq $5, 0($4) yann@1: - bne $5, 0b yann@1: - /* Copy down envp. */ yann@1: -1: ldq $5, 8($3) yann@1: - addq $4, 8, $4 yann@1: - addq $3, 8, $3 yann@1: - stq $5, 0($4) yann@1: - bne $5, 1b yann@1: - /* Copy down auxiliary table. */ yann@1: -2: ldq $5, 8($3) yann@1: - ldq $6, 16($3) yann@1: - addq $4, 16, $4 yann@1: - addq $3, 16, $3 yann@1: - stq $5, -8($4) yann@1: - stq $6, 0($4) yann@1: - bne $5, 2b yann@1: - br $fixup_stack_ret yann@1: - .end _dl_start_user yann@1: - .set noat yann@1: +.text \n\ yann@1: + .set at \n\ yann@1: + .globl _start \n\ yann@1: + .ent _start \n\ yann@1: +_start: \n\ yann@1: + br $gp, 0f \n\ yann@1: +0: ldgp $gp, 0($gp) \n\ yann@1: + .prologue 0 \n\ yann@1: + /* Pass pointer to argument block to _dl_start. */ \n\ yann@1: + mov $sp, $16 \n\ yann@1: + bsr $26, "ASM_ALPHA_NG_SYMBOL_PREFIX"_dl_start..ng \n\ yann@1: + .end _start \n\ yann@1: + /* FALLTHRU */ \n\ yann@1: + .globl _dl_start_user \n\ yann@1: + .ent _dl_start_user \n\ yann@1: +_dl_start_user: \n\ yann@1: + .frame $30,0,$31,0 \n\ yann@1: + .prologue 0 \n\ yann@1: + /* Save the user entry point address in s0. */ \n\ yann@1: + mov $0, $9 \n\ yann@1: + /* Store the highest stack address. */ \n\ yann@1: + stq $30, __libc_stack_end \n\ yann@1: + /* See if we were run as a command with the executable \n\ yann@1: + file name as an extra leading argument. */ \n\ yann@1: + ldl $1, _dl_skip_args \n\ yann@1: + bne $1, $fixup_stack \n\ yann@1: +$fixup_stack_ret: \n\ yann@1: + /* The special initializer gets called with the stack \n\ yann@1: + just as the application's entry point will see it; \n\ yann@1: + it can switch stacks if it moves these contents \n\ yann@1: + over. */ \n\ yann@1: +" RTLD_START_SPECIAL_INIT " \n\ yann@1: + /* Call _dl_init(_dl_loaded, argc, argv, envp) to run \n\ yann@1: + initializers. */ \n\ yann@1: + ldq $16, _dl_loaded \n\ yann@1: + ldq $17, 0($sp) \n\ yann@1: + lda $18, 8($sp) \n\ yann@1: + s8addq $17, 8, $19 \n\ yann@1: + addq $19, $18, $19 \n\ yann@1: + jsr $26, _dl_init \n\ yann@1: + /* Pass our finalizer function to the user in $0. */ \n\ yann@1: + lda $0, _dl_fini \n\ yann@1: + /* Jump to the user's entry point. */ \n\ yann@1: + mov $9, $27 \n\ yann@1: + jmp ($9) \n\ yann@1: +$fixup_stack: \n\ yann@1: + /* Adjust the stack pointer to skip _dl_skip_args words.\n\ yann@1: + This involves copying everything down, since the \n\ yann@1: + stack pointer must always be 16-byte aligned. */ \n\ yann@1: + ldq $2, 0($sp) \n\ yann@1: + ldq $5, _dl_argv \n\ yann@1: + subq $31, $1, $6 \n\ yann@1: + subq $2, $1, $2 \n\ yann@1: + s8addq $6, $5, $5 \n\ yann@1: + mov $sp, $4 \n\ yann@1: + s8addq $1, $sp, $3 \n\ yann@1: + stq $2, 0($sp) \n\ yann@1: + stq $5, _dl_argv \n\ yann@1: + /* Copy down argv. */ \n\ yann@1: +0: ldq $5, 8($3) \n\ yann@1: + addq $4, 8, $4 \n\ yann@1: + addq $3, 8, $3 \n\ yann@1: + stq $5, 0($4) \n\ yann@1: + bne $5, 0b \n\ yann@1: + /* Copy down envp. */ \n\ yann@1: +1: ldq $5, 8($3) \n\ yann@1: + addq $4, 8, $4 \n\ yann@1: + addq $3, 8, $3 \n\ yann@1: + stq $5, 0($4) \n\ yann@1: + bne $5, 1b \n\ yann@1: + /* Copy down auxiliary table. */ \n\ yann@1: +2: ldq $5, 8($3) \n\ yann@1: + ldq $6, 16($3) \n\ yann@1: + addq $4, 16, $4 \n\ yann@1: + addq $3, 16, $3 \n\ yann@1: + stq $5, -8($4) \n\ yann@1: + stq $6, 0($4) \n\ yann@1: + bne $5, 2b \n\ yann@1: + br $fixup_stack_ret \n\ yann@1: + .end _dl_start_user \n\ yann@1: + .set noat \n\ yann@1: .previous"); yann@1: yann@1: #ifndef RTLD_START_SPECIAL_INIT