Module decl_switches = Begin Require 'bliss.req'; Literal SWSWL=20, !HIGHEST SWITCH INDEX VALID IN SWITCHES DECL. ALLSW=28; ! ' ' ' ' ' MODULE HEAD ! THE FOLLOWING IS A LIST OF SWITCHES FOR THE BLISS COMPILER. ! IT IS A PLIT WHICH IS SEARCHED AS A VECTOR. ! ! THIS DECLARATION IS SET UP AS FOLLOWS: ! Bind SWTBL = Plit Long (AZ( 'EXPAND', 'NOEXPAND', 'LIST', 'NOLIST', 'ERRS', 'NOERRS', 'OPTIMIZE', 'NOOPTIMIZE', 'UNAMES', 'NOUNAMES', 'FINAL', 'NOFINAL', 'SAFE', 'UNSAFE', 'ZIP', 'UNZIP', 'DEBUG', 'NODEBUG', 'PIC', 'NOPIC', ! END OF SWITCHES VALID IN BOTH MODULE HEAD AND SWITCHES DECLARATION. ! MODIFY SWSWL IF THE NUMBER OF SWITCHES ABOVE THIS CHANGES. ! THE FOLLOWING SWITCHES ARE VALID ONLY IN THE MODULE HEAD. 'SEGMENT', 'NOSEGMENT', 'STACK', 'MAIN', 'RESERVE', 'IDENT', 'SYNTAX')) : Vector[,Long]; Routine switch_ident = Begin If .DEL Neq TK_EQUAL Then Return TRUE; RUND(QL_STRING); If .SYM[gt_type] Neq T_STRING Then Return TRUE; IDENTLEX = .SYM; Return FALSE End; Routine switch_stack = Begin SSTKLEN = Ctce(); Return TRUE End; Routine switch_main = Begin If .DEL Neq TK_EQUAL Then Return TRUE; RUND(QL_NAME); If .SYM[gt_type] Neq T_NAME Then Return TRUE; MODMAIN = SYM[nt_data]; Return FALSE End; ! RESERVE=(ctce,...) - mark registers as reserved Routine switch_reserve = Begin Local N : Integer; ! check for '=' If .DEL Neq TK_EQUAL Then Return TRUE; ! skip over the '(' If RUNDE() Then Return TRUE; ! check for '(' If .DEL Neq TK_LPAREN Then Return TRUE; ! loop for each register Do Begin ! get the register index N = Ctce(); ! cannot reserve R0, SP, or PC or any other invalid number If .N Lss 1 Or .N Gtr 5 Then WARNEM(.pos_sym,B11$_CANT_RESERVE,.N) Else RESERVED<.N,1,0> = TRUE End Until .DEL Neq TK_COMMA; If .DEL Neq TK_RPAREN Then Return TRUE; Return RUNDE() End; !I. GENERAL ! ! 1. THIS ROUTINE IS USED TO PROCESS A LIST OF SWITCHES ! SEPARATED BY COMMAS. ! ! 2. THE PARAMETER IS THE INDEX INTO THE PLIT SWTBL ! OF THE LAST SWITCH WHICH IS CONSIDERED VALID IN ! THE CURRENT CONTEXT. Global Routine SWITCHER(HIGH : Integer) : Novalue = Begin Local pos_open : Integer, N : Ref Vector[,Byte], X : Integer, sts : Boolean; pos_open = .pos_del; Do Begin RUND(QL_NAME); X = MatchMinorWord(SWTBL); If Not .HIGH And .X Gtr SWSWL Then X = -1; sts = FALSE; Case .X+1 From 0 To 27 Of Set [ 0]: WARNEM(.pos_open,B11$_INVALID_SWITCH); !WARNING, NOT FOUND [ 1]: swit_expand = TRUE; ! EXPAND MACRO [ 2]: swit_expand = FALSE; ! DON'T EXPAND MACRO [ 3]: swit_list = TRUE; ! LIST [ 4]: swit_list = FALSE; ! NO LIST [ 5]: swit_errors = TRUE; ! ERR MSGS TO TTY [ 6]: swit_errors = FALSE; ! NO ERR MSGS TO TTY [ 7]: swit_optimize= TRUE; ! OPTIMIZE [ 8]: swit_optimize= FALSE; ! NO-OPTIMIZE [ 9]: swit_unames = TRUE; ! GENERATE UNIQUE NAMES [10]: swit_unames = FALSE; ! DO NOT GENERATE UNIQUE NAMES [11]: swit_final = TRUE; ! DO FINAL PEEPHOLE OPTIMIZATION [12]: swit_final = FALSE; ! DO NOT DO FINAL PEEPHOLE OPTIMIZATION [13]: swit_mark = FALSE; ! TURN ON UNCERTAIN OPTIMIZATIONS [14]: swit_mark = TRUE; ! TURN OFF ' ' [15]: swit_zip = TRUE; ! CHOOSE SPEED OVER TIME [16]: swit_zip = FALSE; ! CHOOSE TIME OVER SPEED [17]: swit_debug = TRUE; ! GENERATE SIX12 SYMBOL & NAME TABLES [18]: swit_debug = FALSE; ! DO NOT DO ABOVE [19]: swit_pic = TRUE; ! POSITION INDEPENDENT CODE [20]: swit_pic = FALSE; ! NO POSITION INDEPENDENT CODE [21]: swit_i_d = TRUE; ! NO DATA ALLOWED IN CODE CSECT [22]: swit_i_d = FALSE; ! DATA [23]: sts = switch_stack(); ! STACK DECLARATION [24]: sts = switch_main(); ! MAIN DECLARATION [25]: sts = switch_reserve(); ! RESERVE SPECIFIC REGS. [26]: sts = switch_ident(); ! IDENT [27]: NOTREE = -1 ! SYNTAX CHECK ONLY Tes; If .sts Then WARNEM(.pos_open,B11$_SWITCH_SYNTAX) End Until .DEL Neq TK_COMMA End; End Eludom