Ver Fonte

* converted tobjcrttiwriter_fragile.gen_objc_info_sections to the high level
typed constant builder

git-svn-id: trunk@34158 -

Jonas Maebe há 9 anos atrás
pai
commit
84129857c2
1 ficheiros alterados com 78 adições e 37 exclusões
  1. 78 37
      compiler/objcgutl.pas

+ 78 - 37
compiler/objcgutl.pas

@@ -59,6 +59,8 @@ implementation
       fabi: tobjcabi;
       classdefs,
       catdefs: tfpobjectlist;
+      classrttidefs,
+      catrttidefs: tfpobjectlist;
       classsyms,
       catsyms: tfpobjectlist;
       procedure gen_objc_methods(list: tasmlist; objccls: tobjectdef; out methodslabel: tasmsymbol; classmethods, iscategory: Boolean);
@@ -67,8 +69,8 @@ implementation
       procedure gen_objc_cat_methods(list:TAsmList; items: TFPObjectList; section: tasmsectiontype;const sectname: string; out listsym: TAsmLabel);
 
       procedure gen_objc_protocol(list:TAsmList; protocol: tobjectdef; out protocollabel: TAsmSymbol);virtual;abstract;
-      procedure gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);virtual;abstract;
-      procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);virtual;abstract;
+      procedure gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol; out catlabeldef: tdef);virtual;abstract;
+      procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol; out classlabeldef: tdef);virtual;abstract;
       procedure gen_objc_info_sections(list: tasmlist);virtual;abstract;
      public
       constructor create(_abi: tobjcabi);
@@ -84,8 +86,8 @@ implementation
       function gen_objc_protocol_ext(list: TAsmList; optinstsym, optclssym: TAsmLabel): TAsmLabel;
       procedure gen_objc_ivars(list: TAsmList; objccls: tobjectdef; out ivarslabel: TAsmLabel);
       procedure gen_objc_protocol(list:TAsmList; protocol: tobjectdef; out protocollabel: TAsmSymbol);override;
-      procedure gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);override;
-      procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);override;
+      procedure gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol; out catlabeldef: tdef);override;
+      procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol; out classlabeldef: tdef);override;
       procedure gen_objc_info_sections(list: tasmlist);override;
      public
       constructor create;
@@ -103,8 +105,8 @@ implementation
 
       procedure gen_objc_ivars(list: TAsmList; objccls: tobjectdef; out ivarslabel: TAsmLabel);
       procedure gen_objc_protocol(list:TAsmList; protocol: tobjectdef; out protocollabel: TAsmSymbol);override;
-      procedure gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);override;
-      procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);override;
+      procedure gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol; out catlabeldef: tdef);override;
+      procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol; out classlabeldef: tdef);override;
       procedure gen_objc_info_sections(list: tasmlist);override;
      public
       constructor create;
@@ -549,8 +551,9 @@ end;
 procedure tobjcrttiwriter.gen_objc_rtti_sections(list:TAsmList; st:TSymtable);
   var
     i: longint;
-    def: tdef;
-    sym : TAsmSymbol;
+    def,
+    rttidef: tdef;
+    sym: TAsmSymbol;
   begin
     if not Assigned(st) then
       exit;
@@ -570,14 +573,16 @@ procedure tobjcrttiwriter.gen_objc_rtti_sections(list:TAsmList; st:TSymtable);
           begin
             if not(oo_is_classhelper in tobjectdef(def).objectoptions) then
               begin
-                gen_objc_classes_sections(list,tobjectdef(def),sym);
+                gen_objc_classes_sections(list,tobjectdef(def),sym,rttidef);
                 classsyms.add(sym);
+                classrttidefs.add(rttidef);
                 classdefs.add(def);
               end
             else
               begin
-                gen_objc_category_sections(list,tobjectdef(def),sym);
+                gen_objc_category_sections(list,tobjectdef(def),sym,rttidef);
                 catsyms.add(sym);
+                catrttidefs.add(rttidef);
                 catdefs.add(def);
               end
           end;
@@ -590,6 +595,8 @@ constructor tobjcrttiwriter.create(_abi: tobjcabi);
     fabi:=_abi;
     classdefs:=tfpobjectlist.create(false);
     classsyms:=tfpobjectlist.create(false);
+    classrttidefs:=tfpobjectlist.create(false);
+    catrttidefs:=tfpobjectlist.create(false);
     catdefs:=tfpobjectlist.create(false);
     catsyms:=tfpobjectlist.create(false);
   end;
@@ -599,6 +606,8 @@ destructor tobjcrttiwriter.destroy;
   begin
     classdefs.free;
     classsyms.free;
+    classrttidefs.free;
+    catrttidefs.free;
     catdefs.free;
     catsyms.free;
     inherited destroy;
@@ -779,7 +788,7 @@ From Clang:
 *)
 
 { Generate rtti for an Objective-C class and its meta-class. }
-procedure tobjcrttiwriter_fragile.gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);
+procedure tobjcrttiwriter_fragile.gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol; out catlabeldef: tdef);
   var
     catstrsym,
     clsstrsym,
