summaryrefslogtreecommitdiff
path: root/macho/pprofile.a
diff options
context:
space:
mode:
Diffstat (limited to 'macho/pprofile.a')
-rw-r--r--macho/pprofile.a1488
1 files changed, 1488 insertions, 0 deletions
diff --git a/macho/pprofile.a b/macho/pprofile.a
new file mode 100644
index 0000000..84d2022
--- /dev/null
+++ b/macho/pprofile.a
@@ -0,0 +1,1488 @@
+
+.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
+