Browse Source

changes to fix #32043
* changed most of the variables in the assembler readers used to store constants from aint to tcgint
as aint has only the size of the accumular while some CPUs (AVR) allow larger constants in instructions
+ allow access to absolute symbols with address type in inline assembler
* allow absolute addresses in avr inline assembler
+ tests

git-svn-id: trunk@37411 -

florian 7 years ago
parent
commit
4cf2a2672a

+ 3 - 0
.gitattributes

@@ -14199,6 +14199,8 @@ tests/webtbf/tw31465.pp svneol=native#text/pascal
 tests/webtbf/tw3183.pp svneol=native#text/plain
 tests/webtbf/tw3183.pp svneol=native#text/plain
 tests/webtbf/tw3186.pp svneol=native#text/plain
 tests/webtbf/tw3186.pp svneol=native#text/plain
 tests/webtbf/tw31973.pp svneol=native#text/pascal
 tests/webtbf/tw31973.pp svneol=native#text/pascal
+tests/webtbf/tw32043b.pp svneol=native#text/pascal
+tests/webtbf/tw32043c.pp svneol=native#text/pascal
 tests/webtbf/tw3218.pp svneol=native#text/plain
 tests/webtbf/tw3218.pp svneol=native#text/plain
 tests/webtbf/tw3241.pp svneol=native#text/plain
 tests/webtbf/tw3241.pp svneol=native#text/plain
 tests/webtbf/tw32412a.pp svneol=native#text/pascal
 tests/webtbf/tw32412a.pp svneol=native#text/pascal
@@ -15784,6 +15786,7 @@ tests/webtbs/tw3185.pp svneol=native#text/plain
 tests/webtbs/tw3190.pp svneol=native#text/plain
 tests/webtbs/tw3190.pp svneol=native#text/plain
 tests/webtbs/tw31945.pp svneol=native#text/pascal
 tests/webtbs/tw31945.pp svneol=native#text/pascal
 tests/webtbs/tw3197.pp svneol=native#text/plain
 tests/webtbs/tw3197.pp svneol=native#text/plain
+tests/webtbs/tw32043.pp svneol=native#text/pascal
 tests/webtbs/tw3207.pp svneol=native#text/plain
 tests/webtbs/tw3207.pp svneol=native#text/plain
 tests/webtbs/tw3210.pp svneol=native#text/plain
 tests/webtbs/tw3210.pp svneol=native#text/plain
 tests/webtbs/tw32108.pp svneol=native#text/pascal
 tests/webtbs/tw32108.pp svneol=native#text/pascal

+ 2 - 2
compiler/aasmtai.pas

@@ -795,7 +795,7 @@ interface
            procedure derefimpl;override;
            procedure derefimpl;override;
            procedure SetCondition(const c:TAsmCond);
            procedure SetCondition(const c:TAsmCond);
            procedure allocate_oper(opers:longint);
            procedure allocate_oper(opers:longint);
-           procedure loadconst(opidx:longint;l:aint);
+           procedure loadconst(opidx:longint;l:tcgint);
            procedure loadsymbol(opidx:longint;s:tasmsymbol;sofs:longint);
            procedure loadsymbol(opidx:longint;s:tasmsymbol;sofs:longint);
            procedure loadlocal(opidx:longint;s:pointer;sofs:longint;indexreg:tregister;scale:byte;getoffset,forceref:boolean);
            procedure loadlocal(opidx:longint;s:pointer;sofs:longint;indexreg:tregister;scale:byte;getoffset,forceref:boolean);
            procedure loadref(opidx:longint;const r:treference);
            procedure loadref(opidx:longint;const r:treference);
@@ -2553,7 +2553,7 @@ implementation
       end;
       end;
 
 
 
 
-    procedure tai_cpu_abstract.loadconst(opidx:longint;l:aint);
+    procedure tai_cpu_abstract.loadconst(opidx:longint;l:tcgint);
       begin
       begin
         allocate_oper(opidx+1);
         allocate_oper(opidx+1);
         with oper[opidx]^ do
         with oper[opidx]^ do

+ 6 - 6
compiler/arm/raarmgas.pas

@@ -163,7 +163,7 @@ Unit raarmgas;
     procedure tarmattreader.ReadSym(oper : tarmoperand);
     procedure tarmattreader.ReadSym(oper : tarmoperand);
       var
       var
          tempstr, mangledname : string;
          tempstr, mangledname : string;
-         typesize,l,k : longint;
+         typesize,l,k : tcgint;
       begin
       begin
         tempstr:=actasmpattern;
         tempstr:=actasmpattern;
         Consume(AS_ID);
         Consume(AS_ID);
@@ -310,7 +310,7 @@ Unit raarmgas;
       procedure read_index(require_rbracket : boolean);
       procedure read_index(require_rbracket : boolean);
         var
         var
           recname : string;
           recname : string;
-          o_int,s_int : aint;
+          o_int,s_int : tcgint;
         begin
         begin
           case actasmtoken of
           case actasmtoken of
             AS_REGISTER :
             AS_REGISTER :
@@ -576,7 +576,7 @@ Unit raarmgas;
     Procedure tarmattreader.BuildOperand(oper : tarmoperand);
     Procedure tarmattreader.BuildOperand(oper : tarmoperand);
       var
       var
         expr : string;
         expr : string;
-        typesize,l : longint;
+        typesize,l : tcgint;
 
 
 
 
         procedure AddLabelOperand(hl:tasmlabel);
         procedure AddLabelOperand(hl:tasmlabel);
