Parcourir la source

* fixed call bugs with assembler readers
+ OPR_SYMBOL to hold a symbol in the asm parser
* fixed staticsymtable vars which were acessed through %ebp instead of
name

peter il y a 27 ans
Parent
commit
659c2fb45d
4 fichiers modifiés avec 240 ajouts et 516 suppressions
  1. 183 251
      compiler/asmutils.pas
  2. 14 117
      compiler/rai386.pas
  3. 15 126
      compiler/ratti386.pas
  4. 28 22
      compiler/symdef.inc

+ 183 - 251
compiler/asmutils.pas

@@ -108,7 +108,7 @@ Type
   {---------------------------------------------------------------------}
 
   toperandtype = (OPR_NONE,OPR_REFERENCE,OPR_CONSTANT,OPR_REGISTER,OPR_LABINSTR,
-                  OPR_REGLIST);
+                  OPR_REGLIST,OPR_SYMBOL);
 
     { When the TReference field isintvalue = TRUE }
     { then offset points to an ABSOLUTE address   }
@@ -136,6 +136,7 @@ Type
        OPR_LABINSTR: (hl: plabel);
        { Register list such as in the movem instruction }
        OPR_REGLIST:  (list: set of tregister);
+       OPR_SYMBOL : (symbol:pstring);
     end;
 
 
@@ -1207,194 +1208,188 @@ end;
   { search and sets up the correct fields in the Instr record }
   { for the NON-constant identifier passed to the routine.    }
   { if not found returns FALSE.                               }
-   var
-    sym:psym;
-    l: longint;
+  var
+    sym : psym;
+    l   : longint;
   Begin
-     CreateVarInstr := FALSE;
-     { are we in a routine ? }
-     if assigned(aktprocsym) then
+    CreateVarInstr := FALSE;
+  { are we in a routine ? }
+    if assigned(aktprocsym) then
      begin
-      if assigned(aktprocsym^.definition^.localst) then
-      { search the local list for the name of this variable. }
+     { search the local list for the name of this variable. }
+       if assigned(aktprocsym^.definition^.localst) then
         sym:=aktprocsym^.definition^.localst^.search(hs)
-      else
+       else
         sym:=nil;
-      if assigned(sym) then
-      begin
-        if sym^.typ=varsym then
-          begin
-           { we always assume in asm statements that     }
-           { that the variable is valid.                 }
-           pvarsym(sym)^.is_valid:=1;
-           instr.operands[operandnum].ref.base := procinfo.framepointer;
-           instr.operands[operandnum].ref.offset := - (pvarsym(sym)^.address);
-           { the current size is NOT overriden if it already }
-           { exists, such as in the case of a byte ptr, in   }
-           { front of the identifier.                        }
-           if instr.operands[operandnum].size = S_NO then
-           Begin
-             case pvarsym(sym)^.getsize of
-              1: instr.operands[operandnum].size := S_B;
-              2: instr.operands[operandnum].size := S_W{ could be S_IS};
-              4: instr.operands[operandnum].size := S_L{ could be S_IL or S_FS};
-              8: instr.operands[operandnum].size := S_IQ{ could be S_D or S_FL};
-              extended_size: instr.operands[operandnum].size := S_FX;
-             else
-               { this is in the case where the instruction is LEA }
-               { or something like that, in that case size is not }
-               { important.                                       }
-               instr.operands[operandnum].size := S_NO;
-             end; { end case }
+       if assigned(sym) then
+        begin
+          case sym^.typ of
+  typedconstsym,
+         varsym : begin
+                    { we always assume in asm statements that     }
+                    { that the variable is valid.                 }
+                    pvarsym(sym)^.is_valid:=1;
+                    if pvarsym(sym)^.owner^.symtabletype=staticsymtable then
+                     begin
+                       if assigned(instr.operands[operandnum].ref.symbol) then
+                         FreeMem(instr.operands[operandnum].ref.symbol,length(instr.operands[operandnum].ref.symbol^)+1);
+                       instr.operands[operandnum].ref.symbol:=newpasstr(pvarsym(sym)^.mangledname);
+                     end
+                    else
+                     begin
+                       instr.operands[operandnum].ref.base := procinfo.framepointer;
+                       instr.operands[operandnum].ref.offset := -(pvarsym(sym)^.address);
+                     end;
+                    { the current size is NOT overriden if it already }
+                    { exists, such as in the case of a byte ptr, in   }
+                    { front of the identifier.                        }
+                    if instr.operands[operandnum].size = S_NO then
+                    Begin
+                      case pvarsym(sym)^.getsize of
+                       1: instr.operands[operandnum].size := S_B;
+                       2: instr.operands[operandnum].size := S_W{ could be S_IS};
+                       4: instr.operands[operandnum].size := S_L{ could be S_IL or S_FS};
+                       8: instr.operands[operandnum].size := S_IQ{ could be S_D or S_FL};
+                       extended_size: instr.operands[operandnum].size := S_FX;
+                      else
+                        { this is in the case where the instruction is LEA }
+                        { or something like that, in that case size is not }
+                        { important.                                       }
+                        instr.operands[operandnum].size := S_NO;
+                      end; { end case }
+                    end;
+                    { ok, finished for thir variable. }
+                    CreateVarInstr := TRUE;
+                    Exit;
+                  end;
+        procsym : begin
+                    { free the memory before changing the symbol name. }
+                    if assigned(instr.operands[operandnum].ref.symbol) then
+                      FreeMem(instr.operands[operandnum].ref.symbol,length(instr.operands[operandnum].ref.symbol^)+1);
+                    instr.operands[operandnum].operandtype:=OPR_SYMBOL;
+                    instr.operands[operandnum].symbol:=newpasstr(pprocsym(sym)^.definition^.mangledname);
+                    CreateVarInstr := TRUE;
+                    Exit;
+                  end
+          else
+           begin
+             Comment(V_Error,'Unsupported symbol type for operand');
+             exit;
            end;
