diff --git a/compiler/i386/ra386int.pas b/compiler/i386/ra386int.pas index b0ba5fb122..23abff897b 100644 --- a/compiler/i386/ra386int.pas +++ b/compiler/i386/ra386int.pas @@ -84,7 +84,7 @@ Unit Ra386int; { aasm } cpuinfo,aasmbase,aasmtai,aasmcpu, { symtable } - symconst,symbase,symtype,symsym,symtable, + symconst,symbase,symtype,symsym,symdef,symtable, { parser } scanner, { register allocator } @@ -719,6 +719,7 @@ Unit Ra386int; errorflag : boolean; prevtok : tasmtoken; hl : tasmlabel; + def : tdef; sym : tsym; srsymtable : tsymtable; Begin @@ -817,6 +818,7 @@ Unit Ra386int; AS_OFFSET: begin Consume(AS_OFFSET); + needofs:=true; if actasmtoken<>AS_ID then Message(asmr_e_offset_without_identifier); end; @@ -887,6 +889,7 @@ Unit Ra386int; AS_ID: Begin hs:=''; + def:=nil; tempstr:=actasmpattern; prevtok:=prevasmtoken; consume(AS_ID); @@ -916,9 +919,13 @@ Unit Ra386int; if sym.owner.symtabletype in [localsymtable,parasymtable] then Message(asmr_e_no_local_or_para_allowed); hs:=tvarsym(sym).mangledname; + def:=tvarsym(sym).vartype.def; end; typedconstsym : - hs:=ttypedconstsym(sym).mangledname; + begin + hs:=ttypedconstsym(sym).mangledname; + def:=ttypedconstsym(sym).typedconsttype.def; + end; procsym : begin if Tprocsym(sym).procdef_count>1 then @@ -940,8 +947,6 @@ Unit Ra386int; { symbol found? } if hs<>'' then begin - if needofs and (prevtok<>AS_OFFSET) then - Message(asmr_e_need_offset); if asmsym='' then asmsym:=hs else @@ -953,7 +958,13 @@ Unit Ra386int; delete(expr,length(expr),1); end else - Message(asmr_e_only_add_relocatable_symbol); + if needofs then + begin + if (prevtok<>AS_OFFSET) then + Message(asmr_e_need_offset); + end + else + Message(asmr_e_only_add_relocatable_symbol); end; if actasmtoken=AS_DOT then begin @@ -966,6 +977,23 @@ Unit Ra386int; if (expr='') or (expr[length(expr)] in ['+','-','/','*']) then delete(expr,length(expr),1); end; + if (actasmtoken=AS_LBRACKET) and + assigned(def) and + (def.deftype=arraydef) then + begin + consume(AS_LBRACKET); + l:=BuildConstExpression; + if l'') and not(actasmtoken in [AS_MINUS,AS_PLUS,AS_COMMA,AS_SEPARATOR,AS_END,AS_RBRACKET]) then @@ -1373,7 +1401,9 @@ Unit Ra386int; begin oper.opr.typ:=OPR_SYMBOL; oper.opr.symofs:=l; - oper.opr.symbol:=objectlibrary.newasmsymbol(tempstr,AB_EXTERNAL,AT_FUNCTION); + { the symbol already exists, but we don't know whether it is data or + a function. we can use AT_NONE } + oper.opr.symbol:=objectlibrary.newasmsymbol(tempstr,AB_EXTERNAL,AT_NONE); end else begin @@ -1741,12 +1771,23 @@ Unit Ra386int; AS_TBYTE : size:=extended_size; end; Consume(actasmtoken); - if actasmtoken=AS_PTR then - begin - Consume(AS_PTR); - instr.Operands[operandnum].InitRef; - end; - BuildOperand(instr.Operands[operandnum] as tx86operand); + case actasmtoken of + AS_LPAREN : + begin + instr.Operands[operandnum].hastype:=true; + Consume(AS_LPAREN); + BuildOperand(instr.Operands[operandnum] as tx86operand); + Consume(AS_RPAREN); + end; + AS_PTR : + begin + Consume(AS_PTR); + instr.Operands[operandnum].InitRef; + BuildOperand(instr.Operands[operandnum] as tx86operand); + end; + else + BuildOperand(instr.Operands[operandnum] as tx86operand); + end; { now set the size which was specified by the override } instr.Operands[operandnum].setsize(size,true); end; @@ -1973,7 +2014,11 @@ begin end. { $Log$ - Revision 1.76 2004-07-06 19:47:19 peter + Revision 1.77 2004-09-13 20:25:52 peter + * support byte() typecast + * support array index + + Revision 1.76 2004/07/06 19:47:19 peter * fixed parsing of strings in db Revision 1.75 2004/06/23 14:54:46 peter