@@ -607,7 +607,7 @@ Unit raarmgas;
             hasdot  : boolean;
             hasdot  : boolean;
             l,
             l,
             toffset,
             toffset,
-            tsize   : longint;
+            tsize   : tcgint;
           begin
           begin
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
              exit;
              exit;
@@ -806,7 +806,7 @@ Unit raarmgas;
           var
           var
             symtype: TAsmsymtype;
             symtype: TAsmsymtype;
             sym: string;
             sym: string;
-            val: aint;
+            val: tcgint;
           begin
           begin
             case actasmtoken of
             case actasmtoken of
               AS_INTNUM,
               AS_INTNUM,
@@ -1437,7 +1437,7 @@ Unit raarmgas;
       var
       var
         symname,
         symname,
         symval  : String;
         symval  : String;
-        val     : aint;
+        val     : tcgint;
         symtyp  : TAsmsymtype;
         symtyp  : TAsmsymtype;
       begin
       begin
         case actasmpattern of
         case actasmpattern of

+ 1 - 1
compiler/avr/raavr.pas

@@ -31,7 +31,7 @@ unit raavr;
       rautils;
       rautils;
 
 
     type
     type
-      TAVROperand=class(TOperand)
+       TAVROperand=class(TOperand)
       end;
       end;
 
 
       TAVRInstruction=class(TInstruction)
       TAVRInstruction=class(TInstruction)

+ 17 - 9
compiler/avr/raavrgas.pas

@@ -107,7 +107,8 @@ Unit raavrgas;
     procedure tavrattreader.ReadSym(oper : tavroperand);
     procedure tavrattreader.ReadSym(oper : tavroperand);
       var
       var
         tempstr, mangledname : string;
         tempstr, mangledname : string;
-        typesize,l,k : aint;
+        typesize : tcgint;
+        l,k : tcgint;
       begin
       begin
         tempstr:=actasmpattern;
         tempstr:=actasmpattern;
         Consume(AS_ID);
         Consume(AS_ID);
@@ -203,7 +204,7 @@ Unit raavrgas;
     Procedure tavrattreader.BuildOperand(oper : tavroperand);
     Procedure tavrattreader.BuildOperand(oper : tavroperand);
       var
       var
         expr : string;
         expr : string;
-        typesize,l : aint;
+        typesize,l : tcgint;
 
 
 
 
         procedure AddLabelOperand(hl:tasmlabel);
         procedure AddLabelOperand(hl:tasmlabel);
@@ -228,7 +229,7 @@ Unit raavrgas;
             hasdot  : boolean;
             hasdot  : boolean;
             l,
             l,
             toffset,
             toffset,
-            tsize   : aint;
+            tsize   : tcgint;
           begin
           begin
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
              exit;
              exit;
@@ -295,10 +296,14 @@ Unit raavrgas;
               AS_PLUS:
               AS_PLUS:
                 Begin
                 Begin
                   oper.opr.ref.offset:=BuildConstExpression(True,False);
                   oper.opr.ref.offset:=BuildConstExpression(True,False);
-                  if actasmtoken<>AS_LPAREN then
-                    Message(asmr_e_invalid_reference_syntax)
-                  else
-                    BuildReference(oper);
+                  case actasmtoken of
+                    AS_LPAREN:
+                      BuildReference(oper);
+                    AS_COMMA:
+                      exit;
+                    else
+                      Message(asmr_e_invalid_reference_syntax)
+                  end;
                 end;
                 end;
               AS_LPAREN:
               AS_LPAREN:
                 BuildReference(oper);
                 BuildReference(oper);
@@ -373,8 +378,11 @@ Unit raavrgas;
                   oper.opr.ref.offset:=BuildConstExpression(True,False);
                   oper.opr.ref.offset:=BuildConstExpression(True,False);
 
 
                   { absolute memory addresss? }
                   { absolute memory addresss? }
-                  if actopcode in [A_LDS,A_STS] then
-                    BuildReference(oper)
+                  if (actopcode in [A_LDS,A_STS]) and (actasmtoken<>AS_COMMA) then
+                    begin
+                      if not(MaybeBuildReference) then
+                        Message(asmr_e_invalid_reference_syntax);
+                    end
                   else
                   else
                     begin
                     begin
                       ofs:=oper.opr.ref.offset;
                       ofs:=oper.opr.ref.offset;

+ 3 - 3
compiler/m68k/ra68kmot.pas

@@ -636,7 +636,7 @@ const
       sym : tsym;
       sym : tsym;
       srsymtable : TSymtable;
       srsymtable : TSymtable;
       hl : tasmlabel;
       hl : tasmlabel;
-      l : longint;
+      l : tcgint;
       errorflag: boolean;
       errorflag: boolean;
   begin
   begin
     BuildExpression:=0;
     BuildExpression:=0;
@@ -1072,7 +1072,7 @@ const
   var
   var
     tempstr: string;
     tempstr: string;
     expr: string;
     expr: string;
-    l : longint;
+    l : tcgint;
     errorflag : boolean;
     errorflag : boolean;
   begin
   begin
     BuildRefExpression := 0;
     BuildRefExpression := 0;
@@ -1401,7 +1401,7 @@ const
     expr: string;
     expr: string;
     tempstr: string;
     tempstr: string;
     lab: tasmlabel;
     lab: tasmlabel;
-    l : longint;
+    l : tcgint;
     hl: tasmlabel;
     hl: tasmlabel;
     p: pointer;
     p: pointer;
   begin
   begin

