mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-03 05:07:29 +01:00
* bug #701 fixed: ansistrings in interface and implementation part of the units
are now finalized correctly even if there are no explicit initialization/
finalization statements
This commit is contained in:
parent
b16a589d24
commit
339d986a2a
@ -133,6 +133,11 @@ unit cgai386;
|
|||||||
procedure genexitcode(alist : paasmoutput;parasize:longint;
|
procedure genexitcode(alist : paasmoutput;parasize:longint;
|
||||||
nostackframe,inlined:boolean);
|
nostackframe,inlined:boolean);
|
||||||
|
|
||||||
|
{ if a unit doesn't have a explicit init/final code, }
|
||||||
|
{ we've to generate one, if the units has ansistrings }
|
||||||
|
{ in the interface or implementation }
|
||||||
|
procedure genimplicitunitfinal(alist : paasmoutput);
|
||||||
|
procedure genimplicitunitinit(alist : paasmoutput);
|
||||||
{$ifdef test_dest_loc}
|
{$ifdef test_dest_loc}
|
||||||
|
|
||||||
const
|
const
|
||||||
@ -3827,7 +3832,41 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
|||||||
exprasmlist:=oldexprasmlist;
|
exprasmlist:=oldexprasmlist;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure genimplicitunitfinal(alist : paasmoutput);
|
||||||
|
|
||||||
|
begin
|
||||||
|
{ using current_module^.globalsymtable is hopefully }
|
||||||
|
{ more robust than symtablestack and symtablestack^.next }
|
||||||
|
psymtable(current_module^.globalsymtable)^.foreach({$ifndef TP}@{$endif}finalize_data);
|
||||||
|
psymtable(current_module^.localsymtable)^.foreach({$ifndef TP}@{$endif}finalize_data);
|
||||||
|
exprasmlist^.insert(new(pai_symbol,initname_global('FINALIZE$$'+current_module^.modulename^,0)));
|
||||||
|
exprasmlist^.insert(new(pai_symbol,initname_global(target_os.cprefix+current_module^.modulename^+'_finalize',0)));
|
||||||
|
{$ifdef GDB}
|
||||||
|
if (cs_debuginfo in aktmoduleswitches) and
|
||||||
|
target_os.use_function_relative_addresses then
|
||||||
|
exprasmlist^.insert(new(pai_stab_function_name,init(strpnew('FINALIZE$$'+current_module^.modulename^))));
|
||||||
|
{$endif GDB}
|
||||||
|
exprasmlist^.concat(new(paicpu,op_none(A_RET,S_NO)));
|
||||||
|
alist^.concatlist(exprasmlist);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure genimplicitunitinit(alist : paasmoutput);
|
||||||
|
|
||||||
|
begin
|
||||||
|
{ using current_module^.globalsymtable is hopefully }
|
||||||
|
{ more robust than symtablestack and symtablestack^.next }
|
||||||
|
psymtable(current_module^.globalsymtable)^.foreach({$ifndef TP}@{$endif}finalize_data);
|
||||||
|
psymtable(current_module^.localsymtable)^.foreach({$ifndef TP}@{$endif}finalize_data);
|
||||||
|
exprasmlist^.insert(new(pai_symbol,initname_global('INIT$$'+current_module^.modulename^,0)));
|
||||||
|
exprasmlist^.insert(new(pai_symbol,initname_global(target_os.cprefix+current_module^.modulename^+'_init',0)));
|
||||||
|
{$ifdef GDB}
|
||||||
|
if (cs_debuginfo in aktmoduleswitches) and
|
||||||
|
target_os.use_function_relative_addresses then
|
||||||
|
exprasmlist^.insert(new(pai_stab_function_name,init(strpnew('INIT$$'+current_module^.modulename^))));
|
||||||
|
{$endif GDB}
|
||||||
|
exprasmlist^.concat(new(paicpu,op_none(A_RET,S_NO)));
|
||||||
|
alist^.concatlist(exprasmlist);
|
||||||
|
end;
|
||||||
|
|
||||||
{$ifdef test_dest_loc}
|
{$ifdef test_dest_loc}
|
||||||
procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
||||||
@ -3855,7 +3894,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.92 2000-04-01 14:18:45 peter
|
Revision 1.93 2000-04-02 10:18:18 florian
|
||||||
|
* bug 701 fixed: ansistrings in interface and implementation part of the units
|
||||||
|
are now finalized correctly even if there are no explicit initialization/
|
||||||
|
finalization statements
|
||||||
|
|
||||||
|
Revision 1.92 2000/04/01 14:18:45 peter
|
||||||
* use arraydef.elesize instead of elementtype.def.size
|
* use arraydef.elesize instead of elementtype.def.size
|
||||||
|
|
||||||
Revision 1.91 2000/03/31 22:56:46 pierre
|
Revision 1.91 2000/03/31 22:56:46 pierre
|
||||||
|
|||||||
@ -49,6 +49,9 @@ unit pmodules;
|
|||||||
cgbase,
|
cgbase,
|
||||||
{$else newcg}
|
{$else newcg}
|
||||||
hcodegen,
|
hcodegen,
|
||||||
|
{$ifdef i386}
|
||||||
|
cgai386,
|
||||||
|
{$endif i386}
|
||||||
{$endif newcg}
|
{$endif newcg}
|
||||||
link,assemble,import,export,gendef,ppu,comprsrc,
|
link,assemble,import,export,gendef,ppu,comprsrc,
|
||||||
cresstr,cpubase,cpuasm,
|
cresstr,cpubase,cpuasm,
|
||||||
@ -1203,6 +1206,16 @@ unit pmodules;
|
|||||||
force_init_final:=needs_init_final(current_module^.globalsymtable)
|
force_init_final:=needs_init_final(current_module^.globalsymtable)
|
||||||
or needs_init_final(current_module^.localsymtable);
|
or needs_init_final(current_module^.localsymtable);
|
||||||
|
|
||||||
|
{ should we force unit initialization? }
|
||||||
|
{ this is a hack, but how can it be done better ? }
|
||||||
|
if force_init_final and ((current_module^.flags and uf_init)=0) then
|
||||||
|
begin
|
||||||
|
current_module^.flags:=current_module^.flags or uf_init;
|
||||||
|
{ now we can insert a cut }
|
||||||
|
if (cs_create_smart in aktmoduleswitches) then
|
||||||
|
codesegment^.concat(new(pai_cut,init));
|
||||||
|
genimplicitunitinit(codesegment);
|
||||||
|
end;
|
||||||
{ finalize? }
|
{ finalize? }
|
||||||
if token=_FINALIZATION then
|
if token=_FINALIZATION then
|
||||||
begin
|
begin
|
||||||
@ -1229,6 +1242,14 @@ unit pmodules;
|
|||||||
names.done;
|
names.done;
|
||||||
{$endif fixLeaksOnError}
|
{$endif fixLeaksOnError}
|
||||||
codegen_doneprocedure;
|
codegen_doneprocedure;
|
||||||
|
end
|
||||||
|
else if force_init_final then
|
||||||
|
begin
|
||||||
|
current_module^.flags:=current_module^.flags or uf_finalize;
|
||||||
|
{ now we can insert a cut }
|
||||||
|
if (cs_create_smart in aktmoduleswitches) then
|
||||||
|
codesegment^.concat(new(pai_cut,init));
|
||||||
|
genimplicitunitfinal(codesegment);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ the last char should always be a point }
|
{ the last char should always be a point }
|
||||||
@ -1639,7 +1660,12 @@ unit pmodules;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.186 2000-03-01 15:36:11 florian
|
Revision 1.187 2000-04-02 10:18:18 florian
|
||||||
|
* bug 701 fixed: ansistrings in interface and implementation part of the units
|
||||||
|
are now finalized correctly even if there are no explicit initialization/
|
||||||
|
finalization statements
|
||||||
|
|
||||||
|
Revision 1.186 2000/03/01 15:36:11 florian
|
||||||
* some new stuff for the new cg
|
* some new stuff for the new cg
|
||||||
|
|
||||||
Revision 1.185 2000/02/09 13:22:57 peter
|
Revision 1.185 2000/02/09 13:22:57 peter
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user