@@ -788,7 +797,8 @@ procedure tobjcrttiwriter_fragile.gen_objc_category_sections(list:TAsmList; objc
     clsmthdlist,
     catsym        : TAsmSymbol;
     catstrdef,
-    clsstrdef     : tdef;
+    clsstrdef,
+    catdef        : tdef;
     tcb           : ttai_typedconstbuilder;
   begin
     { the category name }
@@ -824,15 +834,17 @@ procedure tobjcrttiwriter_fragile.gen_objc_category_sections(list:TAsmList; objc
     tcb.emit_ord_const(28,u32inttype);
     { properties, not yet supported }
     tcb.emit_ord_const(0,u32inttype);
+    catdef:=tcb.end_anonymous_record;
     list.concatList(
       tcb.get_final_asmlist(
-        catsym,tcb.end_anonymous_record,
+        catsym,catdef,
         sec_objc_category,'_OBJC_CATEGORY',sizeof(pint)
       )
     );
     tcb.free;
 
     catlabel:=catsym;
+    catlabeldef:=catdef;
   end;
 
 (*
@@ -858,7 +870,7 @@ From Clang:
 
 
 { Generate rtti for an Objective-C class and its meta-class. }
-procedure tobjcrttiwriter_fragile.gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);
+procedure tobjcrttiwriter_fragile.gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol; out classlabeldef: tdef);
   const
     CLS_CLASS  = 1;
     CLS_META   = 2;
@@ -872,7 +884,8 @@ procedure tobjcrttiwriter_fragile.gen_objc_classes_sections(list:TAsmList; objcl
     superStrDef,
     classStrDef,
     metaisaStrDef,
-    metaDef       : tdef;
+    metaDef,
+    clsDef        : tdef;
     superStrSym,
     classStrSym,
     metaisaStrSym,
@@ -1015,15 +1028,17 @@ procedure tobjcrttiwriter_fragile.gen_objc_classes_sections(list:TAsmList; objcl
     tcb.emit_tai(tai_const.Create_nil_dataptr,voidpointertype);
     { TODO: From Clang: weak ivar_layout, necessary for garbage collection support }
     tcb.emit_tai(tai_const.Create_nil_dataptr,voidpointertype);
+    clsDef:=tcb.end_anonymous_record;
     list.concatList(
       tcb.get_final_asmlist(
-        clssym,tcb.end_anonymous_record,
+        clssym,clsDef,
         sec_objc_class,'_OBJC_CLASS',sizeof(pint)
       )
     );
     tcb.free;
 
     classlabel:=clssym;
+    classlabeldef:=clsDef;
   end;
 
 
@@ -1034,49 +1049,69 @@ procedure tobjcrttiwriter_fragile.gen_objc_info_sections(list: tasmlist);
     i: longint;
     sym : TAsmSymbol;
     lab : TAsmLabel;
+    symsdef,
     def : tdef;
     parent: tobjectdef;
     superclasses: tfpobjectlist;
+    tcb: ttai_typedconstbuilder;
   begin
     if (classsyms.count<>0) or
        (catsyms.count<>0) then
       begin
-        new_section(list,sec_objc_symbols,'_OBJC_SYMBOLS',sizeof(pint));
+        tcb:=ctai_typedconstbuilder.create([tcalo_new_section]);
         sym := current_asmdata.DefineAsmSymbol(target_asm.labelprefix+'_OBJC_SYMBOLS_$',AB_LOCAL,AT_DATA);
 
-        { symbol to refer to this information }
-        list.Concat(tai_symbol.Create(sym,0));
+        tcb.begin_anonymous_record('',
+          C_alignment,1,
+          targetinfos[target_info.system]^.alignment.recordalignmin,
+          targetinfos[target_info.system]^.alignment.maxCrecordalign);
         { ??? (always 0 in Clang) }
-        list.Concat(Tai_const.Create_pint(0));
+        tcb.emit_tai(tai_const.Create_nil_dataptr,voidpointertype);
         { ??? (From Clang: always 0, pointer to some selector) }
-        list.Concat(Tai_const.Create_pint(0));
+        tcb.emit_tai(tai_const.Create_nil_dataptr,voidpointertype);
         { From Clang: number of defined classes }
-        list.Concat(Tai_const.Create_16bit(classsyms.count));
+        tcb.emit_ord_const(classsyms.count,u16inttype);
         { From Clang: number of defined categories }
-        list.Concat(Tai_const.Create_16bit(catsyms.count));
+        tcb.emit_ord_const(catsyms.count,u16inttype);
         { first all classes }
         for i:=0 to classsyms.count-1 do
-          list.Concat(Tai_const.Create_sym(tasmsymbol(classsyms[i])));
+           tcb.emit_tai(Tai_const.Create_sym(tasmsymbol(classsyms[i])),tdef(classrttidefs[i]));
         { then all categories }
         for i:=0 to catsyms.count-1 do
-          list.Concat(Tai_const.Create_sym(tasmsymbol(catsyms[i])));
+          tcb.emit_tai(Tai_const.Create_sym(tasmsymbol(catsyms[i])),tdef(catrttidefs[i]));
+        symsdef:=tcb.end_anonymous_record;
+        list.concatList(tcb.get_final_asmlist(sym,
+          symsdef,
+          sec_objc_symbols,'_OBJC_SYMBOLS',
+          sizeof(pint)));
      end
     else
-      sym:=nil;
+      begin
+        sym:=nil;
+        symsdef:=nil;
+      end;
 
-    new_section(list,sec_objc_module_info,'_OBJC_MODULE_INFO',4);
+    tcb:=ctai_typedconstbuilder.create([tcalo_new_section]);
+    tcb.begin_anonymous_record('',
+      C_alignment,1,
+      targetinfos[target_info.system]^.alignment.recordalignmin,
+      targetinfos[target_info.system]^.alignment.maxCrecordalign);
     { version number = 7 (always, both for gcc and clang) }
-    list.Concat(Tai_const.Create_pint(7));
+    tcb.emit_ord_const(7,ptruinttype);
     { sizeof(objc_module): 4 pointer-size entities }
     list.Concat(Tai_const.Create_pint(sizeof(pint)*4));
+    tcb.emit_ord_const(sizeof(pint)*4,ptruinttype);
     { used to be file name, now unused (points to empty string) }
     objcreatestringpoolentry('',sp_objcclassnames,sec_objc_class_names,lab,def);
-    list.Concat(Tai_const.Create_sym(lab));
+    tcb.emit_tai(Tai_const.Create_sym(lab),def);
     { pointer to classes/categories list declared in this module }
     if assigned(sym) then
-      list.Concat(Tai_const.Create_sym(sym))
+      tcb.emit_tai(tai_const.Create_sym(sym),symsdef)
     else
-      list.concat(tai_const.create_pint(0));
+      tcb.emit_tai(tai_const.Create_nil_dataptr,voidpointertype);
+    current_asmdata.getlabel(lab,alt_data);
+    list.concatList(tcb.get_final_asmlist(lab,
+      tcb.end_anonymous_record,sec_objc_module_info,'_OBJC_MODULE_INFO',4));
 
     { Add lazy references to parent classes of all classes defined in this unit }
     superclasses:=tfpobjectlist.create(false);
@@ -1363,7 +1398,7 @@ From Clang:
 ///   const struct _prop_list_t * const properties;
 /// }
 *)
-procedure tobjcrttiwriter_nonfragile.gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);
+procedure tobjcrttiwriter_nonfragile.gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol; out catlabeldef: tdef);
   var
     catstrsym,
     protolistsym  : TAsmLabel;