+ 2 - 2
compiler/mips/racpugas.pas

@@ -116,7 +116,7 @@ Interface
     Procedure TMipsReader.BuildOperand(oper : TOperand);
     Procedure TMipsReader.BuildOperand(oper : TOperand);
       var
       var
         expr : string;
         expr : string;
-        typesize,l : aint;
+        typesize,l : tcgint;
 
 
         procedure AddLabelOperand(hl:tasmlabel);
         procedure AddLabelOperand(hl:tasmlabel);
           begin
           begin
@@ -140,7 +140,7 @@ Interface
             hasdot  : boolean;
             hasdot  : boolean;
             l,
             l,
             toffset,
             toffset,
-            tsize   : aint;
+            tsize   : tcgint;
           begin
           begin
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
              exit;
              exit;

+ 5 - 5
compiler/powerpc/rappcgas.pas

@@ -62,7 +62,7 @@ Unit rappcgas;
     procedure tppcattreader.ReadSym(oper : tppcoperand);
     procedure tppcattreader.ReadSym(oper : tppcoperand);
       var
       var
          tempstr, mangledname : string;
          tempstr, mangledname : string;
-         typesize,l,k : aint;
+         typesize,l,k : tcgint;
       begin
       begin
         tempstr:=actasmpattern;
         tempstr:=actasmpattern;
         Consume(AS_ID);
         Consume(AS_ID);
@@ -139,7 +139,7 @@ Unit rappcgas;
         end;
         end;
 
 
       var
       var
-        l : aint;
+        l : tcgint;
         relsym: string;
         relsym: string;
         asmsymtyp: tasmsymtype;
         asmsymtyp: tasmsymtype;
         isflags: tindsymflags;
         isflags: tindsymflags;
@@ -287,7 +287,7 @@ Unit rappcgas;
     Procedure tppcattreader.BuildOperand(oper : tppcoperand);
     Procedure tppcattreader.BuildOperand(oper : tppcoperand);
       var
       var
         expr : string;
         expr : string;
-        typesize,l : aint;
+        typesize,l : tcgint;
 
 
 
 
         procedure AddLabelOperand(hl:tasmlabel);
         procedure AddLabelOperand(hl:tasmlabel);
@@ -312,7 +312,7 @@ Unit rappcgas;
             hasdot  : boolean;
             hasdot  : boolean;
             l,
             l,
             toffset,
             toffset,
-            tsize   : aint;
+            tsize   : tcgint;
           begin
           begin
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
              exit;
              exit;
@@ -411,7 +411,7 @@ Unit rappcgas;
       var
       var
         tempreg : tregister;
         tempreg : tregister;
         hl : tasmlabel;
         hl : tasmlabel;
-        ofs : aint;
+        ofs : tcgint;
       Begin
       Begin
         expr:='';
         expr:='';
         case actasmtoken of
         case actasmtoken of

+ 12 - 12
compiler/raatt.pas

@@ -95,9 +95,9 @@ unit raatt;
          procedure BuildRealConstant(typ : tfloattype);
          procedure BuildRealConstant(typ : tfloattype);
          procedure BuildStringConstant(asciiz: boolean);
          procedure BuildStringConstant(asciiz: boolean);
          procedure BuildRva;
          procedure BuildRva;
-         procedure BuildRecordOffsetSize(const expr: string;var offset:aint;var size:aint; var mangledname: string; needvmtofs: boolean);
-         procedure BuildConstSymbolExpression(allowref,betweenbracket,needofs:boolean;var value:aint;var asmsym:string;var asmsymtyp:TAsmsymtype);
-         function BuildConstExpression(allowref,betweenbracket:boolean): aint;
+         procedure BuildRecordOffsetSize(const expr: string;var offset:tcgint;var size:tcgint; var mangledname: string; needvmtofs: boolean);
+         procedure BuildConstSymbolExpression(allowref,betweenbracket,needofs:boolean;var value:tcgint;var asmsym:string;var asmsymtyp:TAsmsymtype);
+         function BuildConstExpression(allowref,betweenbracket:boolean): tcgint;
          function Assemble: tlinkedlist;override;
          function Assemble: tlinkedlist;override;
          procedure handleopcode;virtual;abstract;
          procedure handleopcode;virtual;abstract;
          function is_asmopcode(const s: string) : boolean;virtual;abstract;
          function is_asmopcode(const s: string) : boolean;virtual;abstract;
@@ -862,7 +862,7 @@ unit raatt;
        asmsymtyp : TAsmSymType;
        asmsymtyp : TAsmSymType;
        asmsym,
        asmsym,
        expr: string;
        expr: string;
-       value : aint;
+       value : tcgint;
       Begin
       Begin
         Repeat
         Repeat
           Case actasmtoken of
           Case actasmtoken of
@@ -1037,7 +1037,7 @@ unit raatt;
        lasTSec    : TAsmSectiontype;
        lasTSec    : TAsmSectiontype;
        l1,
        l1,
        l2,
        l2,
-       symofs     : aint;
+       symofs     : tcgint;
        symtyp     : TAsmsymtype;
        symtyp     : TAsmsymtype;
      Begin
      Begin
        Message1(asmr_d_start_reading,'GNU AS');
        Message1(asmr_d_start_reading,'GNU AS');
@@ -1325,7 +1325,7 @@ unit raatt;
                                Parsing Helpers
                                Parsing Helpers
 *****************************************************************************}
 *****************************************************************************}
 
 
-    Procedure tattreader.BuildRecordOffsetSize(const expr: string;var offset:aint;var size:aint; var mangledname: string; needvmtofs: boolean);
+    Procedure tattreader.BuildRecordOffsetSize(const expr: string;var offset:tcgint;var size:tcgint; var mangledname: string; needvmtofs: boolean);
       { Description: This routine builds up a record offset after a AS_DOT }
       { Description: This routine builds up a record offset after a AS_DOT }
       { token is encountered.                                              }
       { token is encountered.                                              }
       { On entry actasmtoken should be equal to AS_DOT                     }
       { On entry actasmtoken should be equal to AS_DOT                     }
@@ -1358,12 +1358,12 @@ unit raatt;
       end;
       end;
 
 
 
 
-    procedure tattreader.BuildConstSymbolExpression(allowref,betweenbracket,needofs:boolean;var value:aint;var asmsym:string;var asmsymtyp:TAsmsymtype);
+    procedure tattreader.BuildConstSymbolExpression(allowref,betweenbracket,needofs:boolean;var value:tcgint;var asmsym:string;var asmsymtyp:TAsmsymtype);
       var
       var
         hssymtyp : TAsmSymType;
         hssymtyp : TAsmSymType;
         hs,tempstr,expr,mangledname : string;
         hs,tempstr,expr,mangledname : string;
         parenlevel : longint;
         parenlevel : longint;
-        l,k : aint;
+        l,k : tcgint;
         errorflag : boolean;
         errorflag : boolean;
         prevtok : tasmtoken;
         prevtok : tasmtoken;
         sym : tsym;
         sym : tsym;
@@ -1685,9 +1685,9 @@ unit raatt;
       end;
       end;
 
 
 
 
-    function tattreader.BuildConstExpression(allowref,betweenbracket:boolean): aint;
+    function tattreader.BuildConstExpression(allowref,betweenbracket:boolean): tcgint;
       var
       var
-        l : aint;
+        l : tcgint;
         hs : string;
         hs : string;
         hssymtyp : TAsmSymType;
         hssymtyp : TAsmSymType;
       begin
       begin
@@ -1700,7 +1700,7 @@ unit raatt;
 
 
     Procedure tattreader.BuildConstantOperand(oper : toperand);
     Procedure tattreader.BuildConstantOperand(oper : toperand);
       var
       var
-        l : aint;
+        l : tcgint;
         tempstr : string;
         tempstr : string;
         tempsymtyp : TAsmSymType;
         tempsymtyp : TAsmSymType;
       begin
       begin
@@ -1722,7 +1722,7 @@ unit raatt;
       var
       var
        asmsymtyp : TAsmSymType;
        asmsymtyp : TAsmSymType;
        asmsym: string;
        asmsym: string;
-       value : aint;
+       value : tcgint;
        ai:tai_const;
        ai:tai_const;
       begin
       begin
         repeat
         repeat

+ 62 - 49
compiler/rautils.pas

@@ -50,7 +50,11 @@ type
   TOprRec = record
   TOprRec = record
     case typ:TOprType of
     case typ:TOprType of
       OPR_NONE      : ();
       OPR_NONE      : ();
+{$ifdef AVR}
+      OPR_CONSTANT  : (val:word);
+{$else AVR}
       OPR_CONSTANT  : (val:aint);
       OPR_CONSTANT  : (val:aint);
+{$endif AVR}
       OPR_SYMBOL    : (symbol:tasmsymbol;symofs:aint;symseg:boolean;sym_farproc_entry:boolean);
       OPR_SYMBOL    : (symbol:tasmsymbol;symofs:aint;symseg:boolean;sym_farproc_entry:boolean);
       OPR_REFERENCE : (varsize:asizeint; constoffset: asizeint;ref_farproc_entry:boolean;ref:treference);
       OPR_REFERENCE : (varsize:asizeint; constoffset: asizeint;ref_farproc_entry:boolean;ref:treference);
       OPR_LOCAL     : (localvarsize, localconstoffset: asizeint;localsym:tabstractnormalvarsym;localsymofs:aint;localindexreg:tregister;localscale:byte;localgetoffset,localforceref:boolean);
       OPR_LOCAL     : (localvarsize, localconstoffset: asizeint;localsym:tabstractnormalvarsym;localsymofs:aint;localindexreg:tregister;localscale:byte;localgetoffset,localforceref:boolean);
@@ -145,29 +149,29 @@ type
     public
     public
      Constructor create;
      Constructor create;
      Destructor Destroy;override;
      Destructor Destroy;override;
-     Function Evaluate(Expr:  String): aint;
+     Function Evaluate(Expr:  String): tcgint;
      Function Priority(_Operator: Char): aint;
      Function Priority(_Operator: Char): aint;
     private
     private
-     RPNStack   : Array[1..RPNMax] of aint;        { Stack For RPN calculator }
-     RPNTop     : aint;
+     RPNStack   : Array[1..RPNMax] of tcgint;        { Stack For RPN calculator }
+     RPNTop     : tcgint;
      OpStack    : Array[1..OpMax] of TExprOperator;    { Operator stack For conversion }
      OpStack    : Array[1..OpMax] of TExprOperator;    { Operator stack For conversion }
