Explorar o código

* use .comm again for global variables
this is needed for shared library linking where the .so
needs to resolve to the space allocated for the symbol in the
main program

git-svn-id: trunk@6641 -

peter %!s(int64=18) %!d(string=hai) anos
pai
achega
e0c58d3658
Modificáronse 2 ficheiros con 45 adicións e 23 borrados
  1. 17 13
      compiler/aggas.pas
  2. 28 10
      compiler/assemble.pas

+ 17 - 13
compiler/aggas.pas

@@ -615,22 +615,26 @@ implementation
                  end
                  end
                else
                else
                  begin
                  begin
+                   { The .comm is required for COMMON symbols. These are used
+                     in the shared library loading. All the symbols declared in
+                     the .so file need to resolve to the data allocated in the main
+                     program (PFV) }
                    if Tai_datablock(hp).is_global then
                    if Tai_datablock(hp).is_global then
                      begin
                      begin
-                       asmwrite(#9'.globl ');
-                       asmwriteln(Tai_datablock(hp).sym.name);
-                     end;
-                   if (target_info.system <> system_arm_linux) then
-                     sepChar := '@'
+                       asmwrite(#9'.comm'#9);
+                       asmwrite(tai_datablock(hp).sym.name);
+                       asmwrite(','+tostr(tai_datablock(hp).size));
+                       asmwrite(','+tostr(last_align));
+                       asmwriteln('');
+                     end
                    else
                    else
-                     sepChar := '%';
-                   if (tf_needs_symbol_type in target_info.flags) then
-                     asmwriteln(#9'.type '+Tai_datablock(hp).sym.name+','+sepChar+'object');
-                   if (tf_needs_symbol_size in target_info.flags) and (tai_datablock(hp).size > 0) then
-                     asmwriteln(#9'.size '+Tai_datablock(hp).sym.name+','+tostr(Tai_datablock(hp).size));
-                   asmwrite(Tai_datablock(hp).sym.name);
-                   asmwriteln(':');
-                   asmwriteln(#9'.zero '+tostr(Tai_datablock(hp).size));
+                     begin
+                       asmwrite(#9'.lcomm'#9);
+                       asmwrite(tai_datablock(hp).sym.name);
+                       asmwrite(','+tostr(tai_datablock(hp).size));
+                       asmwrite(','+tostr(last_align));
+                       asmwriteln('');
+                     end;
                  end;
                  end;
              end;
              end;
 
 

+ 28 - 10
compiler/assemble.pas

@@ -276,7 +276,6 @@ Implementation
         end;
         end;
 
 
       var
       var
-        dir : TSearchRec;
         hs  : string;
         hs  : string;
       begin
       begin
         if PathExists(s,false) then
         if PathExists(s,false) then
@@ -713,6 +712,8 @@ Implementation
                     end;
                     end;
                   hs[0]:=chr(len);
                   hs[0]:=chr(len);
                   val(hs,exprvalue,code);
                   val(hs,exprvalue,code);
+                  if code<>0 then
+                    internalerror(200702251);
                 end;
                 end;
               '.','_',
               '.','_',
               'A'..'Z',
               'A'..'Z',
@@ -918,9 +919,14 @@ Implementation
                end;
                end;
              ait_datablock :
              ait_datablock :
                begin
                begin
-                 ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
-                 ObjData.SymbolDefine(Tai_datablock(hp).sym);
-                 ObjData.alloc(Tai_datablock(hp).size);
+                 if Tai_datablock(hp).is_global then
+                   ObjData.SymbolDefine(Tai_datablock(hp).sym)
+                 else
+                   begin
+                     ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
+                     ObjData.SymbolDefine(Tai_datablock(hp).sym);
+                     ObjData.alloc(Tai_datablock(hp).size);
+                   end;
                end;
                end;
              ait_real_80bit :
              ait_real_80bit :
                ObjData.alloc(10);
                ObjData.alloc(10);
@@ -979,10 +985,19 @@ Implementation
                begin
                begin
                  if (oso_data in ObjData.CurrObjSec.secoptions) then
                  if (oso_data in ObjData.CurrObjSec.secoptions) then
                    Message(asmw_e_alloc_data_only_in_bss);
                    Message(asmw_e_alloc_data_only_in_bss);
-                 ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
-                 objsym:=ObjData.SymbolDefine(Tai_datablock(hp).sym);
-                 objsym.size:=Tai_datablock(hp).size;
-                 ObjData.alloc(Tai_datablock(hp).size);
+                 if Tai_datablock(hp).is_global then
+                   begin
+                     objsym:=ObjData.SymbolDefine(Tai_datablock(hp).sym);
+                     objsym.size:=Tai_datablock(hp).size;
+                     objsym.bind:=AB_COMMON;
+                   end
+                 else
+                   begin
+                     ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
+                     objsym:=ObjData.SymbolDefine(Tai_datablock(hp).sym);
+                     objsym.size:=Tai_datablock(hp).size;
+                     ObjData.alloc(Tai_datablock(hp).size);
+                   end;
                end;
                end;
              ait_real_80bit :
              ait_real_80bit :
                ObjData.alloc(10);
                ObjData.alloc(10);
@@ -1074,9 +1089,12 @@ Implementation
                end;
                end;
              ait_datablock :
              ait_datablock :
                begin
                begin
-                 ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
                  ObjOutput.exportsymbol(ObjData.SymbolRef(Tai_datablock(hp).sym));
                  ObjOutput.exportsymbol(ObjData.SymbolRef(Tai_datablock(hp).sym));
-                 ObjData.alloc(Tai_datablock(hp).size);
+                 if not Tai_datablock(hp).is_global then
+                   begin
+                     ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
+                     ObjData.alloc(Tai_datablock(hp).size);
+                   end;
                end;
                end;
              ait_real_80bit :
              ait_real_80bit :
                ObjData.writebytes(Tai_real_80bit(hp).value,10);
                ObjData.writebytes(Tai_real_80bit(hp).value,10);