-           { ok, finished for thir variable. }
-           CreateVarInstr := TRUE;
-           Exit;
-          end
-        else
-        { call to local function }
-        if (sym^.typ=procsym) then
-          begin
-            { free the memory before changing the symbol name. }
-            if assigned(instr.operands[operandnum].ref.symbol) then
-              FreeMem(instr.operands[operandnum].ref.symbol,
-            length(instr.operands[operandnum].ref.symbol^)+1);
-            instr.operands[operandnum].ref.symbol:=newpasstr(pprocsym(sym)^.definition^.mangledname);
-            CreateVarInstr := TRUE;
-            Exit;
-          end
-{        else
-        if (sym^.typ = typedconstsym) then
-        Begin}
-           { UGH????? pprocsym??? }
-{           instr.operands[operandnum].ref.symbol:=newpasstr(pprocsym(sym)^.definition^.mangledname);}
-           {* the current size is NOT overriden if it already *}
-           {* exists, such as in the case of a byte ptr, in   *}
-           {* front of the identifier.                        *}
-{           if instr.operands[operandnum].size = S_NO then
-           Begin
-             case ptypedconstsym(sym)^.definition^.size of
-              1: instr.operands[operandnum].size := S_B;
-              2: instr.operands[operandnum].size := S_W;
-              4: instr.operands[operandnum].size := S_L;
-              8: instr.operands[operandnum].size := S_IQ;
-              extended_size: instr.operands[operandnum].size := S_FX;
-             else}
-               {* this is in the case where the instruction is LEA *}
-               {* or something like that, in that case size is not *}
-               {* important.                                       *}
-{               instr.operands[operandnum].size := S_NO;}
-{             end;} {* end case *}
-{           end;}
-           {* ok, finished for this variable. *}
-{           CreateVarInstr := TRUE;
-           Exit;
-        end }
-      end;
-      { now check for parameters passed to routine }
-{      else}
-       begin
-         if assigned(aktprocsym^.definition^.parast) then
-            sym:=aktprocsym^.definition^.parast^.search(hs)
-         else
-           sym:=nil;
-         if assigned(sym) then
-         begin
-           if sym^.typ=varsym then
+          end;
+        end;
+
+     { now check for parameters passed to routine }
+       if assigned(aktprocsym^.definition^.parast) then
+        sym:=aktprocsym^.definition^.parast^.search(hs)
+       else
+        sym:=nil;
+       if assigned(sym) then
+        begin
+          case sym^.typ of
+         varsym : begin
+                    l:=pvarsym(sym)^.address;
+                    { set offset }
+                    inc(l,aktprocsym^.definition^.parast^.call_offset);
+                    pvarsym(sym)^.is_valid:=1;
+                    instr.operands[operandnum].ref.base := procinfo.framepointer;
+                    instr.operands[operandnum].ref.offset := l;
+                    { the current size is NOT overriden if it already }
+                    { exists, such as in the case of a byte ptr, in   }
+                    { front of the identifier.                        }
+                    if instr.operands[operandnum].size = S_NO then
+                    Begin
+                      case pvarsym(sym)^.getsize of
+                        1: instr.operands[operandnum].size := S_B;
+                        2: instr.operands[operandnum].size := S_W;
+                        4: instr.operands[operandnum].size := S_L;
+                        8: instr.operands[operandnum].size := S_IQ;
+                        extended_size: instr.operands[operandnum].size := S_FX;
+                      else
+                      { this is in the case where the instruction is LEA }
+                      { or something like that, in that case size is not }
+                      { important.                                       }
+                        instr.operands[operandnum].size := S_NO;
+                      end; { end case }
+                    end; { endif }
+                    CreateVarInstr := TRUE;
+                    Exit;
+                  end;
+          else
            begin
