.macro lea_ &r,&a lis $0,ha16($1) addi $0,$0,lo16($1) .endmacro MACOSX = 1 POWER601 = 0 ALLOCATION_PROFILE = 1 USE_TEMPORARY_MEMORY = 1 CHECK_STACK_OVERFLOWS = 0 MODULE_NAMES = 1 .if POWER601 .macro time_hi dialect Power mfrtcu $0 dialect PowerPC .endmacro .macro time_lo dialect Power mfrtcl $0 dialect PowerPC .endmacro .else .macro time_hi mftbu $0 .endmacro .macro time_lo mftb $0 .endmacro .endif #define sp r1 #define d0 r24 #define d1 r25 #define d2 r26 #define d3 r27 #define d4 r28 #define d5 r29 #define d6 r30 #define d7 r31 #define a0 r23 #define a1 r22 #define a2 r21 #define a3 r20 #define a4 r19 #define a5 r18 #define a6 r17 #define o0 r3 #define o1 r4 #define o2 r5 #define o3 r6 #define o4 r7 #define o5 r8 #define g2 r9 #define g3 r10 #define g0 r11 #define g1 r12 #define int_reg r16 #define char_reg r15 #define real_reg r14 #define bool_reg r13 .if POWER601 lo1e9 = 1000000000 % 65536 hi1e9 = (1000000000 / 65536)+1 .endif .globl init_profiler .globl profile_r .globl profile_l .globl profile_l2 .globl profile_n .globl profile_n2 .globl profile_s .globl profile_s2 .globl profile_t .globl profile_ti .globl write_profile_information .globl write_profile_stack .if USE_TEMPORARY_MEMORY .globl _TempNewHandle .globl _TempHLock .globl _TempHUnlock .globl _TempDisposeHandle .else .globl _NewPtr .endif .globl _Gestalt .globl __STRING__ .globl openF .globl closeF .globl writeFC .globl writeFI .globl print_error .globl _new_file_creator .globl _stack_size .globl _er_print_string .globl _er_print_char .globl _create_profile_file_name .if CHECK_STACK_OVERFLOWS .globl _Debugger .endif #define FunctionProfile_next 0 #define FunctionProfile_time_hi 4 #define FunctionProfile_time_lo 8 #define FunctionProfile_n_profiler_calls 12 #define FunctionProfile_n_strict_calls 16 #define FunctionProfile_n_lazy_calls 20 #define FunctionProfile_n_curried_calls 24 #define FunctionProfile_n_words_allocated 28 #define FunctionProfile_name 32 #define FunctionProfile 36 #define Globals_n_free_records_in_block 0 # comment 0 n free records in block #define Globals_last_allocated_block 4 # comment 4 latest allocated block #define Globals_profile_records 8 # comment 8 profile record list #define Globals_time_hi 12 # comment 12 clock #define Globals_time_lo 16 #define Globals_stack_pointer 20 # comment 20 stack pointer #define Globals_last_tail_call 24 # comment 24 last tail calling function #define Globals_n_words_free 28 .if USE_TEMPORARY_MEMORY #define Globals_temp_handle_list 32 #define Globals_profile_stack_handle 36 .if CHECK_STACK_OVERFLOWS Globals_end_profile_stack = 40 Globals = 44 .else Globals = 40 .endif .else .if CHECK_STACK_OVERFLOWS Globals_end_profile_stack = 32 Globals = 36 .else Globals = 32 .endif .endif .text profile_ti: read_clock_0: time_hi r9 time_lo r10 time_hi r4 cmpw 0,r4,r9 bne- read_clock_0 lea_ r5,profile_globals b profile_t_ profile_t: read_clock_1: time_hi r9 time_lo r10 time_hi r4 cmpw 0,r4,r9 bne- read_clock_1 mflr r12 lea_ r5,profile_globals mtctr r12 mtlr r0 profile_t_: lwz r6,Globals_stack_pointer(r5) lwz r7,Globals_time_hi(r5) lwz r8,Globals_time_lo(r5) lwzu r4,-4(r6) stw r6,Globals_stack_pointer(r5) stw r4,Globals_last_tail_call(r5) .if POWER601 sub. r10,r10,r8 sub r9,r9,r7 bge+ @no_borrow addis r10,r10,hi1e9 addi r10,r10,lo1e9 subi r9,r9,1 @no_borrow: .else subc r10,r10,r8 subfe r9,r7,r9 .endif lwz r8,FunctionProfile_time_lo(r4) lwz r7,FunctionProfile_time_hi(r4) .if POWER601 add r8,r8,r10 add r7,r7,r9 subis r9,r8,hi1e9 cmpwi 0,r9,lo1e9 lwz r6,FunctionProfile_n_profiler_calls(r4) blt+ @no_carry subi r8,r9,lo1e9 addi r7,r7,1 @no_carry: .else addc r8,r8,r10 lwz r6,FunctionProfile_n_profiler_calls(r4) adde r7,r7,r9 .endif addi r6,r6,1 stw r7,FunctionProfile_time_hi(r4) stw r8,FunctionProfile_time_lo(r4) stw r6,FunctionProfile_n_profiler_calls(r4) .if ALLOCATION_PROFILE lwz r11,Globals_n_words_free(r5) stw d7,Globals_n_words_free(r5) lwz r12,FunctionProfile_n_words_allocated(r4) sub r11,r11,d7 add r12,r12,r11 stw r12,FunctionProfile_n_words_allocated(r4) .endif store_clock_0: time_hi r9 stw r9,Globals_time_hi(r5) time_lo r10 time_hi r4 stw r10,Globals_time_lo(r5) cmpw 0,r4,r9 ; beqctr+ bcctr 13,2 b store_clock_0 profile_r: read_clock_2: time_hi r9 time_lo r10 time_hi r4 cmpw 0,r4,r9 bne- read_clock_2 lea_ r5,profile_globals lwz r6,Globals_stack_pointer(r5) lwz r7,Globals_time_hi(r5) lwz r8,Globals_time_lo(r5) lwzu r4,-4(r6) li r3,0 stw r6,Globals_stack_pointer(r5) stw r3,Globals_last_tail_call(r5) .if POWER601 sub. r10,r10,r8 sub r9,r9,r7 bge+ @no_borrow addis r10,r10,hi1e9 addi r10,r10,lo1e9 subi r9,r9,1 @no_borrow: .else subc r10,r10,r8 subfe r9,r7,r9 .endif lwz r8,FunctionProfile_time_lo(r4) lwz r7,FunctionProfile_time_hi(r4) .if POWER601 add r8,r8,r10 add r7,r7,r9 subis r9,r8,hi1e9 cmpwi 0,r9,lo1e9 lwz r6,FunctionProfile_n_profiler_calls(r4) blt+ @no_carry subi r8,r9,lo1e9 addi r7,r7,1 @no_carry: .else addc r8,r8,r10 lwz r6,FunctionProfile_n_profiler_calls(r4) adde r7,r7,r9 .endif addi r6,r6,1 stw r7,FunctionProfile_time_hi(r4) stw r8,FunctionProfile_time_lo(r4) stw r6,FunctionProfile_n_profiler_calls(r4) .if ALLOCATION_PROFILE lwz r11,Globals_n_words_free(r5) stw d7,Globals_n_words_free(r5) lwz r12,FunctionProfile_n_words_allocated(r4) sub r11,r11,d7 add r12,r12,r11 stw r12,FunctionProfile_n_words_allocated(r4) .endif store_clock_1: time_hi r9 stw r9,Globals_time_hi(r5) time_lo r10 time_hi r4 stw r10,Globals_time_lo(r5) cmpw 0,r4,r9 beqlr+ b store_clock_1 profile_l: read_clock_3: time_hi r9 time_lo r10 time_hi r4 cmpw 0,r4,r9 bne- read_clock_3 mflr r12 lea_ r5,profile_globals lwz r4,0(r3) mtctr r12 cmpwi 0,r4,0 beql allocate_function_profile_record lwz r3,Globals_last_tail_call(r5) lwz r6,Globals_stack_pointer(r5) cmpwi 0,r3,0 lwz r7,Globals_time_hi(r5) lwz r8,Globals_time_lo(r5) bne use_tail_calling_function_0 lwz r3,-4(r6) c_use_tail_calling_function_0: stw r4,0(r6) addi r6,r6,4 .if CHECK_STACK_OVERFLOWS lwz r12,Globals_end_profile_stack(r5) .endif stw r6,Globals_stack_pointer(r5) .if CHECK_STACK_OVERFLOWS cmpw r6,r12 bge profile_stack_overflow .endif lwz r6,FunctionProfile_n_curried_calls(r4) mtlr r0 addi r6,r6,1 stw r6,FunctionProfile_n_curried_calls(r4) b profile_n_ use_tail_calling_function_0: li r12,0 stw r12,Globals_last_tail_call(r5) b c_use_tail_calling_function_0 profile_l2: read_clock_4: time_hi r9 time_lo r10 time_hi r4 cmpw 0,r4,r9 bne- read_clock_4 mflr r12 lea_ r5,profile_globals lwz r4,0(r3) mtctr r12 cmpwi 0,r4,0 beql allocate_function_profile_record lwz r3,Globals_last_tail_call(r5) lwz r6,Globals_stack_pointer(r5) cmpwi 0,r3,0 lwz r7,Globals_time_hi(r5) lwz r8,Globals_time_lo(r5) bne use_tail_calling_function_1 lwz r3,-4(r6) c_use_tail_calling_function_1: stw r4,0(r6) stw r4,4(r6) addi r6,r6,8 .if CHECK_STACK_OVERFLOWS lwz r12,Globals_end_profile_stack(r5) .endif stw r6,Globals_stack_pointer(r5) .if CHECK_STACK_OVERFLOWS cmpw r6,r12 bge profile_stack_overflow .endif lwz r6,FunctionProfile_n_curried_calls(r4) mtlr r0 addi r6,r6,1 stw r6,FunctionProfile_n_curried_calls(r4) b profile_n_ use_tail_calling_function_1: li r12,0 stw r12,Globals_last_tail_call(r5) b c_use_tail_calling_function_1 profile_n: read_clock_5: time_hi r9 time_lo r10 time_hi r4 cmpw 0,r4,r9 bne- read_clock_5 mflr r12 lea_ r5,profile_globals lwz r4,0(r3) mtctr r12 cmpwi 0,r4,0 beql allocate_function_profile_record lwz r3,Globals_last_tail_call(r5) lwz r6,Globals_stack_pointer(r5) cmpwi 0,r3,0 lwz r7,Globals_time_hi(r5) lwz r8,Globals_time_lo(r5) bne use_tail_calling_function_2 lwz r3,-4(r6) c_use_tail_calling_function_2: stw r4,0(r6) addi r6,r6,4 .if CHECK_STACK_OVERFLOWS lwz r12,Globals_end_profile_stack(r5) .endif stw r6,Globals_stack_pointer(r5) .if CHECK_STACK_OVERFLOWS cmpw r6,r12 bge profile_stack_overflow .endif lwz r6,FunctionProfile_n_lazy_calls(r4) mtlr r0 addi r6,r6,1 stw r6,FunctionProfile_n_lazy_calls(r4) b profile_n_ use_tail_calling_function_2: li r12,0 stw r12,Globals_last_tail_call(r5) b c_use_tail_calling_function_2 profile_n2: read_clock_6: time_hi r9 time_lo r10 time_hi r4 cmpw 0,r4,r9 bne- read_clock_6 mflr r12 lea_ r5,profile_globals lwz r4,0(r3) mtctr r12 cmpwi 0,r4,0 beql allocate_function_profile_record lwz r3,Globals_last_tail_call(r5) lwz r6,Globals_stack_pointer(r5) cmpwi 0,r3,0 lwz r7,Globals_time_hi(r5) lwz r8,Globals_time_lo(r5) bne use_tail_calling_function_3 lwz r3,-4(r6) c_use_tail_calling_function_3: stw r4,0(r6) stw r4,4(r6) addi r6,r6,8 .if CHECK_STACK_OVERFLOWS lwz r12,Globals_end_profile_stack(r5) .endif stw r6,Globals_stack_pointer(r5) .if CHECK_STACK_OVERFLOWS cmpw r6,r12 bge profile_stack_overflow .endif lwz r6,FunctionProfile_n_lazy_calls(r4) mtlr r0 addi r6,r6,1 stw r6,FunctionProfile_n_lazy_calls(r4) b profile_n_ use_tail_calling_function_3: li r12,0 stw r12,Globals_last_tail_call(r5) b c_use_tail_calling_function_3 profile_s2: read_clock_7: time_hi r9 time_lo r10 time_hi r4 cmpw 0,r4,r9 bne- read_clock_7 mflr r12 lea_ r5,profile_globals lwz r4,0(r3) mtctr r12 cmpwi 0,r4,0 beql allocate_function_profile_record lwz r3,Globals_last_tail_call(r5) lwz r6,Globals_stack_pointer(r5) cmpwi 0,r3,0 lwz r7,Globals_time_hi(r5) lwz r8,Globals_time_lo(r5) bne use_tail_calling_function_4 lwz r3,-4(r6) c_use_tail_calling_function_4: stw r4,0(r6) stw r4,4(r6) addi r6,r6,8 .if CHECK_STACK_OVERFLOWS lwz r12,Globals_end_profile_stack(r5) .endif stw r6,Globals_stack_pointer(r5) .if CHECK_STACK_OVERFLOWS cmpw r6,r12 bge profile_stack_overflow .endif b profile_s_ use_tail_calling_function_4: li r12,0 stw r12,Globals_last_tail_call(r5) b c_use_tail_calling_function_4 profile_s: read_clock_8: time_hi r9 time_lo r10 time_hi r4 cmpw 0,r4,r9 bne- read_clock_8 mflr r12 lea_ r5,profile_globals lwz r4,0(r3) mtctr r12 cmpwi 0,r4,0 beql allocate_function_profile_record lwz r3,Globals_last_tail_call(r5) lwz r6,Globals_stack_pointer(r5) cmpwi 0,r3,0 lwz r7,Globals_time_hi(r5) lwz r8,Globals_time_lo(r5) bne use_tail_calling_function_5 lwz r3,-4(r6) c_use_tail_calling_function_5: stw r4,0(r6) addi r6,r6,4 .if CHECK_STACK_OVERFLOWS lwz r12,Globals_end_profile_stack(r5) .endif stw r6,Globals_stack_pointer(r5) .if CHECK_STACK_OVERFLOWS cmpw r6,r12 bge profile_stack_overflow .endif profile_s_: lwz r6,FunctionProfile_n_strict_calls(r4) mtlr r0 addi r6,r6,1 stw r6,FunctionProfile_n_strict_calls(r4) profile_n_: .if POWER601 sub. r10,r10,r8 sub r9,r9,r7 bge+ @no_borrow addis r10,r10,hi1e9 addi r10,r10,lo1e9 subi r9,r9,1 @no_borrow: .else subc r10,r10,r8 subfe r9,r7,r9 .endif lwz r8,FunctionProfile_time_lo(r3) lwz r7,FunctionProfile_time_hi(r3) .if POWER601 add r8,r8,r10 add r7,r7,r9 subis r9,r8,hi1e9 cmpwi 0,r9,lo1e9 lwz r6,FunctionProfile_n_profiler_calls(r4) blt+ @no_carry subi r8,r9,lo1e9 addi r7,r7,1 @no_carry: .else addc r8,r8,r10 lwz r6,FunctionProfile_n_profiler_calls(r4) adde r7,r7,r9 .endif addi r6,r6,1 stw r7,FunctionProfile_time_hi(r3) stw r8,FunctionProfile_time_lo(r3) stw r6,FunctionProfile_n_profiler_calls(r4) .if ALLOCATION_PROFILE lwz r11,Globals_n_words_free(r5) stw d7,Globals_n_words_free(r5) lwz r12,FunctionProfile_n_words_allocated(r3) sub r11,r11,d7 add r12,r12,r11 stw r12,FunctionProfile_n_words_allocated(r3) .endif store_clock_2: time_hi r9 stw r9,Globals_time_hi(r5) time_lo r10 time_hi r4 stw r10,Globals_time_lo(r5) cmpw 0,r4,r9 ; beqctr+ bcctr 13,2 b store_clock_2 use_tail_calling_function_5: li r12,0 stw r12,Globals_last_tail_call(r5) b c_use_tail_calling_function_5 allocate_function_profile_record: lwz r6,Globals_n_free_records_in_block(r5) lwz r4,Globals_last_allocated_block(r5) cmpwi 0,r6,0 bne+ no_alloc stw r0,-4(sp) stw r3,-8(sp) stw r9,-12(sp) stw r10,-16(sp) mfctr r11 stw r11,-20(sp) mflr r12 stw r12,-24(sp) .if USE_TEMPORARY_MEMORY li r3,(128*FunctionProfile)+4 .else li r3,128*FunctionProfile .endif .if MACOSX mr g0,sp ori sp,sp,28 stwu g0,-(64+32+28)(sp) .else stwu sp,-(64+32)(sp) .endif .if USE_TEMPORARY_MEMORY bl allocate_temp_memory_handle .else bl _NewPtr nop .endif .if MACOSX lwz sp,0(sp) .else addi sp,sp,64+32 .endif and. r4,r3,r3 lwz r12,-24(sp) lwz r11,-20(sp) mtlr r12 lwz r10,-16(sp) mtctr r11 lwz r9,-12(sp) lwz r3,-8(sp) lwz r0,-4(sp) lea_ r5,profile_globals beq profiler_memory_error .if USE_TEMPORARY_MEMORY lwz r6,Globals_temp_handle_list(r5) stw r4,Globals_temp_handle_list(r5) lwz r4,0(r4) stw r6,0(r4) addi r4,r4,4 .endif li r6,128 stw r4,Globals_last_allocated_block(r5) no_alloc: subi r6,r6,1 stw r6,Globals_n_free_records_in_block(r5) addi r7,r4,FunctionProfile stw r7,Globals_last_allocated_block(r5) lwz r6,Globals_profile_records(r5) li r8,0 stw r8,FunctionProfile_time_hi(r4) stw r8,FunctionProfile_time_lo(r4) stw r8,FunctionProfile_n_profiler_calls(r4) stw r8,FunctionProfile_n_strict_calls(r4) stw r8,FunctionProfile_n_lazy_calls(r4) stw r8,FunctionProfile_n_curried_calls(r4) stw r8,FunctionProfile_n_words_allocated(r4) stw r6,FunctionProfile_next(r4) stw r4,Globals_profile_records(r5) stw r3,FunctionProfile_name(r4) stw r4,0(r3) blr write_profile_information: lea_ o0,profile_file_name mflr r0 stwu r0,-4(sp) .if MACOSX mr g0,sp ori sp,sp,28 stwu g0,-(64+28)(sp) .else stwu sp,-64(sp) .endif bl _create_profile_file_name nop .if MACOSX lwz sp,0(sp) lwz r0,0(sp) addi sp,sp,4 .else lwz r0,64(sp) addi sp,sp,68 .endif mtlr r0 lea_ d3,_new_file_creator li d5,'T*256+'I lwz d4,0(d3) addis d5,d5,'P*256+'R stw d5,0(d3) li d0,1 lea_ a0,profile_file_name mflr r0 stwu r0,-4(sp) bl openF mtlr r0 stw d4,0(d3) cmpwi 0,d2,0 beq cannot_open mflr r0 li d3,0 stw r0,-4(sp) stwu d3,-8(sp) .if MACOSX mr g0,sp ori sp,sp,28 stwu g0,-(64+28)(sp) .else stwu sp,-64(sp) .endif stw d3,64(sp) li r3,'u*256+'t addi r4,sp,64 addis r3,r3,'c*256+'p bl L_Gestalt$stub nop lwz d2,64(sp) stwu r0,-4(sp) bl writeFI_space mtlr r0 stw d3,64(sp) li r3,'l*256+'k addi r4,sp,64 addis r3,r3,'p*256+'c bl L_Gestalt$stub nop lwz d2,64(sp) stwu r0,-4(sp) bl writeFI_space mtlr r0 stw d3,64(sp) li r3,'l*256+'k addi r4,sp,64 addis r3,r3,'b*256+'c bl L_Gestalt$stub nop lwz d2,64(sp) stwu r0,-4(sp) bl writeFI mtlr r0 li d2,13 stwu r0,-4(sp) bl writeFC mtlr r0 .if MACOSX lwz sp,0(sp) lwz r0,4(sp) addi sp,sp,8 .else lwz r0,68(sp) addi sp,sp,72 .endif mtlr r0 lea_ d2,profile_globals lwz d2,Globals_profile_records(d2) write_profile_lp: cmpwi 0,d2,0 beq end_list lwz d3,FunctionProfile_name(d2) stwu d2,-4(sp) .if MODULE_NAMES stwu d3,-4(sp) lwz d3,-4(d3) lwz d2,0(d3) addi d3,d3,3 write_module_name_lp: subic. d2,d2,1 blt end_module_name stw d2,-4(sp) lbzu d2,1(d3) mflr r0 stw d3,-8(sp) stwu r0,-12(sp) bl writeFC mtlr r0 lwz d2,4(sp) lwz d3,0(sp) addi sp,sp,8 b write_module_name_lp end_module_name: li d2,' mflr r0 stwu r0,-4(sp) bl writeFC mtlr r0 lwz d3,0(sp) addi sp,sp,4 .endif addi d3,d3,3 write_function_name_lp: lbzu d2,1(d3) cmpwi 0,d2,0 beq end_function_name stw d3,-4(sp) mflr r0 stwu r0,-8(sp) bl writeFC mtlr r0 lwz d3,0(sp) addi sp,sp,4 b write_function_name_lp end_function_name: li d2,' mflr r0 stwu r0,-4(sp) bl writeFC lwz d2,0(sp) lwz d2,FunctionProfile_n_strict_calls(d2) stwu r0,-4(sp) bl writeFI_space lwz d2,0(sp) lwz d2,FunctionProfile_n_lazy_calls(d2) stwu r0,-4(sp) bl writeFI_space lwz d2,0(sp) lwz d2,FunctionProfile_n_curried_calls(d2) stwu r0,-4(sp) bl writeFI_space lwz d2,0(sp) lwz d2,FunctionProfile_n_profiler_calls(d2) stwu r0,-4(sp) bl writeFI_space lwz d2,0(sp) lwz d2,FunctionProfile_n_words_allocated(d2) stwu r0,-4(sp) bl writeFI_space lwz d2,0(sp) lwz d2,FunctionProfile_time_hi(d2) stwu r0,-4(sp) bl writeFI_space lwz d2,0(sp) lwz d2,FunctionProfile_time_lo(d2) stwu r0,-4(sp) bl writeFI li d2,13 stwu r0,-4(sp) bl writeFC mtlr r0 lwz d2,0(sp) addi sp,sp,4 lwz d2,FunctionProfile_next(d2) b write_profile_lp writeFI_space: mflr r0 stwu r0,-4(sp) bl writeFI mtlr r0 li d2,' b writeFC end_list: mflr r0 stwu r0,-4(sp) bl closeF mtlr r0 cannot_open: .if USE_TEMPORARY_MEMORY mflr r0 .if MACOSX mr g0,sp ori sp,sp,28 stwu g0,-(96+28)(sp) .else stwu sp,-96(sp) .endif stw r0,96-4(sp) lea_ r5,profile_globals lwz r3,Globals_profile_stack_handle(r5) bl free_temp_memory_handle lea_ r5,profile_globals stw r31,96-8(sp) lwz r31,Globals_temp_handle_list(r5) b free_temp_handles free_temp_handles_lp: mr r3,r31 lwz r31,0(r31) lwz r31,0(r31) bl free_temp_memory_handle free_temp_handles: cmpwi 0,r31,0 bne free_temp_handles_lp lwz r31,96-8(sp) lwz r0,96-4(sp) .if MACOSX lwz sp,0(sp) .else addi sp,sp,96 .endif mtlr r0 .endif lwz r0,0(sp) addi sp,sp,4 blr write_profile_stack: mflr r0 lea_ d0,profile_globals stwu r0,-4(sp) lwz d0,Globals_stack_pointer(d0) cmpwi 0,d0,0 beq stack_not_initialised .if MACOSX mr g0,sp ori sp,sp,28 stwu g0,-(64+28)(sp) .else stwu sp,-64(sp) .endif lea_ o0,stack_trace_string bl _er_print_string .if MACOSX lwz sp,0(sp) .else addi sp,sp,64 .endif .if 1 li d2,12 .else li d2,24 .endif write_functions_on_stack: lwzu d1,-4(d0) cmpwi 0,d1,0 beq end_profile_stack lwz o0,FunctionProfile_name(d1) .if MACOSX mr g0,sp ori sp,sp,28 stwu g0,-(64+28)(sp) .else stwu sp,-64(sp) .endif addi o0,o0,4 bl _er_print_string li o0,13 bl _er_print_char .if MACOSX lwz sp,0(sp) .else addi sp,sp,64 .endif subic. d2,d2,1 .if 0 b write_functions_on_stack .else bne write_functions_on_stack .endif end_profile_stack: stack_not_initialised: lwz r0,0(sp) mtlr r0 lwz r0,4(sp) addi sp,sp,8 blr init_profiler: .if 0 mflr r0 stw r0,-4(sp) stwu sp,-64(sp) bl .Debugger nop lwz r0,64-4(sp) addi sp,sp,64 mtlr r0 .endif mflr r0 stwu r0,-4(sp) .if MACOSX subi sp,sp,8 mr g0,sp ori sp,sp,28 stwu g0,-(64+28)(sp) .else stwu sp,-72(sp) .endif li r3,0 addi r4,sp,64 stw r3,64(sp) li r3,'u*256+'t addis r3,r3,'c*256+'p bl L_Gestalt$stub nop lwz r3,64(sp) .if MACOSX lwz sp,0(sp) addi sp,sp,8 .else addi sp,sp,72 .endif cmpwi 0,r3,257 .if POWER601 bne init_profiler_error1 .else beq init_profiler_error1 .endif .if 1 lea_ r3,_stack_size lwz r3,0(r3) .else li r3, (512*1024) % 65536 addis r3,r3,(512*1024) / 65536 .endif .if MACOSX mr g0,sp ori sp,sp,28 stwu g0,-(64+28)(sp) .else stwu sp,-64(sp) .endif .if USE_TEMPORARY_MEMORY bl allocate_temp_memory_handle .else bl _NewPtr nop .endif .if MACOSX lwz sp,0(sp) .else addi sp,sp,64 .endif lea_ r5,profile_globals and. r9,r3,r3 beq init_profiler_error .if USE_TEMPORARY_MEMORY stw r9,Globals_profile_stack_handle(r5) lwz r9,0(r9) li r0,0 stw r0,Globals_temp_handle_list(r5) .endif .if CHECK_STACK_OVERFLOWS .if 1 lea_ r3,_stack_size lwz r3,0(r3) .else li r3, (512*1024) % 65536 addis r3,r3,(512*1024) / 65536 .endif add r3,r3,r9 stw r3,Globals_end_profile_stack(r5) .endif lea_ r3,start_string bl allocate_function_profile_record lwz r0,0(sp) addi sp,sp,4 mtlr r0 li r0,0 stw r4,4(r9) stw r0,0(r9) addi r9,r9,8 stw r9,Globals_stack_pointer(r5) stw r0,Globals_last_tail_call(r5) stw d7,Globals_n_words_free(r5) lwz r0,0(sp) addi sp,sp,4 store_clock_3: time_hi r9 stw r9,Globals_time_hi(r5) time_lo r10 time_hi r4 stw r10,Globals_time_lo(r5) cmpw 0,r4,r9 beqlr+ b store_clock_3 .if USE_TEMPORARY_MEMORY allocate_temp_memory_handle: mflr r0 stw r31,-4(sp) stw r0,8(sp) stwu sp,-96(sp) addi r4,sp,56 bl L_TempNewHandle$stub nop mr. r31,r3 beq return_r31 addi r4,sp,56 bl L_TempHLock$stub nop lha r0,56(sp) cmpwi r0,0 beq+ return_r31 mr r3,r31 addi r4,sp,56 bl L_TempDisposeHandle$stub nop li r31,0 return_r31: lwz r0,104(sp) mr r3,r31 mtlr r0 addi sp,sp,96 lwz r31,-4(sp) blr free_temp_memory_handle: mflr r0 stw r3,-4(sp) stw r0,8(sp) stwu sp,-96(sp) addi r4,sp,56 bl L_TempHUnlock$stub nop lwz r3,96-4(sp) addi r4,sp,56 bl L_TempDisposeHandle$stub nop lwz r0,104(sp) addi sp,sp,96 mtlr r0 blr .endif init_profiler_error1: lea_ o0,wrong_processor lea_ r5,profile_globals li r4,0 stw r4,Globals_stack_pointer(r5) b print_error init_profiler_error: lea_ o0,not_enough_memory_for_profile_stack lea_ r5,profile_globals li r4,0 stw r4,Globals_stack_pointer(r5) b print_error profiler_memory_error: lea_ o0,not_enough_memory_for_profiler b print_error .if CHECK_STACK_OVERFLOWS profile_stack_overflow: mflr r0 stw r0,-4(sp) stwu sp,-64(sp) bl .Debugger nop lwz r0,64-4(sp) addi sp,sp,64 mtlr r0 b profile_stack_overflow .endif .data .align 2 .comm profile_globals,Globals profile_file_name: .long __STRING__+2 .long 0 .long 0,0,0,0,0,0,0,0 .align 2 .if MODULE_NAMES m_system_: .long 6 .ascii "System" .byte 0,0 .long m_system_ .endif start_string: .long 0 .ascii "start" .byte 0 .align 2 not_enough_memory_for_profile_stack: .ascii "not enough memory for profile stack" .byte 13 .byte 0 not_enough_memory_for_profiler: .ascii "not enough memory for profiler" .byte 13 .byte 0 wrong_processor: .if POWER601 .ascii "Not a PowerPC601 processor (don't use profiling option for 601)" .else .ascii "This is a PowerPC601 processor (use profiling option for 601)" .endif .byte 13 .byte 0 stack_trace_string: .ascii "Stack trace:" .byte 13 .byte 0 .align 2 .picsymbol_stub L_Gestalt$stub: .indirect_symbol _Gestalt mflr r0 bcl 20,31,L20$pb L20$pb: mflr r11 addis r11,r11,ha16(L20$lz-L20$pb) mtlr r0 lwz r12,lo16(L20$lz-L20$pb)(r11) mtctr r12 addi r11,r11,lo16(L20$lz-L20$pb ) bctr .lazy_symbol_pointer L20$lz: .indirect_symbol _Gestalt .long dyld_stub_binding_helper .picsymbol_stub L_TempDisposeHandle$stub: .indirect_symbol _TempDisposeHandle mflr r0 bcl 20,31,L21$pb L21$pb: mflr r11 addis r11,r11,ha16(L21$lz-L21$pb) mtlr r0 lwz r12,lo16(L21$lz-L21$pb)(r11) mtctr r12 addi r11,r11,lo16(L21$lz-L21$pb ) bctr .lazy_symbol_pointer L21$lz: .indirect_symbol _TempDisposeHandle .long dyld_stub_binding_helper .picsymbol_stub L_TempHLock$stub: .indirect_symbol _TempHLock mflr r0 bcl 20,31,L22$pb L22$pb: mflr r11 addis r11,r11,ha16(L22$lz-L22$pb) mtlr r0 lwz r12,lo16(L22$lz-L22$pb)(r11) mtctr r12 addi r11,r11,lo16(L22$lz-L22$pb ) bctr .lazy_symbol_pointer L22$lz: .indirect_symbol _TempHLock .long dyld_stub_binding_helper .picsymbol_stub L_TempHUnlock$stub: .indirect_symbol _TempHUnlock mflr r0 bcl 20,31,L23$pb L23$pb: mflr r11 addis r11,r11,ha16(L23$lz-L23$pb) mtlr r0 lwz r12,lo16(L23$lz-L23$pb)(r11) mtctr r12 addi r11,r11,lo16(L23$lz-L23$pb ) bctr .lazy_symbol_pointer L23$lz: .indirect_symbol _TempHUnlock .long dyld_stub_binding_helper .picsymbol_stub L_TempNewHandle$stub: .indirect_symbol _TempNewHandle mflr r0 bcl 20,31,L24$pb L24$pb: mflr r11 addis r11,r11,ha16(L24$lz-L24$pb) mtlr r0 lwz r12,lo16(L24$lz-L24$pb)(r11) mtctr r12 addi r11,r11,lo16(L24$lz-L24$pb ) bctr .lazy_symbol_pointer L24$lz: .indirect_symbol _TempNewHandle .long dyld_stub_binding_helper