* 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 -
This commit is contained in:
peter 2007-02-25 16:05:57 +00:00
parent 358546ec2f
commit e0c58d3658
2 changed files with 45 additions and 23 deletions

View File

@ -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 '); asmwrite(#9'.comm'#9);
asmwriteln(Tai_datablock(hp).sym.name); asmwrite(tai_datablock(hp).sym.name);
end; asmwrite(','+tostr(tai_datablock(hp).size));
if (target_info.system <> system_arm_linux) then asmwrite(','+tostr(last_align));
sepChar := '@' asmwriteln('');
end
else else
sepChar := '%'; begin
if (tf_needs_symbol_type in target_info.flags) then asmwrite(#9'.lcomm'#9);
asmwriteln(#9'.type '+Tai_datablock(hp).sym.name+','+sepChar+'object'); asmwrite(tai_datablock(hp).sym.name);
if (tf_needs_symbol_size in target_info.flags) and (tai_datablock(hp).size > 0) then asmwrite(','+tostr(tai_datablock(hp).size));
asmwriteln(#9'.size '+Tai_datablock(hp).sym.name+','+tostr(Tai_datablock(hp).size)); asmwrite(','+tostr(last_align));
asmwrite(Tai_datablock(hp).sym.name); asmwriteln('');
asmwriteln(':'); end;
asmwriteln(#9'.zero '+tostr(Tai_datablock(hp).size));
end; end;
end; end;

View File

@ -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)); if Tai_datablock(hp).is_global then
ObjData.SymbolDefine(Tai_datablock(hp).sym); ObjData.SymbolDefine(Tai_datablock(hp).sym)
ObjData.alloc(Tai_datablock(hp).size); 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)); if Tai_datablock(hp).is_global then
objsym:=ObjData.SymbolDefine(Tai_datablock(hp).sym); begin
objsym.size:=Tai_datablock(hp).size; objsym:=ObjData.SymbolDefine(Tai_datablock(hp).sym);
ObjData.alloc(Tai_datablock(hp).size); 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);