-             l:=pvarsym(sym)^.address;
-             { set offset }
-             inc(l,aktprocsym^.definition^.parast^.call_offset);
-             pvarsym(sym)^.is_valid:=1;
-             instr.operands[operandnum].ref.base := procinfo.framepointer;
-             instr.operands[operandnum].ref.offset := l;
-             { the current size is NOT overriden if it already }
-             { exists, such as in the case of a byte ptr, in   }
-             { front of the identifier.                        }
-             if instr.operands[operandnum].size = S_NO then
-             Begin
-               case pvarsym(sym)^.getsize of
-                 1: instr.operands[operandnum].size := S_B;
-                 2: instr.operands[operandnum].size := S_W;
-                 4: instr.operands[operandnum].size := S_L;
-                 8: instr.operands[operandnum].size := S_IQ;
-                 extended_size: instr.operands[operandnum].size := S_FX;
-               else
-               { this is in the case where the instruction is LEA }
-               { or something like that, in that case size is not }
-               { important.                                       }
-                 instr.operands[operandnum].size := S_NO;
-               end; { end case }
-             end; { endif }
-             CreateVarInstr := TRUE;
-             Exit;
-           end; { endif }
-         end; {endif }
-       end; { endif }
+             Comment(V_Error,'Unsupported symbol type for operand');
+             exit;
+           end;
+          end; { case }
+        end; { endif }
      end;
-
-     { not found.. .now look for global variables. }
-     getsym(hs,false);
-     sym:=srsym;
-     if assigned(sym) then
+  { not found.. .now look for global variables. }
+    getsym(hs,false);
+    sym:=srsym;
+    if assigned(sym) then
      Begin
-       if (sym^.typ = varsym) or (sym^.typ = typedconstsym) then
-       Begin
-       { free the memory before changing the symbol name. }
-         if assigned(instr.operands[operandnum].ref.symbol) then
-           FreeMem(instr.operands[operandnum].ref.symbol,
-         length(instr.operands[operandnum].ref.symbol^)+1);
-         instr.operands[operandnum].ref.symbol:=newpasstr(sym^.mangledname);
-         { the current size is NOT overriden if it already }
-         { exists, such as in the case of a byte ptr, in   }
-         { front of the identifier.                        }
-         if (instr.operands[operandnum].size = S_NO) and (sym^.typ = varsym) then
-         Begin
-           case pvarsym(sym)^.getsize of
-             1: instr.operands[operandnum].size := S_B;
-             2: instr.operands[operandnum].size := S_W;
-             4: instr.operands[operandnum].size := S_L;
-             8: instr.operands[operandnum].size := S_IQ;
-           else
-           { this is in the case where the instruction is LEA }
-           { or something like that, in that case size is not }
-           { important.                                       }
-             instr.operands[operandnum].size := S_NO;
-           end;
-         end
-         else
-         if (instr.operands[operandnum].size = S_NO) and (sym^.typ = typedconstsym) then
-         Begin
-         { only these are valid sizes, otherwise prefixes are }
-         { required.                                          }
-            case ptypedconstsym(sym)^.definition^.size of
-              1: instr.operands[operandnum].size := S_B;
-              2: instr.operands[operandnum].size := S_W;
-              4: instr.operands[operandnum].size := S_L;
-              8: instr.operands[operandnum].size := S_IQ;
-            else
-            { this is in the case where the instruction is LEA }
-            { or something like that, in that case size is not }
-            { important.                                       }
-                 instr.operands[operandnum].size := S_NO;
-            end;
-         end; { endif }
-         CreateVarInstr := TRUE;
-         Exit;
-       end;
-       if (sym^.typ=procsym) then
-       begin
-         if assigned(pprocsym(sym)^.definition^.nextoverloaded) then
-          Message(assem_w_calling_overload_func);
-         { free the memory before changing the symbol name. }
-         if assigned(instr.operands[operandnum].ref.symbol) then
-           FreeMem(instr.operands[operandnum].ref.symbol,
-         length(instr.operands[operandnum].ref.symbol^)+1);
-         instr.operands[operandnum].ref.symbol:=
-           newpasstr(pprocsym(sym)^.definition^.mangledname);
-         CreateVarInstr := TRUE;
-         Exit;
-       end;
+       case sym^.typ of
+          varsym,
+   typedconstsym : Begin
+                   { free the memory before changing the symbol name. }
+                     if assigned(instr.operands[operandnum].ref.symbol) then
+                      FreeMem(instr.operands[operandnum].ref.symbol,
+                     length(instr.operands[operandnum].ref.symbol^)+1);
+                     instr.operands[operandnum].ref.symbol:=newpasstr(sym^.mangledname);
+                   { the current size is NOT overriden if it already }
+                   { exists, such as in the case of a byte ptr, in   }
+                   { front of the identifier.                        }
+                     if (instr.operands[operandnum].size = S_NO) and (sym^.typ = varsym) then
+                      Begin
+                        case pvarsym(sym)^.getsize of
+                         1: instr.operands[operandnum].size := S_B;
+                         2: instr.operands[operandnum].size := S_W;
+                         4: instr.operands[operandnum].size := S_L;
+                         8: instr.operands[operandnum].size := S_IQ;
+                        else
+                      { this is in the case where the instruction is LEA }
+                      { or something like that, in that case size is not }
+                      { important.                                       }
+                         instr.operands[operandnum].size := S_NO;
+                        end;
+                      end
+                     else
+                      if (instr.operands[operandnum].size = S_NO) and (sym^.typ = typedconstsym) then
+                       Begin
+                       { only these are valid sizes, otherwise prefixes are }
+                       { required.                                          }
+                         case ptypedconstsym(sym)^.definition^.size of
+                          1: instr.operands[operandnum].size := S_B;
+                          2: instr.operands[operandnum].size := S_W;
+                          4: instr.operands[operandnum].size := S_L;
+                          8: instr.operands[operandnum].size := S_IQ;
+                         else
+                         { this is in the case where the instruction is LEA }
+                         { or something like that, in that case size is not }
+                         { important.                                       }
+                           instr.operands[operandnum].size := S_NO;
+                         end;
+                    end; { endif }
+                    CreateVarInstr := TRUE;
+                    Exit;
+                  end;
+        procsym : begin
+                    if assigned(pprocsym(sym)^.definition^.nextoverloaded) then
+                     Message(assem_w_calling_overload_func);
+                    { free the memory before changing the symbol name. }
+                    if assigned(instr.operands[operandnum].ref.symbol) then
+                      FreeMem(instr.operands[operandnum].ref.symbol,length(instr.operands[operandnum].ref.symbol^)+1);
+                    instr.operands[operandnum].operandtype:=OPR_SYMBOL;
+                    instr.operands[operandnum].symbol:=newpasstr(pprocsym(sym)^.definition^.mangledname);
+                    CreateVarInstr := TRUE;
+                    Exit;
+                  end;
+       else
+        begin
+          Comment(V_Error,'Unsupported symbol type for operand');
+          exit;
+        end;
+       end; {case}
      end; { end looking for global variables .. }
   end;
 
