Browse Source

* support sizeof()
* fix typecasting a constant like dword(4)

peter 20 years ago
parent
commit
1da9e24cee
4 changed files with 48 additions and 23 deletions
  1. 17 12
      compiler/i386/ra386int.pas
  2. 18 6
      compiler/raatt.pas
  3. 6 2
      compiler/rautils.pas
  4. 7 3
      compiler/x86/rax86att.pas

+ 17 - 12
compiler/i386/ra386int.pas

@@ -44,7 +44,7 @@ Unit Ra386int;
       AS_ALIGN,AS_DB,AS_DW,AS_DD,AS_END,
        {------------------ Assembler Operators  --------------------}
       AS_BYTE,AS_WORD,AS_DWORD,AS_QWORD,AS_TBYTE,AS_DQWORD,AS_NEAR,AS_FAR,
-      AS_HIGH,AS_LOW,AS_OFFSET,AS_SEG,AS_TYPE,AS_PTR,AS_MOD,AS_SHL,AS_SHR,AS_NOT,
+      AS_HIGH,AS_LOW,AS_OFFSET,AS_SIZEOF,AS_SEG,AS_TYPE,AS_PTR,AS_MOD,AS_SHL,AS_SHR,AS_NOT,
       AS_AND,AS_OR,AS_XOR);
 
     type
@@ -70,7 +70,7 @@ Unit Ra386int;
          procedure BuildOperand(oper: tx86operand);
          procedure BuildConstantOperand(oper: tx86operand);
          procedure BuildOpCode(instr : tx86instruction);
-         procedure BuildConstant(constsize: longint);
+         procedure BuildConstant(constsize: byte);
        end;
 
 
@@ -116,7 +116,7 @@ Unit Ra386int;
        { context sensitive.                                 }
        _asmoperators : array[0.._count_asmoperators] of tasmkeyword = (
         'BYTE','WORD','DWORD','QWORD','TBYTE','DQWORD','NEAR','FAR','HIGH',
-        'LOW','OFFSET','SEG','TYPE','PTR','MOD','SHL','SHR','NOT','AND',
+        'LOW','OFFSET','SIZEOF','SEG','TYPE','PTR','MOD','SHL','SHR','NOT','AND',
         'OR','XOR');
 
       token2str : array[tasmtoken] of string[10] = (
@@ -126,7 +126,7 @@ Unit Ra386int;
         ';','identifier','register','opcode','/',
         '','','','','END',
         '','','','','','','','','',
-        '','','','type','ptr','mod','shl','shr','not',
+        '','','sizeof','','type','ptr','mod','shl','shr','not',
         'and','or','xor'
       );
 
@@ -747,6 +747,9 @@ Unit Ra386int;
               end;
             AS_RPAREN:
               Begin
+                { Keep the AS_PAREN in actasmtoken, it is maybe a typecast }
+                if parenlevel=0 then
+                  break;
                 Consume(AS_RPAREN);
                 expr:=expr + ')';
                 dec(parenlevel);
@@ -828,11 +831,12 @@ Unit Ra386int;
                 if actasmtoken<>AS_ID then
                  Message(asmr_e_offset_without_identifier);
               end;
+            AS_SIZEOF,
             AS_TYPE:
               begin
                 l:=0;
                 hasparen:=false;
-                Consume(AS_TYPE);
+                Consume(actasmtoken);
                 if actasmtoken=AS_LPAREN then
                   begin
                     hasparen:=true;
@@ -1509,13 +1513,10 @@ Unit Ra386int;
           case actasmtoken of
 
             AS_OFFSET,
+            AS_SIZEOF,
             AS_TYPE,
             AS_NOT,
-            AS_STRING :
-              Begin
-                BuildConstantOperand(oper);
-              end;
-
+            AS_STRING,
             AS_PLUS,
             AS_MINUS,
             AS_LPAREN,
@@ -1844,7 +1845,7 @@ Unit Ra386int;
       end;
 
 
-    Procedure ti386intreader.BuildConstant(constsize: longint);
+    Procedure ti386intreader.BuildConstant(constsize: byte);
       var
         asmsymtyp : tasmsymtype;
         asmsym,
@@ -2037,7 +2038,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.82  2004-11-29 18:50:15  peter
+  Revision 1.83  2004-12-22 17:09:55  peter
+    * support sizeof()
+    * fix typecasting a constant like dword(4)
+
+  Revision 1.82  2004/11/29 18:50:15  peter
     * os2 fixes for import
     * asmsymtype support for intel reader
 

+ 18 - 6
compiler/raatt.pas

@@ -55,7 +55,7 @@ unit raatt;
         AS_ASCIIZ,AS_LCOMM,AS_COMM,AS_SINGLE,AS_DOUBLE,AS_EXTENDED,
         AS_DATA,AS_TEXT,AS_END,
         {------------------ Assembler Operators  --------------------}