-     OpTop      : aint;
-     Procedure RPNPush(Num: aint);
-     Function RPNPop: aint;
+     OpTop      : tcgint;
+     Procedure RPNPush(Num: tcgint);
+     Function RPNPop: tcgint;
      Procedure RPNCalc(const token: String; prefix: boolean);
      Procedure RPNCalc(const token: String; prefix: boolean);
      Procedure OpPush(_Operator: char; prefix: boolean);
      Procedure OpPush(_Operator: char; prefix: boolean);
      { In reality returns TExprOperaotr }
      { In reality returns TExprOperaotr }
      Procedure OpPop(var _Operator:TExprOperator);
      Procedure OpPop(var _Operator:TExprOperator);
   end;
   end;
 
 
-  { Evaluate an expression string to a aint }
-  Function CalculateExpression(const expression: string): aint;
+  { Evaluate an expression string to a tcgint }
+  Function CalculateExpression(const expression: string): tcgint;
 
 
   {---------------------------------------------------------------------}
   {---------------------------------------------------------------------}
   {                     String routines                                 }
   {                     String routines                                 }
   {---------------------------------------------------------------------}
   {---------------------------------------------------------------------}
 
 
-Function ParseVal(const S:String;base:byte):aint;
+Function ParseVal(const S:String;base:byte):tcgint;
 Function PadZero(Var s: String; n: byte): Boolean;
 Function PadZero(Var s: String; n: byte): Boolean;
 Function EscapeToPascal(const s:string): string;
 Function EscapeToPascal(const s:string): string;
 
 
@@ -176,10 +180,10 @@ Function EscapeToPascal(const s:string): string;
 ---------------------------------------------------------------------}
 ---------------------------------------------------------------------}
 
 
 procedure AsmSearchSym(const s:string;var srsym:tsym;var srsymtable:TSymtable);
 procedure AsmSearchSym(const s:string;var srsym:tsym;var srsymtable:TSymtable);
-Function GetRecordOffsetSize(s:string;Var Offset: aint;var Size:aint; var mangledname: string; needvmtofs: boolean; out hastypecast: boolean):boolean;
-Function SearchType(const hs:string;var size:aint): Boolean;
+Function GetRecordOffsetSize(s:string;Var Offset: tcgint;var Size:tcgint; var mangledname: string; needvmtofs: boolean; out hastypecast: boolean):boolean;
+Function SearchType(const hs:string;var size:tcgint): Boolean;
 Function SearchRecordType(const s:string): boolean;
 Function SearchRecordType(const s:string): boolean;
-Function SearchIConstant(const s:string; var l:aint): boolean;
+Function SearchIConstant(const s:string; var l:tcgint): boolean;
 Function AsmRegisterPara(sym: tabstractnormalvarsym): boolean;
 Function AsmRegisterPara(sym: tabstractnormalvarsym): boolean;
 
 
 {---------------------------------------------------------------------
 {---------------------------------------------------------------------
@@ -187,11 +191,11 @@ Function AsmRegisterPara(sym: tabstractnormalvarsym): boolean;
 ---------------------------------------------------------------------}
 ---------------------------------------------------------------------}
 
 
   Procedure ConcatLabel(p: TAsmList;var l : tasmlabel);
   Procedure ConcatLabel(p: TAsmList;var l : tasmlabel);
-  Procedure ConcatConstant(p : TAsmList;value: aint; constsize:byte);
-  Procedure ConcatConstSymbol(p : TAsmList;const sym:string;symtyp:tasmsymtype;l:aint);
+  Procedure ConcatConstant(p : TAsmList;value: tcgint; constsize:byte);
+  Procedure ConcatConstSymbol(p : TAsmList;const sym:string;symtyp:tasmsymtype;l:tcgint);
   Procedure ConcatRealConstant(p : TAsmList;value: bestreal; real_typ : tfloattype);
   Procedure ConcatRealConstant(p : TAsmList;value: bestreal; real_typ : tfloattype);
   Procedure ConcatString(p : TAsmList;s:string);
   Procedure ConcatString(p : TAsmList;s:string);
-  procedure ConcatAlign(p:TAsmList;l:aint);
+  procedure ConcatAlign(p:TAsmList;l:tcgint);
   Procedure ConcatPublic(p:TAsmList;const s : string);
   Procedure ConcatPublic(p:TAsmList;const s : string);
   Procedure ConcatLocal(p:TAsmList;const s : string);
   Procedure ConcatLocal(p:TAsmList;const s : string);
 
 
@@ -214,7 +218,7 @@ Begin
 end;
 end;
 
 
 
 
-Procedure TExprParse.RPNPush(Num : aint);
+Procedure TExprParse.RPNPush(Num : tcgint);
 { Add an operand to the top of the RPN stack }
 { Add an operand to the top of the RPN stack }
 begin
 begin
   if RPNTop < RPNMax then
   if RPNTop < RPNMax then
@@ -227,7 +231,7 @@ begin
 end;
 end;
 
 
 
 
-Function TExprParse.RPNPop : aint;
+Function TExprParse.RPNPop : tcgint;
 { Get the operand at the top of the RPN stack }
 { Get the operand at the top of the RPN stack }
 begin
 begin
   RPNPop:=0;
   RPNPop:=0;
@@ -243,8 +247,8 @@ end;
 
 
 Procedure TExprParse.RPNCalc(const Token : String; prefix:boolean);                       { RPN Calculator }
 Procedure TExprParse.RPNCalc(const Token : String; prefix:boolean);                       { RPN Calculator }
 Var
 Var
-  Temp  : aint;
-  n1,n2 : aint;
+  Temp  : tcgint;
+  n1,n2 : tcgint;
   LocalError : Integer;
   LocalError : Integer;
 begin
 begin
   { Handle operators }
   { Handle operators }