@@ -1626,80 +1621,17 @@ end;
 end.
 {
   $Log$
-  Revision 1.2  1998-04-29 10:33:43  pierre
+  Revision 1.3  1998-05-31 14:13:30  peter
+    * fixed call bugs with assembler readers
+    + OPR_SYMBOL to hold a symbol in the asm parser
+    * fixed staticsymtable vars which were acessed through %ebp instead of
+      name
+
+  Revision 1.2  1998/04/29 10:33:43  pierre
     + added some code for ansistring (not complete nor working yet)
     * corrected operator overloading
     * corrected nasm output
     + started inline procedures
     + added starstarn : use ** for exponentiation (^ gave problems)
     + started UseTokenInfo cond to get accurate positions
-
-  Revision 1.1.1.1  1998/03/25 11:18:12  root
-  * Restored version
-
-  Revision 1.15  1998/03/10 01:17:14  peter
-    * all files have the same header
-    * messages are fully implemented, EXTDEBUG uses Comment()
-    + AG... files for the Assembler generation
-
-  Revision 1.14  1998/03/09 12:58:10  peter
-    * FWait warning is only showed for Go32V2 and $E+
-    * opcode tables moved to i386.pas/m68k.pas to reduce circular uses (and
-      for m68k the same tables are removed)
-    + $E for i386
-
-  Revision 1.13  1998/03/03 16:45:16  peter
-    + message support for assembler parsers
-
-  Revision 1.12  1998/03/02 01:48:02  peter
-    * renamed target_DOS to target_GO32V1
-    + new verbose system, merged old errors and verbose units into one new
-      verbose.pas, so errors.pas is obsolete
-
-  Revision 1.11  1998/02/13 10:34:34  daniel
-  * Made Motorola version compilable.
-  * Fixed optimizer
-
-  Revision 1.10  1998/01/09 19:21:19  carl
-  + added support for m68k
-
-  Revision 1.7  1997/12/14 22:43:17  florian
-    + command line switch -Xs for DOS (passes -s to the linker to strip symbols from
-      executable)
-    * some changes of Carl-Eric implemented
-
-  Revision 1.5  1997/12/09 13:23:54  carl
-  + less processor specific
-  - moved searching for externals/internal symbols from CreateVarInstr to
-    ratti386.pas (this would cause invalid stuff in rai386.pas!)
-
-  Revision 1.4  1997/12/04 12:20:39  pierre
-    +* MMX instructions added to att output with a warning that
-       GNU as version >= 2.81 is needed
-       bug in reading of reals under att syntax corrected
-
-  Revision 1.3  1997/12/01 17:42:49  pierre
-     + added some more functionnality to the assembler parser
-
-  Revision 1.2  1997/11/27 17:55:11  carl
-  * made it compile under bp (one comment was nested)
-
-  Revision 1.1.1.1  1997/11/27 08:32:50  michael
-  FPC Compiler CVS start
-
-
-  Pre-CVS log:
-
-  CEC   Carl-Eric Codere
-  FK    Florian Klaempfl
-  PM    Pierre Muller
-  +     feature added
-  -     removed
-  *     bug fixed or changed
-
- 11th november 1997:
-   * fixed problems when using reserved words TRUE and FALSE (CEC).
- 22th november 1997:
-   * changed operator (reserved word) into _operator (PM).
-
 }

