Procházet zdrojové kódy

+ getting the address of a label now returns a far pointer in i8086 far code memory models; this fixes the call to fpc_raiseexception in the raise node

git-svn-id: trunk@25517 -
nickysn před 12 roky
rodič
revize
6aae88578c
2 změnil soubory, kde provedl 50 přidání a 0 odebrání
  1. 37 0
      compiler/i8086/n8086mem.pas
  2. 13 0
      compiler/nmem.pas

+ 37 - 0
compiler/i8086/n8086mem.pas

@@ -31,6 +31,10 @@ interface
       node,nmem,ncgmem,nx86mem;
 
     type
+       ti8086addrnode = class(tcgaddrnode)
+         procedure pass_generate_code;override;
+       end;
+
        ti8086derefnode = class(tx86derefnode)
          procedure pass_generate_code;override;
        end;
@@ -48,6 +52,38 @@ implementation
       defutil,hlcgobj,
       pass_2,ncgutil;
 
+{*****************************************************************************
+                             TI8086ADDRNODE
+*****************************************************************************}
+
+    procedure ti8086addrnode.pass_generate_code;
+      var
+        segref: treference;
+      begin
+        if (current_settings.x86memorymodel in x86_far_code_models) and
+           (left.nodetype=loadn) and
+           (tloadnode(left).symtableentry.typ=labelsym) then
+          begin
+            secondpass(left);
+
+            location_reset(location,LOC_REGISTER,OS_32);
+            location.register:=cg.getintregister(current_asmdata.CurrAsmList,OS_32);
+            if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
+              internalerror(2013091801);
+
+            { load offset }
+            cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,location.register);
+
+            { load segment }
+            segref:=left.location.reference;
+            segref.refaddr:=addr_seg;
+            cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,GetNextReg(location.register));
+          end
+        else
+          inherited;
+      end;
+
+
 {*****************************************************************************
                              TI8086DEREFNODE
 *****************************************************************************}
@@ -128,5 +164,6 @@ implementation
 
 
 begin
+  caddrnode:=ti8086addrnode;
   cderefnode:=ti8086derefnode;
 end.

+ 13 - 0
compiler/nmem.pas

@@ -143,6 +143,9 @@ implementation
       symconst,symbase,defutil,defcmp,
       nbas,nutils,
       wpobase,
+{$ifdef i8086}
+      cpuinfo,
+{$endif i8086}
       htypechk,pass_1,ncal,nld,ncon,ncnv,cgbase,procinfo
       ;
 
@@ -614,6 +617,16 @@ implementation
                    result:=cpointerconstnode.create(offset,voidpointertype);
                  exit;
                end
+{$ifdef i8086}
+              else if (hp.nodetype=loadn) and
+               (tloadnode(hp).symtableentry.typ=labelsym) then
+                begin
+                  if current_settings.x86memorymodel in x86_far_code_models then
+                    resultdef:=voidfarpointertype
+                  else
+                    resultdef:=voidnearpointertype;
+                end
+{$endif i8086}
               else if (nf_internal in flags) or
                  valid_for_addr(left,true) then
                 begin