;;; -*- Mode:LISP; Package:SYSTEM-INTERNALS; Base:10 -*-

(defconstant *dynamic-functions*
	     '((1326 PRINT-FIXNUM)
	       (1342 GET-MACRO-ARG-DESC-POINTER)
                     (1375 CONSTANTP)
                     (1386 FLATSIZE-STREAM)
                     (1402 EXPLODE-STREAM)
                     (1453 COMPILER::P1ARGC)
                     (1456 (:METHOD BASIC-BUFFERED-INPUT-STREAM :UNTYI))
                     (1540 (:METHOD EQ-HASH-TABLE :GET-HASH))
                     (1544 SIMPLE-MAKE-ARRAY)
                     (1552 STRING-EQUAL)
                     (1560 COMPILER::CONTAINS-LOAD-TIME-EVAL)
                     (1634 PRINT-RAW-FIXNUM)
                     (1668 COMPILER::INCPDLLVL)
                     (1737 COMPILER::GETARGDESC)
                     (1806 CURRENT-READTABLE)
                     (1806 PRINT-OBJECT)
                     (1876 FORMAT::FORMAT-CTL-OP)
                     (1911 COMPILER::QFIND-CONSTANTS-PAGE)
                     (1938 FORMAT::FORMAT-PARSE-COMMAND)
                     (2077 COMPILER::P2-SOURCE)
                     (2176 ARRAY-ELEMENT-SIZE)
                     (2183 (:METHOD EQL-HASH-TABLE :PUT-HASH))
                     (2183 COMPILER::FASD-TABLE-ADD)
                     (2197 COMPILER::P1V)
                     (2225 COMPILER::FASD-TABLE-NEXT-INDEX)
                     (2276 %CHAOS-SHARE-CSR)
                     (2308 ARRAY-TYPE)
                     (2348 XR-OPENPAREN-MACRO)
                     (2348 XR-READ-LIST)
                     (2366 MAPCAR)
                     (2496 CURRENT-PRINT-BASE)
                     (2534 COMPILER::P2F)
                     (2638 (:METHOD TV:TYPEOUT-WINDOW :COMBINED :STRING-OUT))
                     (2745 SPECIAL-FORM-P)
                     (2907 (:METHOD TV:SHEET :STRING-OUT))
                     (2978 INVOKE-READER-MACRO)
                     (3023 TV::%DRAW-STRING)
                     (3032 SUBLIS-1)
                     (3051 MACRO-FUNCTION)
                     (3087 COMPILER::OUTS)
                     (3109 REHASH-PUT)
                     (3124 (:METHOD EQL-HASH-TABLE :GET-HASH))
                     (3177 SELF-EVALUATING-P)
                     (3234 COMPILER::FLAG-ALREADY-OPTIMIZED)
                     (3491 COMPILER::LAP-ADR-P1)
                     (3492 COMPILER::LAP-WORD-EVAL)
                     (3494 COMPILER::COMPILER-MACROEXPAND-1)
                     (3549 COMPILER::OUTI)
                     (3582 COMPILER::CHECK-NUMBER-OF-ARGS)
                     (3588 COMPILER::FASD-TABLE-LOOKUP)
                     (3588 COMPILER::FASD-CONSTANT)
                     (3754 ARGLIST)
                     (3765 COMPILER::FASD-START-GROUP)
                     (3815 (:METHOD TV:BLINKER :DEFER-REAPPEARANCE))
                     (3861 COMPILER::P2)
                     (3954 COMPILER::LAP-OUTPUT-WORD)
                     (4087 COMPILER::PEEP-ONE-SPOT)
                     (4138 XR-READ-SYMBOL)
                     (4140 INTERN)
                     (4308 TV:OPEN-BLINKER)
                     (4531 MACROEXPAND-1)
                     (4645 COMPILER::ADRREFP)
                     (4653 XR-XRUNTYI)
                     (4869 NREVERSE)
                     (4908 COMPILER::QLP2-U)
                     (4929 CURRENT-PACKAGE)
                     (5069 COMPILER::LAP-FASD-NIBBLE)
                     (5095 NRECONC)
                     (5324 (:PROPERTY MACRO-CHAR STANDARD-READ-FUNCTION))
                     (5390 COMPILER::P1)
                     (5438 COMPILER::OUTF)
                     (5483 COMPILER::QLP1)
                     (5528 COPYLIST)
                     (5588 FDEFINITION)
                     (5588 DWIMIFY-ARG-PACKAGE)
                     (5594 VALIDATE-FUNCTION-SPEC)
                     (5659 DECLARED-DEFINITION)
                     (6003 COMPILER::QLEVAL)
                     (6471 (:METHOD TV:TYPEOUT-WINDOW :COMBINED :TYO))
                     (6474 (:METHOD TV:SHEET :TYO))
                     (6474 TV::SHEET-TYO)
                     (8037 LAMBDA-MACRO-EXPAND)
                     (8285 COMPILER::FSYMEVAL-IN-FUNCTION-ENVIRONMENT)
                     (8422 (:INTERNAL COMPILER::QADD 0))
                     (9563 TV::MAYBE-MOVE-BOTTOM-REACHED)
                     (9638 COMPILER::COMPILER-OPTIMIZE)
                     (9638 COMPILER::ALREADY-OPTIMIZED-P)
                     (9981 XR-READ-THING)
                     (10072 HASH-BLOCK-POINTER)
                     (11480 TV::SHEET-CAN-GET-LOCK-INTERNAL)
                     (11493 TV:SHEET-CAN-GET-LOCK)
                     (13410 (:INTERNAL (:INTERNAL COMPILER::QADD 0) 0))
                     (13753 (:INTERNAL COMPILER::LAP-QUOTE-ADR 0))
                     (14065 FDEFINEDP)
                     (14083 FSYMEVAL-IN-ENVIRONMENT)
                     (16403 TREE-EQUAL)
                     (16969 COMPILER::FASD-NIBBLE)
                     (17591 STORE-KEYWORD-ARG-VALUES)
                     (29792 STRING)
                     (32646 FEF-DEBUGGING-INFO)
                     (33891 DEBUGGING-INFO)
                     (42980 LAMBDA-MACRO-CALL-P)
                     (43455 TREE-EQUAL-1)
                     (46559 XR-XRTYI)
                     (47138 <=)
                     (61848 BASIC-BUFFERED-INPUT-STREAM-TYI)))