-        AS_TYPE,AS_MOD,AS_SHL,AS_SHR,AS_NOT,AS_AND,AS_OR,AS_XOR,AS_NOR,AS_AT,
+        AS_TYPE,AS_SIZEOF,AS_MOD,AS_SHL,AS_SHR,AS_NOT,AS_AND,AS_OR,AS_XOR,AS_NOR,AS_AT,
         AS_LO,AS_HI);
 
         tasmkeyword = string[10];
@@ -76,14 +76,14 @@ unit raatt;
         '.align','.balign','.p2align','.ascii',
         '.asciz','.lcomm','.comm','.single','.double','.tfloat',
         '.data','.text','END',
-        'TYPE','%','<<','>>','!','&','|','^','~','@','lo','hi');
+        'TYPE','SIZEOF','%','<<','>>','!','&','|','^','~','@','lo','hi');
 
     type
        tattreader = class(tasmreader)
          actasmtoken    : tasmtoken;
          prevasmtoken   : tasmtoken;
          procedure SetupTables;
-         procedure BuildConstant(constsize: longint);
+         procedure BuildConstant(constsize: byte);
          procedure BuildConstantOperand(oper : toperand);
          procedure BuildRealConstant(typ : tfloattype);
          procedure BuildStringConstant(asciiz: boolean);
@@ -354,6 +354,11 @@ unit raatt;
                     actasmtoken:=AS_TYPE;
                     exit;
                   end;
+                 if actasmpattern = 'SIZEOF' then
+                  Begin
+                    actasmtoken:=AS_SIZEOF;
+                    exit;
+                  end;
                  if is_register(actasmpattern) then
                    begin
                      actasmtoken:=AS_REGISTER;
@@ -756,7 +761,7 @@ unit raatt;
       end;
 
 
-    Procedure tattreader.BuildConstant(constsize: longint);
+    Procedure tattreader.BuildConstant(constsize: byte);
       var
        asmsymtyp : TAsmSymType;
        asmsym,
@@ -784,6 +789,8 @@ unit raatt;
             AS_PLUS,
             AS_MINUS,
             AS_LPAREN,
+            AS_TYPE,
+            AS_SIZEOF,
             AS_NOT,
             AS_ID :
               Begin
@@ -1319,10 +1326,11 @@ unit raatt;
                 expr:=expr + tempstr;
                 Consume(AS_STRING);
               end;
+            AS_SIZEOF,
             AS_TYPE:
               begin
                 l:=0;
-                Consume(AS_TYPE);
+                Consume(actasmtoken);
                 if actasmtoken<>AS_ID then
                  Message(asmr_e_type_without_identifier)
                 else
@@ -1514,7 +1522,11 @@ end.
 
 {
   $Log$
-  Revision 1.15  2004-11-29 18:50:15  peter
+  Revision 1.16  2004-12-22 17:09:55  peter
+    * support sizeof()
+    * fix typecasting a constant like dword(4)
+
+  Revision 1.15  2004/11/29 18:50:15  peter
     * os2 fixes for import
     * asmsymtype support for intel reader
 

+ 6 - 2
compiler/rautils.pas

@@ -427,7 +427,7 @@ begin
          Case Expr[I] OF
           '(' : OpPush('(',false);
           ')' : begin
-                  While OpStack[OpTop].ch <> '(' DO
+                  While (OpTop>0) and (OpStack[OpTop].ch <> '(') DO
                    Begin
                      OpPop(opr);
                      RPNCalc(opr.ch,opr.is_prefix);
@@ -1620,7 +1620,11 @@ end;
 end.
 {
   $Log$
-  Revision 1.98  2004-12-12 10:50:34  florian
+  Revision 1.99  2004-12-22 17:09:55  peter
+    * support sizeof()
+    * fix typecasting a constant like dword(4)
+
+  Revision 1.98  2004/12/12 10:50:34  florian
     * fixed operand size calculation for sse operands
     + all nasm assembler targets to help page output added
 

+ 7 - 3
compiler/x86/rax86att.pas

@@ -48,12 +48,12 @@ Implementation
       { helpers }
       cutils,
       { global }
-      globtype,globals,verbose,
+      globtype,verbose,
       systems,
       { aasm }
       aasmbase,aasmtai,aasmcpu,
       { symtable }
-      symconst,symsym,
+      symconst,
       { parser }
       scanner,
       procinfo,
@@ -775,7 +775,11 @@ Implementation
 end.
 {
   $Log$
-  Revision 1.8  2004-11-21 15:35:23  peter
+  Revision 1.9  2004-12-22 17:09:55  peter
+    * support sizeof()
+    * fix typecasting a constant like dword(4)
+
+  Revision 1.8  2004/11/21 15:35:23  peter
     * float routines all use internproc and compilerproc helpers
 
   Revision 1.7  2004/11/08 22:09:59  peter