Annotation of researchv10no/cmd/sml/src/build/prof.sml, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: signature PROF = sig
                      3:  type profileInfo
                      4:  val instrumDec : Absyn.dec -> (Absyn.dec * profileInfo)
                      5:  val instrumStrb : Absyn.strb -> (Absyn.strb * profileInfo)
                      6:  val instrumFctb : Absyn.fctb -> (Absyn.fctb * profileInfo)
                      7:  val bindLambda : (Lambda.lexp * profileInfo) -> Lambda.lexp
                      8: end
                      9: 
                     10: abstraction Prof : PROF =
                     11: struct
                     12: 
                     13: open Access Absyn Lambda Basics BasicTypes ErrorMsg
                     14: 
                     15: type profileInfo = (lvar * string) list
                     16: 
                     17: val symbol = Symbol.symbol
                     18: 
                     19: (* Profiling globals *)
                     20: val profiling = System.Control.Profile.profiling
                     21: val profileList = ref([]: (Access.lvar * string) list)
                     22:                
                     23: val anonSym = symbol "anon"
                     24: 
                     25: val intreftype = CONty(refTycon,[intTy])
                     26: val alpha = VARty(mkTyvar(IBOUND 0))
                     27: 
                     28: fun topCCa() = VALvar{name = [symbol "toplevel.CC"],
                     29:                      access = PATH(!CoreInfo.toplevelPath),
                     30:                      typ = ref intreftype}
                     31: val assop = VALvar{name = [symbol "unboxedassign"],
                     32:                   access = INLINE P.unboxedassign,
                     33:                   typ = ref(tupleTy[intreftype,intTy] --> unitTy)}
                     34: val derefop = VALvar{name = [symbol "!"],
                     35:                     access = INLINE P.!,
                     36:                     typ = ref(CONty(refTycon,[alpha]) --> alpha)}
                     37: val addop = VALvar{name = [symbol "iadd"],
                     38:                   access = INLINE P.+,
                     39:                   typ = ref(tupleTy[intTy,intTy] --> intTy)}
                     40: fun currentvar() = VALvar{name = [symbol "current"],
                     41:                          access = PATH(!CoreInfo.currentPath), 
                     42:                          typ = ref intreftype}
                     43: 
                     44: fun tmpvar str = 
                     45:        let  val lvar = mkLvar()
                     46:             val name = [symbol str]
                     47:        in (VALvar{name=name, access=LVAR(lvar), typ = ref UNDEFty},
                     48:            VALvar{name=name, access=PATH[lvar], typ = ref UNDEFty})
                     49:        end
                     50: 
                     51: fun clean (path as name::names) = if Symbol.eq(name,anonSym) then names else path
                     52:   | clean x = x
                     53: 
                     54: fun instrdec(sp as (names,ccvara), VALdec vbl) = 
                     55:     let fun instrvb (vb as VB{pat=VARpat(VALvar{access=INLINE _,...}),...}) = vb
                     56:          | instrvb (vb as VB{pat=CONSTRAINTpat
                     57:                    (VARpat (VALvar{access=INLINE _,...}),_),...}) = vb
                     58:          | instrvb (VB{pat as VARpat(VALvar{access=LVAR v,name=[n],...}),exp,tyvars}) =
                     59:              VB{pat=pat,exp=instrexp(n::clean names,ccvara)false exp,
                     60:                                                                  tyvars=tyvars}
                     61:          | instrvb (VB{pat,exp,tyvars}) =
                     62:                    VB{pat=pat, exp=instrexp sp false exp, tyvars=tyvars}
                     63:     in VALdec (map instrvb vbl)
                     64:     end
                     65:   | instrdec(sp as (names,ccvara), VALRECdec rvbl) = 
                     66:     let fun instrrvb (RVB{var=var as VALvar{access=LVAR v, name=[n],...},
                     67:                                                        exp,resultty,tyvars}) =
                     68:                RVB{var=var, exp=instrexp (n::clean names, ccvara) false exp, 
                     69:                                        resultty=resultty, tyvars=tyvars}
                     70:          | instrrvb _ = impossible "VALRECdec in instrdec"
                     71:     in VALRECdec(map instrrvb rvbl)
                     72:     end
                     73:   | instrdec(sp, ABSTYPEdec {abstycs,withtycs,body}) = 
                     74:        ABSTYPEdec {abstycs=abstycs,withtycs=withtycs, body=instrdec(sp,body)}
                     75:   | instrdec(sp, STRdec strbl) = STRdec (map (fn strb => instrstrb(sp,strb)) strbl)
                     76:   | instrdec(sp, ABSdec strbl) = ABSdec (map (fn strb => instrstrb(sp,strb)) strbl)
                     77:   | instrdec(sp, FCTdec fctbl) = FCTdec (map (fn fctb => instrfctb(sp,fctb)) fctbl)
                     78:   | instrdec(sp, LOCALdec(localdec,visibledec)) =
                     79:        LOCALdec(instrdec (sp,localdec), instrdec (sp,visibledec))
                     80:   | instrdec(sp, SEQdec decl) = SEQdec (map (fn dec => instrdec(sp,dec)) decl)
                     81:   | instrdec(sp, MARKdec(dec,a,b)) = MARKdec(instrdec (sp,dec), a,b)
                     82:   | instrdec(sp, other) = other
                     83: 
                     84: and instrstrexp(names, STRUCTstr {body,locations}) =
                     85:       STRUCTstr{body = (map (fn dec => instrdec((names,topCCa()),dec)) body),
                     86:                                    locations=locations}
                     87:   | instrstrexp(names, APPstr {oper,argexp,argthin}) = 
                     88:       APPstr{oper=oper, argexp=instrstrexp(names,argexp),argthin=argthin}
                     89:   | instrstrexp(names, VARstr x) = VARstr x
                     90:   | instrstrexp(names, LETstr(d,body)) = 
                     91:                LETstr(instrdec((names,topCCa()),d), instrstrexp(names,body))
                     92: 
                     93: and instrstrb ((names,ccvara), STRB{strvar=strvar as STRvar{name,...},
                     94:                                                  def,thin,constraint}) = 
                     95:         STRB{strvar=strvar,def = instrstrexp(name@names,def),
                     96:                                 thin=thin, constraint=constraint}
                     97: 
                     98: and instrfctb ((names,ccvara), FCTB{fctvar=fctvar as FCTvar{name,...},
                     99:                                                  param,def,thin,constraint}) =
                    100:         FCTB{fctvar=fctvar,param=param,def=instrstrexp(name::names,def),
                    101:                                        thin=thin, constraint=constraint}
                    102: 
                    103: and instrexp(sp as (names,ccvara)) =
                    104:  let fun istail tail =
                    105:      let fun iinstr exp = istail false exp
                    106:         fun oinstr exp = istail true exp
                    107:         fun instrrules tr = map (fn (RULE(p,e)) => RULE(p, tr e))
                    108:         fun BUMPCCexp ccvara =    
                    109:             APPexp(VARexp(ref assop), 
                    110:                    TUPLEexp[VARexp(ref ccvara),
                    111:                             APPexp(VARexp(ref addop), 
                    112:                                    TUPLEexp[APPexp(VARexp(ref derefop),
                    113:                                                    VARexp(ref ccvara)),
                    114:                                                    INTexp(1)])])
                    115:         fun SETCURRENTexp ccvara = 
                    116:             APPexp(VARexp(ref assop),
                    117:                    TUPLEexp[VARexp(ref (currentvar())), VARexp(ref ccvara)]) 
                    118:         val rec instr:(exp->exp) =
                    119:             fn RECORDexp l => RECORDexp(map (fn (lab,exp) => (lab,iinstr exp)) l)
                    120:              | SEQexp l =>
                    121:                let fun seq [e] = [instr e]
                    122:                      | seq (e::r) = (iinstr e)::(seq r)
                    123:                      | seq nil = nil
                    124:                in SEQexp (seq l)
                    125:                end
                    126:              | APPexp (f,a) =>
                    127:                let fun safe(VARexp(ref(VALvar{access=INLINE P.callcc,...})))=false
                    128:                      | safe(VARexp(ref(VALvar{access=INLINE _,...}))) = true
                    129:                      | safe _ = false
                    130:                in if tail orelse (safe f)
                    131:                   then APPexp (iinstr f, iinstr a)
                    132:                   else let val (lvarb,lvara) = tmpvar("appvar")
                    133:                        in LETexp (VALdec[VB{pat=VARpat(lvarb),
                    134:                                        exp=APPexp(iinstr f, iinstr a),
                    135:                                        tyvars=nil}],
                    136:                           SEQexp([SETCURRENTexp(ccvara), VARexp(ref lvara)]))
                    137:                        end
                    138:                end
                    139:              | CONSTRAINTexp(e,t) => CONSTRAINTexp(instr e, t)
                    140:              | HANDLEexp (e, HANDLER(FNexp l))=> 
                    141:                let fun rule(RULE(p,e)) = 
                    142:                                RULE(p,SEQexp[SETCURRENTexp ccvara, instr e])
                    143:                in HANDLEexp (instr e, HANDLER(FNexp(map rule l)))
                    144:                end
                    145:              | RAISEexp e => RAISEexp(oinstr e)
                    146:              | LETexp (d,e) => LETexp (instrdec(sp,d), instr e)
                    147:              | CASEexp (e,l) => CASEexp(iinstr e, instrrules instr l)
                    148:              | FNexp l =>
                    149:                let fun dot (a,[z]) = Symbol.name z :: a
                    150:                      | dot (a,x::rest) = dot("." :: Symbol.name x :: a, rest)
                    151:                      | dot _ = impossible "no path in instrexp"
                    152:                    val name =  implode (dot ([], names))
                    153:                    val ccsym = symbol (name^".CC")
                    154:                    val ccvar = namedLvar(ccsym)
                    155:                    val ccvara' = VALvar{name=[ccsym],
                    156:                                     access=PATH[ccvar],
                    157:                                     typ = ref intreftype}
                    158:                    val (lvarb,lvara) = tmpvar "fnvar";
                    159:                in profileList := (ccvar,name) :: !profileList;
                    160:                   FNexp ([RULE(VARpat(lvarb), 
                    161:                                SEQexp ([BUMPCCexp(ccvara'),
                    162:                                         SETCURRENTexp(ccvara'),
                    163:                                         CASEexp(VARexp(ref lvara),
                    164:                                         instrrules (instrexp (anonSym::names,
                    165:                                                         ccvara') true) l)]))])
                    166:                end
                    167:              | MARKexp(e,a,b) => MARKexp(instr e, a, b)
                    168:              | e => e 
                    169:      in instr
                    170:      end
                    171:  in istail
                    172:  end
                    173: 
                    174: fun instrumDec absyn = 
                    175:     (profileList := [];
                    176:      (if !profiling then instrdec(([],topCCa()),absyn) else absyn, !profileList))
                    177: 
                    178: fun instrumStrb absyn = 
                    179:     (profileList := [];
                    180:      (if !profiling then instrstrb(([],topCCa()),absyn) else absyn, !profileList))
                    181: 
                    182: fun instrumFctb absyn = 
                    183:     (profileList := [];
                    184:      (if !profiling then instrfctb(([],topCCa()),absyn) else absyn, !profileList))
                    185: 
                    186: fun bindLambda (lexp, profileList) =
                    187:     fold (fn ((var,string),x) => APP(FN(var,x),STRING("aaaaaaaa"^string)))
                    188:         profileList
                    189:         (RECORD[lexp,RECORD(map (VAR o #1) profileList)])
                    190: 
                    191: end (* structure Instrum *)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.