@@ -383,7 +387,7 @@ begin
 end;
 end;
 
 
 
 
-Function TExprParse.Evaluate(Expr : String):aint;
+Function TExprParse.Evaluate(Expr : String):tcgint;
 Var
 Var
   I     : longint;
   I     : longint;
   Token : String;
   Token : String;
@@ -479,7 +483,7 @@ Begin
 end;
 end;
 
 
 
 
-Function CalculateExpression(const expression: string): aint;
+Function CalculateExpression(const expression: string): tcgint;
 var
 var
   expr: TExprParse;
   expr: TExprParse;
 Begin
 Begin
@@ -558,8 +562,8 @@ Begin
 end;
 end;
 
 
 
 
-Function ParseVal(const S:String;base:byte):aint;
-{ Converts a decimal string to aint }
+Function ParseVal(const S:String;base:byte):tcgint;
+{ Converts a decimal string to tcgint }
 var
 var
   code : integer;
   code : integer;
   errmsg : word;
   errmsg : word;
@@ -592,7 +596,7 @@ Begin
   val(prefix+s,result,code);
   val(prefix+s,result,code);
   if code<>0 then
   if code<>0 then
     begin
     begin
-      val(prefix+s,aword(result),code);
+      val(prefix+s,result,code);
       if code<>0 then
       if code<>0 then
         begin
         begin
           Message1(errmsg,s);
           Message1(errmsg,s);
@@ -807,24 +811,33 @@ Begin
    exit;
    exit;
   if sym.typ=absolutevarsym then
   if sym.typ=absolutevarsym then
     begin
     begin
-      if (tabsolutevarsym(sym).abstyp=tovar) then
-        begin
-          { Only support simple loads }
-          plist:=tabsolutevarsym(sym).ref.firstsym;
-          if assigned(plist) and
-             (plist^.sltype=sl_load) then
-            sym:=plist^.sym
-          else
-            begin
-              Message(asmr_e_unsupported_symbol_type);
-              exit;
-            end;
-        end
-      else
-        begin
-          Message(asmr_e_unsupported_symbol_type);
-          exit;
-        end;
+      case tabsolutevarsym(sym).abstyp of
+        tovar:
+          begin
+            { Only support simple loads }
+            plist:=tabsolutevarsym(sym).ref.firstsym;
+            if assigned(plist) and
+               (plist^.sltype=sl_load) then
+              sym:=plist^.sym
+            else
+              begin
+                Message(asmr_e_unsupported_symbol_type);
+                exit;
+              end;
+          end;
+        toaddr:
+          begin
+            initref;
+            opr.ref.offset:=tabsolutevarsym(sym).addroffset;
+            Result:=true;
+            exit;
+          end;
+        else
+          begin
+            Message(asmr_e_unsupported_symbol_type);
+            exit;
+          end;
+      end;
     end;
     end;
   case sym.typ of
   case sym.typ of
     fieldvarsym :
     fieldvarsym :
@@ -1219,7 +1232,7 @@ begin
 end;
 end;
 
 
 
 
-Function SearchType(const hs:string;var size:aint): Boolean;
+Function SearchType(const hs:string;var size:tcgint): Boolean;
 var
 var
   srsym : tsym;
   srsym : tsym;
   srsymtable : TSymtable;
   srsymtable : TSymtable;
@@ -1269,7 +1282,7 @@ Begin
 end;
 end;
 
 
 
 
-Function SearchIConstant(const s:string; var l:aint): boolean;
+Function SearchIConstant(const s:string; var l:tcgint): boolean;
 {**********************************************************************}
 {**********************************************************************}
 {  Description: Searches for a CONSTANT of name s in either the local  }
 {  Description: Searches for a CONSTANT of name s in either the local  }
 {  symbol list, then in the global symbol list, and returns the value  }
 {  symbol list, then in the global symbol list, and returns the value  }
@@ -1305,7 +1318,7 @@ Begin
          begin
          begin
            if tconstsym(srsym).consttyp=constord then
            if tconstsym(srsym).consttyp=constord then
             Begin
             Begin
-              l:=aint(tconstsym(srsym).value.valueord.svalue);
+              l:=tconstsym(srsym).value.valueord.svalue;
               SearchIConstant:=TRUE;
               SearchIConstant:=TRUE;
               exit;
               exit;
             end;
             end;
@@ -1330,7 +1343,7 @@ begin
 end;
 end;
 
 
 
 
-Function GetRecordOffsetSize(s:string;Var Offset: aint;var Size:aint; var mangledname: string; needvmtofs: boolean; out hastypecast: boolean):boolean;
+Function GetRecordOffsetSize(s:string;Var Offset: tcgint;var Size:tcgint; var mangledname: string; needvmtofs: boolean; out hastypecast: boolean):boolean;
 { search and returns the offset and size of records/objects of the base }
 { search and returns the offset and size of records/objects of the base }
 { with field name setup in field.                              }
 { with field name setup in field.                              }
 { returns FALSE if not found.                                  }
 { returns FALSE if not found.                                  }
@@ -1526,7 +1539,7 @@ end;
   end;
   end;
 
 
 
 
-Procedure ConcatConstant(p: TAsmList; value: aint; constsize:byte);
+Procedure ConcatConstant(p: TAsmList; value: tcgint; constsize:byte);
 {*********************************************************************}
 {*********************************************************************}
 { PROCEDURE ConcatConstant(value: aint; maxvalue: aint);        }
 { PROCEDURE ConcatConstant(value: aint; maxvalue: aint);        }
 {  Description: This routine adds the value constant to the current   }
 {  Description: This routine adds the value constant to the current   }