(defun fef-size (fef)
  (let ((header (%p-ldb-offset %%header-rest-field fef %fefhi-ipc))
	(header-type (%p-ldb-offset %%header-type-field fef %fefhi-ipc)))
    (select header-type
      (%header-type-fef -1)
      (%header-type-fast-fef-fixed-args-no-locals
       (ldb %%fefh-args-for-fanl header))
      (%header-type-fast-fef-var-args-no-locals
       (ldb %%fefh-max-args-for-vanl header))
      (%header-type-fast-fef-fixed-args-with-locals
       (+ (%p-ldb-offset %%fefh-args-for-fawl fef %fefhi-ipc)	   ;cdr-code
	  (ldb %%fefh-locals-for-fawl header)))
      (%header-type-fast-fef-var-args-with-locals
			 (+ (ldb %%fefh-max-args-for-vawl header)
			 (ldb %%fefh-locals-for-vawl header))))))

(defun new-fef-size (fef)
  (let ((info (args-info fef)))
    (+ (ldb %%arg-desc-max-args info)
       (%p-ldb-offset %%fefhi-ms-local-block-length fef %fefhi-misc))))

(defun new-fef-size (fef)
  (let ((n-locals 0))
    (dolist (local (cadr (assq 'compiler:local-map (debugging-info fef))))
      (when local
	(incf n-locals)))
    (+ n-locals (ldb %%arg-desc-max-args (args-info fef)))))

(defun count-slow-fefs (&aux (x 0))
  (dolist (fef *fef-list*)
    (when (= (%p-ldb %%header-type-field fef) %header-type-fef)
      (incf x)))
  x)

(defvar *size-alist* nil)

(defun find-fef-sizes ()
  (dolist (fef *fef-list*)
    (let ((size (new-fef-size fef)))
      (unless (= size -1)
	(push (list size fef) *size-alist*)))))
       

(defvar *size-array* (make-array 256. :initial-element 0))

(defun scan-fef-sizes ()
  (fillarray *size-array*)
  (dolist (size-record *size-alist*)
    (incf (aref *size-array* (first size-record)))))

(defvar *losing-fefs* nil)

(defun find-losing-fefs ()
  (dolist (fef *size-alist*)
    (when (> (first fef) 10.)
      (push (list (first fef) (function-name (second fef))) *losing-fefs*))))

(defun scan-used-fefs ()
  (array-initialize *size-array* 0)
  (dolist (f *dynamic-functions*)
    (incf (aref *size-array* (second (assoc (second f) *alist-size*))) (first f))))

;;; Stuff to check pdl depth and tail recursion.
(defun map-across-stack-frames (sg function)
  (do ((frame (eh:sg-innermost-active sg) (

	