@@ -1371,7 +1406,8 @@ procedure tobjcrttiwriter_nonfragile.gen_objc_category_sections(list:TAsmList; o
     clsmthdlist,
     clssym,
     catsym        : TAsmSymbol;
-    catstrdef     : tdef;
+    catstrdef,
+    catdef        : tdef;
     tcb           : ttai_typedconstbuilder;
   begin
     { the category name }
@@ -1402,15 +1438,17 @@ procedure tobjcrttiwriter_nonfragile.gen_objc_category_sections(list:TAsmList; o
     ConcatSymOrNil(tcb,protolistsym,voidpointertype);
     { properties, not yet supported }
     tcb.emit_tai(Tai_const.Create_nil_dataptr,voidpointertype);
+    catdef:=tcb.end_anonymous_record;
     list.concatList(
       tcb.get_final_asmlist(
-        catsym,tcb.end_anonymous_record,
+        catsym,catdef,
         sec_objc_const,'_OBJC_CATEGORY',sizeof(pint)
       )
     );
     tcb.free;
 
     catlabel:=catsym;
+    catlabeldef:=catdef;
   end;
 
 
@@ -1637,7 +1675,7 @@ From Clang:
 *)
 
 { Generate rtti for an Objective-C class and its meta-class. }
-procedure tobjcrttiwriter_nonfragile.gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);
+procedure tobjcrttiwriter_nonfragile.gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol; out classlabeldef: tdef);
   var
     root          : tobjectdef;
     superSym,
@@ -1650,7 +1688,8 @@ procedure tobjcrttiwriter_nonfragile.gen_objc_classes_sections(list:TAsmList; ob
     protolistsym  : TAsmLabel;
     vis           : TAsmsymbind;
     tcb           : ttai_typedconstbuilder;
-    metadef       : tdef;
+    metadef,
+    classdef      : tdef;
   begin
     { A) Register necessary names }
 
@@ -1741,15 +1780,17 @@ procedure tobjcrttiwriter_nonfragile.gen_objc_classes_sections(list:TAsmList; ob
     ConcatSymOrNil(tcb,ObjCEmptyVtableVar,voidpointertype);
     { the read-only part }
     tcb.emit_tai(Tai_const.Create_sym(rosym),voidpointertype);
+    classdef:=tcb.end_anonymous_record;
     list.concatList(
       tcb.get_final_asmlist(
-        clssym,tcb.end_anonymous_record,
+        clssym,classdef,
         sec_objc_data,'_OBJC_CLASS',sizeof(pint)
       )
     );
     tcb.free;
 
     classlabel:=clssym;
+    classlabeldef:=classdef;;
   end;