@@ -1574,7 +1587,7 @@ Begin
 end;
 end;
 
 
 
 
-  Procedure ConcatConstSymbol(p : TAsmList;const sym:string;symtyp:tasmsymtype;l:aint);
+  Procedure ConcatConstSymbol(p : TAsmList;const sym:string;symtyp:tasmsymtype;l:tcgint);
   begin
   begin
     p.concat(Tai_const.Createname(sym,l));
     p.concat(Tai_const.Createname(sym,l));
   end;
   end;
@@ -1620,7 +1633,7 @@ end;
      p.concat(Tai_label.Create(l));
      p.concat(Tai_label.Create(l));
    end;
    end;
 
 
-   procedure ConcatAlign(p:TAsmList;l:aint);
+   procedure ConcatAlign(p:TAsmList;l:tcgint);
   {*********************************************************************}
   {*********************************************************************}
   { PROCEDURE ConcatPublic                                              }
   { PROCEDURE ConcatPublic                                              }
   {  Description: This routine emits an global   definition to the      }
   {  Description: This routine emits an global   definition to the      }

+ 2 - 2
compiler/sparcgen/racpugas.pas

@@ -175,7 +175,7 @@ Interface
     Procedure TSparcReader.BuildOperand(oper : tSparcoperand);
     Procedure TSparcReader.BuildOperand(oper : tSparcoperand);
       var
       var
         expr : string;
         expr : string;
-        typesize,l : aint;
+        typesize,l : tcgint;
 
 
         procedure AddLabelOperand(hl:tasmlabel);
         procedure AddLabelOperand(hl:tasmlabel);
           begin
           begin
@@ -199,7 +199,7 @@ Interface
             hasdot  : boolean;
             hasdot  : boolean;
             l,
             l,
             toffset,
             toffset,
-            tsize   : aint;
+            tsize   : tcgint;
           begin
           begin
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
              exit;
              exit;

+ 3 - 3
compiler/x86/rax86att.pas

@@ -330,7 +330,7 @@ Implementation
       var
       var
         relsym: string;
         relsym: string;
         asmsymtyp: tasmsymtype;
         asmsymtyp: tasmsymtype;
-        l: aint;
+        l: tcgint;
         sym: tasmsymbol;
         sym: tasmsymbol;
       begin
       begin
         case actasmtoken of
         case actasmtoken of
@@ -401,7 +401,7 @@ Implementation
       var
       var
         tempstr,
         tempstr,
         expr : string;
         expr : string;
-        typesize,l,k : aint;
+        typesize,l,k : tcgint;
 
 
 
 
         procedure AddLabelOperand(hl:tasmlabel);
         procedure AddLabelOperand(hl:tasmlabel);
@@ -426,7 +426,7 @@ Implementation
             hasdot  : boolean;
             hasdot  : boolean;
             l,
             l,
             toffset,
             toffset,
-            tsize   : aint;
+            tsize   : tcgint;
           begin
           begin
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
             if not(actasmtoken in [AS_DOT,AS_PLUS,AS_MINUS]) then
              exit;
              exit;

+ 12 - 12
compiler/x86/rax86int.pas

@@ -62,8 +62,8 @@ Unit Rax86int;
          procedure GetToken;
          procedure GetToken;
          function consume(t : tasmtoken):boolean;
          function consume(t : tasmtoken):boolean;
          procedure RecoverConsume(allowcomma:boolean);
          procedure RecoverConsume(allowcomma:boolean);
-         procedure BuildRecordOffsetSize(const expr: string;var offset:aint;var size:aint; var mangledname: string; needvmtofs: boolean; out hastypecast: boolean);
-         procedure BuildConstSymbolExpression(needofs,isref,startingminus:boolean;var value:aint;var asmsym:string;var asmsymtyp:TAsmsymtype;out isseg,is_farproc_entry:boolean);
+         procedure BuildRecordOffsetSize(const expr: string;var offset:tcgint;var size:tcgint; var mangledname: string; needvmtofs: boolean; out hastypecast: boolean);
+         procedure BuildConstSymbolExpression(needofs,isref,startingminus:boolean;var value:tcgint;var asmsym:string;var asmsymtyp:TAsmsymtype;out isseg,is_farproc_entry:boolean);
          function BuildConstExpression:aint;
          function BuildConstExpression:aint;
          function BuildRefConstExpression(startingminus:boolean=false):aint;
          function BuildRefConstExpression(startingminus:boolean=false):aint;
          procedure BuildReference(oper : tx86operand);
          procedure BuildReference(oper : tx86operand);
@@ -756,7 +756,7 @@ Unit Rax86int;
     { This routine builds up a record offset after a AS_DOT
     { This routine builds up a record offset after a AS_DOT
       token is encountered.
       token is encountered.
       On entry actasmtoken should be equal to AS_DOT                     }
       On entry actasmtoken should be equal to AS_DOT                     }
-    Procedure tx86intreader.BuildRecordOffsetSize(const expr: string;var offset:aint;var size:aint; var mangledname: string; needvmtofs: boolean; out hastypecast: boolean);
+    Procedure tx86intreader.BuildRecordOffsetSize(const expr: string;var offset:tcgint;var size:tcgint; var mangledname: string; needvmtofs: boolean; out hastypecast: boolean);
       var
       var
         s: string;
         s: string;
       Begin
       Begin
