Browse Source

Use indirect reference for the RTL helpers that require RTTI symbols.

hlcgobj.pas, thlcgobj:
  * g_incrrefcount, g_initialize, g_finalize & g_array_rtti_helper: use the indirect symbol of the RTTI if the target supports packages

git-svn-id: branches/svenbarth/packages@32502 -
svenbarth 9 years ago
parent
commit
d97d3840b9
1 changed files with 36 additions and 12 deletions
  1. 36 12
      compiler/hlcgobj.pas

+ 36 - 12
compiler/hlcgobj.pas

@@ -3091,15 +3091,21 @@ implementation
           paramanager.getintparaloc(pd,2,cgpara2);
           paramanager.getintparaloc(pd,2,cgpara2);
           if is_open_array(t) then
           if is_open_array(t) then
             InternalError(201103054);
             InternalError(201103054);
-          reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,false),0,sizeof(pint));
+          reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,tf_supports_packages in target_info.flags),0,sizeof(pint));
           if pd.is_pushleftright then
           if pd.is_pushleftright then
             begin
             begin
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
-              a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
+              if tf_supports_packages in target_info.flags then
+                a_load_ref_cgpara(list,voidpointertype,href,cgpara2)
+              else
+                a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
             end
             end
           else
           else
             begin
             begin
-              a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
+              if tf_supports_packages in target_info.flags then
+                a_load_ref_cgpara(list,voidpointertype,href,cgpara2)
+              else
+                a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
             end;
             end;
           paramanager.freecgpara(list,cgpara1);
           paramanager.freecgpara(list,cgpara1);
@@ -3139,15 +3145,21 @@ implementation
             pd:=search_system_proc('fpc_initialize');
             pd:=search_system_proc('fpc_initialize');
             paramanager.getintparaloc(pd,1,cgpara1);
             paramanager.getintparaloc(pd,1,cgpara1);
             paramanager.getintparaloc(pd,2,cgpara2);
             paramanager.getintparaloc(pd,2,cgpara2);
-            reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,false),0,sizeof(pint));
+            reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,tf_supports_packages in target_info.flags),0,sizeof(pint));
             if pd.is_pushleftright then
             if pd.is_pushleftright then
               begin
               begin
                 a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
                 a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
-                a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
+                if tf_supports_packages in target_info.flags then
+                  a_load_ref_cgpara(list,voidpointertype,href,cgpara2)
+                else
+                  a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
               end
               end
             else
             else
               begin
               begin
-                a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
+                if tf_supports_packages in target_info.flags then
+                  a_load_ref_cgpara(list,voidpointertype,href,cgpara2)
+                else
+                  a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
                 a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
                 a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
               end;
               end;
             paramanager.freecgpara(list,cgpara1);
             paramanager.freecgpara(list,cgpara1);
@@ -3189,15 +3201,21 @@ implementation
             pd:=search_system_proc('fpc_finalize');
             pd:=search_system_proc('fpc_finalize');
           paramanager.getintparaloc(pd,1,cgpara1);
           paramanager.getintparaloc(pd,1,cgpara1);
           paramanager.getintparaloc(pd,2,cgpara2);
           paramanager.getintparaloc(pd,2,cgpara2);
-          reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,false),0,sizeof(pint));
+          reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,tf_supports_packages in target_info.flags),0,sizeof(pint));
           if pd.is_pushleftright then
           if pd.is_pushleftright then
             begin
             begin
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
-              a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
+              if tf_supports_packages in target_info.flags then
+                a_load_ref_cgpara(list,voidpointertype,href,cgpara2)
+              else
+                a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
             end
             end
           else
           else
             begin
             begin
-              a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
+              if tf_supports_packages in target_info.flags then
+                a_load_ref_cgpara(list,voidpointertype,href,cgpara2)
+              else
+                a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
             end;
             end;
           paramanager.freecgpara(list,cgpara1);
           paramanager.freecgpara(list,cgpara1);
@@ -3231,12 +3249,15 @@ implementation
       paramanager.getintparaloc(pd,2,cgpara2);
       paramanager.getintparaloc(pd,2,cgpara2);
       paramanager.getintparaloc(pd,3,cgpara3);
       paramanager.getintparaloc(pd,3,cgpara3);
 
 
-      reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,false),0,sizeof(pint));
+      reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,tf_supports_packages in target_info.flags),0,sizeof(pint));
       { if calling convention is left to right, push parameters 1 and 2 }
       { if calling convention is left to right, push parameters 1 and 2 }
       if pd.is_pushleftright then
       if pd.is_pushleftright then
         begin
         begin
           a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
           a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
-          a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
+          if tf_supports_packages in target_info.flags then
+            a_load_ref_cgpara(list,voidpointertype,href,cgpara2)
+          else
+            a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
         end;
         end;
 
 
       { push parameter 3 }
       { push parameter 3 }
@@ -3260,7 +3281,10 @@ implementation
       { if calling convention is right to left, push parameters 2 and 1 }
       { if calling convention is right to left, push parameters 2 and 1 }
       if not pd.is_pushleftright then
       if not pd.is_pushleftright then
         begin
         begin
-          a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
+          if tf_supports_packages in target_info.flags then
+            a_load_ref_cgpara(list,voidpointertype,href,cgpara2)
+          else
+            a_loadaddr_ref_cgpara(list,voidpointertype,href,cgpara2);
           a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
           a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
         end;
         end;
       paramanager.freecgpara(list,cgpara1);
       paramanager.freecgpara(list,cgpara1);