+ 14 - 117
compiler/rai386.pas

@@ -780,6 +780,9 @@ var
                       findtype := _regtypes[reg];
                       exit;
                      end;
+         OPR_SYMBOL: Begin
+                       findtype := ao_jumpabsolute;
+                     end;
        OPR_NONE:     Begin
                        findtype := 0;
                      end;
@@ -1472,6 +1475,10 @@ var
                               else
                                 Message(assem_e_invalid_opcode_and_operand);
                           end;
+             OPR_SYMBOL:  Begin
+                            p^.concat(new(pai386,op_csymbol(instruc,
+                             instr.stropsize, newcsymbol(instr.operands[1].symbol^,0))));
+                          End;
            OPR_NONE: Begin
                        Message(assem_f_internal_error_in_concatopcode);
                      end;
@@ -3369,7 +3376,13 @@ Begin
 end.
 {
   $Log$
-  Revision 1.8  1998-05-30 14:31:07  peter
+  Revision 1.9  1998-05-31 14:13:32  peter
+    * fixed call bugs with assembler readers
+    + OPR_SYMBOL to hold a symbol in the asm parser
+    * fixed staticsymtable vars which were acessed through %ebp instead of
+      name
+
+  Revision 1.8  1998/05/30 14:31:07  peter
     + $ASMMODE
 
   Revision 1.7  1998/05/28 16:32:05  carl
@@ -3406,120 +3419,4 @@ end.
       nasm output OK (program still crashes at end
       and creates wrong assembler files !!)
       procsym types sym in tdef removed !!
-
-  Revision 1.2  1998/03/31 15:21:01  florian
-    * fix of out (intel syntax) applied
-
-  Revision 1.1.1.1  1998/03/25 11:18:15  root
-  * Restored version
-
-  Revision 1.19  1998/03/24 21:48:34  florian
-    * just a couple of fixes applied:
-         - problem with fixed16 solved
-         - internalerror 10005 problem fixed
-         - patch for assembler reading
-         - small optimizer fix
-         - mem is now supported
-
-  Revision 1.18  1998/03/10 01:17:26  peter
-    * all files have the same header
-    * messages are fully implemented, EXTDEBUG uses Comment()
-    + AG... files for the Assembler generation
-
-  Revision 1.17  1998/03/09 12:58:12  peter
-    * FWait warning is only showed for Go32V2 and $E+
-    * opcode tables moved to i386.pas/m68k.pas to reduce circular uses (and
-      for m68k the same tables are removed)
-    + $E for i386
-
-  Revision 1.16  1998/03/04 17:33:56  michael
-  + Changed ifdef FPK to ifdef FPC
-
-  Revision 1.15  1998/03/03 22:38:26  peter
-    * the last 3 files
-
-  Revision 1.14  1998/03/02 01:49:15  peter
-    * renamed target_DOS to target_GO32V1
-    + new verbose system, merged old errors and verbose units into one new
-      verbose.pas, so errors.pas is obsolete
-
-  Revision 1.13  1998/02/13 10:35:38  daniel
-  * Made Motorola version compilable.
-  * Fixed optimizer
-
-  Revision 1.12  1998/02/12 11:50:36  daniel
-  Yes! Finally! After three retries, my patch!
-
-  Changes:
-
-  Complete rewrite of psub.pas.
-  Added support for DLL's.
-  Compiler requires less memory.
-  Platform units for each platform.
-
-  Revision 1.11  1998/02/07 18:02:36  carl
-    + fwait warning for emulation
-
-  Revision 1.10  1998/01/19 03:11:40  carl
-    * bugfix number 78
-
-  Revision 1.9  1998/01/09 19:22:51  carl
-  * bugfix of __ID variable names
-
-  Revision 1.8  1997/12/09 14:00:25  carl
-  * bugfix of intr reg,reg instructions, size must always be specified
-    under gas (ref: DJGPP FAQ)
-  * bugfix of concatopcode with fits init twice!
-  + unknown instr. only poermitted when compiling system unit and/or
-    target processor > i386
-
-  Revision 1.7  1997/12/04 12:20:50  pierre
-    +* MMX instructions added to att output with a warning that
-       GNU as version >= 2.81 is needed
-       bug in reading of reals under att syntax corrected
-
-  Revision 1.6  1997/11/28 18:14:45  pierre
-   working version with several bug fixes
-
-  Revision 1.5  1997/11/28 15:43:20  florian
-  Fixed stack ajustment bug, 0.9.8 compiles now 0.9.8 without problems.
-
-  Revision 1.4  1997/11/28 15:31:59  carl
-  * uncommented firstop and lastop. (otherwise can cause bugs)
-
-  Revision 1.3  1997/11/28 14:26:22  florian
-  Fixed some bugs
-
-  Revision 1.2  1997/11/28 12:03:53  michael
-  Changed comment delimiters to braces, causes problems with 0.9.1
-  Changed use of ord to typecast with longint.
-  Made boolean expressions non-redundant.
-
-  Revision 1.1.1.1  1997/11/27 08:33:00  michael
-  FPC Compiler CVS start
-
-
-  Pre-CVS log:
-
-  CEC   Carl-Eric Codere
-  FK    Florian Klaempfl
-  PM    Pierre Muller
-  +     feature added
-  -     removed
-  *     bug fixed or changed
-
-  9th november 1997:
-   + first working version with main distribution line of FPC (CEC)
- 12th november 1997:
-   * bugfix of CALL and JMP with symbolic references. (CEC)
- 13th november 1997:
-   * too many bugfixes/improvements to name... (CEC)
-   * Fixed range check, line numbering, missing operand checking
-     bugs - range checking must be off to compile under tp. (CEC)
-   + speed improvement of 30% over old version with global look up tables.
- 14th november 1997:
-   + added support for record/object offsets. (CEC)
-   * fixed bug regarding ENTER and push imm8 instruction(CEC)
-   + fixed conflicts with fpu instructions. (CEC).
-
 }