@@ -784,11 +784,11 @@ Unit Rax86int;
       end;
       end;
 
 
 
 
-    Procedure tx86intreader.BuildConstSymbolExpression(needofs,isref,startingminus:boolean;var value:aint;var asmsym:string;var asmsymtyp:TAsmsymtype;out isseg,is_farproc_entry:boolean);
+    Procedure tx86intreader.BuildConstSymbolExpression(needofs,isref,startingminus:boolean;var value:tcgint;var asmsym:string;var asmsymtyp:TAsmsymtype;out isseg,is_farproc_entry:boolean);
       var
       var
         tempstr,expr,hs,mangledname : string;
         tempstr,expr,hs,mangledname : string;
         parenlevel : longint;
         parenlevel : longint;
-        l,k : aint;
+        l,k : tcgint;
         hasparen,
         hasparen,
         errorflag,
         errorflag,
         needvmtofs : boolean;
         needvmtofs : boolean;
@@ -1181,7 +1181,7 @@ Unit Rax86int;
 
 
     Function tx86intreader.BuildConstExpression:aint;
     Function tx86intreader.BuildConstExpression:aint;
       var
       var
-        l : aint;
+        l : tcgint;
         hs : string;
         hs : string;
         hssymtyp : TAsmsymtype;
         hssymtyp : TAsmsymtype;
         isseg : boolean;
         isseg : boolean;
@@ -1196,7 +1196,7 @@ Unit Rax86int;
 
 
     Function tx86intreader.BuildRefConstExpression(startingminus:boolean):aint;
     Function tx86intreader.BuildRefConstExpression(startingminus:boolean):aint;
       var
       var
-        l : aint;
+        l : tcgint;
         hs : string;
         hs : string;
         hssymtyp : TAsmsymtype;
         hssymtyp : TAsmsymtype;
         isseg : boolean;
         isseg : boolean;
@@ -1212,7 +1212,7 @@ Unit Rax86int;
     procedure tx86intreader.BuildReference(oper : tx86operand);
     procedure tx86intreader.BuildReference(oper : tx86operand);
       var
       var
         scale : byte;
         scale : byte;
-        k,l : aint;
+        k,l : tcgint;
         tempstr,hs : string;
         tempstr,hs : string;
         tempsymtyp : tasmsymtype;
         tempsymtyp : tasmsymtype;
         code : integer;
         code : integer;
@@ -1630,7 +1630,7 @@ Unit Rax86int;
 
 
     Procedure tx86intreader.BuildConstantOperand(oper: tx86operand);
     Procedure tx86intreader.BuildConstantOperand(oper: tx86operand);
       var
       var
-        l : aint;
+        l : tcgint;
         tempstr : string;
         tempstr : string;
         tempsymtyp : tasmsymtype;
         tempsymtyp : tasmsymtype;
         isseg: boolean;
         isseg: boolean;
@@ -1698,10 +1698,10 @@ Unit Rax86int;
         expr,
         expr,
         hs      : string;
         hs      : string;
         tempreg : tregister;
         tempreg : tregister;
-        l       : aint;
+        l       : tcgint;
         hl      : tasmlabel;
         hl      : tasmlabel;
         toffset,
         toffset,
-        tsize   : aint;
+        tsize   : tcgint;
         hastypecast: boolean;
         hastypecast: boolean;
       begin
       begin
         expr:='';
         expr:='';
@@ -2359,7 +2359,7 @@ Unit Rax86int;
         asmsymtyp : tasmsymtype;
         asmsymtyp : tasmsymtype;
         asmsym,
         asmsym,
         expr: string;
         expr: string;
-        value : aint;
+        value : tcgint;
         isseg: boolean;
         isseg: boolean;
         is_farproc_entry : boolean;
         is_farproc_entry : boolean;
       Begin
       Begin

+ 21 - 0
tests/webtbf/tw32043b.pp

@@ -0,0 +1,21 @@
+{ %cpu=avr }
+{ %fail }
+const
+  cFE = $FE;
+  c102 = $102;
+  c1000 = $1000;
+  c3070 = $3070;
+
+procedure p;assembler;
+var
+  var1: byte;
+  varabs: byte absolute $100;
+
+asm
+          adiw 0x1225 //(7)
+          sts varabs, r22
+          sts 0x1223, r22
+end;
+
+begin
+end.

+ 19 - 0
tests/webtbf/tw32043c.pp

@@ -0,0 +1,19 @@
+{ %cpu=avr }
+{ %fail }
+const
+  cFE = $FE;
+  c102 = $102;
+  c1000 = $1000;
+  c3070 = $3070;
+
+procedure p;assembler;
+var
+  var1: byte;
+  varabs: byte absolute $100;
+
+asm
+          adiw r28, c3070 //(6)
+end;
+
+begin
+end.

+ 24 - 0
tests/webtbs/tw32043.pp

@@ -0,0 +1,24 @@
+{ %cpu=avr }
+const
+  cFE = $FE;
+  c102 = $102;
+  c1000 = $1000;
+  c3070 = $3070;
+
+procedure p;assembler;
+var
+  var1: byte;
+  varabs: byte absolute $100;
+
+asm
+          sts cFE, r22 //(1)
+          sts c102, r22 //(2)
+          sts c1000, r22 //(3)
+          sts c3070, r22 //(4)
+          sts var1, r22 //(5)
+          sts 0x1223, r22
+          sts varabs, r22
+end;
+
+begin
+end.