// BNCG0.bcpl - BCPL Compiler -- Nova Code Generator, Main program // Copyright Xerox Corporation 1980 ///*DCS* BNCG Symbol Table Compaction get "bncgx" external InitToRead static [ PassTwo = false LabelDef = false Cparameter = 32 PCparameter = 16 plabdefvec = nil pchainvec = nil plabelt = 0 lchainvec = nil llabelt = 0 elabelvec = nil eaddrvec = nil elabelt = 0 vlabelt = 0 zlabelt = 0 ctypetable = nil cdatatable = nil caddrtable = nil cnametable = nil ctablep = 0 constcount = 0 constreflimit = #77777 casev = nil casel = nil argvec = nil arg1 = nil arg2 = nil arg3 = nil framestack = nil framestackp = 0 Dict = nil ///*DCS* DictPtr = nil VirginSym = 0 PC = nil PCmax = nil ] ///*DCS* structure SYMPTR: [ Virgin bit 1 ///* if on, symbol useless link bit 15 ///* => next symbol, no longer needed. ] manifest [ Vsymsize = 64 ] let GenerateCode() be [ if SWDebug do WriteS("NCG*n") Code = Newvec(Codelimit) PC, PCmax = 1, Codelimit vlabelt = 0 zlabelt = 0 plabelt = Nextparam() - 1 pchainvec = Newvec(plabelt) plabdefvec = Newvec(plabelt) for i = 0 to plabelt do plabdefvec!i = 0 llabelt = Nextstatic() - 1 lchainvec = Newvec(llabelt) elabelt = Nextentry() - 1 elabelvec = Newvec(elabelt) eaddrvec = Newvec(elabelt) for i = 0 to elabelt do elabelvec!i, eaddrvec!i = 0, 0 ctypetable = Newvec(ctablesize) cdatatable = Newvec(ctablesize) caddrtable = Newvec(ctablesize) cnametable = Newvec(ctablesize) argvec = Newvec(argvecsize) framestack = Newvec(framestacksize) Reposition(DictStream, 0) InitToRead(DictStream) ///*DCS* Dict = Newvec(DictLength) ///* old code ///* for i = 0 to DictLength-1 do Readword(DictStream, lv Dict!i) ///* Look at each Symbol. There exist virgin symbols (entered, ///* but never referenced) and others. Virgin symbols have the ///* virgin bit on in the now unused pointer word (word 0). Read ///* in only non-virgin symbols. Record their file indices in the ///* DictPtr table, for use by binary search. Dict = Newvec(RealSymSize) // Size of non-virgin symbols DictPtr = Newvec(RealSymCount) // Number of same ///* dump first letter dispatch table let symptr, symct, onewd = 0, 0, nil for i = 0 to ($z-$a+1)*2+1-1 do Readword(DictStream,lv onewd) for i = ($z-$a+1)*2+1 to DictLength-1 do [readasymbol Readword(DictStream, lv onewd) ///* link word, w/virgin bit Readword(DictStream, lv Dict!(symptr+1)) ///* 1st word, w/count ///* sz is index rel symptr of last word in symbol let sz = (((Dict!(symptr+1)) rshift 8)/Bytesperword)+1 for j=2 to sz do Readword(DictStream, lv Dict!(symptr+j)) unless onewd<