J51D~SAVE.SET/SAVE.SET$BACKUP/LOG [.NEWAS]*.* SAVE.SET/SAVE YOUNGDALE :`>lV5.1 _V6550C::  _DUA1: V5.0 ~ **[VAXUSERS.ERIC.GPLUS.NEWAS]AAAREADME.TXT;1+,5. /: 4O :-'&0123KPWO56j7:j8+9G:HJC This distribution contains the diffs to get full debugging supportNworking with GNU-C on VMS. There are no changes to the compiler itself - onlyMto the assembler. These diffs were developed in conjunction with version 1-36(of gcc-as, and the files are as follows: AAAREADME.TXT This file= BUGFIX.LOG List of bugs found since this was first released. DBGDEF.H Header that defines some constants.: GCC-AS.EXE Executable with changes. Linked under VMS 4.7( (Thanks to Ken Adelman of TGV Inc.)8 MAKE-GAS.COM Modified command file to build assembler./ VMS.DIFF Diffs to vms.c, to implement changes< VMS_DBG_MODULE.C New module that contains most of the code.3 Before you get started, please note the following:F 1) Consider this a beta-test. Once the code has undergone a shakedownKperiod it will be submitted to FSF. I think that everything works OK, but INwill not guarantee it. I will say that I can compile the assembler with debugLand I can *apparently* see all of the variables. Since this is experimental,Hplease keep your old version of the assembler handy in case something isLgenerated that the linker or debugger cannot swallow. For the next severalOweeks I will be extremely busy, and thus I am releasing this with the conditionLthat there won't be any support promised or implied but I would like to hearOabout any bugs. I will not really have time to get to it for a while, but I amMhoping that this is of some use as-is. I should point out that overly complexdata types, such as:/int (*(*(*(*(*(* sarr6)[1])[1])[2])[3])[4])[5];Owill not be debugged properly, since the debugging record overflows an internalKdebugger buffer. gcc-as will convert these to *void as far as the debuggerLsymbol table is concernted, which will avoid any problems, and the assembler=will give you a message informing you that this has happened.&**************************************HNote: despite what I said about not having time to support this, after INreleased this the first time I ran across a rather large bug which would keepMmost people from being able to use this. (i.e. works with gcc 1-37-1, but notH1-22. I do not know where the cut of was). See bugfix.log for details.F 2) You should be aware that GNU-C, as with any other decent compiler,Gwill do things when optimization is turned on that you may not expect. MSometimes intermediate results are not written to variables, if they are onlyOused in one place, and sometimes variables that are not used at all will not beOwritten to the symbol table. You can see the assembly code equivalent by usingLKP7 in the debugger, and from this you can tell if in fact a variable shouldOhave the value that you expect. You can find out if a variable lives withing a%register by doing a show symbol/addr.C 3) You must, of course, compile and link with /debug. If you linkOwithout debug, you still get traceback table in the executable, but there is nosymbol table for variables.@ 4) Included in the patches to VMS.C is a patch to the code thatIgenerates the line number/PC correlation. The debugger needs to know theNlargest line number of the file so it knows how much source to expect, and theKcode had taken the largest line number seen in the stabn directives despiteOthe fact that code is occasionally generated from include files. The upshot isNthat sometimes when compiling small programs, that the debugger would not show&you the source. The patch fixes this.@ 5) If you are using the GNU-C++ compiler, you should modify theHcompiler driver file GNU_CC:[000000]GCC.COM (or GXX.COM). If you have aAseperate GXX.COM, then you need to change one line in GXX.COM to:<$ if f$locate("D",p2) .ne. P2_Length then Debug = " ""-G0"""9 Notice zero---> ^OIf you are using a GCC.COM that does both C and C++, add the following lines toGCC.COM:$!*$! Use old style debugging records for VMS$!6$ if (Debug.nes."" ).and. Plus then Debug = " ""-G0"""Mafter the variables Plus and Debug are set. The reason for this, is that C++Fcompiler by default generates debugging records that are more complex,Iwith many new syntactical elements that allow for the new features of theOlanguage. The -G0 switch tells the C++ compiler to use the old style debuggingNrecords. Until the debugger understands C++ there is not any point to try andFuse the expanded syntax. Also, (and this *is* important), the patchesMcontained here are *only* the patches to get the debugger going. The patchesKthat I included with libg++ are not included here and need to be applied inIaddition to this. The executable that is supplied contains both patches.LAlso, inline functions do not work very well with the debugger yet. I think%that some work needs to be done here.H 6) Speaking for myself, I rarely used the debugger with C before I madeOthese changes, since there was so little you could find out. Thus I was reallyLa novice at using the debugger until quite recently, and I suspect that manyIother GNU-C users are also novices at using the debugger. Thus as a finalMpresent, I give you a few hints to get you started. (A few of these were newto me).7 a) To examine a struct, you can just 'exa structvar'.: b) If you have a pointer to struct, use 'exa *structptr'7 c) To examine a zero terminated string: 'exa/az *str'? d) Use KP7 to see assembly code. (Use KP- to switch screens).< e) Use 'set module/all' or 'set module modulename' to make4 symbols visible. If you do not do this, then the0 debugger will only see symbols for the module containing the entry point.: f) Try 'set mode/screen' if you are on a video terminal.A g) Use 'set break VMS_DBG_MODULE\%LINE 453' to set a breakpoint/ at a particular line in a particular module.> h) You can put commands in a file, and assign a logical name7 DBG$INIT to point to that file. These commands will/ be executed whenever you enter the debugger.7 Alternatively you can use the @ command to execute a series of startup commands.A i) Use the DEPOSIT command to assign a new value to a variable.= j) Use SAVE to make a snapshot of the screen for later ref.< jk There are all sorts of other neat features, use help to look up.  Good luck- -Eric Youngdale# YOUNGDALE@V6550C.NRL.NAVY.MIL'*[VAXUSERS.ERIC.GPLUS.NEWAS]BUGFIX.LOG;1+,'./: 4O-'&0123KPWO56hHם7moj8m+9G:HJDLog of bugs found in the code to add full debugger support to GNU-C. 7/18/90 * ERY> This one was big enough that found enough time to get thingsLworking. Basically I had made a stupid assumption that void was always typeK15, which it is for gcc version 1-37-1. Since I am such a packrat, I stillOhave the executable to version 1-22 lying around, and found that there void wasKtype 13! I made the code smarter so it does not matter what the number is.LThere is still an implicit assumption that void is the only untyped variableJpresent. Also, assembler no longer bombs if there are unresolved circularOreferences (which I doubt could even happen, but someone will undoubtedly prove me wrong).%*[VAXUSERS.ERIC.GPLUS.NEWAS]DBGDEF.H;1+,+&./: 4LJ-'&0123KPWO5 6@ڴ7@4j8@4+9G:HJK/* the following are the codes for the various data types. Anything not on- * the list is included under 'advanced_type' */#define DBG$UCHAR 0x02#define DBG$USINT 0x03#define DBG$ULINT 0x04#define DBG$SCHAR 0x06#define DBG$SSINT 0x07#define DBG$SLINT 0x08#define DBG$REAL4 0x0a#define DBG$REAL8 0x0b#define DBG$FUNCTION_ADDR 0x17#define DBG$ADVANCED_TYPE 0xa3K/* These are the codes that are used to generate the definitions of struct * union and enum records */#define DBG$ENUM_ITEM 0xa4#define DBG$ENUM_START 0xa5#define DBG$ENUM_END 0xa6#define DBG$STRUCT_START 0xab#define DBG$STRUCT_ITEM 0xff#define DBG$STRUCT_END 0xacL/* These are the codes that are used in the suffix records to determine the * actual data type */#define DBG$BASIC 0x01#define DBG$BASIC_ARRAY 0x02#define DBG$STRUCT 0x03#define DBG$POINTER 0x04#define DBG$COMPLEX_ARRAY 0x07J/* These codes are used in the generation of the symbol definition records */##define DBG$FUNCTION_PARAMETER 0xc9#define DBG$LOCAL_SYM 0xd9'*[VAXUSERS.ERIC.GPLUS.NEWAS]GCC-AS.EXE;1+,5"g./: 4-'&0123 KPWO567j8"+9G:HJR0DX0205(PhIGCC-ASV1.0`RP04-00 D^e"     ?@!d FORRTL_001!  LIBRTL_001Y       N *.*;*.*;*.*;*/sys$disk...*;*.*;*.*;*DIR.DIR ((((( DDDDDDDDDDAAAAAABBBBBB DCLMCRSHELLerror 0not ownerno such file or directoryno such processinterrupted system calli/o errorno such device or addressarg list too longexec format errorbad file numberno childrenno more processesnot enough corepermission deniedbad addressblock device requiredmount device busyfile existscross-device linkno such devicenot a directoryis a directoryinvalid argumentfile table overflowtoo many open filesnot a typewritertext file busyfile too largeno space left on deviceillegal seekread-only file systemtoo many linksbroken pipemath argumentresult too largeI/O stream emptySYS$LOGINSYS$COMMANDSYS$DISKLNM$FILE_DEVVAXC$PATHPATH=HOME=TERM=USER=PATHHOMETERMUSERPATHPATH=HOME=TERM=USER=PATHft1-132ft1-80ft1ft2-132ft2-80ft2ft3-132ft3-80ft3ft4-132ft4-80ft4ft5-132ft5-80ft5ft6-132ft6-80ft6ft7-132ft7-80ft7ft8-132ft8-80ft8la12-132la12-80la12la120-132la120-80la120la24-132la24-80la24la34-132la34-80la34la36-132la36-80la36la38-132la38-80la38unknown-132unknown-80unknownvk100-132vk100-80vk100vt05-132vt05-80vt05vt100-132vt100-80vt100vt101-132vt101-80vt101vt102-132vt102-80vt102vt105-132vt105-80vt105vt125-132vt125-80vt125vt131-132vt131-80vt131vt132-132vt132-80vt132vt173-132vt173-80vt173vt52-132vt52-80vt52vt55-132vt55-80vt55vt200-132vt200-80vt200undefinedLNM$FILE_DEV   $._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789NTHZ,`,fj kPpu6zV ddV f<j j   ^j V fFVdVnVsj ** (\(\(\(\(\(\(\(\d5;Nё\C9#J{/L F%u^)Ǻ'W]K<_ZX`]OSOJp?sa*VmBf)?`MMCua o"4o#xg63 ւR`i;.eNQG3ſt[Am-{t9SSz jd8n헧?O}JFVPr^2>#n>. 8Mc>]ҪYZZJ3&Nq*}q+n`W1oZ7oi'23UD~NXP 0LtrԽHm?9JuM4w}Ũ&jxMo_Sy!ewLD,s4C3o~rEl{Q-Hu=.3-!=- XH 龴0) ި|빣(_da䈴cO\I8P84cO8<9^@h g&RD7eEC15^+RASQ?O\&;t ?)β$Yd%0K_0%p>u>v>u>z>u>~>u>>u>>u>>u>>u>>>>> >> >> >> >> >>>>>>?>?> ?>?>?>?>!?>&?*?-?*?1?>6?>;?>A?>G?>K?>O?>S?>Y?>_?>c?> i?o?!|?>"?o?#??$?o?%??&?o?'??(??)??*??+??,??-??.??/@@0 @@1@@2@@3$@?4)@?5/@5@6<@>7B@I@8R@>9Y@>:^@>;c@@<j@o@=x@~@>@@?@@@@@A@@B@@C@@D@@E@@F@@G@@H@@I@@J@@K@@L@AMA ANAAO A%AP*A/AQ4A%AR:A?ASBAHATSAYAU`AfAVkAqAXvA}A\A}A]AA^AA_AA`AAaAAbAAcAAdAAeAAfAAgAAhAAiAAjAAkBBl BBmBBn!B&Bo/B4Bp9B>BqCB4BrIBNBsQBWBtbBhBuoBuBvzBBxBByBBzBB{BB|BB|BB|BB}BA~BB~BBBBBBBC CBCCCBCC"CB(CC.CB4CC:CB@CCFCBLCCRCXC]CcCjCXCoCtCyCXCCtCCCCCCCCCCCCCCCCCCBCCC>C*?CqACCCqACCDqA DCDqADCDqA"DC(DqA.DC4DqA:DC@DFDKDQDXDFD]DbDgDFDmDbDrDwDzDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDED EDEDEDE"E'E-E4E"E9E>ECE"EIE>ENESEVE[E^EcEfEkEnEkEsEDxED}E>EE"EE[EEcEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEF FF FFFF!FF&FF,F1F:F?FHFOFVFOF]FdFiFdFpFvF{FFFFFFF>FFFu>FF2FF3FF@FFAFFBFFCFFDFFEGFFGFG GGHGGI"G(GJ-G(GK4G:GL?GEGMJGPGNUGZGOcGhGPmGrGQwGhGR}GGSGGTGGUGFVGG`GGaGGbGGcGGdGGeGGfGGgGGhGGiGHjHHk HHlHHm#H)Hn.H3Hou>II II IIIIIIII#II)II.II3II8II=IICIIIIIMIIQIIWII[IIaIIeIkI=tIzIOIIoIIIIIIOIIoIIIIIIIIIIIIIIIIIJJJ JJJJ#J+J0J+Ju>u>????0123456789ABCDEFtlxl|llll l@lll8<( L(LNM$PROCESSSHELL$FILE_ |(LNM$PROCESS((( )LNM$PROCESS l v  $ 5 J̄*55Q$5d,5 |Ą45<5DD5L5 T5  \5 D  Ԅ  d5 $  l5 t5|5l@AHr555  5(5555Ā5̀5Ԁ5܀5PD55\555 !!!!!̂!! 5!""Ă"5"5# x #eExxx+z++++"BB+Jdd+p||+++Fx++xxx++++  +DHH+fnn+~++ DD+M+44+dDfFgGhH|************************************************ ******* ************************** *********************************************************************************************************************************************************cc#+V d +V f+V g+V h     4=BGKSZ`((("<Ldn0<N]m| .:HY# GNU assembler version 1.36 a.out%s: Flag option -%c has already been seen!%s: I expected a filename after -o. "%s" assumed.%s: I don't understand '%c' flag! ^ЬWЬVRRP@@2@URSCe3 TdP ACedRRP@efX~' #LI)$`$WV1ЭQaPP`-1j-1R1Jϴa1Q֭RRPାPϓ RPାPD2hkЭP`PrP4խԽ׭PP`W RЭ?E֭;׭ ]~]~]~,PR~ խ֭R1ԽPPP1jVW@%P{OE#^P\PP!ЬRЬSTxSRR#cc#P TP)SRTϦ"P Pb) ЬRR9P~PSRSSP%s: 2nd pass not implemented - get your code from random(3)R$ Interrupted by signal %dݬ}=w= virtual memory exceededЬRݬRpPR RPvirtual memory exceededݬPR mRP <@~RbPST,bPQLQ,RQPPRԀPR<< Sa@RR< SPPR`PPRQQP ЬRb{ScRc ЬQЬ SPSRRRB`RSPRЀPRЬRݬRb РQ`ע(QQPݬݬϽb РQЬ QQPexistsЬSЬTRѣ(  S{PRb$TSo3bR Ь T`֣(RPЬSЬTRѣ(  S1PRbTS%aT`֣(Ь RPno room|ЬScVУUPP~@~PR12TPPxPPRc ֣ԣ(~@bQQRPPQ `PPQԣ(VRRU%bPPݢPS&PTdRRUەdVHTTPЬPЬTРS`RRSb bݢbdRRSP~ݬݬ`РPPЬVЬWЬ XWVϕ~@TXP@U`/Q/WRS b`PPSt` UTdQT6fT,Q,WRa baRQaab 8` UTdQXPU@TP<ЬUЬSPRQPTQRxTRP~B`PPQRQҥPPRP+-4^ЬYЬ [ЬZмTdRR-R+RT+̑dndN)aAnN Ԫ j1di dI1nN~fFp+PPNPPԪ jiI?nN1iI#tTyYTTPWUXVTSMRR~YP>RR~[P*ˏRPVR0WVTScRR^R~YuPN7RR~[_P8ˏRPV#UUR0VScR WUPD`0UURiR~[VfPVScRR~fP RVScR+VR(D/YˏRPI`HhPRQ>@XScRߑV-XXSWUR[R Ԫ j1jYxYYYYPnPPd(PfTAxKP`PjPPRPPSRSSWPPXnSPdTAxKP`PjPRRxRRRUURUUPP^^VPVTWS^>BTgQˏQP4QP0PRVQQT@bPPxPRQTR SWSUUEV>EPPPԭ+YTPXPPUXX>DPP^^RP^^SPRFbԭRRTTPB+S͞CVU UNURXC3]T]SX-RV[X!TSxRPRPUP~=QSTPxXXRXZ"]~]~Q̪[P ЬSЬ RRcݬ"RcЏPWP`*\~ݬ` sT\~ݬo+b FATAL:\R:SRݬ( *+-.0123456789Backw. ref to unknown label "%d:", 0 assumed..Bad floating-point constant: exponent overflow, probably assembling junkBad floating-point constant: unknown error code=%d.L0Missing ')' assumedUnary operator %c ignored because bad operand followsЬW@P`T6ˏTP10T01P`T TxTXP`TXXV Z1TfLP`,`~tHRbP,P`~bP XXV Z0TOT:TRRP$VˏTPRP PTPPV X XXV ZV14USTPQQX12VYRSYP2QQPQSP`TTPB`QQXQUPPZQQY1ScUUeTz)~SAVE.SET5"g'&'[VAXUSERS.ERIC.GPLUS.NEWAS]GCC-AS.EXE;19|*TPR2XPRP^2VUUQQSPT`ԧ1T(+W~P`)13yT~T-OWcP####4#$T-ΧMҧFT- gg 5T~E%T'\P`Qԧ   BW>Ч Pexpr.cCase value %d unexpected at line %d of file "%s" ЬPϠ %%%%8)"`ԠԠԠ`ԠѠ`Ԡ`Ԡ <~ݠ |Expression too complex, 2 symbols forgotten: "%s" "%s" ЬRЬQbSbPQPbPQ bPaݲbPbPSˏSP@PQQbSˏSP@PbPMissing operand value assumed absolute 0.bignumfloatLeft operand of %c is a %s. Integer 0 assumed.Right operand of %c is a %s. Integer 0 assumed.Expression too complex: forgetting %s - %sRelocation error. Absolute 0 assumed.Division by 0. 0 assumed.^WЬTTφP`UUP@+S1W1P`UU<U>]~~PψGԤԤdԤ ZP`RRQA0+V`RR<R>6Ѥ ѭ 1Ѥ ,դTPTPPU~PԤ dԤԤѭ-խ"P"PPU~NԭԭԭԭS έЭPЭP SS 1]~ϐRbTbݭTRbPSݭT~bSP  7PS -S$S PSPݴݴԤ  T1Ѥ ѭ w1Ԥdդ խϺԤ Ԥ1S:A]fyr0oȭ~խ-ǭPĭPPiҭPP_ĭXխƭL{QԤRbP#w)bPN@?~RRYR P ﻧPP  G#7P'Can't read source file: end-of-file faked.Can't close source file -- continuingЬTJP@7TR<S$PPSSP<~TdP1TPPTPǯP0(P P}PuPP~PoP>@>7{standard input}ЬRQЏPfP`QQRTbRPPPPinput-scrub.cSource line too long. Please change file %s then rebuild assembler.Partial line at end of file ignored Q1IK~?|Rb1~ bPP~PSZSRr RPRPRRSRRb-b PvPP\RЬPЬQPPCQQ0%s:%u:%s:unknown: {-PE  QQ PPPQ QQQ|ðas:file(%s) %s! Unknown error #%d.%s.ݬݬiRbCbtP@D'@ GP ЬSERb r RR1S~ R RЬSRS%)RRS?~@RSR~wCan't create object fileCan't continueЬRR8PURCan't close object file Pݬm~Failed to emit an object byteЬSЬRЬ TR<ﶾc~P T RSRo~<~o4RPOI?abortalignasciiascizbytecommdatadescdoublefilefillfloatgloblintlcommlinelonglsymoctaorgquadsetshortsinglespacestabdstabnstabstextworderror constructing pseudo-op tablePPRb`Rb RbuRb`Rb] Rb` rUnknown pseudo-op: '%s'Spurious digit %d.APP #NO_APP Junk character %d.~1Ь1P P`RR  R R P`RRP1smV?PRR:V!NP:`D1R= 6P=V϶% 1f.SV~MPS VPR`R R S1 1ݣ1}PR`P`PQP`PA`P`R`V7uPR`k1RQ1ˏRP70Q@P9`: Q;1Q1R1R~P1X'VVP1VV/PT1VUUuPXUXV\~PS^SVЬvol/PTìTS ì)SUSRRXPXSXU~ݬ&RUTTTPPPXVXUTT%?~PU%?WUSV3T(P'PUWPSP؞dRRU9PUUWSRWX XЬEO6UUgS8R~],ϧ E1pm6hUݸθݸ7\~JPø1.abort detected. Abandoning ship.Alignment too large: %d. assumed.Alignment negative. 0 assumed.uPRRRR2R "R>P`, 25PR PRExpected comma after symbol-name.COMMon length (%d.) <0! Ignored.Ignoring attempt to re-define symbolLength of .comm "%s" is already %d. Not changed to %d.<dU6PTSSTcIP`,3E7:PRR<wcUTc /HՠѠRRݠ`1RϿP~]ϨExpected comma after name "%s"<~TPPUmSTcUcZP`,cT"UcϚ 69PRcTUcR^]~ϼP~PDExpect comma after rep-size in .fillExpected comma after size in .fill.fill size clamped to %d.Size negative: .fill ignored.Repeat < 0, .fill ignored ^]~πP, ?I]~fP,%Tqѭ^խd խwԭPSխKLC~ݭ~~ݭݭ~PRݭRѭPЭPPSR,τ xRJPSR0^QSaS,KEP`  SS,4Expected comma after nameBSS length (%d.) <0! Ignored.Ignoring attempt to re-define symbol from %d. to %d.<UPTRTbP`,flχPSS]IbU(Tb=8 ѠI "ՠ6ﲼS!ݠP~6ωBad expression: %s^TPSRSbP`,bT]Sbr]~~P'P"PP@wϗbݭ~~@PP~TESbIllegal segment "%s". Segment "%s" assumed. ^]~BPRP`,PSS-FRP#RDQPA`B`x[~ݭݭ~>S`b^SR%PTBSTc8P`,cRυTcwcb.b]]~mPRvER#RQ.PA`B`~ݭݭ~`TcRnTcPώϕRepeat < 0, .space ignored^]~ϞP, fPRSRխϙ~ݭ~~~R`P~P`P;Rest of line ignored. 1st junk character valued %d (%c).P`PDPP^|O)sQhP`PA`YS&FI need a comma after symbol's nameread.cCase value %d unexpected at line %d of file "%s" I want a comma after the n_type expressionI want a comma after the n_other expressionI want a comma after the n_desc expression|^ЬUSUs0]~ϻ PT@P`,4SSTS1~~~~~T1PRUn; Ud 8Us%-bЏ8P P&`PiP` 6ό<~Uψ]~ P, ЭVVϗUSpS)]~ϙ P,ϕ(SCS=B PUs Un"P`,ςSSUs Un RVS4Missing expression: absolute 0 assumedBignumFloating-Point%s number illegal. Absolute 0 assumed.No expression: Using absolute 0Complex expression. Absolute segment assumed.Unknown expression|^ЬSVˏVU]~~PRR ԭԭR 7S1խPPP r #eUԣխ*խ%ЭTPЭRQPQ âPP UЭ﮿B菉PUPЭPЭPРЭЭ<~R4Subtracting symbol "%s"(segment"%s") is too hard. Absolute segment assumed.0 assumed for missing expressionValue x%x truncated to x%x.^ЬTTU~DPxPUUWϢ P P,PP,1UV]~~PRv1IR 3խ.ЭPXˏXQAQA`RThPSR I;~1խPPPPT~7?ԭЭQWPPQRVQPPURQTRSV!1T@$`P勇SԠ ЭЭЭԠl>~ݭݭݭT&SPoP~gϘ<~RϔP`PP,1χMissing digits. 0 assumed.Most significant bits truncated in integer constant.ЬTϣPR ,RR,1: P`RR06P`RRxRXٶӶP`RSS SRPPPS +uhRPMPRbQQRaPSPRPPxPRQ8R ϑR&TNP`PPPS PPPT ϾPTRDڦRTPQTQ݈ߵP`,1;RRR~y.PkRdPPTPRPBad floating literal: %s ^ЬSP PL,PP,1]R5P`0QˏQP]~RSL`P{JP0dݭݭPR‡ĴP`PﺴP,1wהּϩExpected "-ed string<ЬUP Ry,RR,1TT S[P`"1L=ä PPٲ~ PP TKRcϤPRUIä PPa~ PP Tc ﰳP`R靈R,1=ϕBad escaped character in string, '?' assumed \P`PRP" P\P9P`P/P\1%P"1 P 11P91P0J1Pn2PbPfsPrPt_P P P P PRˏPQ*S~BRP`PˏPQCaRPo P;?PExpected address expression: absolute 0 assumedЬRR~3P PPԢ PԢԢbSymbols "%s" "%s" are undefined: absolute 0 assumed.Symbol "%s" undefined: absolute 0 assumed.ЬRR[PYbвQϧQբвPϗPQPPQ_&QQPP~Ԣ PԢԢbBad Absolute Expression, absolute 0 assumed.^]~~PP ԭЭPPﺰP`PﰰThis string may not contain '\0'ЬTT6PSdRcSRd?RSPMissing string<UBP`"13ﵳTT S PP THRcUϟPR؞R PP RR P`ZRТS PˢP â PâQPQТ Т SRArRURP~P`PP^ЬP`.11SP= E=P=`3-P` ` ]~ρPRERﭲ#RQBPA`B`~ݭݭ~`PPQﰮP= P=`Qabsolutetextdatabssunknownabsentpass1ASSEMBLER-INTERNAL-LOGIC-ERROR!bignum/flonumdifference ~<~jRRT&SS PP SR S ТS PˢP â PâQPQТ Т S;*D~>*YЬPPP <﫱免ЬXWX W1ɫ'PЏ8Q Q&aQשׂQPzvR PˢP â PâQPQТ Т W~XHjUѣ XW SUeSS ѣ XWgRRVTT PP TRT ТT PˢP â PâQPQТ Т TeSTSWX ԣSΪЏ8PP`V`RRU&TT PP TR0T ТT PˢP â PâQPQТ Т TbЏ8PPV`TPԠУQPPcPDB}Px ~RbЏ4PP`=bT ^ЬSRLS0S05SS'hЏ8P P&`PTP~~~TP@ PP~SPQQ.Inserting "%s" into symbol table failed: %sЬRRbJ`Pb ЬSS(PR~~~~S﷤RC~ݢ ~Ѣ PPPpSsPԠТRQdR9baQТP P|ԖQP ТÖТﵖPRЏPRP`^P~Pՠ РPՠ jDRb0b#YYRRSc 8XXR~cYPT PdФT֕Pӕ~凌 XYX | lQաСPPPԡСQPQ4ЏRRRbPPԡ СQ>@`P@~ ~V T1Ϥu 'RԤdPäPYT8,դ ' ФPѠ TѠ`PT <~ݤ嘆ФTНRɝS1գ$~ݣݣݣ&PãP~ݣ*cbSRcSSS1У TUSRѢ T ѢUbRУ PРW&WQ£ QQ`VV:QUƤRݣPQR~VW/4WVSѣ TѣeУPàVUUݣ cRѢ TѢ SUݢy bRУPUPݣ UVW36W/VcS1LJXYa=.word %s-%s+%ld didn't fitЬR~RUVЬUdVeVϥ R&R/ť PPV;ݥVHPV,BUPV*<~ݥ&ǵХU[ZЬU1eYZePPePVХRХTϥ 1X1XХS1ѣ U1գ1УPPPУQQQPTT ToЏPkP`ݣݳݳե  ֥ &XcP*Ѡ #РRУQѢѢS `PXcS1J1TV~ RbPSTY~bPSX1R PPTõTPPPXZX1Х WW PPSSXR!ТQaPPTaYQUPZTVTPåPQAУ PCQPPWW PPSУ PP QcPPWW PPSУ PPPQQPXW .<~ݥ*˳XXZ[ХU1[1ЬPxRRRPRQRQPQPNegative of non-absolute symbol %sCan't emit reloc {- %s-seg symbol "%s"} @ file address %d.Fixup of %d too large for field width of %dInternal error in write.c in fixup_segment^ЬT[T1dYФXH&2VФUФ RФSZU QˏQWR1UEb6PWPP$WW WWâPPSUԤ8¢S,Xi~bQˏQP@P@ϩUdWZSVXPiPPSZԤEW'++++SԤU"[S[ BPP~nRPPP~cdgnФ dPPPcPRPPP~c?B>nУR  ^ЬY-+ЬY-+Ь YЬYЬZ+P-PЬ YPЬYü[x[[ЬYüxЬYЬZ XЬ Yü PxPP[íPWWVVXVUԭTTnUSURRT>RTQR[1Q+Q'ЬYFPP <`SU`SUPP VЬ Y>FX <ЬScUSmPTЬRbUTSRmPPRP<ЬRЬTЬ UЬSST7SS~URfl>DPPR `PPRRPxPPTPP+PTT~UR/lSTTSPPP~?Ce|lPЬRЬPЬ QQP<PЬЬ PbQbPPQQQ PbQQ`QԠ<ЬSУUã TTPxTQ@dRRccRRPPQUQRPPPaP"TPP @@PTP@PPPT @ATPQT ЬQЬRТPPQ`QРPPPPЬTЬSФPPS`SРRP RPPS S`PSylݬݬdfloatffloatgfloathfloat`*$VIP_BEGIN error:%s៯` P︫RȓQQ1 TSBbP~@PPXaPTRQQS;Displacement (%ld) long for instruction field length (%d).ЬQЬRЬ TTPRSPP RxRRPRRTSnDisplacement (%ld) too long for instruction field length (%d).ЬQЬRЬ TTPRSPP RxRRPRRTSDisplacement too long for instruction field length.ЬSЬTЬ RqjRR TxTTRTT oЬSЬTЬ R-jRR TxTTRTT J* ЬQRQPPSQQxRRcPPRSQRPvax_assemble"%s" in="%s"Ignoring statement due to "%s"Ignoring statement because "%s"Can't relocate expressions ivax.cCase value %d unexpected at line %d of file "%s" Bignum not permitted in short literal. Immediate mode assumed.Can't do flonum short literal: immediate mode used.A bignum/flonum may not be a displacement: 0x%x usedJunk at end of expression "%s"Short literal overflow(%d.), immediate mode assumed.Forced short literal to immediate mode. now_seg=%s to_seg=%s? ?Length specification ignored. Address mode 9F used(^ЬSS+`PRbSRϻ(﬇P`R PϻﱒXWY PPPW1MЧ P`PϏHR1Ч^ЧPSY~bPUU %:%1ԩ ԩiԩ1M1թݽݩ塚Y1ݭ͐~(OeP1]~ݭΩ~'ΩPPd' Hi1QPP@1{vQPP@id_ZUQ~PP@HC>94QPP@)! QQTWBi1ΩPPd Q (E1:bUPPQT1>bQPUP~RPPT1bOcb1QPUP~R~T1cbQR~T1 c cQPUP~RPPϥT1QPUP~RώT1bQR~e TpUPPQbTcb1QPUP~R~1T<bQR~ T5<~ݦ / 2TPP^}SS]RRTPxPQQxPQQPTP~@PPTQQQQQPTQQQPPݬREWhaltnopreibptretrsbldpctxsvpctxcvtpsrwabrwabcvtspindexrlrlrlrlrlwlcrcabrlrwabproberrbrwabprobewinsqueababremqueabwlbsbbbbbrbbneqbnequbeqlbeqlubgtrbleqjsbabjmpbgeqblssbgtrublequbvcbvsbccbgequblssubcsaddp4addp6rwabrwabrwabsubp4subp6cvtptrwababrwabmulpcvttpdivpmovc3rwababcmpc3scancrwababrbspancmovc5rwabrbrwabcmpc5movtcrwabrbabrwabmovtucbsbwbwbrwcvtwlrwwlcvtwbrwwbmovpcmpp3cvtplrwabwlcmpp4editpcrwabababmatchcloccskpcmovzwlacbwrwrwmwbwmovawawwlpushawawaddf2rfmfaddf3rfrfwfsubf2subf3mulf2mulf3divf2divf3cvtfbrfwbcvtfwrfwwcvtflrfwlcvtrflcvtbfrbwfcvtwfrwwfcvtlfrlwfacbfrfrfmfbwmovfrfwfcmpfrfrfmnegftstfrfemodfrfrbrfwlwfpolyfrfrwabcvtfdrfwdadawirwmwinsqhiabaqinsqtiremqhiaqwlremqtiaddd2rdmdaddd3rdrdwdsubd2subd3muld2muld3divd2divd3cvtdbrdwbcvtdwrdwwcvtdlrdwlcvtrdlcvtbdrbwdcvtwdrwwdcvtldrlwdacbdrdrdmdbwmovdrdwdcmpdrdrdmnegdtstdrdemoddrdrbrdwlwdpolydrdrwabcvtdfrdwfashlrbrlwlashqrbrqwqemulrlrlrlwqedivrlrqwlwlclrdwdclrgwgclrqmovqrqwqmovaqmovadadwlpushaqaqpushadadaddb2rbmbaddb3rbrbwbsubb2subb3mulb2mulb3divb2divb3bisb2bisb3bicb2bicb3xorb2xorb3mnegbrbwbcasebrbrbrbmovbcmpbrbrbmcombbitbclrbwbtstbrbincbmbdecbcvtblrbwlcvtbwrbwwmovzblmovzbwrotlacbbrbrbmbbwmovabpushabaddw2addw3rwrwwwsubw2subw3mulw2mulw3divw2divw3bisw2bisw3bicw2bicw3xorw2xorw3mnegwrwwwcasewrwrwrwmovwcmpwrwrwmcomwbitwclrwwwtstwrwincwmwdecwbispswbicpswpoprpushrchmkchmechmschmuaddl2rlmladdl3rlrlwlsubl2subl3mull2mull3divl2divl3bisl2bisl3bicl2bicl3xorl2xorl3mneglrlwlcaselrlrlrlmovlcmplrlrlmcomlbitlclrfwfclrlwltstlrlinclmldecladwcsbwcmtprmfprmovpslpushlmovalalwlmovafafwlpushalalpushafafbbsrlabbbbbcbbssbbcsbbscbbccbbssibbcciblbsrlbbblbcffsrlrbvbwlffccmpvrlrbvbrlcmpzvextvextzvinsvrlrlrbvbacblrlrlmlbwaoblssrlmlbbaobleqsobgeqmlbbsobgtrcvtlbrlwbcvtlwrlwwashprbrwabrbrwabcvtlprlrwabcallgcallsrlabxfccvtdhrdwhcvtgfrgwhaddg2rgmgaddg3rgrgwgsubg2subg3mulg2mulg3divg2divg3cvtgbrgwbcvtgwrgwwcvtglrgwlcvtrglcvtbgrbwgcvtwgrwwgcvtlgrlwgacbgrgrgmgbwmovgrgwgcmpgrgrgmneggtstgrgemodgrgrwrgwlwgpolygrgrwabcvtghaddh2rhmhaddh3rhrhwhsubh2subh3mulh2mulh3divh2divh3cvthbrhwbcvthwrhwwcvthlrhwlcvtrhlcvtbhrbwhcvtwhrwwhcvtlhrlwhacbhrhrhmhbwmovhrhwhcmphrhrhmneghtsthrhemodhrhrwrhwlwhpolyhrhrwabcvthgrhwgclrhwhclrowomovorowomovahahwlmovaoaowlpushahahpushaoaocvtfhrfwhcvtfgrfwgcvthfrhwfcvthdrhwdbuglbugwjbsbb-jbrjrjneqb?jnequjeqljeqlujgtrjleqjgeqjlssjgtrujlequjvcjvsjgequjccjlssujcsjacbwrwrwmwb!jacbfrfrfmfb!jacbdrdrdmdb!jacbbrbrbmbb!jacblrlrlmlb!jacbgrgrgmgb!jacbhrhrhmhb!jbsrlvbb?jbcjbssjbcsjbscjbccjbssijbccijlbsrlb?jlbcjaoblssrlmlb:jaobleqjsobgeqmlb:jsobgtrvirtual memory exceeded ]PhSR"cR~bDPS Rլ5R)c%R~bPS RjSݬݬ ݬsSPNo operatorUnknown operatorpBad operandNot enough operandsToo many operandsЬYЬQ1Xa QQTd d TdQTP }ɢ%dSdQ˅PRSdRbɢWYyJ1ТQˏQPPPPPQYWTQϞVbTYUf|hxdtX^aUQRS,RbSbP3@dUQϝPXSb VSPPRPQWϼVUTffa QaϲVVɢWXPQR SˏQP QˏRP RˏRPڶTD`3Qr-RQ0QˏSPD`AaPSQ>@QQKFSE@Sխ9V  [ WSRT yTXU UZYխ[WV  SRWYdDխ?V  [SRϿT*TPW PPXUϸ UZϿdh[dVi V TRYTGUЭRTWaЬQW XXUmw WϡdZYVURV ϲTFW iTX8ZϫT-aTЬQPE`PP</TXd.#T PW PPXVbVlVwXXd ZTЬQXUVSRZT Э ЭPЬP Q¬Q1QPρЬRЬSЬTä PPRZ~~~T&RSR~S,Displacement length %s. ignored! GNU is NOT Un*x!I can do better than -J!SYMBOL TABLE not implementedTOKEN TRACE not implementedI expected a filename after -t.{absent}I don't need or use temp. file "%s".I don't use an interpass file! -V ignored ЬQЬRЬ SPP+I522222222222222222222222222225222~SAVE.SET5"g'&'[VAXUSERS.ERIC.GPLUS.NEWAS]GCC-AS.EXE;18|h2222222%22222222222222225222222222221aL81p*1{sϋfaP`PR8a/babccP`R`cxRRzϒPPPPD$PXLPTXXXXXXXXXXXXXXXXXXXXXXXXXXXPXLPT PPPPЬR``PR`b`PT@bSRS<~VVRSUU TP P_main_c$main_argsJPV1|1sЏP+P`V ePP1OPY`W16W1-W1 'PPP~rPX('gh&&''()*+,-Q PQPG&H, PPQXiVkP`W X`ѠРP#kVѦWXѦЦV rRbPVfԦԦ ԦXԦjVj"bX`VԠ ԠBkP9kP WYЧW1P1РP1TEXT$codeDATA$uninitialized_dataCOMMON ERROR, unknown type (%d) $dataFixup data addsy and subsy didn't have the same typeFixup data addsy and subsy didn't have an appropriate typeFixup data was erroneously "pcrel"Fixup datum was not a longwordFixup datum was not "fixP->fx_addsy" ^ЬYЬ ZUSXVWլXSϫݬϩ ffSWSϙUfϔhT1iPP'66P,1!oPRTФDoPRTԢW w^1oPRTY~T^PS SԢ)ibR!iRݢdS1[oPRTY~TPV UUIФR&P'QxQQQPbXբݢR&~[բ բݢ &PRP~ݢТRgS1գ |գwУ PУQ ϑ[vУPPPP Ϩ=v -vУPУ Qá~XE2~]~ϪP ϶uգ u~X~ݣݣZc~XdУS1&Y1Y mPWЬRSìbTբݢWT~R&~4T&PRPVТ UТSUUWT~V3UTSТRSfR8ТPPP%ݢݢ KݢТPWPìP~ϧbRv\S1*fR1ТTPP1QѤQ1PPQ1գ 1գ1У PУQ ϾtУPPPP jt ZtУPУ QáPТQ¡PP~ݢ d2~]~R  tգ sPТQ¡PP~ݢ ~ݣݣbR1УS1UԭWTVYZ1dSK[[8PP&&P  &P( S%S% S*%УScS1PP1L1U å~:X XSPSUecR3[[ $cPbQ_pq:ТRR1BТR19$10[[;PP P@!PR" XURX$ТR1[[1PPd1 PD1P11W1V ~Xݣ2~>2PTP$~~V~~0Rb~Xݣ2~b~V~2PTP~2TTZTZУV0cϗPY"WcYWcݭ0PWУS17U(~~å~~ϥYZxå~kr~~ PݠXrrfm=varCouldn't create VMS object file "%s"^~`!8PT `RRLRpRRЬRRR*RRI/O error writing VMS object filebRYRWRQTMP?R 3p-R(T6%s: Module name truncated: %s V1.0GNU AS V1.0<^~4QP@QQ@QQ@QQQP`Qu_QRaKTa]a> a:a/ RQ"RSRaUˏUPD` PPPcabRPRPPb.bRRPRR.P%ЏP+P`R^FRR.PQPaPbPP@PPbϦRRC.PQPaPb~PP@qPkPb~~~HPFPQMA6P0PPP(PQAPPPϣ PP@OO@OOaUQQaOP@OOaQЬROP@OO@OOR R@OyOsOPЬ`gO ЬRR,RPSQRSxQP~A`PxQQQPQPQRSQP$$PsectAttributes_%s: Symbol %s replaced by %s  ^ЬRЬSXZUVb_RSb_$ _XR`,P RJPYzb_RPRPPw,PRbb$ $RRbRQbaWQVUUb$VXQVb[ˏ[PG`U"STSb[ˏ[PG` PPPdbЏPhP`VUb1SZU1ЏPhP`Q0QBa)?TQBa[ˏ[PD`VQBaޕBaZQBa6Q0Vb%STSb[ˏ[PF` PPPdQЏP+P`ZUZVZ(_QRˏUPB`xUUQ됏X*ЭS_QˏYPP P0P7xYYQcZ*ЏP+P`ݭݭYϔBPICLIBOVRRELGBLSHREXERDWRTVECЬSЬXc_S9c_SPSPP6*PSc$1WVcN OVSSUee_ e$UeR4SU~~BgTdS)PV ҤPhQQPh~BP`h R~BgP`USc_Sc$Unknown VMS psect type$^ЬTЬ RKuKP`kKiKP@]KWK@OKIKLR(P<<R(P<#Rr(P Hhd_TPTPP(P $]~TOJRRJP`JPPJRPЬ`J ]SSTϔS+(PByJsJcmJP@`JZJcPJ ^ЬRϊ,JJP`JRJP`IP`IIQAIIլZQIP `IRRAIIIPR`IIPЬ `uIhIP`]I ]RRݬYR&;IQPa1Ib+IP@IIbIϘ ^ЬRHHHP`HRHP`HP`HHQAHHQHP `~HRRAmHgHZHPR`OHMHRRAHPЬ `6HPP-HRP`H ]SSݬS%PBHGcGP@GGcGa ЬSЬ RRGGPR`GS%GP@G~GS@vGpG&lGP@_GYGSGPS`HGFGPP:GQЬa.GP@%GGGϣЬTЬRЬ SSOFFPS`FѬ5T5FP@FFT@FFFP;R>FP@FFPzFQTapFQQgFQPR`ZF|R>MFP@@F:FP3FQTa)FQQ FQPR`F5FP@FEPEQTaER@EEEP`EEKEEP`EEP@EyEPrEQafET@]EWE@OEIECEυ'EEP`EEP@EDPDQaDR@DDD]DDP`DDP@DDPDQaxDS@oDiDcD|ЬSЬTЬ VVϙT18DUTPTPPRRTRDPPPϙCVECCRECCRECCRCNT<ЬSЬTЬ RЬURdRdRdRSURTSUϷYCLCPU`BC@CP@3C-CP&CQSaC)@C CR@CBRBP@BBRBg ^ЬUЬWЬ XЬVЬTЬSХRSBBPS`BXST~STVϪnBaBPS`WBPP1y ]RRe7+BSCBBRPCBBbAP@AAbW1AP@AAPAQWaA3@AA1Ѣ v1Ѣ &AP@AzA @qAkA'gAP@ZATANAP `BA7APХ`hѢ &$AP@AA @AA'@P@@@@P `@@PW`@@Q@XPPPa@$Couldn't find fixup fragment when checking for indirect reference Ь RSSb bPSP)ЬRSb bPSPТRR ^bSPB&Sݬ%ϊ<^MSQcKUTc]c> c:c/ QS"QRQcUˏUPD` PPPbcaQPQPPa.aQQPRRP%ЏP+P`RVL5SRRPRQaaPPSQQQPυ^]~i ^ЬP`Rb_RРSREPP&v>i>P`_>]>P@P>J>PC>Qa8>QQ/>PQSa">@>>SRPPbbPϑ^𐏿Ь]~m ^ЬQЬSЬ RЬP1 ¡QÐ-}=p=P`f=R%[=P@N=H=R@@=:=&6=P@)=#==PR`==PP=QSa<@<<PSb?]RQ QPP Q QSSSSSPPQQRPR~Pgas: Couldn't find source file "%s", Error = %%X%x ^ЬSЬT:RbP>;(;$.;P`X c;P`,;y;P,`S,S?P4RPPS3n1Pi::SSPP PRT:QЁa;QaPPSSTPPR~PϏ^ ]~j ЬSRIQ*PPѡQSRѡQRСQRãPãP_doprnt error on "%s"!!ЬQЬPЬ RϠ '5FZqQQR$`QR$ݠ`QRp$ݠݠ`QR\$ݠ ݠݠ`QRE$ݠݠ ݠݠ`QR+$ݠݠݠ ݠݠ`QR$ݠݠݠݠ ݠݠ`QR #ݠݠݠݠݠ ݠݠ`QR #ݠ ݠݠݠݠݠ ݠݠ`QR #ЬRPb9b/@`PQ>@Pb9PRPЬP`: `p:`6H-655h5566 5_5P5QA55P555PP#5%5R5QA`B554Pz5p5n5x]5|ЬUЬVЬTSVNTSP95QPaSլ  6S &㭻S\ PQ 5RBcSQKTRbTb4QPAcSAcSAcS~QS~ݬ V TP㭻STP`4QAcS`S~4ѥ ~U-^ЬUԭeT:TOPSSVScpLХRDWW1$1@$bQTP`:`a PQ`:a:`:ТRS]~SݭώPPfTݥ~Pb:fP^Ь ZЬYԭмV:VNPTTXTd]~T~ϯݭ)PWPh?UեNеT@_:T[RbPSVbSP!VT PХPPPZ PYeUեUVݥݥ WϞ:hP^G~ݬ'~^S~ݬ~^S~ݬ^ЬXЬ ZTЬ[ЫWЏUSP>R2ТQPPPDQWQU QUQSQSТRUSUԭhP:PMPPYP`r]~P~MݭPVPih ScP1RPBdTBdTBdThcPBdTBdTBdTBdThcPBdThP`1QAdT`1RBdTBdTBdTBdTBdT~RScWZTdUZdbRc:iѦ ~V Deferring %d <^ЬT]~T~,PTd;1]U:T6LPTUT~PTݭ{PRrѢѢ?Т ݢ ]PSѢSݭu#ѢSPSSRUT~ϟRbPTUT~bPTTd;1ePvoid %d is an unknown untyped variable. Contact programmer.intlong intunsigned intlong unsigned intshort intshort unsigned intcharsigned charunsigned charfloatdouble %d is an unknown type of variable. Contact programmer.^ЬY=Y~JPVVP1fYVf9 f/v9]~V~KݭPS7;$DPSc$DPSl;cSd;ЭYVf9-f/(vP P@^l?P\<^ n^S|~߮~~^T|~d ЎR|~^T|~|~Rc|~d0!0'#0g 0PPʏ0ЬWP0W 0P1 0 Pʏ0gV0n%ѧ> ЏzP P֧g0~Pʏ0ЬWP0?P6RǕSlլ 3 3P'RYjRgS(SbcUPP1PP<ЬPЬWP0P 0P1ЬZ ЩS<TЧ$STSTSçUSjTUʏ0PЬ WP0`| 0P1ЬZЬ[ZZ~7gV0-F: VPPVVZ VnVZVZZn0@nZɔkЬPʏ0ЏL5P0[ߔʏ0PЬWP0g0 Pg֧PЬWP00vPP֧g0P߬ l~n ߬l~n01 ЬUЬRSVSrVSw Sa1b+VR~bb< nRVb+VP0"HYSaȏ@0鉶ЭZ Э\0)1HSwhP#Sa<^PPPY0h040.Z ЎPP00~ZP[PЏ5P0PЬWP0YO 0P1^^[oWݏ߬ ݬ[DPPZ0j ʏ0ЎPʏ0PЬWP0c 0P17gV0FgV0֧ѧ>Ч>g-  ӏ00nЬPʏ0ѧ>%Ч>çPxPQʏPP,Q$(Q:ЬPʏ0ЬWP0NG 0P1Ь[ЏZ:Zk Џ5P0M[QZ0iP ЏL5P04ʏ0ЬWP0> 0P17Ь[Ь ~լЬZ0nÎ Pʏ0ʏ0PЬ WW2P0 ~}PԼ l PЎWPW`g`WPPЬWP0jP 0P1߬ ݬݬAHʏ0ЬWP06}~ ~PPЬWP01g0Z0Z0Z00ЬZjS<TSTRS(T,Ч$Ч,i ipRP Pz; gԧ:S$}S~0t%<PPPg0 }SSTPPЬWP0M ~ ~ЬWP01= 0P1pЬ[Ь ~ЬZ0^0nʏ0Ь Pʏ0PЬWP0iPP0E W10n6RǕSlլ 3 /-P'2 R?SRS(SbcրPP!+P ЬPWP0=q 0P1| Ь[ЏZZ~gV0 <: VPPVVZ VnVZVZZn0nZɔ{ʏ0ЬP[锼ʏ0PЬWP0, 0P1 Z~n[0 ʏ0ЎPʏ0P0 P@P0 P@P0 0P1 0 Z [1Ѭ jѧ0 00S?Ч<gˏ@Vя@V)ݩnՎϬ YhЏ5P0PPʏ0լ(çQgQ09gQЬPPQR RgPPʏ00C[1J[Zլ1V0l$.0`([,Z[(Z, ʏ0P0g Z[[ ʏ0P[PZPiP`ԩ1V[Z[(Z,Ч$Ч,i ipVяzPяPP 0ʏ01|0Ϭ 3Џ5P0ʏ0[Ч$PPP[çUUZ([,ZxZPP[ʏZ[ʏ0PЏ5P0Qʏ0ç$[V[(Z, 0110x [[Z[x (Z<,PPZZ[ç>V<ZVZZ[[Z,gZ>S>Z[2<PP0 ,gV<Z6$Z[0Z[[>ç>[<P[PgЧ>ˏ[Zԧ:[ x[[[:$[0?0 VV:000[$ԧ:0nVx VQZQ<PQPgQ07[Z[x [[Z[Pʏ0<PP^^Vݩ,ݩ(ݩRЧ(S<,TSTV$V,iPz^P^ЩS<T<"URiPzP7?VUVVVVVTxTPʏTPSPRЎЎ(Ў,<QQ^PS(T,STUPP$:PP(ç>PЧ>Pg00VЧ($ԧ:0-<,PPЧ><QPQg00.iPP00ЬUVP0 ՎYЬPPP:{P0zШ,045ǒVЦ  h0PJӏ4 ӏ4 Џ5P1E:Tæ HUUTЦ U}T~^R~l>n~l>nYY~l> nRhP0ЎP0P0G}UʏVP0 l;Ь P nzPY0Yl@UzlZZެ\0 @hP>ˏQя Q Џ5P1ӏQhP)P0QЎP0tяPӏ Џ5P1Nyh01-.Z ZςPZP0|XWP0P 0P1 ^^[Wݏ߬ݬ[d9}P~QZ0 }Pʏ0ʏ0PW1nWP0^J 0P1Ь[ЏZ:Zk Џ5P0] [QZ0yx[Z0jPʏ0ZЬWP0# 0P1@Ь~^[07ЬPʏ004  0P10P0w 0Z P0ʏ0TWЬR:b1RQSw~$RPP3ww"1TwRwSwR~~S~^SЬU:e1UQV~UOP3rwaw!1SWOwULwVAwU~~V~^S]ePT Sq!W Ud!ЎPPPT SN!Џ5PPBPЬWP0h0 |~ ~WP0GP 0P1߬ݬ<ʏ0ЬWP0 0P1M լ QЧЧլ! çPЬPl ЧЧgЧl  լ  ʏ01fP|~ݏ߬ ݬݬ)6ЬQ@aP^^WgЬЬݬPgA ^~^W߬ ݬW ;P1@@@; ,h0ȏ@0h0<6R)@< ȏ0@16Ǖ~^P|~?4`Pю^^RǕb6~? ݏ^S|~cb<~P 01  ȏ0^@0i0U,ȏ0BB V V 0:eUQQ4Џ5P0k^ Ќ[X0@=k6]V0zP)VY" AmZҺ ^ A 0uЏ5P0[0PkVFV<UUV(WhWP[ kQkR0R R QRQPVFV<UUV "ӏQQfӏQQfQfPP[0] V0P&UEU<TTUSSe,kPkP[0' V0iPUEU<TTUePkPWXV k[k),k$=k?WWUaU zUUUW vWP-Wh  fPPVPPQAQQ iPQAQQiPQAQQiQiQяzPW# 0QPP6QW QP0WZѬZ1|k[ZZJ[kWާBXYZ~PQ{ PPQ0Q~PjPjKP#PZPRZPZPRP1rЏL5P02<P0PZ,jjШ(U |~?jP0nXʓX $X(<hХ$(ЎXUUPЏ 4`U|~ߪ$|~,<2~V ЏzP0ZVZV(VkQVgS[VZ 0PЧV0 ЩPSP*UЧ,V$iP@P  ȏ0&ʏ0<"UP 0PT1Џ5P071&@- RS TT TTRT <SREfSU1 EfU1XЧTФXhXX~dP=UX(UfhЎP1XVXU f E ExUXU(UhЎUЧVЎX1 P xPxPhPUU fm|PfT2T+-P QT #T$T0T1 Q QEfU6PPU(U@fVSUQQfT$T EfUT0Q ?TTUЧVUgVUV>P0թQFЏzP:$ѧ$(g,bЧ$8Ч$"iPGя Pȏ0Џ5P2ʏ0Ч<g<"QQ>QxQQQ:P§:$0\01@Ч<gP00L(Ч<g 0 00} Ч(,Pg+004$Ч<g 00:$ԧ:Ч>PZP10 00Zӏ0 : ZkQ[QZgV0CcZVZV0(VkVgSQ[VnVZ09 0  ӏ0 0nZѧ>Ч>PՎPgV0:ZVZV0(VkSS>S>çSPxP:VgQ[VZPЧVVU0W PЧ<gP0<P$6QQ(ç>PP"Ч(Ч$8iя P i0}U~ 0F?TV,TVTU ЏP1TP 0 111N EU1B~T^, EUn1(U1f f Aӏ@0'ʏ@0 ~}U~ޮVU0}UT}U~1f  ȏ@01vPf P1Q+Qӏ@0 Qʏ@0E  ȏ@0U}Uя P i08)0 P` çPP6P ,nPSէ$:$ԧ:çPxPQQʏP$QQ( n:Q(,P, P,Ч>ЎQSYS$ERRORRUN SYS$INPUTSYS$OUTPUT_NLA0:VAXC$EXECMBXSYS$DISKVAXC$PATH:|~߮~~^P|~` EbP߬ݬϠЬR:bRQV VSSSS^^W( g(Vc߬WelP@l߬ݬQdݬݬ=ЬR:bRQV VSSSS^^W( ,g(Vc'ݬW:BìQ~na[><P[~ZjP[j@ݬ ݬݬϵЏ5P1iѭ  ЏL5P1X~>nYЫXYP0C^^SYR0i Џ~|~S~~P~~߮~~^QQ ~^Tad`~^Z`ЬTЭU~~(T!8P_T_U P TU^T"UVV^(Ud(nnV~^T ~^R|~߮~~^V|~fb<~PяBnS1zbRS^Xϵ~~~~ZS~T nMPU^G ~^Td_UPPЫ PЏ\5P10^^U n_R^S0P1Z^[k[1WnSZGV5.4R^UeUTVDRTU[TW R, 'XZP(ƕPP(P6c^SR^S0kP1W1r1yYP76РР3_[nkZZR^S0#PCZn[kkךZЬ [0@PZЬ[03P nR^S0]P]PШPRR^nSЬT|~|~Rc|~<1~< ~  ^ʏ< ~T] |~ݏݏݏ?`PPPը ߨ]P[P0ZZZ`PZР P] ^]PZP`ZݠݠP6ЎPРPlЏL5P1lZ[k9kZ Z[l լЪݪjkZЎPЏT5P1\PPP|~߮S~ ~@~^T|~dPP^߭iBPx P(P螭>ԭ|~|~ݭPRR ݭx߭ BRRP?ݬA^T\sݬݬcQPQQP ^|~|~2TQQЬS RRR|~<#~Q SuTP ^ЬP1P1PELT=լ"P@_TP`4T tլT \RP RQATP`SЬ`ATP`ATP`ASP`R SPݏ5BP^ݬݬ(PPQQQP^,SRP RRWЬVVW ݏ5P߭ѽ ЏUЬUT TP@cP`1 TQAP`VlAP`U UYAcP`RW ЬQQP@RP`QPxRPPRQ Q  UR? R?PT TP@cP`1pW &}PRQRPRPPPPPPPl լPd^U 1WmSTާ6[ާԭİԭ>ԭа԰ޭ>ܰޭ>ޭ>ԭe6 e]Q(ЭPФRb<RRR|~?QPP)|~|~2P~ѽ؏BP 22~PRRԤRSRPc֤Հ 1P P`3!PݴߧNP ߧSФ RPߧXФ RPߧ]Ф RP 1<~NPԭİԭ>ԭа԰ޭ>ܰޭ>ޭ>ԭc& cML(ЭPТ\l<\\\|~?LPP)|~|~2K~ѽ؏BKޢH ޢ\TT UTPTTƁPWWTڸWPT1TW (P%ݢ$T< \LdTϴ< \\\TZ2\LdTϛ2\\TTޢ\\\T\\!\\?PPT<\LdTX<\\\TWAPWȟ0(PUТ \TYTPTT(PUU%ݢTŷ<\LdT<\\\T2\LdTϽ2\\\TТ \TZTPTѽ؏BݽݽT& ƆTXTiPPTТ \T [T7PTTТ I?XPWT<\Q\P\ \P Q{\PQPQԭЬTTPSPPF>Rb3STbPbSQa=QPQP`=QPRbͰSЬސܐ<~GPRRڟ<P2P@bRRPR⟭⟭ P RWЭVf*:QfQRhPg(RWVPPYX$^,n$ ЬV:fQVQV,nnn(iPW1&HC>,nPPƐϞPVܞ<:fQVQ<,nPPƐϞPVܞ:fQVQ,n`P`PR,TZP\0PWhP hGRHP.SP@,S,iP RPPşhRPP|UVP^,nPPƐϞPЬܞ:QQ,n`P`PZf\0PRR[P@fn\ RfPPЬQС(Pՠ04Q0W^,n$܈:QìQЬ,nnn;PV/V&g:fQVQQQ (QfgPVPP ЬPР RSbcՠbPPJcPQcccbP. .b0bbQ.bbP/bQPP ^Ь R]> .b/brPbPPnnb~P/bSn:.nQQS/cSbPPnSbbS:]ncQQb :>ncQQbPЬXШ W[gVЬZZYZ/gY1ZZ Z.ШYZk(  gkkkk/cZ ШYkk k/g.BZ@1ШYkkk k/g.g.gYk k0gPPgPYPPI(YYgZ!g*VQQgYY:%YfQQ?aQVPPYQVZkPPЬ P/`.`.`PЬ PQaa/`.`.`.`aP\_\S\G\ ;\@~-\<~\ P`P P`P< [^,n$0,n0lլ|YЬZPѬPPYЬVTWS|QP.PPPSR/P/PQQ1+RSЬVTW, |$$$(ЏЏЏ04Q8W<P 8P1   1[,,$T$PTP-   .,,$T$PTPH,U- -e$-.e,VW.,,dT1    Z,PPX  ..`[`,  .,,( ,<PP,],,Y~,nPPƐϞP؞ܞPP,,n`P`PRPTZP\0PR R,$k1IX, 1,P.,],,  Z  $k1,,nPPƐϞP؞ܞPP,,n`P`PRPTZP\0PRRRR$kRPVW .,,VW ,P% .,, I ',Q.,,PQPa* *,,.,,VW$G   1,nPPƐϞP؞ܞPP,,n`P`PRPTZP\0P$kd1  #,$k6PWHP|SP(PTnSP@PYYY W~P*.RZWR PP P'WRPݬPSP(PnT1f$kWPPPXWά^,n0nT, |n$$$(ЏЏЏ,n$004:QìQ8ЬS8SSQ[5Q%ܑQ?׊QQSVVVTXRdPdTVRXQQWWQQ]ȑQ-#QӑQ]S-QSSW͑SQ QQSQQ]1WP^ ZP.;y.;o ::"":[<]>;.-*.]>$.$-o]&>"-_.]>.u]>[<]`>Xj.F-".]>D.--.]>*- -*\%bp/0/hC.n;"n.| ;t@! !"".( ./*- -*?[]-Э PР P`PeVAXCMSG@@8@HH@( x0HP @FORRTLLIBRTL AS gcc_compiled.C7IҌC#DUA0:[VAXUSERS.ERIC.GAS-1.36]AS.C;1 main >  got_sig L lvstralloc  glperform_an_assembly_pass  loseV ,VXREALLOC4 gcc_compiled.I=@5C)DUA0:[VAXUSERS.ERIC.GAS-1.36]XREALLOC.C;1Lxrealloc 3L( ;(XMALLOCt gcc_compiled.H<C(DUA0:[VAXUSERS.ERIC.GAS-1.36]XMALLOC.C;1xmalloc /  :  HASH gcc_compiled.E9#C<%DUA0:[VAXUSERS.ERIC.GAS-1.36]HASH.C;1__ctype__dummy hash_new   p&hash_die>hash_say Ml4r hash_deletejhash_ask 4 hash_replace0 hash_insertd hash_growhash_jam ' 0 hash_apply3 A2L hash_find  hash_code     6 6 HEX-VALUEL gcc_compiled.J>tC*DUA0:[VAXUSERS.ERIC.GAS-1.36]HEX-VALUE.C;1 Ldummy2 0L 2 ATOF-GENERICP gcc_compiled.MAC!x-DUA0:[VAXUSERS.ERIC.GAS-1.36]ATOF-GENERIC.C;1P__ctype__dummy^ atof_generic V^             ]^ \^ Hr Gv1 z  R Y0  APPENDx gcc_compiled.G;Cp'DUA0:[VAXUSERS.ERIC.GAS-1.36]APPEND.C;1 xappend x  # MESSAGES gcc_compiled.I=lC )DUA0:[VAXUSERS.ERIC.GAS-1.36]MESSAGES.C;1as_warn P@ as_bad'<as_fatal&H H EXPR\ gcc_compiled.E9.C<%DUA0:[VAXUSERS.ERIC.GAS-1.36]EXPR.C;1\__ctype__dummypoperand Sp  2 2 N    & get_symbol_end@ exprclean_up_expressionP expr_part U   APP gcc_compiled.D8`C&$DUA0:[VAXUSERS.ERIC.GAS-1.36]APP.C;1do_scrub_begin 1 7  >6 @SXscrub_from_fileh scrub_to_file|scrub_from_string"scrub_to_stringHdo_scrub_next_char8 }    o FRAGS gcc_compiled.F:(9C&DUA0:[VAXUSERS.ERIC.GAS-1.36]FRAGS.C;1 frag_grow FV6 frag_waneBxfrag_new t frag_morefrag_varT frag_variant `F frag_align " INPUT-FILEd gcc_compiled.K?JJC*+DUA0:[VAXUSERS.ERIC.GAS-1.36]INPUT-FILE.C;1dinput_file_begin Jd ninput_file_endrinput_file_buffer_sizezinput_file_is_openLinput_file_open[L"input_file_give_next_buffer ] - INPUT-SCRUB gcc_compiled.L@y^Cd,DUA0:[VAXUSERS.ERIC.GAS-1.36]INPUT-SCRUB.C;1input_scrub_begin e`.input_scrub_endJinput_scrub_new_fileinput_scrub_next_buffer'seen_at_least_1_file bump_line_countersnew_logical_line 4<as_where    as_perror j as_howmuch 6 as_1_char gD D OUTPUT-FILE gcc_compiled.L@RC,DUA0:[VAXUSERS.ERIC.GAS-1.36]OUTPUT-FILE.C;1*output_file_create %JXoutput_file_closeVoutput_file_append B R MR READ gcc_compiled.E9-BCj=%DUA0:[VAXUSERS.ERIC.GAS-1.36]READ.C;1__ctype__dummy  read_begin   pobegins_abortNHs_align,stringer> j cons Ps_comm s_data8 6s_desc V  float_consP s_file ds_fill<s_globls_lcomm s_line@ s_lsym  big_consR s_org ^s_setFs_space VstabP s_textG J q0read_a_source_file  t Jequalst demand_empty_rest_of_line Zignore_rest_of_line   get_absolute_expression pdemand_copy_string-&get_absolute_expression_and_terminators s_long s_intH%*get_known_segmented_expression  pseudo_set Ic | .demand_copy_C_string 6is_it_end_of_statement I   grow_bignum b        lXnext_char_of_string  &:get_segmented_expression  Y Y    SUBSEGS4 gcc_compiled.H<@C:(DUA0:[VAXUSERS.ERIC.GAS-1.36]SUBSEGS.C;1f subsegs_begin Sn subseg_new< subseg_change     "SYMBOLS$ gcc_compiled.H<`-C(DUA0:[VAXUSERS.ERIC.GAS-1.36]SYMBOLS.C;1$ symbol_begin Q$Nrlocal_label_name  xZ local_colon Tcolon symbol_new;fs~SAVE.SET5"g'&'[VAXUSERS.ERIC.GPLUS.NEWAS]GCC-AS.EXE;1s5\   symbol_find  ^symbol_table_insert *symbol_find_or_make  H H WRITE gcc_compiled.F:@`CJ"&DUA0:[VAXUSERS.ERIC.GAS-1.36]WRITE.C;1fix_new owrite_object_file   78  relax_segment  % $ P{   E l8   k     d# relax_align M!2  39" %E" $H" d& is_dnrange " #  R#  p8$ fixup_segment   &&emit_relocations   &( VERSION& gcc_compiled.H<C(DUA0:[VAXUSERS.ERIC.GAS-1.36]VERSION.C;1 &dummy3 &  FLONUM-CONST& gcc_compiled.MAC-DUA0:[VAXUSERS.ERIC.GAS-1.36]FLONUM-CONST.C;1 &dummy1 &  FLONUM-COPY& gcc_compiled.L@HC,DUA0:[VAXUSERS.ERIC.GAS-1.36]FLONUM-COPY.C;1& flonum_copy & J FLONUM-MULT' gcc_compiled.L@kѱC ,DUA0:[VAXUSERS.ERIC.GAS-1.36]FLONUM-MULT.C;1' flonum_multip O' x( x( z( y(/ ( ( h h STRSTR( gcc_compiled.G;`Cy'DUA0:[VAXUSERS.ERIC.GAS-1.36]STRSTR.C;1 (strstr (  ,")< 1< BIGNUM-COPY() gcc_compiled.L@uC,DUA0:[VAXUSERS.ERIC.GAS-1.36]BIGNUM-COPY.C;1() bignum_copy ,() 4\)x IxOBSTACK) gcc_compiled.H<vC(DUA0:[VAXUSERS.ERIC.GAS-1.36]OBSTACK.C;1)_obstack_begin ;) T)_obstack_newchunk  N* N* n*~*_obstack_allocated_p ,* obstack_free J* _obstack_free  VAX+ gcc_compiled.D8E.$DUA0:[VAXUSERS.ERIC.GAS-1.36]VAX.C;26:+md_begin .:+PJ vip_begin ;+ :+P +md_endBJvip_end+md_number_to_charsj,md_number_to_imm|,md_number_to_dispD*-md_number_to_fieldFp-md_chars_to_number -P/ md_assemble v 6Kvip   u3 3           : # : :$:md_estimate_size_before_relaxT<md_convert_frag =md_ri_to_chars   J JTPMvip_op_defaults z Ovip_op UL [LL__ctype__dummy L vax_reg_parse|Mvip_op_1  MD*     )[  FTmd_create_short_jumpdTmd_create_long_jump>Umd_parse_optionV VATOF-VAXV gcc_compiled.I=C)DUA0:[VAXUSERS.ERIC.GAS-1.36]ATOF-VAX.C;1Vatof_vax_sizeof 'VjbW next_bits.) X"make_invalid_floating_point_number Xwhat_kind_of_floatRhXatof_vax Yflonum_gen2vax  " GoY  nY 0Z 3Z `dZmd_atof )[ )[  VMSH[ gcc_compiled.E9`]'~i%DUA0:[VAXUSERS.ERIC.GAS-1.36]VMS.C;62H[__ctype__dummyf[VMS_Check_For_Main Cf[  \ E\ h\ l\^VMS_write_object_file $fCreate_VMS_Object_File*gWrite_VMS_MHD_Records NxmVMS_Psect_Spec  V~VMS_Initialized_Data_Size  pVMS_Procedure_Entry_Pt nVMS_Global_Symbol_Spec 5_ #`xJq VMS_Set_PsectttVMS_Store_Immediate_DatabuVMS_Store_Repeated_Data `$ %DvVMS_Store_PIC_Symbol_Reference!xVMS_Fix_Indirect_Reference 7faY a a b   Ac Icnl6yVMS_TBT_Module_Begin  Xc.{VMS_TBT_Routine_End(VzVMS_TBT_Routine_Begin ?d d "R{VMS_TBT_Line_PC_Correlation  |VMS_TBT_Source_File ne20~VMS_TBT_Source_Lines :zVMS_TBT_Module_End ZiWrite_VMS_EOM_RecordfClose_VMS_Object_File0!lfSet_VMS_Object_File_Record>%fFlush_VMS_Object_Record_Buffer  i hash_stringjjVMS_Case_Hack_Symbol k l >l ~"lVMS_Modify_Psect_Attributes 7Fm    lr VMS_Set_Data X`sVMS_Store_Struct~sVMS_Def_StructpNtVMS_Set_Struct      x     ~)n ~_doprnt $ * $VMS_DBG_MODULE gcc_compiled.PD@͸kӝ@0DUA0:[VAXUSERS.ERIC.GAS-1.36]VMS_DBG_MODULE.C;52 cvt_integer G, get_struct_name Vb find_symbol" push) Հ  array_suffix "new_forward_refZ |gen1vgenerate_suffixNVMS_DBG_recordJVMS_local_stab_Parse   VMS_stab_parseVMS_GSYM_ParseΈVMS_LCSYM_ParseVMS_STSYM_ParseVMS_RSYM_Parse  Sforward_referenceLVMS_typedef_parse 4VMS_LSYM_Parse  u4 4 BCOPY BCOPY$CODEb BZERO BZERO$CODE% INDEX @indexSTRINGS \strcat |strcmp( strcpy strlenԖstrncat.strncmp8:strncpy22C$CTYPEC$MALLOC CALLOC FREE tMALLOCREALLOC()$DATAt$CODESHELL$FROM_VMSSHELL$FROM_VMS  XT8+SHELL$$RMS_PARSE + (TERMINATE_PARSE  @   SHELL$TRANSLATE_VMS  o -h TRANSLATE_VMS h 7&~ DEFAULT_DIR  <% COPY_TOKEN  t@ : INSERT_MINUS  E* DOTDOTDOT  t2 NODE_ACTION     ' DEVICE_ACTION '   3 FILE_ACTION 3   ? TYPE_ACTION ?   KVERSION_ACTION K : YDIR_TOP_ACTION Y _ h DIR_ACTION h   tSET_WILD t  SET_WILD_PCT  CLI$DATA  _LIB$KEY0$  _LIB$STATE$tCLI$READ_ONLY_DATACLI$CODESHELL$CLI_NAMEshell$cli_namewzshell$is_shell1 t+  SHELL$TO_VMS SHELL$TO_VMS  H]  U X    ;   8SHELL$$VMS_FILE 8 ѹA    B SAVE_NODE B Z!,nSAVE_DEV n #SAVE_DIRECTORY  ?7?  SAVE_NAME ?  :V  SAVE_TYPE V  c&  _  SAVE_VERS     SET_FILETYPE    SET_REGULAR_EXP    SET_WILD   *  SET_VERSION   P COPY_STR   vK,! FREE_DIRECTORY_DESCRIPTORS    ,  MATCH_REGEX   / A'  MATCH_SUBSTRING   $'Q PRUNE_FILESPEC   O%  FIND_LAST_DOT   v ". TERMINATE_PARSE      CLI$READ_ONLY_DATA  _LIB$KEY0$& _LIB$STATE$CLI$CODED  . ABS .C$SIGNAL declare_control_c_handlerD signalssignal&gsignal' i#! $  C$DATAC$$MAINLc$$main^vaxc$crtl_init expand_buffer lowercase/ get_paramsqcget_terminal_typeS c$$ctrlc_hando% c$$cond_hand] Q L0    "   ܹ'! " C$$TRANSLATE c$$translatef C$GETENV getenv H SHELL$CLINTSHELL$GET_ARGV  55$CODE$SHELL$MATCH_WILD SHELL$MATCH_WILD CLI$CODEC$SIGVEC sigvecsigblock5 sigsetmasksigpause4sigstack> )*[VAXUSERS.ERIC.GPLUS.NEWAS]MAKE-GAS.COM;1+,;&./: 4J'-'&0123KPWO5 67 ;j8 ;R+9G:HJ$! $! Command file to build a GNU assembler on VMS $! $ if "''p1'" .eqs. "LINK" then goto Link $ gcc/debug/define="VMS" as.c $ gcc/debug/define=("VMS", "error=as_fatal") xrealloc.c $ gcc/debug/define=("VMS", "error=as_fatal") xmalloc.c $ gcc/debug/define=("VMS", "error=as_fatal") hash.c $ gcc/debug/define="VMS" hex-value.c $ gcc/debug/define="VMS" atof-generic.c $ gcc/debug/define="VMS" append.c $ gcc/debug/define="VMS" messages.c $ gcc/debug/define="VMS" expr.c $ gcc/debug/define="VMS" app.c $ gcc/debug/define="VMS" frags.c $ gcc/debug/define="VMS" input-file.c $ gcc/debug/define="VMS" input-scrub.c $ gcc/debug/define="VMS" output-file.c $ gcc/debug/define="VMS" read.c $ gcc/debug/define="VMS" subsegs.c $ gcc/debug/define="VMS" symbols.c $ gcc/debug/define="VMS" write.c $ gcc/debug/define="VMS" version.c $ gcc/debug/define="VMS" flonum-const.c $ gcc/debug/define="VMS" flonum-copy.c $ gcc/debug/define="VMS" flonum-mult.c $ gcc/debug/define="VMS" strstr.c $ gcc/debug/define="VMS" bignum-copy.c $ gcc/debug/define=("VMS", "error=as_fatal") vax.c $ gcc/debug/define="VMS" atof-vax.c $ gcc/debug/define=("VMS", "error=as_fatal") vms.c $ gcc/debug/define="VMS" vms_dbg_module.c $ Link: $ link/exec=gcc-as sys$input:/opt ! ! Linker options file for GNU assembler ! as,xrealloc,xmalloc,hash,hex-value,atof-generic,append,messages,expr,app,- frags,input-file,input-scrub,output-file,read,subsegs,symbols,write,- version,flonum-const,flonum-copy,flonum-mult,strstr,bignum-copy,- obstack,vax,atof-vax,vms,vms_dbg_module,- gnu_cc:[000000]gcclib/lib,sys$share:vaxcrtl/lib %*[VAXUSERS.ERIC.GPLUS.NEWAS]VMS.DIFF;1+,U= ./: 4Q-'&0123KPWO56@g}7!j8|+9G:HJ *** vms.c;1 --- vms.c************** *** 57,63 int Psect_Index; int Psect_Offset; };.! static struct VMS_Symbol *VMS_Symbols = 0;   /*--- 57,63 ----- int Psect_Index; int Psect_Offset; };'! struct VMS_Symbol *VMS_Symbols = 0;   /*************** *** 837,842 */ {+ struct symbol *Current_Routine = 0;$ int Current_Line_Number = 0;  int Current_Offset = -1;  int Has_Source_File = 0;--- 837,844 ----- */ {+ struct symbol *Current_Routine = 0;1+ char * actual_source_file = (char*) NULL;$+ int in_true_source_file = 0;$ int Current_Line_Number = 0;  int Current_Offset = -1;  int Has_Source_File = 0;************** *** 842,847  int Has_Source_File = 0;$ int Largest_Line_Number = 0; J for(symbolP = symbol_rootP; symbolP; symbolP = symbolP->sy_next) { /* * Deal with text symbols--- 844,859 -----  int Has_Source_File = 0;$ int Largest_Line_Number = 0; S+ /* Output debugging info for global variables and static variables that are notP+ * specific to one routine. We also need to examine all stabs directives, toR+ * find the definitions to all of the advanced data types, and this is done byR+ * VMS_LSYM_Parse. This needs to be done before any definitions are output toJ+ * the object file, since there can be forward references in the stabsM+ * directives. When through with parsing, the text of the stabs directiveN+ * is altered, with the definitions removed, so that later passes will seeL+ * directives as they would be written if the type were already defined.+ */+ VMS_LSYM_Parse();J for(symbolP = symbol_rootP; symbolP; symbolP = symbolP->sy_next) { /* * Deal with STAB symbols************** *** 844,850 J for(symbolP = symbol_rootP; symbolP; symbolP = symbolP->sy_next) { /*! * Deal with text symbols  */: if ((symbolP->sy_nlist.n_type & ~N_EXT) == N_TEXT) {  /*--- 856,862 ----- VMS_LSYM_Parse();J for(symbolP = symbol_rootP; symbolP; symbolP = symbolP->sy_next) { /*! * Deal with STAB symbols  */5 if ((symbolP->sy_nlist.n_type & N_STAB) != 0) {  /*************** *** 846,851 /* * Deal with text symbols  */: if ((symbolP->sy_nlist.n_type & ~N_EXT) == N_TEXT) {  /*+ * Ignore symbols starting with "L",--- 858,885 ----- /* * Deal with STAB symbols  */5+ if ((symbolP->sy_nlist.n_type & N_STAB) != 0) { + /* + * Dispatch on STAB type + */9+ switch((unsigned char)symbolP->sy_nlist.n_type) {+ case N_GSYM: + VMS_GSYM_Parse(symbolP);+ break;+ case N_LCSYM:!+ VMS_LCSYM_Parse(symbolP);+ break;+ case N_STSYM:!+ VMS_STSYM_Parse(symbolP);+ break; + }+ } + }+ J+ for(symbolP = symbol_rootP; symbolP; symbolP = symbolP->sy_next) {+ /*+ * Deal with text symbols + */: if ((symbolP->sy_nlist.n_type & ~N_EXT) == N_TEXT) {  /*+ * Ignore symbols starting with "L",************** *** 871,8762 VMS_TBT_Routine_Begin(symbolP,Text_Psect);" Current_Routine = symbolP; }  /* * Done  */--- 905,950 -----2 VMS_TBT_Routine_Begin(symbolP,Text_Psect);" Current_Routine = symbolP; }Q+ /* Output local symbols, i.e. all symbols that are associated with a specificO+ * routine. We output them now so the debugger recognizes them as local to+ * this routine.+ */+ { symbolS * symbolP1;+ char* pnt;+ char* pnt1;N+ for(symbolP1 = symbol_rootP; symbolP1; symbolP1 = symbolP1->sy_next) {>+ if ((symbolP1->sy_nlist.n_type & N_STAB) == 0) continue;7+ if (symbolP1->sy_nlist.n_type != N_FUN) continue;I(+ pnt=symbolP->sy_nlist.n_un.n_name;*+ pnt1=symbolP1->sy_nlist.n_un.n_name;!+ if(*pnt++ != '_') continue;6"+ while(*pnt++ == *pnt1++) {};9+ if((*(--pnt) == '\0') && (*(--pnt1) == ':')) break;S+ };%+ if(symbolP1 != (symbolS *) NULL)*P+ for(symbolP1 = symbolP1->sy_next; symbolP1; symbolP1 = symbolP1->sy_next) {4+ if (symbolP1->sy_nlist.n_type == N_FUN) break;+ /*+ * Deal with STAB symbolsF + */6+ if ((symbolP1->sy_nlist.n_type & N_STAB) != 0) { + /* + * Dispatch on STAB type + */l:+ switch((unsigned char)symbolP1->sy_nlist.n_type) {+ case N_LSYM:+ case N_PSYM:*+ VMS_local_stab_Parse(symbolP1);+ break;*+ case N_RSYM:?+ VMS_RSYM_Parse(symbolP1,Current_Routine,Text_Psect);e+ break; + + } /*switch*/+ } /* if */+ } /* for */+ + } /* local symbol block */t  /* * Done  */************** *** 883,889  /*  * Dispatch on STAB type  */g*! switch(symbolP->sy_nlist.n_type) {  /*  * Line numberi  */--- 957,963 -----  /*  * Dispatch on STAB type  */n9! switch((unsigned char)symbolP->sy_nlist.n_type) {  /*Y * Line number  */************** *** 888,893 * Line number  */ casy~SAVE.SETU= '&%[VAXUSERS.ERIC.GPLUS.NEWAS]VMS.DIFF;1;1Q: e N_SLINE:  /*, * If this is the 1st N_SLINE, setup* * PC/Line correlation. Otherwise--- 962,968 -----h * Line numbers  */ case N_SLINE:'+ if(!in_true_source_file) break;  /*, * If this is the 1st N_SLINE, setup* * PC/Line correlation. Otherwise************** *** 959,964x VMS_TBT_Source_File(i( symbolP->sy_nlist.n_un.n_name,  1); break;  }l }y--- 1034,1043 -----P VMS_TBT_Source_File(*( symbolP->sy_nlist.n_un.n_name,  1);>+ if(Has_Source_File) {T!+ in_true_source_file = 1;-+ actual_source_file = .+ symbolP->sy_nlist.n_un.n_name;}; break;M /* We need to make sure that we are really in the actual source file whenmN * we compute the maximum line number. Otherwise the debugger gets really************** *** 960,965i( symbolP->sy_nlist.n_un.n_name,  1);t break;  }) }  } --- 1039,1055 -----t actual_source_file = . symbolP->sy_nlist.n_un.n_name;}; break;M+ /* We need to make sure that we are really in the actual source file whensN+ * we compute the maximum line number. Otherwise the debugger gets really+ * confused */+ case N_SOL:+ if(Has_Source_File) {$+ in_true_source_file = 0;*+ if(strcmp(actual_source_file, -+ symbolP->sy_nlist.n_un.n_name) == 0)a!+ in_true_source_file = 1; + };+ break;  }  }y  }b***************** 1738,1743P /*)4 * Flush the buffer if it is more than 75% full */ if (Object_Record_Offset > ) (sizeof(Object_Record_Buffer)*3/4)) ( Flush_VMS_Object_Record_Buffer();--- 1828,1948 -----7 /* 4 * Flush the buffer if it is more than 75% full */+ if (Object_Record_Offset > )+ (sizeof(Object_Record_Buffer)*3/4)),(+ Flush_VMS_Object_Record_Buffer();+ },+ + + /*+ * Make a data reference+ */8+ VMS_Set_Data(Psect_Index, Offset, Record_Type,Force)+ int Psect_Index;+ int Offset; + int Record_Type;+ int Force;+ {s+ /*l-+ * We are writing a "Record_Type" record{+ */-+ Set_VMS_Object_File_Record(Record_Type);t+ /* =+ * If the buffer is empty we must insert the record typey+ */:+ if (Object_Record_Offset == 0) PUT_CHAR(Record_Type);+ /* .+ * Stack the Psect base + Longword Offset+ */+ if(Force==1){+ if(Psect_Index>127){+ PUT_CHAR(TIR$C_STA_WPL);+ PUT_SHORT(Psect_Index);6+ PUT_LONG(Offset);}+ else {f+ PUT_CHAR(TIR$C_STA_PL);1+ PUT_CHAR(Psect_Index);+ PUT_LONG(Offset);}+ } else {if(Offset>32767){+ PUT_CHAR(TIR$C_STA_WPL);+ PUT_SHORT(Psect_Index);+ PUT_LONG(Offset);}+ else if(Offset>127){*+ PUT_CHAR(TIR$C_STA_WPW);+ PUT_SHORT(Psect_Index);o+ PUT_SHORT(Offset);})+ else{+ PUT_CHAR(TIR$C_STA_WPB);+ PUT_SHORT(Psect_Index);w+ PUT_CHAR(Offset);};};>+ /*n+ * Set relocation base:+ */+ PUT_CHAR(TIR$C_STO_PIDR);+ /*a4+ * Flush the buffer if it is more than 75% full+ */+ if (Object_Record_Offset >e)+ (sizeof(Object_Record_Buffer)*3/4))(+ Flush_VMS_Object_Record_Buffer();+ } + + /*<+ * Make a debugger reference to a struct, union or enum.+ */&+ VMS_Store_Struct(int Struct_Index)+ {+ /*++ * We are writing a "OBJ$C_DBG" recordg+ */++ Set_VMS_Object_File_Record(OBJ$C_DBG); + /* =+ * If the buffer is empty we must insert the record type+ */8+ if (Object_Record_Offset == 0) PUT_CHAR(OBJ$C_DBG);+ PUT_CHAR(TIR$C_STA_UW);+ PUT_SHORT(Struct_Index);i+ PUT_CHAR(TIR$C_CTL_STKDL);*+ PUT_CHAR(TIR$C_STO_L); + /*n4+ * Flush the buffer if it is more than 75% full+ */+ if (Object_Record_Offset >p)+ (sizeof(Object_Record_Buffer)*3/4))e(+ Flush_VMS_Object_Record_Buffer();+ }+ + /*M+ * Make a debugger reference to partially define a struct, union or enum. + */s$+ VMS_Def_Struct(int Struct_Index)+ {e+ /*i++ * We are writing a "OBJ$C_DBG" record6+ */++ Set_VMS_Object_File_Record(OBJ$C_DBG);s+ /*_=+ * If the buffer is empty we must insert the record typey+ */8+ if (Object_Record_Offset == 0) PUT_CHAR(OBJ$C_DBG);+ PUT_CHAR(TIR$C_STA_UW);+ PUT_SHORT(Struct_Index);s+ PUT_CHAR(TIR$C_CTL_DFLOC);e+ /*i4+ * Flush the buffer if it is more than 75% full+ */+ if (Object_Record_Offset > )+ (sizeof(Object_Record_Buffer)*3/4)) (+ Flush_VMS_Object_Record_Buffer();+ }*+ $+ VMS_Set_Struct(int Struct_Index).+ {/* see previous functions for comments */++ Set_VMS_Object_File_Record(OBJ$C_DBG);_8+ if (Object_Record_Offset == 0) PUT_CHAR(OBJ$C_DBG);+ PUT_CHAR(TIR$C_STA_UW);+ PUT_SHORT(Struct_Index);o+ PUT_CHAR(TIR$C_CTL_STLOC);l if (Object_Record_Offset > ) (sizeof(Object_Record_Buffer)*3/4))w( Flush_VMS_Object_Record_Buffer();-*[VAXUSERS.ERIC.GPLUS.NEWAS]VMS_DBG_MODULE.C;1+,3 .@/: 4a@@-'&0123KPWOA56@͸kӝ74Nj84+9G:HJd#include #include "as.h"#include "struc-symbol.h"#include "symbols.h"#include "objrecdef.h"#include */* include symbols for debugger records */#include "dbgdef.h"N/* We need this info to cross correlate between the stabs def for a symbol andN * the actual symbol def. The actual symbol def contains the psect number andK * offset, which is needed to declare a variable to the debugger for global * and static variables */struct VMS_Symbol { struct VMS_Symbol *Next; struct symbol *Symbol; int Size; int Psect_Index; int Psect_Offset; };&extern struct VMS_Symbol *VMS_Symbols;Qenum advanced_type {BASIC,POINTER,ARRAY,ENUM,STRUCT,UNION,FUNCTION,VOID,UNKNOWN};M/* this structure contains the information from the stabs directives, and theL * information is filled in by VMS_typedef_parse. Everything that is neededG * to generate the debugging record for a given symbol is present here.O * This could be done more efficiently, using nested struct/unions, but for now * I am happy that it works. */struct VMS_DBG_Symbol{ struct VMS_DBG_Symbol * next;? enum advanced_type advanced; /* description of what this is */1 int dbx_type; /* this record is for this type */? int type2; /* For advanced types this is the type referred to.2 i.e. the type a pointer points to, or the type' of object that makes up an array */A int VMS_type; /* Use this type when generating a variable def */D int index_min; /* used for arrays - this will be present for all */E int index_max; /* entries, but will be meaningless for non-arrays */F int data_size; /* size in bytes of the data type. For an array, this0 is the size of one element in the array */H int struc_numb; /* Number of the structure/union/enum - used for ref */};Lstruct VMS_DBG_Symbol *VMS_Symbol_type_list={(struct VMS_DBG_Symbol*) NULL};@/* we need this structure to keep track of forward references toN * struct/union/enum that have not been defined yet. When they are ultimatelyL * defined, then we can go back and generate the TIR commands to make a back * reference. */struct forward_ref{ struct forward_ref * next; int dbx_type; int struc_numb; char resolved; };=struct forward_ref * f_ref_root={(struct forward_ref*) NULL};static char * symbol_name;static structure_count=0;K/* this routine converts a number string into an integer, and stops when itH * sees an invalid character the return value is the character just past3 * the last character read. No error is generated. *//static char * cvt_integer(char* str,int * rtn){ int ival;8 ival=0; /* first get the number of the type for dbx */' while((*str <= '9') && (*str >= '0')) ival = 10*ival + *str++ -'0'; *rtn = ival; return str;}H/* this routine is used to compare the names of certain types to various. * fixed types that are known by the debugger. */1#define type_check(x) !strcmp( symbol_name , x )H/* When defining a structure, this routine is called to find the name ofI * the actual structure. It is assumed that str points to the equal signK * in the definition, and it moves backward until it finds the start of theJ * name. If it finds a 0, then it knows that this structure def is in theC * outermost level, and thus symbol_name points to the symbol name. */(static char* get_struct_name(char* str){ char* pnt; pnt=str;. while((*pnt != ':') && (*pnt != '\0')) pnt--;% if(*pnt == '\0') return symbol_name; *pnt-- = '\0';- while((*pnt != ';') && (*pnt != '=')) pnt--; if(*pnt == ';') return pnt+1;+ while((*pnt < '0') || (*pnt > '9')) pnt++;- while((*pnt >= '0') && (*pnt <= '9')) pnt++; return pnt;} N/* search symbol list for type number dbx_type. Return a pointer to struct */8static struct VMS_DBG_Symbol* find_symbol(int dbx_type){ struct VMS_DBG_Symbol* spnt; spnt=VMS_Symbol_type_list;- while (spnt!=(struct VMS_DBG_Symbol*) NULL){% if(spnt->dbx_type==dbx_type) break; spnt=spnt->next;};H if(spnt==(struct VMS_DBG_Symbol*) NULL) return 0;/*Dunno what this is*/ return spnt;}M/* Many good programmers cringe when they see a fixed size array - since I amM * using this to generate the various descriptors for the data types present,E * you might argue that the descriptor could overflow the array for aM * complicated variable, and then I am in deep doo-doo. My answer to this isI * that the debugger records that we write have all sorts of length bytesO * stored in them all over the place, and if we exceed 127 bytes (since the topO * bit indicates data, rather than a command), we are dead anyhow. So I figureO * why not do this the easy way. Besides, to get 128 bytes, you need something4 * like an array with 10 indicies, or something like< * char **************************************** var; K * Lets get real. If some idiot writes programs like that he/she gets whatH * they deserve. (It is possible to overflow the record with a somewhatI * simpler example, like: int (*(*(*(*(*(* sarr6)[1])[1])[2])[3])[4])[5];K * but still...). And if someone in the peanut gallery wants to know "WhatJ * does VAX-C do with something like this?", I will tell you. It crashes.A * At least this code has the good senses to convert it to *void.N * In practice, I do not think that this presents too much of a problem, sinceG * struct/union/enum all use defined types, which sort of terminate theM * definition. It occurs to me that we could possibly do the same thing withE * arrays and pointers, but I don't know quite how it would be coded. *5 * And now back to the regularly scheduled program... */#define MAX_DEBUG_RECORD 128Istatic char Local[MAX_DEBUG_RECORD]; /* buffer for variable descriptor */(static int Lpnt; /* index into Local */Hstatic char Asuffix[MAX_DEBUG_RECORD]; /* buffer for array descriptor */+static int Apoint; /* index into Asuffix */Dstatic char overflow; /* flag to indicate we have written too much*/Gstatic int total_len; /* used to calculate the total length of variable9 descriptor plus array descriptor - used for len byte*/Estatic int struct_number; /* counter used to assign indexes to struct unions and enums */M/* this routine puts info into either Local or Asuffix, depending on the signM * of size. The reason is that it is easier to build the variable descriptorL * backwards, while the array descriptor is best built forwards. In the endK * they get put together, if there is not a struct/union/enum along the way */push(int value, int size){ char * pnt; int i; int size1; long int val; val=value; pnt=(char*) &val; size1 = size;0 if (size < 0) {size1 = -size; pnt += size1-1;}; if(size < 0) for(i=0;i= MAX_DEBUG_RECORD) 0 {overflow = 1; Apoint =MAX_DEBUG_RECORD-1;};}}C/* this routine generates the array descriptor for a given array */2static array_suffix(struct VMS_DBG_Symbol* spnt2){ struct VMS_DBG_Symbol * spnt; struct VMS_DBG_Symbol * spnt1; int rank; int total_size; int i; rank=0; spnt=spnt2;! while(spnt->advanced != ARRAY) { spnt=find_symbol(spnt->type2);6 if(spnt == (struct VMS_DBG_Symbol *) NULL) return;}; spnt1=spnt; spnt1=spnt; total_size= 1;) while(spnt1->advanced == ARRAY) {rank++;9 total_size *= (spnt1->index_max - spnt1->index_min +1);$ spnt1=find_symbol(spnt1->type2);};, total_size = total_size * spnt1->data_size; push(spnt1->data_size,2);' if(spnt1->VMS_type == 0xa3) push(0,1); else push(spnt1->VMS_type,1); push(4,1); for(i=0;i<6;i++) push(0,1); push(0xc0,1); push(rank,1); push(total_size,4); push(0,4); spnt1=spnt;" while(spnt1->advanced == ARRAY) {0 push(spnt1->index_max - spnt1->index_min+1,4);$ spnt1=find_symbol(spnt1->type2);}; spnt1=spnt;" while(spnt1->advanced == ARRAY) { push(spnt1->index_min,4); push(spnt1->index_max,4);$ spnt1=find_symbol(spnt1->type2);};}G/* this routine generates the start of a variable descriptor based uponJ * a struct/union/enum that has yet to be defined. We define this spot asK * a new location, and save four bytes for the address. When the struct isG * finally defined, then we can go back and plug in the correct address*/%static new_forward_ref(int dbx_type){ struct forward_ref* fpnt;A fpnt = (struct forward_ref*) malloc(sizeof(struct forward_ref)); fpnt->next = f_ref_root; f_ref_root = fpnt; fpnt->dbx_type = dbx_type;& fpnt->struc_numb = ++structure_count; fpnt->resolved = 'N'; push(3,-1); total_len = 5; push(total_len,-2);$ struct_number = - fpnt->struc_numb;}L/* this routine generates the variable descriptor used to describe non-basicL * variables. It calls itself recursively until it gets to the bottom of itN * all, and then builds the descriptor backwards. It is easiest to do it thisQ *way since we must periodically write length bytes, and it is easiest if we know( *the value when it is time to write it. */Cstatic int gen1(struct VMS_DBG_Symbol * spnt,int array_suffix_len){ struct VMS_DBG_Symbol * spnt1; int i; switch(spnt->advanced){ case VOID: push(5,-1); total_len += 1; push(total_len,-2); return 0; case BASIC: case FUNCTION: if(array_suffix_len == 0) { push(spnt->VMS_type,-1); push(1,-1);  total_len = 2; push(total_len,-2); return 1;}; push(0,-4); push(0xfa02,-2);  total_len = -2; return 1; case STRUCT: case UNION: case ENUM:! struct_number=spnt->struc_numb; push(3,-1); total_len = 5; push(total_len,-2); return 1; case POINTER:! spnt1=find_symbol(spnt->type2); i=1;. if(spnt1 == (struct VMS_DBG_Symbol *) NULL) new_forward_ref(spnt->type2); else i=gen1(spnt1,0);B if(i){ /* (*void) is a special case, do not put pointer suffix*/ push(4,-1); total_len += 3; push(total_len,-2); }; return 1; case ARRAY: spnt1=spnt;! while(spnt1->advanced == ARRAY)% spnt1 = find_symbol(spnt1->type2);- if(spnt1 == (struct VMS_DBG_Symbol *) NULL) new_forward_ref(spnt->type2); else i=gen1(spnt1,1); i=Apoint; array_suffix(spnt); array_suffix_len = Apoint - i; switch(spnt1->advanced){ case BASIC: case FUNCTION: break; default: push(0,-2); total_len += 2; push(total_len,-2); push(0xfa,-1); push(0x0101,-2); push(7,-1); };$ total_len += array_suffix_len + 8; push(total_len,-2);  };}L/* this generates a suffix for a variable. If it is not a defined type yet,H * then dbx_type contains the type we are expecting so we can generate aK * forward reference. This calls gen1 to build most of the descriptor, andJ * then it puts the icing on at the end. It then dumps whatever is neededG * to get a complete descriptor (i.e. struct reference, array suffix ). */Bstatic generate_suffix(struct VMS_DBG_Symbol * spnt,int dbx_type){ int ilen; int i;" char pvoid[6] = {5,0xaf,0,1,0,5}; struct VMS_DBG_Symbol * spnt1; Apoint=0; Lpnt =MAX_DEBUG_RECORD-1; total_len=0; struct_number = 0; overflow = 0;* if(spnt == (struct VMS_DBG_Symbol*) NULL) new_forward_ref(dbx_type); else{= if(spnt->VMS_type != 0xa3) return 0; /* no suffix needed */ gen1(spnt,0); }; push(0x00af,-2); total_len += 4; push(total_len,-1);K/* if the variable descriptor overflows the record, output a descriptor for * a pointer to void. */2 if((total_len >= MAX_DEBUG_RECORD) || overflow) {W printf(" Variable descriptor %d too complicated. Defined as *void ",spnt->dbx_type);1 VMS_Store_Immediate_Data(pvoid, 6, OBJ$C_DBG); return; };  i=0;= while(Lpnt < MAX_DEBUG_RECORD-1) Local[i++] = Local[++Lpnt]; Lpnt = i; N/* we use this for a reference to a structure that has already been defined */ if(struct_number > 0){; VMS_Store_Immediate_Data(Local, Lpnt, OBJ$C_DBG);Lpnt=0;& VMS_Store_Struct(struct_number);}; H/* we use this for a forward reference to a structure that has yet to beO*defined. We store four bytes of zero to make room for the actual address once * it is known*/ if(struct_number < 0){" struct_number = -struct_number;; VMS_Store_Immediate_Data(Local, Lpnt,OBJ$C_DBG);Lpnt=0;" VMS_Def_Struct(struct_number);& for(i=0;i<4;i++) Local[Lpnt++] = 0;; VMS_Store_Immediate_Data(Local, Lpnt, OBJ$C_DBG);Lpnt=0; }; i=0;. while(i 0). */MVMS_DBG_record(struct VMS_DBG_Symbol* spnt,int Psect,int Offset, char* Name){ char* pnt; int j; int maxlen; int i=0;A if(Psect < 0) { /* this is a local variable, referenced to SP */ maxlen=7+strlen(Name); Local[i++] = maxlen; Local[i++]=spnt->VMS_type;6 if(Offset > 0) Local[i++] = DBG$FUNCTION_PARAMETER;" else Local[i++] = DBG$LOCAL_SYM; pnt=(char*) &Offset;< for(j=0;j<4;j++) Local[i++]=*pnt++; /* copy the offset */ } else {7 maxlen=7+strlen(Name); /* symbols fixed in memory */ Local[i++]=7+strlen(Name); Local[i++]=spnt->VMS_type; Local[i++]=1;6 VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG); i=0;* VMS_Set_Data(Psect,Offset,OBJ$C_DBG,0); } Local[i++]=strlen(Name); pnt=Name;% while(*pnt!='\0') Local[i++]=*pnt++;/ VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG);A if(spnt->VMS_type == DBG$ADVANCED_TYPE) generate_suffix(spnt,0);}H/* This routine parses the stabs entries in order to make the definition< * for the debugger of local symbols and function parameters */'int VMS_local_stab_Parse(symbolS * sp){ char *pnt; char *pnt1; char *str; struct VMS_DBG_Symbol* spnt; struct VMS_Symbol * vsp; int dbx_type; int VMS_type; dbx_type=0; str=sp->sy_nlist.n_un.n_name; pnt=(char*) strchr(str,':');5 if(pnt==(char*) NULL) return; /* no colon present */6 pnt1=pnt++; /* save this for later, and skip colon */J/* there is one little catch that we must be aware of. Sometimes functionL * parameters are optimized into registers, and the compiler, in its infiiteJ * wisdom outputs stabs records for *both*. In general we want to use theL * register if it is present, so we must search the rest of the symbols for D * this function to see if this parameter is assigned to a register. */ { char *str1; char *pnt2; symbolS * sp1; if(*pnt == 'p'){4 for(sp1 = sp->sy_next; sp1; sp1 = sp1->sy_next) {8 if ((sp1->sy_nlist.n_type & N_STAB) == 0) continue;< if((unsigned char)sp1->sy_nlist.n_type == N_FUN) break;@ if((unsigned char)sp1->sy_nlist.n_type != N_RSYM) continue;; str1=sp1->sy_nlist.n_un.n_name; /* and get the name */ pnt2=str; while(*pnt2 != ':') { if(*pnt2 != *str1) break; pnt2++; str1++;};4 if((*str1 != ':') || (*pnt2 != ':') ) continue;9 return; /* they are the same! lets skip this one */ }; /* for */F/* first find the dbx symbol type from list, and then find VMS type */* pnt++; /* skip p in case no register */ };/* if */ }; /* p block */$ pnt = cvt_integer( pnt, &dbx_type); spnt = find_symbol(dbx_type);H if(spnt==(struct VMS_DBG_Symbol*) NULL) return 0;/*Dunno what this is*/ *pnt1='\0';2 VMS_DBG_record(spnt,-1,sp->sy_nlist.n_value,str);( *pnt1=':'; /* and restore the string */ return 1;}O/* this routine parses a stabs entry to find the information required to define< * a variable. It is used for global and static variables.  */Ostatic int VMS_stab_parse(symbolS * sp,char expected_type,int type1,int type2){ char *pnt; char *pnt1; char *str; struct VMS_DBG_Symbol* spnt; struct VMS_Symbol * vsp; int dbx_type; int VMS_type; dbx_type=0; str=sp->sy_nlist.n_un.n_name; pnt=(char*) strchr(str,':');u5 if(pnt==(char*) NULL) return; /* no colon present */h# pnt1=pnt; /* save this for later*/  pnt++;/ if(*pnt==expected_type){*% pnt = cvt_integer(pnt+1,&dbx_type);e spnt = find_symbol(dbx_type);aI if(spnt==(struct VMS_DBG_Symbol*) NULL) return 0;/*Dunno what this is*/bJ/* now we need to search the symbol table to find the psect and offset for * this variable.a */a *pnt1='\0'; vsp=VMS_Symbols; ' while(vsp->Symbol != (symbolS*) NULL) y* {pnt=vsp->Symbol->sy_nlist.n_un.n_name;- if(pnt!=(char*) NULL) if(*pnt++ == '_') _C/* make sure name is the same, and make sure correct symbol type */S< if((strlen(pnt) == strlen(str)) && (strcmp(pnt,str)==0) ( && ((vsp->Symbol->sy_type == type1) ||* (vsp->Symbol->sy_type == type2))) break; vsp=vsp->Next;}; ' if(vsp != (struct VMS_Symbol*) NULL){eC VMS_DBG_record(spnt,vsp->Psect_Index,vsp->Psect_Offset,str);};o) *pnt1=':'; /* and restore the string */s return 1;  };o return 0;} 4VMS_GSYM_Parse(symbolS * sp){ /* Global variables */: VMS_stab_parse(sp,'G',(N_UNDF | N_EXT),(N_DATA | N_EXT));}r@VMS_LCSYM_Parse(symbolS * sp){/* Static symbols - initialized */! VMS_stab_parse(sp,'S',N_BSS,-1);e}yBVMS_STSYM_Parse(symbolS * sp){ /*Static symbols - uninitialized */" VMS_stab_parse(sp,'S',N_DATA,-1);}kL/* for register symbols, we need the symbol pointer for the current routine,N * since we must figure out what range of addresses within the psect are validO * We will basically assume that the register is valid for the entire function,eL * although this is seems absurd. The compiler does not give us enough infoM * to place more intelligent bounds on it. From what I have seen of the code/O * that is generated, it would seem to be a pretty good approximation, however.t * Caveat Emptor.U */FVMS_RSYM_Parse(symbolS * sp,symbolS * Current_Routine,int Text_Psect){ char* pnt;n char* pnt1; char* str;e int dbx_type; struct VMS_DBG_Symbol* spnt;h int j; int maxlen; int i=0;T) int Min_Offset; /* min PC of validity */) int Max_Offset; /* max PC of validity */r< int Max_Source_Offset; /* PC of last source line in file */ int This_Offset;t symbolS * symbolP;r0 Min_Offset = Current_Routine->sy_nlist.n_value; Max_Offset = 0x7fffffff;c Max_Source_Offset = 0; F for(symbolP = symbol_rootP; symbolP; symbolP = symbolP->sy_next) { /* * Dispatch on STAB type */t, This_Offset = symbolP->sy_nlist.n_value; switch(symbolP->sy_type) { case N_TEXT | N_EXT:? if((This_Offset > Min_Offset) && (This_Offset < Max_Offset))n Max_Offset = This_Offset; break; case N_SLINE:& if(This_Offset > Max_Source_Offset)" Max_Source_Offset=This_Offset; } }J/* if this is the last routine, then we use the PC of the last source line; * as a marker of the max PC for which this reg is valid */t= if(Max_Offset == 0x7fffffff) Max_Offset = Max_Source_Offset;r dbx_type=0; str=sp->sy_nlist.n_un.n_name; pnt=(char*) strchr(str,':');h5 if(pnt==(char*) NULL) return; /* no colon present */ # pnt1=pnt; /* save this for later*/t pnt++;o if(*pnt!='r') return 0;& pnt = cvt_integer( pnt+1, &dbx_type); spnt = find_symbol(dbx_type);L if(spnt==(struct VMS_DBG_Symbol*) NULL) return 0;/*Dunno what this is yet*/ *pnt1='\0';, maxlen=25+strlen(sp->sy_nlist.n_un.n_name); Local[i++]=maxlen;  Local[i++]=spnt->VMS_type;  Local[i++]=0xfb;_/ Local[i++]=strlen(sp->sy_nlist.n_un.n_name)+1;  Local[i++]=0x00;- Local[i++]=0x00;) Local[i++]=0x00;i- Local[i++]=strlen(sp->sy_nlist.n_un.n_name);e pnt=sp->sy_nlist.n_un.n_name;% while(*pnt!='\0') Local[i++]=*pnt++;y Local[i++]=0xfd;n Local[i++]=0x0f;t Local[i++]=0x00;r Local[i++]=0x03;c Local[i++]=0x01;i4 VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG); i=0;1 VMS_Set_Data(Text_Psect,Min_Offset,OBJ$C_DBG,1);r1 VMS_Set_Data(Text_Psect,Max_Offset,OBJ$C_DBG,1);d Local[i++]=0x03; ! Local[i++]=sp->sy_nlist.n_value;c Local[i++]=0x00;N Local[i++]=0x00;n Local[i++]=0x00;r/ VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG);i *pnt1=':'; A if(spnt->VMS_type == DBG$ADVANCED_TYPE) generate_suffix(spnt,0); }iN/* this function examines a structure definition, checking all of the elementsK * to make sure that all of them are fully defined. The only thing that we I * kick out are arrays of undefined structs, since we do not know how bigwG * they are. All others we can handle with a normal forward reference.e */ (static int forward_reference(char* pnt){ int i;c struct VMS_DBG_Symbol * spnt; struct VMS_DBG_Symbol * spnt1;r pnt = cvt_integer(pnt+1,&i); 6 if(*pnt == ';') return 0; /* no forward references */ do{ pnt=(char*) strchr(pnt,':');e pnt = cvt_integer(pnt+1,&i);* spnt = find_symbol(i);*6 if(spnt == (struct VMS_DBG_Symbol*) NULL) return 0;C while((spnt->advanced == POINTER) || (spnt->advanced == ARRAY)){o i=spnt->type2;% spnt1 = find_symbol(spnt->type2);i# if((spnt->advanced == ARRAY) &&]- (spnt1 == (struct VMS_DBG_Symbol*) NULL)){n" printf(" Deferring %d \n",i);};# if((spnt->advanced == ARRAY) &&h5 (spnt1 == (struct VMS_DBG_Symbol*) NULL))return 1;e5 if(spnt1 == (struct VMS_DBG_Symbol*) NULL) break;d spnt=spnt1;e };n pnt = cvt_integer(pnt+1,&i);u pnt = cvt_integer(pnt+1,&i);/ }while(*++pnt != ';');d* return 0; /* no forward refences found */}tO/* This routine parses the stabs directives to find any definitions of dbx type I * numbers. It makes a note of all of them, creating a structure elementcM * of VMS_DBG_Symbol that describes it. This also generates the info for thetL * debugger that describes the struct/union/enum, so that further references( * to these data types will be by number */a(static int VMS_typedef_parse(char* str){ char* pnt;p char* pnt1; char* pnt2; int i;n int dtype; struct forward_ref * fpnt;a int i1,i2,i3; int convert_integer;/ struct VMS_DBG_Symbol* spnt;  struct VMS_DBG_Symbol* spnt1; /* check for any nested def's */ pnt=(char*)strchr(str+1,'='); if(pnt != (char*) NULL) b, if(VMS_typedef_parse(pnt) == 1 ) return 1; /* now find dbx_type of entry */ pnt=str-1; , while((*pnt <= '9')&& (*pnt >= '0')) pnt--;( pnt++; /* and get back to the number */ cvt_integer(pnt,&i1); spnt = find_symbol(i1);N/* first we see if this has been defined already, due to a forward reference*/, if(spnt == (struct VMS_DBG_Symbol*) NULL) {: if(VMS_Symbol_type_list==(struct VMS_DBG_Symbol*) NULL)J {spnt=(struct VMS_DBG_Symbol*) malloc(sizeof(struct VMS_DBG_Symbol));1 spnt->next = (struct VMS_DBG_Symbol*) NULL;) VMS_Symbol_type_list=spnt;} elseeJ {spnt=(struct VMS_DBG_Symbol*) malloc(sizeof(struct VMS_DBG_Symbol));% spnt->next=VMS_Symbol_type_list;(# VMS_Symbol_type_list = spnt;};+/ spnt->dbx_type = i1; /* and save the type */ };vI/* for structs and unions, do a partial parse, otherwise we sometimes get K * circular definitions that are impossible to resolve. We read enough infoGE * so that any reference to this type has enough info to be resolved l */n6 pnt=str + 1; /* point to character past equal sign */$ if((*pnt == 'u') || (*pnt == 's')){ };Y$ if((*pnt <= '9') && (*pnt >= '0')){9 if(type_check("void")){ /* this is the void symbol */s *str='\0'; spnt->advanced = VOID; return 0;};1U printf(" %d is an unknown untyped variable. Contact programmer.",spnt->dbx_type);), return 1; /* do not know what this is */ };z/* now define this module*/s6 pnt=str + 1; /* point to character past equal sign */ switch (*pnt){ case 'r': spnt->advanced= BASIC; if(type_check("int")) {u0 spnt->VMS_type=DBG$SLINT; spnt->data_size=4;}# else if(type_check("long int")) {n0 spnt->VMS_type=DBG$SLINT; spnt->data_size=4;}' else if(type_check("unsigned int")) { 2 spnt->VMS_type=DBG$ULINT; spnt->data_size = 4;}, else if(type_check("long unsigned int")) {2 spnt->VMS_type=DBG$ULINT; spnt->data_size = 2;}$ else if(type_check("short int")) {2 spnt->VMS_type=DBG$SSINT; spnt->data_size = 2;}- else if(type_check("short unsigned int")) {t2 spnt->VMS_type=DBG$USINT; spnt->data_size = 1;} else if(type_check("char")) {b2 spnt->VMS_type=DBG$SCHAR; spnt->data_size = 1;}& else if(type_check("signed char")) {2 spnt->VMS_type=DBG$SCHAR; spnt->data_size = 1;}( else if(type_check("unsigned char")) {2 spnt->VMS_type=DBG$UCHAR; spnt->data_size = 1;} else if(type_check("float")) {2 spnt->VMS_type=DBG$REAL4; spnt->data_size = 4;}! else if(type_check("double")) {+2 spnt->VMS_type=DBG$REAL8; spnt->data_size = 8;}! pnt1=(char*) strchr(str,';')+1;e break; case 's': case 'u':) if(*pnt == 's') spnt->advanced= STRUCT;i else spnt->advanced= UNION;n% spnt->VMS_type = DBG$ADVANCED_TYPE;f' spnt->struc_numb = ++structure_count;o- pnt1 = cvt_integer(pnt+1,&spnt->data_size);c& if(forward_reference(pnt)) return 1; pnt1--;e pnt=get_struct_name(str);t# VMS_Def_Struct(spnt->struc_numb); ד~SAVE.SET3 '&-[VAXUSERS.ERIC.GPLUS.NEWAS]VMS_DBG_MODULE.C;1a@"3 fpnt = f_ref_root;, while(fpnt != (struct forward_ref*) NULL){) if(fpnt->dbx_type == spnt->dbx_type) {_ fpnt->resolved = 'Y';b% VMS_Set_Struct(fpnt->struc_numb);d) VMS_Store_Struct(spnt->struc_numb);};o fpnt = fpnt->next;};t# VMS_Set_Struct(spnt->struc_numb);I i=0; Local[i++] = 11+strlen(pnt); Local[i++] = DBG$STRUCT_START; Local[i++] = 0x80;( for(i1=0;i1<4;i1++) Local[i++] = 0x00; Local[i++] = strlen(pnt); pnt2=pnt;, while(*pnt2 != '\0') Local[i++] = *pnt2++;/ i2=spnt->data_size * 8; /* number of bits */N pnt2=(char*) &i2;=+ for(i1=0;i1<4;i1++) Local[i++] = *pnt2++;l5 VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG); i=0;O if(pnt != symbol_name) { pnt += strlen(pnt);, *pnt=':';}; /* replace colon for later */ while(*++pnt1 != ';'){! pnt=(char*) strchr(pnt1,':'); *pnt='\0'; pnt2=pnt1;% pnt1 = cvt_integer(pnt+1,&dtype); # pnt1 = cvt_integer(pnt1+1,&i2); # pnt1 = cvt_integer(pnt1+1,&i3);n3 if((dtype == 1) && (i3 != 32)) { /* bitfield */v Apoint = 0;  push(19+strlen(pnt2),1); push(0xfa22,2);r push(1+strlen(pnt2),4);  push(strlen(pnt2),1);;+ while(*pnt2 != '\0') push(*pnt2++,1);r( push(i3,2); /* size of bitfield */ push(0x0d22,2);n push(0x00,4);e& push(i2,4); /* start position */9 VMS_Store_Immediate_Data(Asuffix,Apoint,OBJ$C_DBG);a Apoint=0;s }else{" Local[i++] = 7+strlen(pnt2);! spnt1 = find_symbol(dtype);i, /* check if this is a forward reference */0 if(spnt1 != (struct VMS_DBG_Symbol*) NULL)" Local[i++] = spnt1->VMS_type; elsey$ Local[i++] = DBG$ADVANCED_TYPE;# Local[i++] = DBG$STRUCT_ITEM;r pnt=(char*) &i2; . for(i1=0;i1<4;i1++) Local[i++] = *pnt++; Local[i++] = strlen(pnt2);0 while(*pnt2 != '\0') Local[i++] = *pnt2++;9 VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG); i=0;0 if(spnt1 == (struct VMS_DBG_Symbol*) NULL)! generate_suffix(spnt1,dtype);i3 else if(spnt1->VMS_type == DBG$ADVANCED_TYPE)B generate_suffix(spnt1,0); }; }; pnt1++;-& Local[i++] = 0x01; /* length byte */ Local[i++] = DBG$STRUCT_END;5 VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG); i=0;e break; case 'e': spnt->advanced= ENUM;/% spnt->VMS_type = DBG$ADVANCED_TYPE;' spnt->struc_numb = ++structure_count;  spnt->data_size=4;# VMS_Def_Struct(spnt->struc_numb);r fpnt = f_ref_root;, while(fpnt != (struct forward_ref*) NULL){) if(fpnt->dbx_type == spnt->dbx_type) {| fpnt->resolved = 'Y';a% VMS_Set_Struct(fpnt->struc_numb);e) VMS_Store_Struct(spnt->struc_numb);};S fpnt = fpnt->next;};,# VMS_Set_Struct(spnt->struc_numb);  i=0;% Local[i++] = 3+strlen(symbol_name);a Local[i++] = DBG$ENUM_START; Local[i++] = 0x20;# Local[i++] = strlen(symbol_name);h pnt2=symbol_name;e, while(*pnt2 != '\0') Local[i++] = *pnt2++;5 VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG); i=0;S while(*++pnt != ';') {! pnt1=(char*) strchr(pnt,':');r *pnt1++='\0';t! pnt1 = cvt_integer(pnt1,&i1);W Local[i++] = 7+strlen(pnt);e Local[i++] = DBG$ENUM_ITEM; Local[i++] = 0x00; pnt2=(char*) &i1;- for(i2=0;i2<4;i2++) Local[i++] = *pnt2++;r Local[i++] = strlen(pnt);J pnt2=pnt;, while(*pnt != '\0') Local[i++] = *pnt++;7 VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG); i=0;t pnt= pnt1; };# Local[i++] = 0x01; /* len byte */i Local[i++] = DBG$ENUM_END;5 VMS_Store_Immediate_Data(Local, i, OBJ$C_DBG); i=0;a pnt1=pnt;C break; case 'a': spnt->advanced= ARRAY;% spnt->VMS_type = DBG$ADVANCED_TYPE;eA pnt=(char*)strchr(pnt,';'); if (pnt == (char*) NULL) return 1;p- pnt1 = cvt_integer(pnt+1,&spnt->index_min); . pnt1 = cvt_integer(pnt1+1,&spnt->index_max);* pnt1 = cvt_integer(pnt1+1,&spnt->type2); break; case 'f': spnt->advanced= FUNCTION; % spnt->VMS_type = DBG$FUNCTION_ADDR;s( /* this masquerades as a basic type*/ spnt->data_size=4;) pnt1 = cvt_integer(pnt+1,&spnt->type2);  break; case '*': spnt->advanced= POINTER;% spnt->VMS_type = DBG$ADVANCED_TYPE;l spnt->data_size=4;) pnt1 = cvt_integer(pnt+1,&spnt->type2);O break; default:l spnt->advanced= UNKNOWN; spnt->VMS_type = 0; V printf(" %d is an unknown type of variable. Contact programmer.",spnt->dbx_type);$ return 1; /* unable to decipher */ }; K/* this removes the evidence of the definition so that the outer levels of ;(parsing do not have to worry about it */ pnt=str;=( while (*pnt1 != '\0') *pnt++ = *pnt1++; *pnt = '\0';l return 0;}m/* pJ * This is the root routine that parses the stabs entries for definitions.= * it calls VMS_typedef_parse, which can in turn call itself.)I * We need to be careful, since sometimes there are forward references tosK * other symbol types, and these cannot be resolved until we have completedn * the parse.s */int VMS_LSYM_Parse(){r char *pnt;s char *pnt1; char *pnt2; char *str;s char fixit[10]; int incomplete,i,pass,incom1; struct VMS_DBG_Symbol* spnt;; struct VMS_Symbol * vsp; struct forward_ref * fpnt;m symbolS * sp; pass=0; incomplete = 0; do{N incom1=incomplete; incomplete = 0;n2 for(sp = symbol_rootP; sp; sp = sp->sy_next) { /* * Deal with STAB symbolss */a, if ((sp->sy_nlist.n_type & N_STAB) != 0) { /* * Dispatch on STAB type */i0 switch((unsigned char)sp->sy_nlist.n_type) { case N_GSYM:  case N_LCSYM: case N_STSYM: case N_PSYM: case N_RSYM: case N_LSYM:l3 case N_FUN: /*sometimes these contain typedefs*/a! str=sp->sy_nlist.n_un.n_name;c symbol_name = str; pnt=(char*)strchr(str,':');p! if(pnt== (char*) NULL) break;; *pnt='\0'; pnt1=pnt+1;(! pnt2=(char*)strchr(pnt1,'=');) if(pnt2 == (char*) NULL){h# *pnt=':'; /* replace colon */a# break;}; /* no symbol here */i* incomplete += VMS_typedef_parse(pnt2);H *pnt=':'; /* put back colon so variable def code finds dbx_type*/ break; } /*switch*/ } /* if */ } /*for*/ pass++;7 } while((incomplete != 0) && (incomplete != incom1 )); 3 /* repeat until all refs resolved if possible */*7/* if(pass > 1) printf(" Required %d passes\n",pass);*/r if(incomplete != 0){ a printf(" Warning: Unable to resolve %d circular references. Contact programmer.\n",incomplete);t }; fpnt = f_ref_root;n symbol_name="\0";+ while(fpnt != (struct forward_ref*) NULL){L if(fpnt->resolved != 'Y') {s' if( find_symbol(fpnt->dbx_type) != ," (struct VMS_DBG_Symbol*) NULL){7 printf("Forward reference error, dbx type %d\n",i fpnt->dbx_type);s( printf(" Contact programmer.\n"); break;};r fixit[0]=0;d/ sprintf(&fixit[1],"%d=s4;",fpnt->dbx_type);i& pnt2=(char*)strchr(&fixit[1],'='); VMS_typedef_parse(pnt2); }; fpnt = fpnt->next;};}a`g~SAVE.SETq v~dLE.C;10V6*?j.蝰Mx^Y"Syހfxu;\aV`3*#{ :Hr@GAH=; `y䈓=@Z䗉lyǀ-cMM/"CY5hCU qc2jԞ;ʡTBXk)v 7I5,hG*V68{4}0,Id֊~_Z`?EE;&qoKDy35D ;ĩ~]"u&]~fs~qFo.dDp0~p>6Q0;+wF#GXx}t&F0;>8"quL-`?V.YoxqD=엯J`&ZV/ټ nOc?& UDˢYɅfe2[ܧ|<<YV R])a~hN\9E`vvW!fmʮ6Jm0XA"g1| YN(2> Tذ2ЅûNq4z~/A;{\K*t'۹G+g o/#}6` _:Z±!p8jP~|]+ܯ%g,ʿէ~$UR:MDS%s}xgEfy0COjeV6H;С¾쒯j)wI5WuhVIqy,׬ȗ=K -bs=w(B9ˎ]'ȏih8$/ ʓA1 P؜3_vKO[r-]XS~uP7O_O(x Ϥې{P]*DqأjdKɥ!8ʸv"ZOqږK6 vm4/Rܰ}?@Mךhcxl64:iϸ$(MA4Ȁ5hAsIzeSߩb:Ɵz4Hzy0ڄ"?n>%1u=zs8cȉk PvUR6:yn|I *2/GA?N} P8-ħe4/m.1o!U$kU8a۔,ܕz^Oh#_ زG[N ӦSI_ ۽,rIr6Ԯ7$5^"7` SXZ'8\ S d~xĻh}%%@1Oˣ/F'j`|j΄ia:IHVvrc=4CeUXx$zUn0l' d(y7ƪ׮ mxݵ|Kxw2뎽8Aw;%Q妌sPB)j*YQKr6LU&-/AᚽբnL:6h H0hɷG6<).Ҷ[dL0]a<-Ϥ+!=I*[1t:(Ws!˫]駒u`dvo@O,aդ x"@V;QD^/ÂXMZifOj"Qf%&wnRd}gPU'JpwG ;.+kLvonxr-Ǒֈ0Sne^ M^RKeNgd<=]tRm2DG4<ty"Òu̱7$>3Wb)u0)t%DC# N*t-dߍd?XLAš~wTlˏ?4hV!w&MPLtpl/4:xT5} esUe KQJeոނSYmnVL\Tz>ML$Si;'b>%O 16?f],Rn6fwgrl3'(x%_I8iAP}ݡ^i9%C?>/ riry{E|t+Dì6R5 d6.3(̌xIt(Һa` F/"T8e+?Ktr!. WM?OLhe97K텏~դ/IBFtr 3c@5gZ/5. ?΃i.k%&;oTFw%Ϫ̻߆:UZ9:Di?+f#PBlP, bm4#SmU g1fF?%>ha1iXpmfUˋe@aBCQ{{1_b_ѽjhFOȈEu_K2j3G,7񵢑Om<;a.emT&ÜY7PƟ`b<`O45RUፙQC#秲pMvL;I/[,a{{3ɎT4VUX kA(1o?SۢDkݭ:F @xxRC2StJˬ͕>%S7?nb$G 5e^5}/FnjކEQw6ea$g{:(KDžfrR1"MA fg};>sףne^i2駡LUyJNo#aB:>+>4(c*o?[Fe73kdfBZ֜骄_󀡚+G[<'TjvH^TǞl<3\5v?Vb\]w+Oydm¤֋ P+"Cʮ4)~XݑydnnhNs|"|@M$Gԫ\S[>fOD0")/yFE* /؉iNzFZ@(BE+1ͭYڇMiSbGrS>!SYı?!hOjƇ(1g?]ZjR:q_C#$]^f{b#Ŗ̝$k5oBl2$(//CZ)òФ ad>0UQ|#8n{IW6Pf>#+0_@qPYh qmR5"󖆊H -ׄ RAygz CMz56xuJ9E(TWx!w,}SA9, 5t̡qcÁCk61'YL@O; BQ> X 8шOϷ(݁0` ģl|x?1]^eԐx^٠ʇ2EQ*H.5ru[`Ђ lp %*k*62_q)Fbbu2#~咛y ?S򬊯oyK:v[oKBxh ᒏ?gs\Vʤl 4T$.(8o7قߝv8-nטRL =gFh \5K<^OCOx*?|A&{D_*fCijgI)!ӳP_-aT6r߽Id^ZgQt%vL{qDa{暨Ir(zzƝ/G|Ǫ̃CԖ-_ɮb-ͫTjLFg;SC↬f7LPFj%:ZNg?t!ܦɾ1s S's9Cde._({]&2Y03{*_Fý=vaux !M$nNAၩ,ZƤs"\@ 6''ѹ^;nL/XϏi'Ox_bB3~uR%. eP`2Ds#) hb CW6ZP[$ yeOPT yv $A@(:ג#lyMS- (&Ûc =a[ 'NgF{ulJjH%Zg.陠DZj|7Jkԛ$۰?㴜4iBιxX`Hm`Eؒ7 {mИ۶2P@(>,$dYͰ0 '>Pݗ`lX^ L.&GyH. 8֘Wxf>E9ː4ֆV9ڈ8ri`WpkX )W9Qe8|^hRQ2w_:V\c DVLFcyBmnliV' `1QYJ4 CYYvό5c PB|(F7y1!2u %<e2Rk+٨LӧT0$K9剣#B~HFGLzgf ƏpDn-X iԪH`(8pszn/I*Uӯ~OOyö)ccuj i6Ӽ:.xȁҮx^JU:O|]ÊHs'c) @^jdp @1m\K~QHf/P*\iiY6gCuŜ[>͒N `\!i[NcKսpϮbZA.Ȕr+E_΃ѪLxD.@0gHN k|!'WZS8ӆM<|JnˋZceM'y@ `-9 * slsl~ #75iJ}c l|Ydِ=rWvA.DCnmT x;$ UZGRM2xrbaT9`$ʏ62weFcDةEkǬT3 sU.@{ŋ|,ubWLԃٵ"s5g064Fr yhgukɿ0ڀwBGrDi; R.ֳ&4C>ߑ49!:x~ Ď`<]AŭĔ pu!o&d ho-QVV H2}552Իɒ M[י¼N(D -z%7"o` h<͉xx,ǂO6ZcD]!0uF/HX͵;KmL;튒Kҍ2$G8IE?+h]Uy K 9rCP#zXe7㳫}cҡh]㩺,G,X({I 煥{cu-Emt)Li^ru.a\hSUgͅ}n-v5'MCYKsu8*< &}O@\|#dH/]C5wӦU!ȫ[L:NKZe!V{I5D,JCt4rm#)q}Jm F{" Mnu(DGkQ"ƓcЯ*{ѵxgEGO*V!;vEktmYY겪VRPYK-|YxR֥p4|QV:oa pHHvIY9CghWӵ|e,nп$VX G7}3-s/T̑u\W1*Zy\X$Õ(_CqK 0Rwwb摀\L 4 F9Œ|, =lܻw:a!O9.E xNax¨ *(fxsMf WfކauȺY?Kj>~9()5*gVԄk `I n<#:ᢓA_cV:ius9or7PdsԓE //X\ڈLLϤF#9>:8Wd$~*Y$gWP0+ RWم0[..ߜTm[f[3o@`w '{}%i`i H!| u|AΠD\ELev6Bq/!4aJ;+r>S*v/ %\Y' *'g;3r"7q׺ҋ!l8Z*/«;ں0kIfd?{>c~0'<]cj5qO>QW>6Fwfң~)𦨮gvN"aM$S9{#]UGZSDCz+ mIMYAЈiXaz*4*L ALZ 1R*;#V7r;J6Ψ$jݒoXAH&gJDŽb5ɡUEDrϓnk\iFpESd$KkK]ŅQޘZ-:C7^ރ=IW-Iq∰B41-2$4.!8s/ѮaP-nWl$rU{|%;x7!a3p_Qg)e:PXla@D1Xw)Zoʁ/]7[0jPÏ4y,|WLM,qll9, a啎8T6ڎ5O9[C/ʼ7I7abXa Kv  6Ia%c6IH?dn*7(|ESLFPϦ/76}ZM-*ŲZqF9kqJr] ] F`kM.LS  ͢km`Ls}nCbF:`4j"CY-ĨN]䪁z *X@]"@ɽDlEuO7^zk/;-)9~s!G5T5micC*FL=~<8 ^+\Ǿh7 ߷)#,Ϊ.jm n]quA *o扡S?xT皾e籬UaR0-1q:ȨrohӯuȌd){ux⹄Un\buTٻgP%&sb.kI4ɧꚌDs' RjE#gjby9A-@<|MHv1.*R3M];J~IHE-h PL>m)|467Əubb;5 uY&wIQ >Ë9r@wP3Px05Vc^ wbeV1BZި hvgA٫+W s\ϔ+]7-=5+"kԸEۙqm|[OKZ4i?GJL6$jnߖ7/ nz(L5zd,IA31u$iqx^#9@\4G5K aUWG1s|W"c5˴>k b5C{R#IviCFY0+!Rx .% Ht̩ɒd*bj@ח*ųwGb8;쾰偪.a*j_<Op$oR..xT 5 JkV=-g„ln{j2qv v H ')͖ B/rO0Gmo E$38T [M=u䘑>yWjT Yݱ0BaJW 69hAUa)>rT9׈%&[OuzGAt ~`ٶho[2Bp~w+Q3B덝RE5ΨJ⹞Yp=LWl?<,PTZNzW#yxOVѴnJFTu\-7 % 4Z:|JR3W Q Z0jHm\Zf 2D.rI3bώxH*wTX1kt6JT`'ư·mpN?WPdS5{=ӄW6L~rZTO2w 5k `̿;r/}7QQ R`Ep%}109)y*A6(.SϨHt?WR[i'@U|&Kw6;A[VأԊzrӢegRYQ *n[Kβ4iTI'ЭKzoخ44olc 5qw n}vL {Fsmf-IlH6սy[tbZ2ؓ-z܄^"nk+5 ɩS<ߛ`~I1Uɘ󔁑J3;P[x'qy @tL[G{  9e߻G$HǎäAk3Ի?R~%"Iud0pznI؍X#Ww_$֢/-,y~ps.zE-+ZjyeԶ81/}FH\eٔ`L (A Ϣh[Vz \J)ַsW׭DdZ!*RO+/0b.0d")fuPáh1~m{EU+HG))%W%Y^p+?=ٝF >jffVm"b azych1o(U?}[ xb x̑wJqYS.7TvJ GE*#d'}Mj< A3T@X){0$L< 7TuMlN;/'AC:啘k9l3ҔW7ZDe۬]-VB1*¿&D!@TzdVΚzAZE<+vZIM%)8 t[WjR+fPd ̝WW_K缌ƝyOs9 A.Y,.K9""!&%sXLP+0<t%t:L;@Z$LRGշJ <$I/'"gmLiݜ,g܁q5vYNFA(-do#p+;SjݾDvSq_&9 5y≵Lk89VCI\10~#Ѻ\yn]ϲ[(RqۼWTnf+팯 7Uy+C .xA޲ggN>Q&b3տlBhqhbªbC}*]uGD3 &遼*NړqBI~:h^mbOjPT*+0R~qך=oZTsD;uq4!5n+=fi^|BT=JE#Qxi*:o$o ̏ DPF {&>S d Sy؜(Vmpo'bLqθ=+ +]k>򤓑\$B>  (%,CFM>uBv *:RIfEŮN-m4*?ڵxE1|̸P=f$/q չL$] bbi&~Q /~#A ZJC0$oUN#X]60FTET^ )^-[25pзki n` 4aǝK3g+wɜ=5=/o:Y2G8`S1CKufssDbϋÓv A:7k'#Lφ`0/:?ᨈ9Bs'yK]JM/GDZ9`hDg`[khI}L #>;֕( @acj7=<뛮4haSqz:Z qoUĩLT~̸VrGH.[$Q[6;|lަ)ΖchMUQUER,Ǘ sK>x<M7is(# 5`~Oq7Ip, OGnvQ670 F*ٜƷOfBr+:.${u2b,?nb[E=h!NpSUhD ˸I=Ǫ+/!8cV74x|M"FkyJk)sz!1 Z-K?>3OȟrLh T1'~Vvv|ϮڡSNc\^wHd"GNІ#,]ݞBD=cdTvh&MU@zY+<q #$[Wo+ޥL 2F`l5F.0v\+{Ov) c6A J_aj7 ߉xUHI$̶=2`\VTg!~EJʇАFw7"% : E1TU7b M>=ZRYJdИbF\]]QE:0@642]U(uhYx\aznq\n{GjܜPdEݿj~`dbwoRʕ'yx[W3'V ;(%FSElT)I ο[G1jKBj[ iDK !wdBA<{Ktm+GTb<\eJQd-bC'19$W䍼:v ) `>Le=@iX`]D] aR+LoP?:wy6 $|CY 1 u#<1 ټb'Ϳ=h)e"X;ȲlI PEͥt"v.r),xvNjVĢ1rbJŧRZzL^2.J95} bccNm%~KX `c}Sz6F'P7.Ϻ^|)R0;IP^'b+5E3t㒚v_ō)|+GNzJv`sNJqJX--ؗksMpV_I o &r:pr)" =؛ eDʨ4"jyth^KF#}YWqÞU3uEuԞH:ͨРv\v"4ܛH D(dħmAoŚ,jzD93 *Z-#s?`'0rE )_4A;5 cSoMiL}@i C،Qm$*""x7rLrICAA˂&czaHTZGdoHpr{ӣ+%0D&Zy3^{"q\"lXIF4/,M-/u ~B#ݜ&9t Uq%U(^C`,ߊ-x8SИ^qRRF(nEk'W(o;!)Ϥqw|V&{H{KkM$ķ(ѳ7mgui ˶V|80H&$o'_Tit2 )[pc-k}Gc8y1\7Sh\A1;2Z]CnsDk+}\Cg 5^~L*rIDFjj0#tܲ;?x xz>6w|ؓ 9|U1vuF|YGcs|'VHV^?.ڞӠ )ΆƸn 91 IYJA!\o$XQ6ew7pjq$DO~ )u4FΠsc ^i]Coڳ''Bj[1^i85俀_+\*nCK<;cl.NssB#/D>&A+<._,ЧxpۆȐ"ͫ\pn["H`}y?ahB`ql~hQV(Q>Gq+V=sHAk[F]r_!kejϸ%! G ;=*@CN 7w>&HP򎘀RYٽu(6&R]8(ڥi~+ypJ)Ÿ92tElc`]OTk-h!:?~LpHcUe+|& yПD x+v{c_ژ[Drg;rGrZ}ȟzG Uxm"øCix1k+9xg0lB{ C'52 {)51++vα//= k 9֬ةp 8, vhȸJI؜; pqvi%.#Q~{,r(۸T8wia +~DHTVt$s2Ć݌À Wʧ!ύkn8HF;oU,ӯոZ9”HYQ{|#qۍ3,@-,8wFZIw&HGdC1\/G@j%b¹bGmngKՇVeĆJV@cHyɄUnk!5k5I+>~as)a־ Ap8(n,Gi N_KJ Te(Ϯw]g/AuW"Xpeaʩ)!&K` e>J!4ĢDIOxvhWplCAy[垀5z27ʿ=HuC9y]%!4.D^p3v+Bd@L?.Zʥ&['ZzBKN'r  lV(w"^\^`7p"dˉ"YWQ(eXaF 'd}d LpȺڅNc]휚~67WqaM@F߼w(^AԓIĺCǗ JG@D'fP`tdHp.2GӢvgR}'q8K[<=ed ۂy[J&a2 6Y'UmŠi\(;pʚL6ͯg|.;bHПOc 4͎TH3fsjA5D(Qyr}X'3y&x+ ?lT:Տ!\,a8 ?#DQKF}lAͻ5\8uKd㣎yR:i T_qD:aZƕEYo1Xhk*pX85W 6#+#qљއxHxCTE*+TD}?Ҹz~Lؕ]nv\ap;F[̠P. .UQ3(SWd, -] On1JN@cb~̌&rsżk| Zr'H9A?\&ݺm쬿Mmcdg*T8Q$&6t{2LYn#Ye>!Ԙ9KoQy[ͳe"h; 0^iEM;~VwBkR{o?\y~ULܾ?^9exiQ8Z[^PO"A}15U;[8|5TwV-vbSX:)96fqCvw+/W`6UBEX-af pL)FY q 1}yg$=.fO޳ .lQlMnDfֵZu`"S7Dyc)d95G ' G["\?IB]/),+ yPfU26I?WyI?25vk2~r5FO|]#xD/6eD_iZ}L2WcA#DZj-Xl#{O˪E`RdO%̤+RkMl ђ DE:"Gc_x]+\S nD.axWvc:G%]5y ݏ#cTܙ6=0,Z5Ew 0rar.E2Wvǫ%@t'Ey(Np6{Bh@gJ"q7B)wpiIS?B4}^zx[}EMtyROe΋ˎ@ID픍Gkn]_:PfxTPN?OX*],OnRCqVbbo-@ށg@wmHT_RO VQ㯃~f5sjRSz|a'Gs :4V} ޒ9L_Um՜?CW6\+[pfmnU;-C,nEhkhZ~O$|pA$eV` U?fcRI쪢 Vh՞kae$D%v|IbTO.\]UsͿX^p^0Y`_4}:nA+%C((y}52lU'x buP|xX >YI 95ȘQ2`do7um?@B{[C'*4nBZq}h0!<,u*hݽQ6AC3kswN۸p.9*a-񊳊U ^ w&& qLe-Duړw1ʼnfOD*Zh-b-@pa7ʝa 9\ ?{Dmp kL|OD3)?, r;X/qi(ۢUw(  b-xp-)A^S<@тk~о)CmW Ѽso oG51{_F.)bZ14q$lV(`j'y;}Nѳk\'ݥ؃X?"A]v!LlFga3y*i,'=wG J~@k!Z';iᷙ8w1(W>Zc/uaUm' 9EȊ$Ǧ}Q237B3#pt_$˄('L_,w6%R&s"y&DDhg Qy'uJq ݽbyhlr(jݔOGiR0ځ@+,q/bܵ_BF'@ZD@IڬM]?u%9eFįL$qzDՄ}$4-FsHpB1 ny'fg@sAXfYZ1;.sDgS[);HN2 S( a 3C_Gk.S~<(#2ph tڍB[0F""8:[sb{*c$V/(ݓRaoy%WiO"|C@Ni寭:ƯGDAFT[brn5F"θcS|IS; 0W$eeNgٝN!@Z*>< -MMG-Lez&0]V"TÅb,Z @uͮ7XY֙Gep k'2rMS/{@˙M+S}P?h;8҉୾_ $kƜ9h j_]QZeVMNUTuGN+tG͈EguuQIꜫQ]caN;q5;4bp{>3܏tpb'n?ANenc[56-HʇhLz%;|}kKhS8@J*jx͡G?z[\_z7x^_& HՐ Qz,!2$J\t% KKk}V Wΰ&ftOF4bF2xlهd^ sm=׸ٿ7(`,˨O=%.ѷ#O~5 7)xCWmз@f$0y[S}6xHtx_sx=g5\4F=02śpA+cX ib^;1h{`2ҔkD:zuS-JcL3odSq!m RW^;{Hto$o,!J^3` PTؙbϞY%:s >(sD4)tOu,eFݽ V+41a>fD1wMw׿5XJ]N@lkzHt&I <#6\6UX996s}T4(F!@a8VdAri8^|UZb[{ 1yq3QlȖ\xQ ^ vBk#'ņt=>ǽctu^tlG03Lcz @fޭPJ#'ycFIx=O4 ׳ʴr5o-4Cav{-Bbh/8fٌ fmVJvi@9wwI9&@F 'RhlBj*d"Wh njN INԱ>\̊Ai$YBEBs\) *7U,t/ 5^(T3z6p 5_lj5mKC:݉]v6)jy-[V]0/NX`i0Yf5Xl1qhK @xP5Ȃx=G6ÑOf|dcpPc>Z-5j]U4Y;&3%UNOV}vٽJ>[Z7j,[7R`5r/e;E}0To :YP2^ *`u59m,_##q|֘7C6gV@/B_.>#gc>3Y-9nKF|g,1n.ob/Uzf|o<t6 F6tW]_6:Dhv#òNd`l+!0e;7@չmϼuσpA˥__ @6j]dߪG/)Mek@6|p<cv{nl0rBu33.{+,r hih_S&?D*Bd Ye#ץNp寵S.@mm|OkdaG*#>q%JϚs-!]cOY|_%C[3X__2);O fF˖LIu%h oC-Iqk6r$`P`j@k[Qdi#%A !<L8V@ROXEֈhFO?/p h =u4vYkx@<1K!@$_ c lW+%^\;KQg R )KObGiiG қEN7 5 @ҞO= /߁mCd߻(Q{K[d](iB*z6U9DA.#s_hcrHoY~[]m=ymBx6ލÖDy8zݳ@o_췁Xa9Xަ ]]suՕHe5j @T5c 6`}.ېu%S?=N[*bS>CkjQ\L$,ωJ'ùVzX1څ jؐkB vu^ZТtAt{[̒GE4_G0n-Q+Ԁq3)\jgPG15f,NvX0$U7z5 dNψ'',tU" -i[ƕ\NY\{K{-4yui&dطyoRː%sVvK n!S.)\SSI(MUUhj7S$v}뚈gD%4߁M1F$W2Hҹ'-VΤPn 4fS/*z9mƤ塄L[zhQV֓itBBUL$4Tq6j; kWO 3 Τńʏp@DEw_FiO etF3]9NJ8I@ֽK ;F~KnL*_N-c(+7CM=l;CQ WG$~V36b2[n CtJݖ UnEzHFSeu6H5BgMnofOE.Z{A]w$1Րqcga7sbj:0 B()`ɿ3CFiYcnF姾'f@p+7 =N YıC/*I 6~#&>\X@R뷎}}hGu }Lٻ0MA–{h]"A%tGg,[@(nw5)op2ob!4㖻/00\ (#@cۑzqC%v=ɦ*F9FQ/00mP@q,BTGZfP-'rm"BZ>7r<:R(Rke <8ch5G^ѪAXx0"nEgpXn-Mzː{Ȯp̒cߔ֎l߄YPԴKMs5Tj bwM}?C%:>n؃7Jܸ0mkkց*&S9ؕ٪A!f0~ _yL|poa&f>*;m4li S~J׏z%#˦x.a.DI(vi-UԎu @ :$9ۑ[ 9SQTZ'Sސ,8^§~M'J%Iqͨ@ɵֽ s'ۤ@/U+/EH QR+׿ IrxdЈb(0"B[86%!?[jn.Go,n0kEp[26n s({;(i] *>!5] Cs4xN5[j(>_ղ#>fpGs"rBfY"WD@V}n!lRwN$G'hMS}˝|SlIq3gdĜD&SiRսr}CS* *}X^n3c48Kҋk(~6$ec.#1v*q5q'f g 7<46awxٜ1i cCimǶbݴy|<ӝW7g$b<֣0 8hIa>%N4nGJES6Zg2?d"+lFvd':Xe,ɵΈ o4oPlg<YM&= Xd#xq;\?~f 7!W&9td{(DC$lu[7rv^dJJkHKx+RhGmD}O(oÌGqL;_wbtFG/֭#j&\LAyŬ߁=ФσO} x?d7Ux,TJZE_Fۋ35uEs{ 5TneqtșZr5QMg4#S3~/7]j=sFnr6{g4[ޮHϞ/iC2*ʽX9 V  Mqơi8&o@.I'R΁̗E'@p"tZ/YrnlCOH^a3V]L$۲CC3mdEQ܎?zZdamT*j?hӴ8wA3&)=jSY뀲|اrq}oF2%d̽V*ugIAp!(@jeP{䊬@8EMv;6)Xb9Ƨf`:5d5gǣ -^kЈhNìEUXЍo+ ǀNmn['tkx>D$$NDeM M_,&iMMz*JFb99%K ٟX%@ڣ~vjp@ƽgr+Do)_{?, 6C?ջ.A% aKE·O;S`w2&9x5D ,fMl1@wu6I6g^gKS.@!mw|p+ʚl x