+ 15 - 126
compiler/ratti386.pas

@@ -954,6 +954,9 @@ const
                       findtype := _regtypes[reg];
                       exit;
                      end;
+       OPR_SYMBOL:     Begin
+                       findtype := ao_jumpabsolute;
+                     end;
        OPR_NONE:     Begin
                        findtype := 0;
                      end;
@@ -1648,6 +1651,11 @@ const
                 p^.concat(new(pai386,op_reg(instruc,
                   instr.stropsize, instr.operands[1].reg)));
              End;
+           OPR_SYMBOL:
+             Begin
+                p^.concat(new(pai386,op_csymbol(instruc,
+                  instr.stropsize, newcsymbol(instr.operands[1].symbol^,0))));
+             End;
            OPR_REFERENCE:
              { now first check suffix ... }
              if instr.stropsize <> S_NO then
@@ -3683,7 +3691,13 @@ end.
 
 {
   $Log$
-  Revision 1.10  1998-05-30 14:31:08  peter
+  Revision 1.11  1998-05-31 14:13:35  peter
+    * fixed call bugs with assembler readers
+    + OPR_SYMBOL to hold a symbol in the asm parser
+    * fixed staticsymtable vars which were acessed through %ebp instead of
+      name
+
+  Revision 1.10  1998/05/30 14:31:08  peter
     + $ASMMODE
 
   Revision 1.9  1998/05/29 09:58:16  pierre
@@ -3729,130 +3743,5 @@ end.
       nasm output OK (program still crashes at end
       and creates wrong assembler files !!)
       procsym types sym in tdef removed !!
-
-  Revision 1.2  1998/03/30 15:53:01  florian
-    * last changes before release:
-       - gdb fixed
-       - ratti386 warning removed (about unset function result)
-
-  Revision 1.1.1.1  1998/03/25 11:18:15  root
-  * Restored version
-
-  Revision 1.21  1998/03/10 16:27:44  pierre
-    * better line info in stabs debug
-    * symtabletype and lexlevel separated into two fields of tsymtable
-    + ifdef MAKELIB for direct library output, not complete
-    + ifdef CHAINPROCSYMS for overloaded seach across units, not fully
-      working
-    + ifdef TESTFUNCRET for setting func result in underfunction, not
-      working
-
-  Revision 1.20  1998/03/10 01:17:27  peter
-    * all files have the same header
-    * messages are fully implemented, EXTDEBUG uses Comment()
-    + AG... files for the Assembler generation
-
-  Revision 1.19  1998/03/09 12:58:13  peter
-    * FWait warning is only showed for Go32V2 and $E+
-    * opcode tables moved to i386.pas/m68k.pas to reduce circular uses (and
-      for m68k the same tables are removed)
-    + $E for i386
-
-  Revision 1.18  1998/03/04 17:34:01  michael
-  + Changed ifdef FPK to ifdef FPC
-
-  Revision 1.17  1998/03/03 22:38:30  peter
-    * the last 3 files
-
-  Revision 1.16  1998/03/02 01:49:21  peter
-    * renamed target_DOS to target_GO32V1
-    + new verbose system, merged old errors and verbose units into one new
-      verbose.pas, so errors.pas is obsolete
-
-  Revision 1.15  1998/02/13 10:35:42  daniel
-  * Made Motorola version compilable.
-  * Fixed optimizer
-
-  Revision 1.14  1998/02/12 11:50:41  daniel
-  Yes! Finally! After three retries, my patch!
-
-  Changes:
-
-  Complete rewrite of psub.pas.
-  Added support for DLL's.
-  Compiler requires less memory.
-  Platform units for each platform.
-
-  Revision 1.13  1998/02/07 18:03:55  carl
-    + fwait warning for emulation
-
-  Revision 1.12  1998/01/19 03:10:52  carl
-    * bugfix number 78
-
-  Revision 1.11  1998/01/09 19:24:00  carl
-  + externals are now added if identifier is not found
-
-  Revision 1.10  1997/12/14 22:43:25  florian
-    + command line switch -Xs for DOS (passes -s to the linker to strip symbols from
-      executable)
-    * some changes of Carl-Eric implemented
-
-  Revision 1.9  1997/12/09 14:07:14  carl
-  + added better error size checkimg -- otherwise would cause problems
-    with intasmi3
-  * bugfixes as in rai386
-  * BuildRealConstant gave out Overflow errors (hex/bin/octal should be
-    directly decoded into real)
-  * bugfix of MOVSX/MOVZX instruction
-  * ConcatOpCode op_csymbol gave out a Runerrore 216 under each test
-    I performed, or output a nil symbol -- so removed.
-  * All identifiers must be in uppercase!!!
-    (except local labels and directives)
-  + supervisor stuff only possible when compiling the system unit
-
-  Revision 1.7  1997/12/04 12:21:09  pierre
-    +* MMX instructions added to att output with a warning that
-       GNU as version >= 2.81 is needed
-       bug in reading of reals under att syntax corrected
-
-  Revision 1.6  1997/12/01 17:42:56  pierre
-     + added some more functionnality to the assembler parser
-
-  Revision 1.5  1997/11/28 15:43:23  florian
-  Fixed stack ajustment bug, 0.9.8 compiles now 0.9.8 without problems.
-
-  Revision 1.4  1997/11/28 15:39:46  carl
-  - removed reference to WriteLn and replaced in inasmxxx
-  * uncommented firstop and lastop (otherwise can cause bugs)
-
-  Revision 1.3  1997/11/28 14:26:24  florian
-  Fixed some bugs
-
-  Revision 1.2  1997/11/28 12:05:44  michael
-  Changed comment delimiter to braces
-  CHanged use of ord to typecast with longint
-  Changed line constant to variable. Added initialization. v0.9.1 chokes
-  on 255 length constant strings.
-  Boolean expressions are now non-redundant.
-
-  Revision 1.1.1.1  1997/11/27 08:33:01  michael
-  FPC Compiler CVS start
-
-
-  Pre-CVS log:
-
-
-  CEC   Carl-Eric Codere
-  FK    Florian Klaempfl
-  PM    Pierre Muller
-  +     feature added
-  -     removed
-  *     bug fixed or changed
-
-  14th november 1997:
-   * fixed bug regarding ENTER and push imm8 instruction (CEC)
-   + fixed conflicts with fpu instructions. (CEC).
-   + adding real const support. (PM).
-
 }
 

