| File: | src/of_hfold.c |
| Warning: | line 69, column 2 Value stored to 'formats' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /***************************************************************************** |
| 2 | * |
| 3 | * hfold.c: Foam syme hash constant folding |
| 4 | * |
| 5 | * Copyright (c) 1990-2007 Aldor Software Organization Ltd (Aldor.org). |
| 6 | * |
| 7 | ****************************************************************************/ |
| 8 | |
| 9 | /* |
| 10 | * Takes foam, assumed to be decorated with symes and |
| 11 | * replaces calls to domainGetHash! with the expected result |
| 12 | * of the call, and replaces foamPRefs with the value of the |
| 13 | * PRef slot which should be held in the syme. |
| 14 | * |
| 15 | * To fix: The hashNum slot could, with a bit of work, be held by a prog. |
| 16 | * |
| 17 | */ |
| 18 | |
| 19 | #include "gf_rtime.h" |
| 20 | #include "lib.h" |
| 21 | #include "of_hfold.h" |
| 22 | #include "of_util.h" |
| 23 | #include "of_inlin.h" |
| 24 | #include "optinfo.h" |
| 25 | #include "stab.h" |
| 26 | #include "strops.h" |
| 27 | |
| 28 | Bool hfoldDebug = false((int) 0); |
| 29 | #define hfoldDEBUGDEBUG_IF(hfold) afprintf DEBUG_IF(hfold) afprintf |
| 30 | |
| 31 | /***************************************************************************** |
| 32 | * |
| 33 | * :: Local structures |
| 34 | * |
| 35 | ****************************************************************************/ |
| 36 | |
| 37 | /***************************************************************************** |
| 38 | * |
| 39 | * :: Local function declarations |
| 40 | * |
| 41 | ****************************************************************************/ |
| 42 | |
| 43 | localstatic void hfoldProg (Foam); |
| 44 | localstatic Foam hfoldExpr (Foam); |
| 45 | localstatic Foam hfoldPRef (Foam); |
| 46 | localstatic Foam hfoldCCall (Foam); |
| 47 | localstatic Foam hfoldSet (Foam); |
| 48 | localstatic Bool hfoldIsDomHash (Foam); |
| 49 | localstatic void hfoldInit (Foam); |
| 50 | |
| 51 | /***************************************************************************** |
| 52 | * |
| 53 | * :: Local Constants |
| 54 | * |
| 55 | ****************************************************************************/ |
| 56 | |
| 57 | static int hfoldDomainHashGlobal; |
| 58 | static OptInfo hfoldProgInfo; |
| 59 | static Stab hfoldStab; |
| 60 | static int hfoldNumLocals; |
| 61 | |
| 62 | void |
| 63 | hfoldUnit(Foam unit) |
| 64 | { |
| 65 | Foam defs, formats; |
| 66 | int i; |
| 67 | |
| 68 | defs = unit->foamUnit.defs; |
| 69 | formats = unit->foamUnit.formats; |
Value stored to 'formats' is never read | |
| 70 | |
| 71 | hfoldInit(foamUnitGlobals(unit)((((unit)->foamUnit.formats)->foamGen.argv)[0].code)); |
| 72 | |
| 73 | for (i = 0; i < foamArgc(defs)((defs)->hdr.argc); i++) { |
| 74 | Foam def = defs->foamDDef.argv[i]; |
| 75 | if (foamTag(def->foamDef.rhs)((def->foamDef.rhs)->hdr.tag) == FOAM_Prog) |
| 76 | hfoldProg(def->foamDef.rhs); |
| 77 | } |
| 78 | assert(foamAudit(unit))do { if (!(foamAudit(unit))) _do_assert(("foamAudit(unit)"),"of_hfold.c" ,78); } while (0); |
| 79 | } |
| 80 | |
| 81 | localstatic void |
| 82 | hfoldInit(Foam globals) |
| 83 | { |
| 84 | int i; |
| 85 | |
| 86 | |
| 87 | /* !! Should put runtime strings into gf_rtime.h */ |
| 88 | for (i=0; i<foamDDeclArgc(globals)(((globals)->hdr.argc) - (1)); i++) { |
| 89 | Foam decl = globals->foamDDecl.argv[i]; |
| 90 | if (strEqual(decl->foamDecl.id, "domainHash!")) |
| 91 | break; |
| 92 | } |
| 93 | if (i == foamDDeclArgc(globals)(((globals)->hdr.argc) - (1))) |
| 94 | hfoldDomainHashGlobal = -1; |
| 95 | else |
| 96 | hfoldDomainHashGlobal = i; |
| 97 | |
| 98 | } |
| 99 | |
| 100 | |
| 101 | localstatic void |
| 102 | hfoldProg(Foam prog) |
| 103 | { |
| 104 | Foam body; |
| 105 | int i; |
| 106 | |
| 107 | hfoldProgInfo = foamOptInfo(prog)((prog)->hdr.info.opt); |
| 108 | |
| 109 | if (!hfoldProgInfo) return; /* saved files have no foamOptInfo */ |
| 110 | |
| 111 | hfoldStab = hfoldProgInfo->stab ? hfoldProgInfo->stab : stabFile(); |
| 112 | |
| 113 | /* No Stab => nothing to do */ |
| 114 | if (!hfoldStab) |
| 115 | return; |
| 116 | hfoldNumLocals = foamDDeclArgc(prog->foamProg.locals)(((prog->foamProg.locals)->hdr.argc) - (1)); |
| 117 | |
| 118 | body = prog->foamProg.body; |
| 119 | for (i=0; i<foamArgc(body)((body)->hdr.argc); i++) { |
| 120 | body->foamSeq.argv[i] = hfoldExpr(body->foamSeq.argv[i]); |
| 121 | } |
| 122 | |
| 123 | hfoldStab = NULL((void*)0); |
| 124 | hfoldProgInfo = NULL((void*)0); |
| 125 | } |
| 126 | |
| 127 | localstatic Foam |
| 128 | hfoldExpr(Foam foam) |
| 129 | { |
| 130 | Foam new, newFoam = foam; |
| 131 | |
| 132 | /* What about FOAM_Def nodes? */ |
| 133 | if (foamTag(foam)((foam)->hdr.tag) == FOAM_Set) { |
| 134 | newFoam = hfoldSet(foam); |
| 135 | if (foam != newFoam) { |
| 136 | foamFree(foam); |
| 137 | return newFoam; |
| 138 | } |
| 139 | /* NEVER hfold PRef target */ |
| 140 | /* ASSUME we never have a PRef in multi-lhs */ |
| 141 | if (foamTag(foam->foamSet.lhs)((foam->foamSet.lhs)->hdr.tag) == FOAM_PRef) { |
| 142 | /* hfold the rhs of the set just in case */ |
| 143 | Foam foamRhs = foam->foamSet.rhs; |
| 144 | newFoam = hfoldExpr(foamRhs); |
| 145 | if (newFoam != foamRhs) { |
| 146 | foamFree(foamRhs); |
| 147 | foam->foamSet.rhs = newFoam; |
| 148 | } |
| 149 | return foam; |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | foamIter(foam, arg, { new = hfoldExpr(*arg);{ { String argf = (foamInfoTable [(int)(((foam)->hdr.tag)) -(int)FOAM_START]).argf; Length _i; for (_i = 0; _i < ((foam )->hdr.argc); _i++, argf++) { if (*argf == '*') argf--; if (*argf == 'C') { Foam *arg = (Foam *) ((foam)->foamGen.argv )+_i; { { new = hfoldExpr(*arg); *arg = new; }; }; } } }; } |
| 154 | *arg = new; }){ { String argf = (foamInfoTable [(int)(((foam)->hdr.tag)) -(int)FOAM_START]).argf; Length _i; for (_i = 0; _i < ((foam )->hdr.argc); _i++, argf++) { if (*argf == '*') argf--; if (*argf == 'C') { Foam *arg = (Foam *) ((foam)->foamGen.argv )+_i; { { new = hfoldExpr(*arg); *arg = new; }; }; } } }; }; |
| 155 | switch(foamTag(foam)((foam)->hdr.tag)) { |
| 156 | case FOAM_PRef: |
| 157 | newFoam = hfoldPRef(foam); |
| 158 | break; |
| 159 | case FOAM_CCall: |
| 160 | newFoam = hfoldCCall(foam); |
| 161 | break; |
| 162 | default: |
| 163 | break; |
| 164 | } |
| 165 | if (newFoam != foam) |
| 166 | foamFreeNode(foam); |
| 167 | |
| 168 | return newFoam; |
| 169 | } |
| 170 | |
| 171 | localstatic Foam |
| 172 | hfoldCCall(Foam foam) |
| 173 | { |
| 174 | Syme syme; |
| 175 | Foam ref; |
| 176 | |
| 177 | if (!hfoldIsDomHash(foam->foamCCall.op)) |
| 178 | return foam; |
| 179 | |
| 180 | ref = foam->foamCCall.argv[0]; |
| 181 | |
| 182 | syme = foamSyme(ref)((ref)->hdr.syme); |
| 183 | |
| 184 | if (syme && symeHashNum(syme)((int) (SYFI_HashNum < (8 * sizeof(int)) && !((((( syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib ) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_HashNum ))) ? (symeFieldInfo[SYFI_HashNum].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme) ->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_HashNum )] : (symeFieldInfo[SYFI_HashNum].def)) : symeGetFieldFn(syme ,SYFI_HashNum))) && inlInlinable(hfoldStab, syme)) |
| 185 | foam = foamNewSInt(symeHashNum(syme))foamNew(FOAM_SInt, 1, (AInt)(((int) (SYFI_HashNum < (8 * sizeof (int)) && !(((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_HashNum))) ? (symeFieldInfo[SYFI_HashNum].def ) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((syme)->fieldv)[symeIndex(syme ,SYFI_HashNum)] : (symeFieldInfo[SYFI_HashNum].def)) : symeGetFieldFn (syme,SYFI_HashNum))))); |
| 186 | |
| 187 | return foam; |
| 188 | } |
| 189 | |
| 190 | localstatic Foam |
| 191 | hfoldPRef(Foam foam) |
| 192 | { |
| 193 | Syme syme; |
| 194 | Foam prog; |
| 195 | |
| 196 | if (foam->foamPRef.idx != 0) |
| 197 | return foam; |
| 198 | |
| 199 | prog = foam->foamPRef.prog; |
| 200 | |
| 201 | if (foamTag(prog)((prog)->hdr.tag) != FOAM_CProg) |
| 202 | return foam; |
| 203 | |
| 204 | syme = foamSyme(prog->foamCProg.prog)((prog->foamCProg.prog)->hdr.syme); |
| 205 | |
| 206 | if (syme && symeHashNum(syme)((int) (SYFI_HashNum < (8 * sizeof(int)) && !((((( syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib ) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_HashNum ))) ? (symeFieldInfo[SYFI_HashNum].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme) ->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_HashNum )] : (symeFieldInfo[SYFI_HashNum].def)) : symeGetFieldFn(syme ,SYFI_HashNum))) && inlInlinable(hfoldStab, syme)) |
| 207 | foam = foamNewSInt(symeHashNum(syme))foamNew(FOAM_SInt, 1, (AInt)(((int) (SYFI_HashNum < (8 * sizeof (int)) && !(((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_HashNum))) ? (symeFieldInfo[SYFI_HashNum].def ) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((syme)->fieldv)[symeIndex(syme ,SYFI_HashNum)] : (symeFieldInfo[SYFI_HashNum].def)) : symeGetFieldFn (syme,SYFI_HashNum))))); |
| 208 | |
| 209 | return foam; |
| 210 | } |
| 211 | |
| 212 | |
| 213 | localstatic Foam |
| 214 | hfoldSet(Foam foam) |
| 215 | { |
| 216 | Syme syme; |
| 217 | Foam rhs = foam->foamSet.rhs; |
| 218 | Foam ref; |
| 219 | |
| 220 | if (foamTag(rhs)((rhs)->hdr.tag) != FOAM_CCall) |
| 221 | return foam; |
| 222 | |
| 223 | if (!hfoldIsDomHash(rhs->foamCCall.op)) |
| 224 | return foam; |
| 225 | |
| 226 | ref = rhs->foamCCall.argv[0]; |
| 227 | |
| 228 | syme = foamSyme(ref)((ref)->hdr.syme); |
| 229 | |
| 230 | if (syme && symeHashNum(syme)((int) (SYFI_HashNum < (8 * sizeof(int)) && !((((( syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib ) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_HashNum ))) ? (symeFieldInfo[SYFI_HashNum].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme) ->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_HashNum )] : (symeFieldInfo[SYFI_HashNum].def)) : symeGetFieldFn(syme ,SYFI_HashNum))) && inlInlinable(hfoldStab, syme)) |
| 231 | foam->foamSet.rhs = foamNewSInt(symeHashNum(syme))foamNew(FOAM_SInt, 1, (AInt)(((int) (SYFI_HashNum < (8 * sizeof (int)) && !(((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_HashNum))) ? (symeFieldInfo[SYFI_HashNum].def ) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_HashNum))) ? ((syme)->fieldv)[symeIndex(syme ,SYFI_HashNum)] : (symeFieldInfo[SYFI_HashNum].def)) : symeGetFieldFn (syme,SYFI_HashNum))))); |
| 232 | |
| 233 | return foam; |
| 234 | } |
| 235 | |
| 236 | localstatic Bool |
| 237 | hfoldIsDomHash(Foam foam) |
| 238 | { |
| 239 | if (foamTag(foam)((foam)->hdr.tag) != FOAM_Glo) |
| 240 | return false((int) 0); |
| 241 | |
| 242 | return (foam->foamGlo.index == hfoldDomainHashGlobal); |
| 243 | } |