FoxIntermediateBackend.SymU 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. MODULE FoxIntermediateBackend;
  2. IMPORT Basic := FoxBasic, SyntaxTree := FoxSyntaxTree, SemanticChecker := FoxSemanticChecker, Backend := FoxBackend, Global := FoxGlobal, Scanner := FoxScanner, IntermediateCode := FoxIntermediateCode, Sections := FoxSections, BinaryCode := FoxBinaryCode, Printout := FoxPrintout, SYSTEM, Strings, Options, Streams, Compiler, Formats := FoxFormats, SymbolFileFormat := FoxTextualSymbolFile, D := Debugging, Fingerprinter := FoxFingerprinter, StringPool, CRC;
  3. CONST
  4. ModeUndefined = 0;
  5. ModeReference = 1;
  6. ModeValue = 2;
  7. ArrayDimTable = 3;
  8. MathPtrOffset = 0;
  9. MathAdrOffset = 1;
  10. MathFlagsOffset = 2;
  11. MathDimOffset = 3;
  12. MathElementSizeOffset = 4;
  13. MathLenOffset = 5;
  14. MathIncrOffset = 6;
  15. SysDataArrayOffset* = 0;
  16. ArrDataArrayOffset* = (16 * 8);
  17. TensorFlag* = 0;
  18. RangeFlag* = 1;
  19. StackFlag* = 2;
  20. StaticFlag* = 1;
  21. WithTrap* = 1;
  22. CaseTrap* = 2;
  23. ReturnTrap* = 3;
  24. TypeEqualTrap* = 5;
  25. TypeCheckTrap* = 6;
  26. IndexCheckTrap* = 7;
  27. AssertTrap* = 8;
  28. ArraySizeTrap* = 9;
  29. ArrayFormTrap* = 10;
  30. SetElementTrap* = 11;
  31. NegativeDivisorTrap* = 12;
  32. NoReturnTrap* = 16;
  33. NilPointerTrap* = 17;
  34. RethrowTrap* = 18;
  35. Trace = FALSE;
  36. TraceRegisterUsageCount = TRUE;
  37. ArrayAlignment = (8 * 8);
  38. NumberSystemCalls* = 12;
  39. SysNewRec* = 0;
  40. SysNewArr* = 1;
  41. SysNewSys* = 2;
  42. SysCaseTable* = 3;
  43. SysProcAddr* = 4;
  44. SysLock* = 5;
  45. SysUnlock* = 6;
  46. SysStart* = 7;
  47. SysAwait* = 8;
  48. SysInterfaceLookup* = 9;
  49. SysRegisterInterface* = 10;
  50. SysGetProcedure* = 11;
  51. DefaultBuiltinsModuleName = \"Builtins"\;
  52. DefaultTraceModuleName = \"KernelLog"\;
  53. ChannelModuleName = \"Channels"\;
  54. NonPointer = -1;
  55. NoType = 0;
  56. LhsIsPointer = 0;
  57. RhsIsPointer = 1;
  58. BasePointerTypeSize = 5;
  59. BaseArrayTypeSize = (BasePointerTypeSize + 3);
  60. LengthOffset = (BasePointerTypeSize + 0);
  61. DataOffset = (BasePointerTypeSize + 1);
  62. DescriptorOffset = (BasePointerTypeSize + 2);
  63. BaseRecordTypeSize = (BasePointerTypeSize + 2);
  64. ActionOffset = (BasePointerTypeSize + 0);
  65. MonitorOffset = (BasePointerTypeSize + 1);
  66. BaseObjectTypeSize = BaseRecordTypeSize;
  67. ActionTypeSize = 3;
  68. MonitorTypeSize = 7;
  69. ProcessorOffset = (BaseObjectTypeSize + 1);
  70. StackLimitOffset* = (BaseObjectTypeSize + 3);
  71. QuantumOffset = (BaseObjectTypeSize + 4);
  72. SmallMatrixFlag = 3;
  73. SmallVectorFlag = 3;
  74. Size2Flag = 4;
  75. Size3Flag = 5;
  76. Size4Flag = 6;
  77. Size5Flag = 7;
  78. Size6Flag = 8;
  79. Size7Flag = 9;
  80. Size8Flag = 10;
  81. ReflectionSupport = TRUE;
  82. ProtectModulesPointers = FALSE;
  83. CreateProcedureDescInfo = TRUE;
  84. WarningDynamicLoading = FALSE;
  85. SysvABI = {SyntaxTree.CCallingConvention};
  86. SysvABIorWINAPI = {SyntaxTree.CCallingConvention, SyntaxTree.WinAPICallingConvention};
  87. TYPE
  88. Position = SyntaxTree.Position;
  89. SupportedInstructionProcedure* = PROCEDURE {DELEGATE}(CONST instr: IntermediateCode.Instruction; VAR moduleName, procedureName: ARRAY OF CHAR):BOOLEAN;
  90. SupportedImmediateProcedure* = PROCEDURE {DELEGATE}(CONST op: IntermediateCode.Operand):BOOLEAN;
  91. WriteBackCall = POINTER TO RECORD
  92. call: SyntaxTree.ProcedureCallDesignator;
  93. next: WriteBackCall;
  94. END;
  95. Operand = RECORD
  96. mode: SHORTINT;
  97. op: IntermediateCode.Operand;
  98. tag: IntermediateCode.Operand;
  99. extra: IntermediateCode.Operand;
  100. dimOffset: LONGINT;
  101. availability: WORD;
  102. END;
  103. Fixup = POINTER TO RECORD
  104. pc: LONGINT;
  105. nextFixup: Fixup;
  106. END;
  107. Label = OBJECT
  108. VAR
  109. fixups: Fixup;
  110. section: IntermediateCode.Section;
  111. pc: LONGINT;
  112. PROCEDURE ^ & InitLabel(section: IntermediateCode.Section);
  113. PROCEDURE ^ Resolve(pc: LONGINT);
  114. PROCEDURE ^ AddFixup(at: LONGINT);
  115. END Label;
  116. ConditionalBranch = PROCEDURE {DELEGATE}(label: Label; op1, op2: IntermediateCode.Operand);
  117. DeclarationVisitor = OBJECT
  118. VAR
  119. backend: IntermediateBackend;
  120. implementationVisitor: ImplementationVisitor;
  121. meta: MetaDataGenerator;
  122. system: Global.System;
  123. currentScope: SyntaxTree.Scope;
  124. module: Sections.Module;
  125. moduleSelf: SyntaxTree.Variable;
  126. dump: BOOLEAN;
  127. forceModuleBody: BOOLEAN;
  128. addressType: IntermediateCode.Type;
  129. PROCEDURE ^ & Init(system: Global.System; implementationVisitor: ImplementationVisitor; backend: IntermediateBackend; forceModuleBody, dump: BOOLEAN);
  130. PROCEDURE ^ Error(position: Position; CONST s: ARRAY OF CHAR);
  131. PROCEDURE ^ Type(x: SyntaxTree.Type);
  132. PROCEDURE ^ QualifiedType(x: SyntaxTree.QualifiedType);
  133. PROCEDURE ^ HasFlag(modifiers: SyntaxTree.Modifier; CONST name: ARRAY OF CHAR): BOOLEAN;
  134. PROCEDURE ^ RecordType(x: SyntaxTree.RecordType);
  135. PROCEDURE ^ CellType(x: SyntaxTree.CellType);
  136. PROCEDURE ^ Variable(x: SyntaxTree.Variable);
  137. PROCEDURE ^ Parameter(x: SyntaxTree.Parameter);
  138. PROCEDURE ^ TypeDeclaration(x: SyntaxTree.TypeDeclaration);
  139. PROCEDURE ^ Constant(x: SyntaxTree.Constant);
  140. PROCEDURE ^ Scope(x: SyntaxTree.Scope);
  141. PROCEDURE ^ Parameters(first: SyntaxTree.Parameter);
  142. PROCEDURE ^ Procedure(x: SyntaxTree.Procedure);
  143. PROCEDURE ^ AddBodyCallStub(bodyProcedure: SyntaxTree.Procedure);
  144. PROCEDURE ^ AddStackAllocation(symbol: SyntaxTree.Symbol; initStack: Basic.Integer);
  145. PROCEDURE ^ Module(x: SyntaxTree.Module; module: Sections.Module);
  146. END DeclarationVisitor;
  147. UsedArray* = POINTER TO ARRAY OF RECORD
  148. count: LONGINT;
  149. map: LONGINT;
  150. type: IntermediateCode.Type;
  151. class: IntermediateCode.RegisterClass;
  152. END;
  153. RegisterUsageCount* = OBJECT
  154. VAR
  155. used: UsedArray;
  156. count: LONGINT;
  157. PROCEDURE ^ & Init;
  158. PROCEDURE ^ Grow;
  159. PROCEDURE ^ Next(type: IntermediateCode.Type; class: IntermediateCode.RegisterClass): LONGINT;
  160. PROCEDURE ^ IncUse(register: LONGINT);
  161. PROCEDURE ^ DecUse(register: LONGINT);
  162. PROCEDURE ^ Map(register: LONGINT): LONGINT;
  163. PROCEDURE ^ Use(register: LONGINT): LONGINT;
  164. END RegisterUsageCount;
  165. RegisterEntry = POINTER TO RECORD
  166. prev, next: RegisterEntry;
  167. register: LONGINT;
  168. registerClass: IntermediateCode.RegisterClass;
  169. type: IntermediateCode.Type;
  170. END;
  171. VariableUse = ARRAY 32 OF SET;
  172. Variables = OBJECT (Basic.List)
  173. VAR
  174. inUse: VariableUse;
  175. registerIndex: LONGINT;
  176. nameIndex: LONGINT;
  177. PROCEDURE ^ & Init;
  178. PROCEDURE ^ Clear*;
  179. PROCEDURE ^ GetUID(): SyntaxTree.Identifier;
  180. PROCEDURE ^ GetUsage(VAR use: VariableUse);
  181. PROCEDURE ^ SetUsage(CONST use: VariableUse);
  182. PROCEDURE ^ GetVariable(i: LONGINT): SyntaxTree.Variable;
  183. PROCEDURE ^ SetVariable(pos: LONGINT; v: SyntaxTree.Variable);
  184. PROCEDURE ^ Occupy(pos: LONGINT);
  185. PROCEDURE ^ Occupied(pos: LONGINT): BOOLEAN;
  186. PROCEDURE ^ AddVariable(v: SyntaxTree.Variable);
  187. PROCEDURE ^ CompatibleType(t1, t2: SyntaxTree.Type): BOOLEAN;
  188. PROCEDURE ^ GetFreeVariable(type: SyntaxTree.Type; untraced: BOOLEAN; VAR pos: LONGINT): SyntaxTree.Variable;
  189. END Variables;
  190. ImplementationVisitor = OBJECT (SyntaxTree.Visitor)
  191. TYPE
  192. Context = RECORD
  193. section: IntermediateCode.Section;
  194. registerUsageCount: RegisterUsageCount;
  195. usedRegisters: RegisterEntry;
  196. temporaries: Variables;
  197. END;
  198. ;
  199. VAR
  200. system: Global.System;
  201. section: IntermediateCode.Section;
  202. module: Sections.Module;
  203. moduleScope: SyntaxTree.ModuleScope;
  204. awaitProcCounter, labelId, constId, caseId: LONGINT;
  205. hiddenPointerType: SyntaxTree.RecordType;
  206. delegatePointerType: SyntaxTree.RecordType;
  207. checker: SemanticChecker.Checker;
  208. backend: IntermediateBackend;
  209. meta: MetaDataGenerator;
  210. position: Position;
  211. moduleSelf: SyntaxTree.Variable;
  212. currentScope: SyntaxTree.Scope;
  213. result: Operand;
  214. destination: IntermediateCode.Operand;
  215. arrayDestinationTag: IntermediateCode.Operand;
  216. arrayDestinationDimension: LONGINT;
  217. currentLoop: Label;
  218. exitLabel: Label;
  219. locked: BOOLEAN;
  220. registerUsageCount: RegisterUsageCount;
  221. usedRegisters: RegisterEntry;
  222. nil, one, fp, sp, ap, lr, true, false: IntermediateCode.Operand;
  223. bool, addressType, setType, sizeType, lenType, byteType: IntermediateCode.Type;
  224. commentPrintout: Printout.Printer;
  225. dump: Streams.Writer;
  226. tagsAvailable: BOOLEAN;
  227. supportedInstruction: SupportedInstructionProcedure;
  228. supportedImmediate: SupportedImmediateProcedure;
  229. inData: BOOLEAN;
  230. emitLabels: BOOLEAN;
  231. builtinsModuleName: SyntaxTree.IdentifierString;
  232. indexCounter: LONGINT;
  233. profile: BOOLEAN;
  234. profileId, profileInit: IntermediateCode.Section;
  235. profileInitPatchPosition: LONGINT;
  236. numberProcedures: LONGINT;
  237. procedureResultDesignator: SyntaxTree.Designator;
  238. operatorInitializationCodeSection: IntermediateCode.Section;
  239. fingerprinter: Fingerprinter.Fingerprinter;
  240. temporaries: Variables;
  241. canBeLoaded: BOOLEAN;
  242. currentIsInline: BOOLEAN;
  243. currentInlineExit: Label;
  244. moduleBodySection: IntermediateCode.Section;
  245. NeedDescriptor: BOOLEAN;
  246. cooperativeSwitches: BOOLEAN;
  247. lastSwitchPC: LONGINT;
  248. isUnchecked: BOOLEAN;
  249. availableSymbols: ARRAY 1024 OF RECORD
  250. symbol: SyntaxTree.Symbol;
  251. inMemory, inRegister: BOOLEAN;
  252. register: IntermediateCode.Operand;
  253. memory: IntermediateCode.Operand;
  254. END;
  255. modifyAssignmentCounter := 0: LONGINT;
  256. PROCEDURE ^ & Init(system: Global.System; checker: SemanticChecker.Checker; supportedInstructionProcedure: SupportedInstructionProcedure; supportedImmediateProcedure: SupportedImmediateProcedure; emitLabels: BOOLEAN; CONST runtime: SyntaxTree.IdentifierString; backend: IntermediateBackend);
  257. PROCEDURE ^ SwitchContext(new: IntermediateCode.Section): Context;
  258. PROCEDURE ^ ReturnToContext(context: Context);
  259. PROCEDURE ^ NewSection(list: Sections.SectionList; type: SHORTINT; CONST name: Basic.SegmentedName; syntaxTreeSymbol: SyntaxTree.Symbol; dump: BOOLEAN): IntermediateCode.Section;
  260. PROCEDURE ^ AcquireRegister(CONST type: IntermediateCode.Type; class: IntermediateCode.RegisterClass): LONGINT;
  261. PROCEDURE ^ GetFingerprintString(symbol: SyntaxTree.Symbol; VAR string: ARRAY OF CHAR);
  262. PROCEDURE ^ GetCodeSectionNameForSymbol(symbol: SyntaxTree.Symbol; VAR name: Basic.SegmentedName);
  263. PROCEDURE ^ TraceEnter(CONST s: ARRAY OF CHAR);
  264. PROCEDURE ^ TraceExit(CONST s: ARRAY OF CHAR);
  265. PROCEDURE ^ Emit(instruction: IntermediateCode.Instruction);
  266. PROCEDURE ^ EmitTrap(position: Position; trapNo: LONGINT);
  267. PROCEDURE ^ EmitEnter(section: IntermediateCode.Section; position: Position; procedure: SyntaxTree.Procedure; callconv: LONGINT; varSize: LONGINT);
  268. PROCEDURE ^ Enter(position: Position; callconv: LONGINT; varSize: LONGINT): IntermediateCode.Instruction;
  269. PROCEDURE ^ Leave(position: Position; callconv: LONGINT): IntermediateCode.Instruction;
  270. PROCEDURE ^ EmitLeave(section: IntermediateCode.Section; position: Basic.Position; procedure: SyntaxTree.Procedure; callconv: LONGINT);
  271. PROCEDURE ^ Symbol(x: SyntaxTree.Symbol; VAR op: Operand);
  272. PROCEDURE ^ Expression(x: SyntaxTree.Expression);
  273. PROCEDURE ^ Statement(x: SyntaxTree.Statement);
  274. PROCEDURE ^ MakeMemory(VAR res: IntermediateCode.Operand; op: IntermediateCode.Operand; type: IntermediateCode.Type; offset: LONGINT);
  275. PROCEDURE ^ ToMemory(VAR res: IntermediateCode.Operand; type: IntermediateCode.Type; offset: LONGINT);
  276. PROCEDURE ^ LoadValue(VAR operand: Operand; type: SyntaxTree.Type);
  277. PROCEDURE ^ Evaluate(x: SyntaxTree.Expression; VAR op: Operand);
  278. PROCEDURE ^ EvaluateX(CONST x: SyntaxTree.Expression; VAR result: Operand);
  279. PROCEDURE ^ Designate(x: SyntaxTree.Expression; VAR op: Operand);
  280. PROCEDURE ^ Condition(CONST x: SyntaxTree.Expression; label: Label; reason: BOOLEAN);
  281. PROCEDURE ^ EvaluateUnaryExpression(x: SyntaxTree.UnaryExpression; VAR result: Operand);
  282. PROCEDURE ^ EvaluateBinaryExpression(x: SyntaxTree.BinaryExpression; VAR result: Operand);
  283. PROCEDURE ^ EvaluateSet(x: SyntaxTree.Set; VAR result: Operand);
  284. PROCEDURE ^ NewRegisterOperand(type: IntermediateCode.Type): IntermediateCode.Operand;
  285. PROCEDURE ^ UnuseRegister(register: LONGINT);
  286. PROCEDURE ^ UseRegister(register: LONGINT);
  287. PROCEDURE ^ ReleaseIntermediateOperand(CONST op: IntermediateCode.Operand);
  288. PROCEDURE ^ UseIntermediateOperand(CONST op: IntermediateCode.Operand);
  289. PROCEDURE ^ ReleaseOperand(CONST op: Operand);
  290. PROCEDURE ^ SaveRegisters;
  291. PROCEDURE ^ ReleaseUsedRegisters(VAR saved: RegisterEntry);
  292. PROCEDURE ^ ReleaseParameterRegisters;
  293. PROCEDURE ^ RestoreRegisters(CONST saved: RegisterEntry);
  294. PROCEDURE ^ RestoreRegisterUse(CONST saved: RegisterEntry);
  295. PROCEDURE ^ CheckRegistersFree;
  296. PROCEDURE ^ Reuse2(VAR result: IntermediateCode.Operand; src1, src2: IntermediateCode.Operand);
  297. PROCEDURE ^ Reuse2a(VAR result: IntermediateCode.Operand; src1, src2: IntermediateCode.Operand; VAR alternative: IntermediateCode.Operand);
  298. PROCEDURE ^ Reuse1(VAR result: IntermediateCode.Operand; src1: IntermediateCode.Operand);
  299. PROCEDURE ^ Reuse1a(VAR result: IntermediateCode.Operand; src1: IntermediateCode.Operand; VAR alternative: IntermediateCode.Operand);
  300. PROCEDURE ^ ReuseCopy(VAR result: IntermediateCode.Operand; src1: IntermediateCode.Operand);
  301. PROCEDURE ^ TransferToRegister(VAR result: IntermediateCode.Operand; src: IntermediateCode.Operand);
  302. PROCEDURE ^ NewLabel(): Label;
  303. PROCEDURE ^ EndBasicBlock;
  304. PROCEDURE ^ BeginBasicBlock;
  305. PROCEDURE ^ SetLabel(label: Label);
  306. PROCEDURE ^ LabelOperand(label: Label): IntermediateCode.Operand;
  307. PROCEDURE ^ BrL(label: Label);
  308. PROCEDURE ^ BrgeL(label: Label; left, right: IntermediateCode.Operand);
  309. PROCEDURE ^ BrltL(label: Label; left, right: IntermediateCode.Operand);
  310. PROCEDURE ^ BreqL(label: Label; left, right: IntermediateCode.Operand);
  311. PROCEDURE ^ BrneL(label: Label; left, right: IntermediateCode.Operand);
  312. PROCEDURE ^ Convert(VAR operand: IntermediateCode.Operand; type: IntermediateCode.Type);
  313. PROCEDURE ^ TrapC(br: ConditionalBranch; left, right: IntermediateCode.Operand; trapNo: LONGINT);
  314. PROCEDURE ^ CheckSetElement(o: IntermediateCode.Operand);
  315. PROCEDURE ^ SetFromRange(x: SyntaxTree.RangeExpression): IntermediateCode.Operand;
  316. PROCEDURE ^ VisitSet*(x: SyntaxTree.Set);
  317. PROCEDURE ^ VisitMathArrayExpression*(x: SyntaxTree.MathArrayExpression);
  318. PROCEDURE ^ VisitUnaryExpression*(x: SyntaxTree.UnaryExpression);
  319. PROCEDURE ^ TypeTest(tag: IntermediateCode.Operand; type: SyntaxTree.Type; label: Label; reason: BOOLEAN; withPart: BOOLEAN);
  320. PROCEDURE ^ Error(position: Position; CONST s: ARRAY OF CHAR);
  321. PROCEDURE ^ Warning(position: Position; CONST s: ARRAY OF CHAR);
  322. PROCEDURE ^ CreateTraceModuleMethod(mod: SyntaxTree.Module);
  323. PROCEDURE ^ CallAssignPointer(CONST dst, src: IntermediateCode.Operand);
  324. PROCEDURE ^ CallAssignMethod(CONST dst, src: IntermediateCode.Operand; type: SyntaxTree.Type);
  325. PROCEDURE ^ CreateAssignProcedure(recordType: SyntaxTree.RecordType);
  326. PROCEDURE ^ CallTraceMethod(CONST register: IntermediateCode.Operand; type: SyntaxTree.Type);
  327. PROCEDURE ^ CreateTraceMethod(recordType: SyntaxTree.RecordType);
  328. PROCEDURE ^ CreateResetProcedure(recordType: SyntaxTree.RecordType);
  329. PROCEDURE ^ CreateResetMethod(scope: SyntaxTree.ProcedureScope);
  330. PROCEDURE ^ CallResetProcedure(dest, tag: IntermediateCode.Operand; type: SyntaxTree.Type);
  331. PROCEDURE ^ ResetVariables(scope: SyntaxTree.ProcedureScope);
  332. PROCEDURE ^ Reset(symbol: SyntaxTree.Symbol; refer: BOOLEAN);
  333. PROCEDURE ^ ResetVariables2(scope: SyntaxTree.ProcedureScope; refer: BOOLEAN);
  334. PROCEDURE ^ CreateProcedureDescriptor(procedure: SyntaxTree.Procedure);
  335. PROCEDURE ^ AddImport(CONST moduleName: ARRAY OF CHAR; VAR module: SyntaxTree.Module; force: BOOLEAN): BOOLEAN;
  336. PROCEDURE ^ EnsureSymbol(CONST moduleName, procedureName: SyntaxTree.IdentifierString);
  337. PROCEDURE ^ ConditionValue(x: SyntaxTree.Expression): Operand;
  338. PROCEDURE ^ GetDynamicSize(type: SyntaxTree.Type; tag: IntermediateCode.Operand): IntermediateCode.Operand;
  339. PROCEDURE ^ GetArrayLength(type: SyntaxTree.Type; tag: IntermediateCode.Operand): IntermediateCode.Operand;
  340. PROCEDURE ^ GetSizeFromTag(tag: IntermediateCode.Operand): IntermediateCode.Operand;
  341. PROCEDURE ^ GetArrayOfBytesSize(e: SyntaxTree.Expression; tag: IntermediateCode.Operand): IntermediateCode.Operand;
  342. PROCEDURE ^ GetRuntimeProcedure(CONST moduleName, procedureName: ARRAY OF CHAR; VAR procedure: SyntaxTree.Procedure; force: BOOLEAN): BOOLEAN;
  343. PROCEDURE ^ GetTypeDescriptor(CONST moduleName, typeName: ARRAY OF CHAR; VAR name: Basic.SegmentedName): SyntaxTree.Symbol;
  344. PROCEDURE ^ CallThisChecked(position: Position; CONST moduleName, procedureName: ARRAY OF CHAR; numberParameters: LONGINT; checkNumParameters: BOOLEAN);
  345. PROCEDURE ^ CallThis(position: Position; CONST moduleName, procedureName: ARRAY OF CHAR; numberParameters: LONGINT);
  346. PROCEDURE ^ CompareString(br: ConditionalBranch; label: Label; leftExpression, rightExpression: SyntaxTree.Expression);
  347. PROCEDURE ^ CopyString(leftExpression, rightExpression: SyntaxTree.Expression);
  348. PROCEDURE ^ VisitBinaryExpression*(x: SyntaxTree.BinaryExpression);
  349. PROCEDURE ^ VisitRangeExpression*(x: SyntaxTree.RangeExpression);
  350. PROCEDURE ^ VisitTensorRangeExpression*(x: SyntaxTree.TensorRangeExpression);
  351. PROCEDURE ^ VisitConversion*(x: SyntaxTree.Conversion);
  352. PROCEDURE ^ VisitTypeDeclaration*(x: SyntaxTree.TypeDeclaration);
  353. PROCEDURE ^ VisitSymbolDesignator*(x: SyntaxTree.SymbolDesignator);
  354. PROCEDURE ^ BoundCheck(index, length: IntermediateCode.Operand);
  355. PROCEDURE ^ DimensionCheck(base, dim: IntermediateCode.Operand; op: ConditionalBranch);
  356. PROCEDURE ^ MathIndexDesignator(x: SyntaxTree.IndexDesignator);
  357. PROCEDURE ^ ArrayLength(type: SyntaxTree.Type; dim: LONGINT; tag: IntermediateCode.Operand): IntermediateCode.Operand;
  358. PROCEDURE ^ CopyInt(VAR res: IntermediateCode.Operand; x: IntermediateCode.Operand);
  359. PROCEDURE ^ AddInt(VAR res: IntermediateCode.Operand; x, y: IntermediateCode.Operand);
  360. PROCEDURE ^ MulInt(VAR res: IntermediateCode.Operand; x, y: IntermediateCode.Operand);
  361. PROCEDURE ^ DivInt(VAR res: IntermediateCode.Operand; x, y: IntermediateCode.Operand);
  362. PROCEDURE ^ IndexDesignator(x: SyntaxTree.IndexDesignator);
  363. PROCEDURE ^ VisitIndexDesignator*(x: SyntaxTree.IndexDesignator);
  364. PROCEDURE ^ PrepareTensorDescriptor(expression: SyntaxTree.IndexDesignator): SyntaxTree.Variable;
  365. PROCEDURE ^ PushParameter(expression: SyntaxTree.Expression; parameter: SyntaxTree.Parameter; callingConvention: LONGINT; needsParameterBackup: BOOLEAN; VAR parameterBackup: IntermediateCode.Operand; register: WORD);
  366. PROCEDURE ^ VisitInlineCallDesignator*(x: SyntaxTree.InlineCallDesignator);
  367. PROCEDURE ^ VisitProcedureCallDesignator*(x: SyntaxTree.ProcedureCallDesignator);
  368. PROCEDURE ^ TypeDescriptorAdr(t: SyntaxTree.Type): IntermediateCode.Operand;
  369. PROCEDURE ^ ProfilerInit;
  370. PROCEDURE ^ ProfilerEnterExit(procedureNumber: LONGINT; enter: BOOLEAN);
  371. PROCEDURE ^ ProfilerAddProcedure(procedureNumber: LONGINT; CONST name: ARRAY OF CHAR);
  372. PROCEDURE ^ ProfilerAddModule(CONST name: ARRAY OF CHAR);
  373. PROCEDURE ^ ProfilerPatchInit;
  374. PROCEDURE ^ RegisterDynamicOperator(operator: SyntaxTree.Operator);
  375. PROCEDURE ^ SystemTrace(x: SyntaxTree.ExpressionList; pos: Position);
  376. PROCEDURE ^ InitFields(type: SyntaxTree.Type; CONST adr: IntermediateCode.Operand; offset: LONGINT);
  377. PROCEDURE ^ InitVariable(VAR variable: SyntaxTree.Variable; temporary: BOOLEAN);
  378. PROCEDURE ^ MathArrayDim(type: SyntaxTree.MathArrayType; CONST base: IntermediateCode.Operand; VAR result: Operand);
  379. PROCEDURE ^ PutMathArrayField(base, value: IntermediateCode.Operand; fieldOffset: LONGINT);
  380. PROCEDURE ^ PutMathArrayFieldOffset(base, value: IntermediateCode.Operand; fieldOffset, offset: LONGINT);
  381. PROCEDURE ^ GetMathArrayField(VAR value: IntermediateCode.Operand; base: IntermediateCode.Operand; offset: LONGINT);
  382. PROCEDURE ^ PutMathArrayLenOrIncr(CONST base, value, dim: IntermediateCode.Operand; incr: BOOLEAN);
  383. PROCEDURE ^ PutMathArrayLength(base, value: IntermediateCode.Operand; dim: LONGINT);
  384. PROCEDURE ^ PutMathArrayIncrement(base, value: IntermediateCode.Operand; dim: LONGINT);
  385. PROCEDURE ^ GetMathArrayIncrement(type: SyntaxTree.MathArrayType; CONST operand: Operand; VAR dim: IntermediateCode.Operand; check: BOOLEAN; VAR result: Operand);
  386. PROCEDURE ^ GetMathArrayLength(type: SyntaxTree.MathArrayType; CONST operand: Operand; VAR dim: IntermediateCode.Operand; check: BOOLEAN; VAR result: Operand);
  387. PROCEDURE ^ GetMathArrayLengthAt(type: SyntaxTree.MathArrayType; CONST operand: Operand; dim: LONGINT; check: BOOLEAN; VAR result: Operand);
  388. PROCEDURE ^ GetMathArrayIncrementAt(type: SyntaxTree.MathArrayType; CONST operand: Operand; dim: LONGINT; check: BOOLEAN; VAR result: Operand);
  389. PROCEDURE ^ MathArrayLenOrIncr(type: SyntaxTree.MathArrayType; CONST operand: Operand; VAR dim: IntermediateCode.Operand; increment: BOOLEAN; check: BOOLEAN; VAR result: Operand);
  390. PROCEDURE ^ ArrayLen(type: SyntaxTree.ArrayType; VAR operand: Operand; VAR dim: IntermediateCode.Operand; VAR result: Operand);
  391. PROCEDURE ^ GetTemporaryVariable(type: SyntaxTree.Type; register: BOOLEAN; untraced: BOOLEAN): SyntaxTree.Variable;
  392. PROCEDURE ^ GetMathArrayDescriptorType(dimensions: LONGINT): SyntaxTree.Type;
  393. PROCEDURE ^ PushConstString(CONST s: ARRAY OF CHAR);
  394. PROCEDURE ^ PushConstBoolean(b: BOOLEAN);
  395. PROCEDURE ^ PushConstSet(v: SET);
  396. PROCEDURE ^ PushConstInteger(v: LONGINT);
  397. PROCEDURE ^ OpenInitializer(symbol: SyntaxTree.Symbol; scope: SyntaxTree.Scope): IntermediateCode.Section;
  398. PROCEDURE ^ CloseInitializer(prev: IntermediateCode.Section);
  399. PROCEDURE ^ AddPorts(cell: SyntaxTree.Symbol; x: SyntaxTree.CellType);
  400. PROCEDURE ^ AddProperty(cellType: SyntaxTree.CellType; cell: SyntaxTree.Symbol; property: SyntaxTree.Property; value: SyntaxTree.Expression);
  401. PROCEDURE ^ AddModifiers(cellType: SyntaxTree.CellType; cell: SyntaxTree.Symbol; modifier: SyntaxTree.Modifier);
  402. PROCEDURE ^ AppendModifier(VAR to: SyntaxTree.Modifier; this: SyntaxTree.Modifier);
  403. PROCEDURE ^ AppendModifiers(VAR to: SyntaxTree.Modifier; this: SyntaxTree.Modifier);
  404. PROCEDURE ^ AppendCellTypeModifiers(VAR to: SyntaxTree.Modifier; c: SyntaxTree.CellType);
  405. PROCEDURE ^ AddPortProperty(modifier: SyntaxTree.Modifier; value: SyntaxTree.Expression);
  406. PROCEDURE ^ AddPortProperties(modifier: SyntaxTree.Modifier);
  407. PROCEDURE ^ PushPort(p: SyntaxTree.Expression);
  408. PROCEDURE ^ PushString(op: Operand; actualType: SyntaxTree.Type);
  409. PROCEDURE ^ OnHeap(x: SyntaxTree.Expression): BOOLEAN;
  410. PROCEDURE ^ VisitBuiltinCallDesignator*(x: SyntaxTree.BuiltinCallDesignator);
  411. PROCEDURE ^ EvaluateBuiltinCallDesignator(x: SyntaxTree.BuiltinCallDesignator; VAR result: Operand);
  412. PROCEDURE ^ VisitTypeGuardDesignator*(x: SyntaxTree.TypeGuardDesignator);
  413. PROCEDURE ^ Dereference(VAR operand: Operand; type: SyntaxTree.Type; isUnsafe: BOOLEAN);
  414. PROCEDURE ^ VisitDereferenceDesignator*(x: SyntaxTree.DereferenceDesignator);
  415. PROCEDURE ^ VisitSupercallDesignator*(x: SyntaxTree.SupercallDesignator);
  416. PROCEDURE ^ VisitSelfDesignator*(x: SyntaxTree.SelfDesignator);
  417. PROCEDURE ^ VisitResultDesignator*(x: SyntaxTree.ResultDesignator);
  418. PROCEDURE ^ VisitBooleanValue*(x: SyntaxTree.BooleanValue);
  419. PROCEDURE ^ GetDataSection*(): IntermediateCode.Section;
  420. PROCEDURE ^ GetImmediateMem(VAR vop: IntermediateCode.Operand);
  421. PROCEDURE ^ VisitIntegerValue*(x: SyntaxTree.IntegerValue);
  422. PROCEDURE ^ VisitCharacterValue*(x: SyntaxTree.CharacterValue);
  423. PROCEDURE ^ VisitSetValue*(x: SyntaxTree.SetValue);
  424. PROCEDURE ^ VisitMathArrayValue*(x: SyntaxTree.MathArrayValue);
  425. PROCEDURE ^ VisitConstant*(x: SyntaxTree.Constant);
  426. PROCEDURE ^ VisitRealValue*(x: SyntaxTree.RealValue);
  427. PROCEDURE ^ VisitComplexValue*(x: SyntaxTree.ComplexValue);
  428. PROCEDURE ^ VisitStringValue*(x: SyntaxTree.StringValue);
  429. PROCEDURE ^ VisitNilValue*(x: SyntaxTree.NilValue);
  430. PROCEDURE ^ VisitEnumerationValue*(x: SyntaxTree.EnumerationValue);
  431. PROCEDURE ^ VisitImport*(x: SyntaxTree.Import);
  432. PROCEDURE ^ GetBaseRegister(VAR result: IntermediateCode.Operand; scope, baseScope: SyntaxTree.Scope);
  433. PROCEDURE ^ GetAvailability(x: SyntaxTree.Variable): WORD;
  434. PROCEDURE ^ VisitVariable*(x: SyntaxTree.Variable);
  435. PROCEDURE ^ VisitProperty*(property: SyntaxTree.Property);
  436. PROCEDURE ^ VisitParameter*(x: SyntaxTree.Parameter);
  437. PROCEDURE ^ DynamicCallOperand(VAR operand: Operand; x: SyntaxTree.Procedure);
  438. PROCEDURE ^ StaticCallOperand(VAR operand: Operand; x: SyntaxTree.Procedure);
  439. PROCEDURE ^ VisitProcedure*(x: SyntaxTree.Procedure);
  440. PROCEDURE ^ VisitOperator*(x: SyntaxTree.Operator);
  441. PROCEDURE ^ VisitAlias*(x: SyntaxTree.Alias);
  442. PROCEDURE ^ VisitProcedureCallStatement*(x: SyntaxTree.ProcedureCallStatement);
  443. PROCEDURE ^ AssignMathArray(left, right: SyntaxTree.Expression);
  444. PROCEDURE ^ ModifyAssignments(CONST value: IntermediateCode.Operand);
  445. PROCEDURE ^ CopySize(left: SyntaxTree.Expression; tag: IntermediateCode.Operand): IntermediateCode.Operand;
  446. PROCEDURE ^ AssignReference(left, right: SyntaxTree.Expression);
  447. PROCEDURE ^ Assign(left, right: SyntaxTree.Expression);
  448. PROCEDURE ^ VisitAssignment*(x: SyntaxTree.Assignment);
  449. PROCEDURE ^ EmitCooperativeSwitch;
  450. PROCEDURE ^ VisitCommunicationStatement*(communication: SyntaxTree.CommunicationStatement);
  451. PROCEDURE ^ VisitIfStatement*(x: SyntaxTree.IfStatement);
  452. PROCEDURE ^ BrWithPart(CONST tag: IntermediateCode.Operand; x: SyntaxTree.WithPart; VAR trueL: Label);
  453. PROCEDURE ^ EmitWithPart(x: SyntaxTree.WithPart);
  454. PROCEDURE ^ VisitWithStatement*(x: SyntaxTree.WithStatement);
  455. PROCEDURE ^ VisitCaseStatement*(x: SyntaxTree.CaseStatement);
  456. PROCEDURE ^ VisitWhileStatement*(x: SyntaxTree.WhileStatement);
  457. PROCEDURE ^ VisitRepeatStatement*(x: SyntaxTree.RepeatStatement);
  458. PROCEDURE ^ VisitForStatement*(x: SyntaxTree.ForStatement);
  459. PROCEDURE ^ VisitExitableBlock*(x: SyntaxTree.ExitableBlock);
  460. PROCEDURE ^ VisitLoopStatement*(x: SyntaxTree.LoopStatement);
  461. PROCEDURE ^ VisitExitStatement*(x: SyntaxTree.ExitStatement);
  462. PROCEDURE ^ VisitReturnStatement*(x: SyntaxTree.ReturnStatement);
  463. PROCEDURE ^ MakeAwaitProcedure(x: SyntaxTree.AwaitStatement): SyntaxTree.Procedure;
  464. PROCEDURE ^ VisitAwaitStatement*(x: SyntaxTree.AwaitStatement);
  465. PROCEDURE ^ StatementSequence(x: SyntaxTree.StatementSequence);
  466. PROCEDURE ^ PushSelfPointer;
  467. PROCEDURE ^ Lock(lock: BOOLEAN);
  468. PROCEDURE ^ VisitStatementBlock*(x: SyntaxTree.StatementBlock);
  469. PROCEDURE ^ VisitCode*(x: SyntaxTree.Code);
  470. PROCEDURE ^ ProcParametersSize(procedure: SyntaxTree.Procedure): LONGINT;
  471. PROCEDURE ^ ParameterCopies(x: SyntaxTree.ProcedureType);
  472. PROCEDURE ^ InitVariables(scope: SyntaxTree.Scope);
  473. PROCEDURE ^ GetFingerprint(symbol: SyntaxTree.Symbol): Basic.Fingerprint;
  474. PROCEDURE ^ Body(x: SyntaxTree.Body; scope: SyntaxTree.Scope; ir: IntermediateCode.Section; moduleBody: BOOLEAN);
  475. END ImplementationVisitor;
  476. MetaDataGenerator = OBJECT
  477. CONST
  478. EmptyBlockOffset = 2;
  479. VAR
  480. implementationVisitor: ImplementationVisitor;
  481. declarationVisitor: DeclarationVisitor;
  482. module: Sections.Module;
  483. moduleName: ARRAY 128 OF CHAR;
  484. moduleNamePool: Basic.HashTableInt;
  485. moduleNamePoolSection: IntermediateCode.Section;
  486. modulePointerSection: IntermediateCode.Section;
  487. modulePointerSizePC: LONGINT;
  488. modulePointerSectionOffset: LONGINT;
  489. modulePointers: LONGINT;
  490. simple: BOOLEAN;
  491. RecordBaseOffset: LONGINT;
  492. MethodTableOffset: LONGINT;
  493. BaseTypesTableOffset: LONGINT;
  494. TypeTags: LONGINT;
  495. TypeRecordBaseOffset: LONGINT;
  496. patchInfoPC: LONGINT;
  497. patchCRC: LONGINT;
  498. PROCEDURE ^ & InitMetaDataGenerator(implementationVisitor: ImplementationVisitor; declarationVisitor: DeclarationVisitor; simple: BOOLEAN);
  499. PROCEDURE ^ SetModule(module: Sections.Module);
  500. PROCEDURE ^ AddPointer(section: IntermediateCode.Section; offset: LONGINT);
  501. PROCEDURE ^ GetTypeRecordBaseOffset(numberMethods: LONGINT): LONGINT;
  502. PROCEDURE ^ HeapBlock(CONST moduleName, typeName: ARRAY OF CHAR; section: IntermediateCode.Section; dataAdrOffset: LONGINT);
  503. PROCEDURE ^ ProtectedHeapBlock(CONST moduleName, typeName: ARRAY OF CHAR; section: IntermediateCode.Section; dataAdrOffset: LONGINT);
  504. PROCEDURE ^ Info(section: IntermediateCode.Section; CONST s: ARRAY OF CHAR);
  505. PROCEDURE ^ Address(section: IntermediateCode.Section; value: ADDRESS);
  506. PROCEDURE ^ Size(section: IntermediateCode.Section; value: SIZE);
  507. PROCEDURE ^ Set(section: IntermediateCode.Section; value: Basic.Set);
  508. PROCEDURE ^ Longint(section: IntermediateCode.Section; value: LONGINT);
  509. PROCEDURE ^ Hugeint(section: IntermediateCode.Section; value: HUGEINT);
  510. PROCEDURE ^ PatchSize(section: IntermediateCode.Section; pc: LONGINT; value: LONGINT);
  511. PROCEDURE ^ PatchLongint(section: IntermediateCode.Section; pc: LONGINT; value: LONGINT);
  512. PROCEDURE ^ PatchSymbol(section: IntermediateCode.Section; pc: LONGINT; name: Basic.SegmentedName; symbol: SyntaxTree.Symbol; virtualOffset, realOffset: LONGINT);
  513. PROCEDURE ^ Boolean(section: IntermediateCode.Section; value: BOOLEAN);
  514. PROCEDURE ^ Char(section: IntermediateCode.Section; char: CHAR);
  515. PROCEDURE ^ String(section: IntermediateCode.Section; CONST str: ARRAY OF CHAR);
  516. PROCEDURE ^ String0(section: IntermediateCode.Section; str: StringPool.Index);
  517. PROCEDURE ^ NamedSymbol(section: IntermediateCode.Section; name: Basic.SegmentedName; symbol: SyntaxTree.Symbol; virtualOffset, realOffset: LONGINT);
  518. PROCEDURE ^ NamedSymbolAt(section: IntermediateCode.Section; pc: LONGINT; name: Basic.SegmentedName; symbol: SyntaxTree.Symbol; virtualOffset, realOffset: LONGINT);
  519. PROCEDURE ^ Symbol(section: IntermediateCode.Section; symbol: Sections.Section; virtualOffset, realOffset: LONGINT);
  520. PROCEDURE ^ Pointers(offset: LONGINT; symbol: Sections.Section; section: IntermediateCode.Section; type: SyntaxTree.Type; VAR numberPointers: LONGINT);
  521. PROCEDURE ^ EnterDynamicName(source: IntermediateCode.Section; CONST name: ARRAY OF CHAR; index: LONGINT; pool: Basic.HashTableInt): LONGINT;
  522. PROCEDURE ^ DynamicName(source: IntermediateCode.Section; index: StringPool.Index; pool: Basic.HashTableInt): LONGINT;
  523. PROCEDURE ^ NamedBlock(CONST mName, typeName: ARRAY OF CHAR; name: Basic.SegmentedName; VAR offset: LONGINT): IntermediateCode.Section;
  524. PROCEDURE ^ Block(CONST mName, typeName, suffix: ARRAY OF CHAR; VAR offset: LONGINT): IntermediateCode.Section;
  525. PROCEDURE ^ ArrayBlock(source: IntermediateCode.Section; VAR sizePC: LONGINT; CONST baseType: ARRAY OF CHAR; hasPointer: BOOLEAN);
  526. PROCEDURE ^ PatchArray(section: IntermediateCode.Section; pc: LONGINT; size: LONGINT);
  527. PROCEDURE ^ ExportDesc(source: IntermediateCode.Section);
  528. PROCEDURE ^ ExceptionArray(source: IntermediateCode.Section);
  529. PROCEDURE ^ Name(section: IntermediateCode.Section; CONST name: ARRAY OF CHAR);
  530. PROCEDURE ^ References(section: IntermediateCode.Section);
  531. PROCEDURE ^ CommandArray(source: IntermediateCode.Section);
  532. PROCEDURE ^ IsFirstDirectOccurence(import: SyntaxTree.Import): BOOLEAN;
  533. PROCEDURE ^ ImportsArray(source: IntermediateCode.Section);
  534. PROCEDURE ^ TypeInfoSection(source: IntermediateCode.Section);
  535. PROCEDURE ^ ProcedureDescriptor(section: IntermediateCode.Section; procedureSection: IntermediateCode.Section);
  536. PROCEDURE ^ MakeProcedureDescriptorTag(procedureSection: IntermediateCode.Section): IntermediateCode.Section;
  537. PROCEDURE ^ ProcedureDescriptorPointer(section: IntermediateCode.Section; procedureSection: IntermediateCode.Section);
  538. PROCEDURE ^ ProcedureDescriptorArray(section: IntermediateCode.Section; VAR numberProcs: LONGINT);
  539. PROCEDURE ^ BasePointer(section: IntermediateCode.Section);
  540. PROCEDURE ^ BaseObject(section: IntermediateCode.Section);
  541. PROCEDURE ^ BaseRecord(section: IntermediateCode.Section);
  542. PROCEDURE ^ ModuleDescriptor(section: IntermediateCode.Section);
  543. PROCEDURE ^ ModuleSection(): IntermediateCode.Section;
  544. PROCEDURE ^ NewModuleInfo;
  545. PROCEDURE ^ Module(bodyProc: IntermediateCode.Section);
  546. PROCEDURE ^ PatchCRC(crc: LONGINT);
  547. PROCEDURE ^ PointerArray(source: IntermediateCode.Section; scope: SyntaxTree.Scope; VAR numberPointers: LONGINT);
  548. PROCEDURE ^ CheckTypeDeclaration(x: SyntaxTree.Type);
  549. END MetaDataGenerator;
  550. IntermediateBackend* = OBJECT (IntermediateCode.IntermediateBackend)
  551. VAR
  552. trace-: BOOLEAN;
  553. traceString-: SyntaxTree.IdentifierString;
  554. traceModuleName-: SyntaxTree.IdentifierString;
  555. profile-: BOOLEAN;
  556. noRuntimeChecks: BOOLEAN;
  557. simpleMetaData-: BOOLEAN;
  558. noAsserts: BOOLEAN;
  559. optimize-: BOOLEAN;
  560. cooperative-: BOOLEAN;
  561. preregisterStatic-: BOOLEAN;
  562. dump-: Basic.Writer;
  563. cellsAreObjects: BOOLEAN;
  564. preciseGC, trackLeave, writeBarriers: BOOLEAN;
  565. experiment: BOOLEAN;
  566. PROCEDURE ^ & InitIntermediateBackend*;
  567. PROCEDURE ^ GetParameterRegister*(callingConvention: SyntaxTree.CallingConvention; type: IntermediateCode.Type; VAR register: WORD): BOOLEAN;
  568. PROCEDURE ^ ResetParameterRegisters*;
  569. PROCEDURE ^ GenerateIntermediate*(x: SyntaxTree.Module; supportedInstruction: SupportedInstructionProcedure; supportedImmediate: SupportedImmediateProcedure): Sections.Module;
  570. PROCEDURE ^ SupportedImmediate*(CONST op: IntermediateCode.Operand): BOOLEAN;
  571. PROCEDURE ^ ProcessSyntaxTreeModule*(syntaxTreeModule: SyntaxTree.Module): Formats.GeneratedModule;
  572. PROCEDURE ^ ProcessIntermediateCodeModule*(intermediateCodeModule: Formats.GeneratedModule): Formats.GeneratedModule;
  573. PROCEDURE ^ GetDescription*(VAR instructionSet: ARRAY OF CHAR);
  574. PROCEDURE ^ SetSimpleMetaData*(simpleMetaData: BOOLEAN);
  575. PROCEDURE ^ SetTraceModuleName(CONST name: ARRAY OF CHAR);
  576. PROCEDURE ^ DefineOptions*(options: Options.Options);
  577. PROCEDURE ^ GetOptions*(options: Options.Options);
  578. PROCEDURE ^ DefaultSymbolFileFormat*(): Formats.SymbolFileFormat;
  579. END IntermediateBackend;
  580. ;
  581. VAR
  582. int8-, int16-, int32-, int64-, uint8-, uint16-, uint32-, uint64-, float32-, float64-: IntermediateCode.Type;
  583. emptyOperand: IntermediateCode.Operand;
  584. systemCalls: ARRAY NumberSystemCalls OF SyntaxTree.Symbol;
  585. statCoopResetVariables: LONGINT;
  586. statCoopModifyAssignments: LONGINT;
  587. modifyAssignmentsPC: LONGINT;
  588. statCoopNilCheck: LONGINT;
  589. statCoopSwitch: LONGINT;
  590. statCoopAssignProcedure: LONGINT;
  591. statCoopTraceMethod: LONGINT;
  592. statCoopResetProcedure: LONGINT;
  593. statCoopTraceModule: LONGINT;
  594. ResultDesignatorName: SyntaxTree.Identifier;
  595. PROCEDURE ^ ResetStatistics*;
  596. PROCEDURE ^ Statistics*;
  597. PROCEDURE ^ GCD(a, b: LONGINT): LONGINT;
  598. PROCEDURE ^ SCM(a, b: LONGINT): LONGINT;
  599. PROCEDURE ^ CommonAlignment(a, b: LONGINT): LONGINT;
  600. PROCEDURE ^ PassBySingleReference(parameter: SyntaxTree.Parameter; callingConvention: SyntaxTree.CallingConvention): BOOLEAN;
  601. PROCEDURE ^ PassInRegister(parameter: SyntaxTree.Parameter; callingConvention: SyntaxTree.CallingConvention): BOOLEAN;
  602. PROCEDURE ^ AddRegisterEntry(VAR queue: RegisterEntry; register: LONGINT; class: IntermediateCode.RegisterClass; type: IntermediateCode.Type);
  603. PROCEDURE ^ RemoveRegisterEntry(VAR queue: RegisterEntry; register: LONGINT): BOOLEAN;
  604. PROCEDURE ^ Assert(cond: BOOLEAN; CONST reason: ARRAY OF CHAR);
  605. PROCEDURE ^ ReusableRegister(op: IntermediateCode.Operand): BOOLEAN;
  606. PROCEDURE ^ EnsureBodyProcedure(moduleScope: SyntaxTree.ModuleScope);
  607. PROCEDURE ^ GetSymbol*(scope: SyntaxTree.ModuleScope; CONST moduleName, symbolName: ARRAY OF CHAR): SyntaxTree.Symbol;
  608. PROCEDURE ^ InitOperand(VAR op: Operand; mode: SHORTINT);
  609. PROCEDURE ^ GetType*(system: Global.System; type: SyntaxTree.Type): IntermediateCode.Type;
  610. PROCEDURE ^ FindConstant(module: SyntaxTree.Module; value: SyntaxTree.Value): SyntaxTree.Constant;
  611. PROCEDURE ^ BuildConstant(module: SyntaxTree.Module; value: SyntaxTree.Value; VAR adr: LONGINT): SyntaxTree.Constant;
  612. PROCEDURE ^ HasPointers(scope: SyntaxTree.ProcedureScope): BOOLEAN;
  613. PROCEDURE ^ IsVariableParameter(parameter: SyntaxTree.Parameter): BOOLEAN;
  614. PROCEDURE ^ HasVariableParameters(scope: SyntaxTree.ProcedureScope): BOOLEAN;
  615. PROCEDURE ^ HasExplicitTraceMethod(recordType: SyntaxTree.RecordType): BOOLEAN;
  616. PROCEDURE ^ IsIntegerConstant(expression: SyntaxTree.Expression; VAR val: HUGEINT): BOOLEAN;
  617. PROCEDURE ^ PowerOf2*(val: HUGEINT; VAR exp: LONGINT): BOOLEAN;
  618. PROCEDURE ^ GetConstructor(record: SyntaxTree.RecordType): SyntaxTree.Procedure;
  619. PROCEDURE ^ IsIntegerImmediate(CONST op: IntermediateCode.Operand; VAR value: LONGINT): BOOLEAN;
  620. PROCEDURE ^ IsStrictlyPointerToRecord(type: SyntaxTree.Type): BOOLEAN;
  621. PROCEDURE ^ IsUnsafePointer(type: SyntaxTree.Type): BOOLEAN;
  622. PROCEDURE ^ IsPointerToRecord(type: SyntaxTree.Type; VAR recordType: SyntaxTree.RecordType): BOOLEAN;
  623. PROCEDURE ^ IsArrayOfSystemByte(type: SyntaxTree.Type): BOOLEAN;
  624. PROCEDURE ^ IsOpenArray(type: SyntaxTree.Type): BOOLEAN;
  625. PROCEDURE ^ IsSemiDynamicArray(type: SyntaxTree.Type): BOOLEAN;
  626. PROCEDURE ^ IsStaticArray(type: SyntaxTree.Type): BOOLEAN;
  627. PROCEDURE ^ IsStaticMathArray(type: SyntaxTree.Type): BOOLEAN;
  628. PROCEDURE ^ StaticMathArrayBaseType(type: SyntaxTree.Type): SyntaxTree.Type;
  629. PROCEDURE ^ StaticArrayNumElements(type: SyntaxTree.Type): LONGINT;
  630. PROCEDURE ^ StaticMathArrayNumElements(type: SyntaxTree.Type): LONGINT;
  631. PROCEDURE ^ StaticArrayBaseType(type: SyntaxTree.Type): SyntaxTree.Type;
  632. PROCEDURE ^ ArrayBaseType(type: SyntaxTree.Type): SyntaxTree.Type;
  633. PROCEDURE ^ IsDelegate(type: SyntaxTree.Type): BOOLEAN;
  634. PROCEDURE ^ DynamicDim(type: SyntaxTree.Type): LONGINT;
  635. PROCEDURE ^ StaticSize(system: Global.System; type: SyntaxTree.Type): LONGINT;
  636. PROCEDURE ^ IsImmediate(x: IntermediateCode.Operand): BOOLEAN;
  637. PROCEDURE ^ IsAddress(x: IntermediateCode.Operand): BOOLEAN;
  638. PROCEDURE ^ IsRegister(x: IntermediateCode.Operand): BOOLEAN;
  639. PROCEDURE ^ GetRecordTypeName(recordType: SyntaxTree.RecordType; VAR name: Basic.SegmentedName);
  640. PROCEDURE ^ ParametersSize(system: Global.System; procedureType: SyntaxTree.ProcedureType; isNested: BOOLEAN): LONGINT;
  641. PROCEDURE ^ IsNested(procedure: SyntaxTree.Procedure): BOOLEAN;
  642. PROCEDURE ^ InCellScope(scope: SyntaxTree.Scope): BOOLEAN;
  643. PROCEDURE ^ ProcedureParametersSize*(system: Global.System; procedure: SyntaxTree.Procedure): LONGINT;
  644. PROCEDURE ^ ToMemoryUnits*(system: Global.System; size: SIZE): LONGINT;
  645. PROCEDURE ^ Get*(): Backend.Backend;
  646. PROCEDURE ^ Nop(position: Basic.Position): IntermediateCode.Instruction;
  647. PROCEDURE ^ Use(position: Basic.Position; reg: IntermediateCode.Operand): IntermediateCode.Instruction;
  648. PROCEDURE ^ Mov(position: Basic.Position; dest, src: IntermediateCode.Operand): IntermediateCode.Instruction;
  649. PROCEDURE ^ MovReplace(position: Basic.Position; dest, src: IntermediateCode.Operand): IntermediateCode.Instruction;
  650. PROCEDURE ^ Conv(position: Basic.Position; dest, src: IntermediateCode.Operand): IntermediateCode.Instruction;
  651. PROCEDURE ^ Call*(position: Basic.Position; op: IntermediateCode.Operand; parSize: LONGINT): IntermediateCode.Instruction;
  652. PROCEDURE ^ Exit(position: Basic.Position; pcOffset: LONGINT; callingConvention, unwind: LONGINT): IntermediateCode.Instruction;
  653. PROCEDURE ^ Return(position: Basic.Position; res: IntermediateCode.Operand): IntermediateCode.Instruction;
  654. PROCEDURE ^ Result*(position: Basic.Position; res: IntermediateCode.Operand): IntermediateCode.Instruction;
  655. PROCEDURE ^ Trap(position: Basic.Position; nr: LONGINT): IntermediateCode.Instruction;
  656. PROCEDURE ^ Br(position: Basic.Position; dest: IntermediateCode.Operand): IntermediateCode.Instruction;
  657. PROCEDURE ^ Breq(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  658. PROCEDURE ^ Brne(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  659. PROCEDURE ^ Brge(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  660. PROCEDURE ^ Brlt(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  661. PROCEDURE ^ Pop*(position: Basic.Position; op: IntermediateCode.Operand): IntermediateCode.Instruction;
  662. PROCEDURE ^ Push*(position: Basic.Position; op: IntermediateCode.Operand): IntermediateCode.Instruction;
  663. PROCEDURE ^ Neg(position: Basic.Position; dest, src: IntermediateCode.Operand): IntermediateCode.Instruction;
  664. PROCEDURE ^ Not(position: Basic.Position; dest, src: IntermediateCode.Operand): IntermediateCode.Instruction;
  665. PROCEDURE ^ Abs(position: Basic.Position; dest, src: IntermediateCode.Operand): IntermediateCode.Instruction;
  666. PROCEDURE ^ Mul(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  667. PROCEDURE ^ Div(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  668. PROCEDURE ^ Mod(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  669. PROCEDURE ^ Sub(position: Basic.Position; dest: IntermediateCode.Operand; left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  670. PROCEDURE ^ Add(position: Basic.Position; dest: IntermediateCode.Operand; left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  671. PROCEDURE ^ And(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  672. PROCEDURE ^ Or(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  673. PROCEDURE ^ Xor(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  674. PROCEDURE ^ Shl(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  675. PROCEDURE ^ Shr(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  676. PROCEDURE ^ Rol(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  677. PROCEDURE ^ Ror(position: Basic.Position; dest, left, right: IntermediateCode.Operand): IntermediateCode.Instruction;
  678. PROCEDURE ^ Cas(position: Basic.Position; dest, src, size: IntermediateCode.Operand): IntermediateCode.Instruction;
  679. PROCEDURE ^ Copy(position: Basic.Position; dest, src, size: IntermediateCode.Operand): IntermediateCode.Instruction;
  680. PROCEDURE ^ Fill(position: Basic.Position; dest, size, value: IntermediateCode.Operand): IntermediateCode.Instruction;
  681. PROCEDURE ^ Asm(position: Basic.Position; s: SyntaxTree.SourceCode; inRules, outRules: IntermediateCode.Rules; scope: SyntaxTree.Scope): IntermediateCode.Instruction;
  682. PROCEDURE ^ Data*(position: Basic.Position; op: IntermediateCode.Operand): IntermediateCode.Instruction;
  683. PROCEDURE ^ SpecialInstruction(position: Basic.Position; subtype: SHORTINT; op1, op2, op3: IntermediateCode.Operand): IntermediateCode.Instruction;
  684. PROCEDURE ^ Reserve(position: Basic.Position; units: LONGINT): IntermediateCode.Instruction;
  685. PROCEDURE ^ LabelInstruction(position: Basic.Position): IntermediateCode.Instruction;
  686. PROCEDURE ^ EnterImmediate*(data: IntermediateCode.Section; CONST vop: IntermediateCode.Operand): LONGINT;
  687. PROCEDURE ^ Init;
  688. PROCEDURE ^ IsExported(symbol: SyntaxTree.Symbol): BOOLEAN;
  689. BEGIN
  690. END FoxIntermediateBackend.