2
0
Эх сурвалжийг харах

+ implemented TWasmObjData.sectionname

Nikolay Nikolov 4 жил өмнө
parent
commit
ffc5131087
1 өөрчлөгдсөн 144 нэмэгдсэн , 1 устгасан
  1. 144 1
      compiler/ogwasm.pas

+ 144 - 1
compiler/ogwasm.pas

@@ -43,6 +43,9 @@ interface
       { TWasmObjData }
       { TWasmObjData }
 
 
       TWasmObjData = class(TObjData)
       TWasmObjData = class(TObjData)
+      private
+        function is_smart_section(atype:TAsmSectiontype):boolean;
+        function sectionname_gas(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder):string;
       public
       public
         function sectionname(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder):string;override;
         function sectionname(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder):string;override;
         procedure writeReloc(Data:TRelocDataInt;len:aword;p:TObjSymbol;Reloctype:TObjRelocationType);override;
         procedure writeReloc(Data:TRelocDataInt;len:aword;p:TObjSymbol;Reloctype:TObjRelocationType);override;
@@ -69,10 +72,150 @@ implementation
                                 TWasmObjData
                                 TWasmObjData
 ****************************************************************************}
 ****************************************************************************}
 
 
+    function TWasmObjData.is_smart_section(atype: TAsmSectiontype): boolean;
+      begin
+        { For bss we need to set some flags that are target dependent,
+          it is easier to disable it for smartlinking. It doesn't take up
+          filespace }
+        result:=not(target_info.system in systems_darwin) and
+           create_smartlink_sections and
+           (atype<>sec_toc) and
+           (atype<>sec_user) and
+           { on embedded systems every byte counts, so smartlink bss too }
+           ((atype<>sec_bss) or (target_info.system in (systems_embedded+systems_freertos)));
+      end;
+
+    function TWasmObjData.sectionname_gas(atype: TAsmSectiontype;
+        const aname: string; aorder: TAsmSectionOrder): string;
+      const
+        secnames : array[TAsmSectiontype] of string[length('__DATA, __datacoal_nt,coalesced')] = ('','',
+          '.text',
+          '.data',
+{ why doesn't .rodata work? (FK) }
+{ sometimes we have to create a data.rel.ro instead of .rodata, e.g. for  }
+{ vtables (and anything else containing relocations), otherwise those are }
+{ not relocated properly on e.g. linux/ppc64. g++ generates there for a   }
+{ vtable for a class called Window:                                       }
+{ .section .data.rel.ro._ZTV6Window,"awG",@progbits,_ZTV6Window,comdat    }
+{ TODO: .data.ro not yet working}
+{$if defined(arm) or defined(riscv64) or defined(powerpc)}
+          '.rodata',
+{$else defined(arm) or defined(riscv64) or defined(powerpc)}
+          '.data',
+{$endif defined(arm) or defined(riscv64) or defined(powerpc)}
+          '.rodata',
+          '.bss',
+          '.threadvar',
+          '.pdata',
+          '', { stubs }
+          '__DATA,__nl_symbol_ptr',
+          '__DATA,__la_symbol_ptr',
+          '__DATA,__mod_init_func',
+          '__DATA,__mod_term_func',
+          '.stab',
+          '.stabstr',
+          '.idata$2','.idata$4','.idata$5','.idata$6','.idata$7','.edata',
+          '.eh_frame',
+          '.debug_frame','.debug_info','.debug_line','.debug_abbrev','.debug_aranges','.debug_ranges',
+          '.fpc',
+          '.toc',
+          '.init',
+          '.fini',
+          '.objc_class',
+          '.objc_meta_class',
+          '.objc_cat_cls_meth',
+          '.objc_cat_inst_meth',
+          '.objc_protocol',
+          '.objc_string_object',
+          '.objc_cls_meth',
+          '.objc_inst_meth',
+          '.objc_cls_refs',
+          '.objc_message_refs',
+          '.objc_symbols',
+          '.objc_category',
+          '.objc_class_vars',
+          '.objc_instance_vars',
+          '.objc_module_info',
+          '.objc_class_names',
+          '.objc_meth_var_types',
+          '.objc_meth_var_names',
+          '.objc_selector_strs',
+          '.objc_protocol_ext',
+          '.objc_class_ext',
+          '.objc_property',
+          '.objc_image_info',
+          '.objc_cstring_object',
+          '.objc_sel_fixup',
+          '__DATA,__objc_data',
+          '__DATA,__objc_const',
+          '.objc_superrefs',
+          '__DATA, __datacoal_nt,coalesced',
+          '.objc_classlist',
+          '.objc_nlclasslist',
+          '.objc_catlist',
+          '.obcj_nlcatlist',
+          '.objc_protolist',
+          '.stack',
+          '.heap',
+          '.gcc_except_table',
+          '.ARM.attributes'
+        );
+      var
+        sep     : string[3];
+        secname : string;
+      begin
+        if (atype=sec_fpc) and (Copy(aname,1,3)='res') then
+          begin
+            result:=secname+'.'+aname;
+            exit;
+          end;
+
+        if atype=sec_threadvar then
+          begin
+            if (target_info.system in (systems_windows+systems_wince)) then
+              secname:='.tls'
+            else if (target_info.system in systems_linux) then
+              secname:='.tbss';
+          end;
+
+        { go32v2 stub only loads .text and .data sections, and allocates space for .bss.
+          Thus, data which normally goes into .rodata and .rodata_norel sections must
+          end up in .data section }
+        if (atype in [sec_rodata,sec_rodata_norel]) and
+          (target_info.system in [system_i386_go32v2,system_m68k_palmos]) then
+          secname:='.data';
+
+        { Windows correctly handles reallocations in readonly sections }
+        if (atype=sec_rodata) and
+          (target_info.system in systems_all_windows+systems_nativent-[system_i8086_win16]) then
+          secname:='.rodata';
+
+        { section type user gives the user full controll on the section name }
+        if atype=sec_user then
+          secname:=aname;
+
+        if is_smart_section(atype) and (aname<>'') then
+          begin
+            case aorder of
+              secorder_begin :
+                sep:='.b_';
+              secorder_end :
+                sep:='.z_';
+              else
+                sep:='.n_';
+            end;
+            result:=secname+sep+aname
+          end
+        else
+          result:=secname;
+      end;
+
     function TWasmObjData.sectionname(atype: TAsmSectiontype;
     function TWasmObjData.sectionname(atype: TAsmSectiontype;
         const aname: string; aorder: TAsmSectionOrder): string;
         const aname: string; aorder: TAsmSectionOrder): string;
       begin
       begin
-        result:='todosectionname';
+        if (atype=sec_fpc) or (atype=sec_threadvar) then
+          atype:=sec_data;
+        Result:=sectionname_gas(atype, aname, aorder);
       end;
       end;
 
 
     procedure TWasmObjData.writeReloc(Data: TRelocDataInt; len: aword;
     procedure TWasmObjData.writeReloc(Data: TRelocDataInt; len: aword;