+ 28 - 22
compiler/symdef.inc

@@ -385,10 +385,10 @@
            writelong(len);
 {$ifdef NEWPPU}
          case string_typ of
-           shortstring : ppufile.writeentry(ibstringdef);
-            longstring : ppufile.writeentry(iblongstringdef);
-            ansistring : ppufile.writeentry(ibansistringdef);
-            widestring : ppufile.writeentry(ibwidestringdef);
+           shortstring : ppufile^.writeentry(ibstringdef);
+            longstring : ppufile^.writeentry(iblongstringdef);
+            ansistring : ppufile^.writeentry(ibansistringdef);
+            widestring : ppufile^.writeentry(ibwidestringdef);
          end;
 {$endif}
       end;
@@ -488,7 +488,7 @@
          tdef.write;
          writelong(max);
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibenumdef);
+         ppufile^.writeentry(ibenumdef);
 {$endif}
       end;
 
@@ -640,7 +640,7 @@
          writelong(von);
          writelong(bis);
 {$ifdef NEWPPU}
-         ppufile.writeentry(iborddef);
+         ppufile^.writeentry(iborddef);
 {$endif}
       end;
 
@@ -705,7 +705,7 @@
          tdef.write;
          writebyte(byte(typ));
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibfloatdef);
+         ppufile^.writeentry(ibfloatdef);
 {$endif}
       end;
 
