Browse Source

* fixed handling of typed files for LLVM when ISO-like I/O is active: encode
the buffer in the type, and support typecasting the typed file to a
different size (needed to be able to pass it to the compiler helpers that
expected a "TypedFile", whose buffer is 0 bytes and which hence will
always have a smaller size than the original type) (fixes test/tisoext1)

git-svn-id: trunk@35017 -

Jonas Maebe 8 năm trước cách đây
mục cha
commit
ee014fa4ff

+ 17 - 2
compiler/llvm/llvmdef.pas

@@ -113,7 +113,7 @@ interface
 implementation
 implementation
 
 
   uses
   uses
-    cutils,constexp,
+    globals,cutils,constexp,
     verbose,systems,
     verbose,systems,
     fmodule,
     fmodule,
     symtable,symconst,symsym,
     symtable,symconst,symsym,
@@ -392,7 +392,22 @@ implementation
               case tfiledef(def).filetyp of
               case tfiledef(def).filetyp of
                 ft_text    :
                 ft_text    :
                   llvmaddencodedtype_intern(search_system_type('TEXTREC').typedef,[lef_inaggregate]+[lef_typedecl]*flags,encodedstr);
                   llvmaddencodedtype_intern(search_system_type('TEXTREC').typedef,[lef_inaggregate]+[lef_typedecl]*flags,encodedstr);
-                ft_typed,
+                ft_typed   :
+                  begin
+                    { in case of ISO-like I/O, the typed file def includes a
+                      get/put buffer of the size of the file's elements }
+                    if (m_isolike_io in current_settings.modeswitches) and
+                       not is_void(tfiledef(def).typedfiledef) then
+                      encodedstr:=encodedstr+'<{';
+                    llvmaddencodedtype_intern(search_system_type('FILEREC').typedef,[lef_inaggregate]+[lef_typedecl]*flags,encodedstr);
+                    if (m_isolike_io in current_settings.modeswitches) and
+                       not is_void(tfiledef(def).typedfiledef) then
+                      begin
+                        encodedstr:=encodedstr+',[';
+                        encodedstr:=encodedstr+tostr(tfiledef(def).typedfiledef.size);
+                        encodedstr:=encodedstr+' x i8]}>'
+                      end;
+                  end;
                 ft_untyped :
                 ft_untyped :
                   llvmaddencodedtype_intern(search_system_type('FILEREC').typedef,[lef_inaggregate]+[lef_typedecl]*flags,encodedstr);
                   llvmaddencodedtype_intern(search_system_type('FILEREC').typedef,[lef_inaggregate]+[lef_typedecl]*flags,encodedstr);
                 else
                 else

+ 10 - 1
compiler/llvm/nllvmcnv.pas

@@ -236,7 +236,16 @@ procedure tllvmtypeconvnode.second_nothing;
            (resultdef.typ<>formaldef) and
            (resultdef.typ<>formaldef) and
            not is_open_array(resultdef) and
            not is_open_array(resultdef) and
            not is_open_array(left.resultdef) and
            not is_open_array(left.resultdef) and
-          (left.resultdef.size<>resultdef.size) then
+           (left.resultdef.size<>resultdef.size) and
+           { in case of ISO-like I/O, the typed file def includes a
+             get/put buffer of the size of the file's elements }
+           not(
+               (m_isolike_io in current_settings.modeswitches) and
+               (left.resultdef.typ=filedef) and
+               (tfiledef(left.resultdef).filetyp=ft_typed) and
+               (resultdef.typ=filedef) and
+               (tfiledef(resultdef).filetyp=ft_untyped)
+           ) then
           internalerror(2014012216);
           internalerror(2014012216);
         hlcg.location_force_mem(current_asmdata.CurrAsmList,left.location,left.resultdef);
         hlcg.location_force_mem(current_asmdata.CurrAsmList,left.location,left.resultdef);
         hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef));
         hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef));