From 1da9e24cee8bf17391afedeb80a36cbd3bf24af1 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 22 Dec 2004 17:09:55 +0000 Subject: [PATCH] * support sizeof() * fix typecasting a constant like dword(4) --- compiler/i386/ra386int.pas | 29 +++++++++++++++++------------ compiler/raatt.pas | 24 ++++++++++++++++++------ compiler/rautils.pas | 8 ++++++-- compiler/x86/rax86att.pas | 10 +++++++--- 4 files changed, 48 insertions(+), 23 deletions(-) diff --git a/compiler/i386/ra386int.pas b/compiler/i386/ra386int.pas index f73ff0bb2c..ef3f19f091 100644 --- a/compiler/i386/ra386int.pas +++ b/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 diff --git a/compiler/raatt.pas b/compiler/raatt.pas index 527b0dd72c..b96f08a299 100644 --- a/compiler/raatt.pas +++ b/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 diff --git a/compiler/rautils.pas b/compiler/rautils.pas index 46d27cff50..5d6538190c 100644 --- a/compiler/rautils.pas +++ b/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 diff --git a/compiler/x86/rax86att.pas b/compiler/x86/rax86att.pas index b2e39ce829..d6fefc6870 100644 --- a/compiler/x86/rax86att.pas +++ b/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