@@ -805,7 +805,7 @@
          if filetype=ft_typed then
            writedefref(typed_as);
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibfiledef);
+         ppufile^.writeentry(ibfiledef);
 {$endif}
       end;
 
@@ -911,7 +911,7 @@
          tdef.write;
          writedefref(definition);
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibpointerdef);
+         ppufile^.writeentry(ibpointerdef);
 {$endif}
       end;
 
@@ -990,7 +990,7 @@
          tdef.write;
          writedefref(definition);
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibclassrefdef);
+         ppufile^.writeentry(ibclassrefdef);
 {$endif}
       end;
 
@@ -1061,7 +1061,7 @@
          if settype=varset then
            writelong(savesize);
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibsetdef);
+         ppufile^.writeentry(ibsetdef);
 {$endif}
       end;
 
@@ -1117,7 +1117,7 @@
 {$endif}
          tdef.write;
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibformaldef);
+         ppufile^.writeentry(ibformaldef);
 {$endif}
       end;
 
@@ -1197,7 +1197,7 @@
          writelong(lowrange);
          writelong(highrange);
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibarraydef);
+         ppufile^.writeentry(ibarraydef);
 {$endif}
       end;
 
@@ -1337,7 +1337,7 @@
          tdef.write;
          writelong(savesize);
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibrecorddef);
+         ppufile^.writeentry(ibrecorddef);
 {$endif}
          self.symtable^.writeasstruct;
          read_member:=oldread_member;
@@ -1691,7 +1691,7 @@
       { references do not change the ppu caracteristics      }
       { this only save the references to variables/functions }
       { defined in the unit what about the others            }
-         ppufile.do_crc:=false;
+         ppufile^.do_crc:=false;
          if assigned(lastwritten) then
            ref:=lastwritten
          else
@@ -1706,7 +1706,7 @@
            end;
          lastwritten:=lastref;
          writebyte(ibend);
-         ppufile.do_crc:=true;
+         ppufile^.do_crc:=true;
       end;
 
     procedure tprocdef.write_external_references;
@@ -1714,7 +1714,7 @@
       var ref : pref;
 
       begin
-         ppufile.do_crc:=false;
+         ppufile^.do_crc:=false;
          if lastwritten=lastref then exit;
          writebyte(ibextdefref);
          writedefref(@self);
@@ -1732,7 +1732,7 @@
            end;
          lastwritten:=lastref;
          writebyte(ibend);
-         ppufile.do_crc:=true;
+         ppufile^.do_crc:=true;
       end;
 
     procedure tprocdef.write_ref_to_file(var f : text);
@@ -1798,7 +1798,7 @@
          writedefref(nextoverloaded);
          writedefref(_class);
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibprocdef);
+         ppufile^.writeentry(ibprocdef);
 {$endif}
 {$ifdef UseBrowser}
          if (current_module^.flags and uf_uses_browser)<>0 then
@@ -1970,7 +1970,7 @@
 {$endif StoreFPULevel}
          inherited write;
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibprocvardef);
+         ppufile^.writeentry(ibprocvardef);
 {$endif}
       end;
 
@@ -2215,7 +2215,7 @@
          writedefref(childof);
          writelong(options);
 {$ifdef NEWPPU}
-         ppufile.writeentry(ibobjectdef);
+         ppufile^.writeentry(ibobjectdef);
 {$endif}
          if (options and (oo_hasprivate or oo_hasprotected))<>0 then
            object_options:=true;
@@ -2368,7 +2368,13 @@
 
 {
   $Log$
-  Revision 1.1  1998-05-27 19:45:09  peter
+  Revision 1.2  1998-05-31 14:13:37  peter
+    * fixed call bugs with assembler readers
+    + OPR_SYMBOL to hold a symbol in the asm parser
+    * fixed staticsymtable vars which were acessed through %ebp instead of
+      name
+
+  Revision 1.1  1998/05/27 19:45:09  peter
     * symtable.pas splitted into includefiles
     * symtable adapted for $ifdef NEWPPU