|
@@ -56,6 +56,7 @@ unit cpupi;
|
|
|
|
|
|
uses
|
|
uses
|
|
globals,systems,
|
|
globals,systems,
|
|
|
|
+ verbose,
|
|
tgobj,
|
|
tgobj,
|
|
symconst,symtype,symsym,symcpu,paramgr,
|
|
symconst,symtype,symsym,symcpu,paramgr,
|
|
cgutils,
|
|
cgutils,
|
|
@@ -102,25 +103,36 @@ unit cpupi;
|
|
{ estimate stack frame size }
|
|
{ estimate stack frame size }
|
|
if pi_estimatestacksize in flags then
|
|
if pi_estimatestacksize in flags then
|
|
begin
|
|
begin
|
|
- stackframesize:=maxpushedparasize;
|
|
|
|
|
|
+ stackframesize:=align(maxpushedparasize,target_info.alignment.localalignmax);
|
|
localsize:=0;
|
|
localsize:=0;
|
|
for i:=0 to procdef.localst.SymList.Count-1 do
|
|
for i:=0 to procdef.localst.SymList.Count-1 do
|
|
if tsym(procdef.localst.SymList[i]).typ=localvarsym then
|
|
if tsym(procdef.localst.SymList[i]).typ=localvarsym then
|
|
- inc(localsize,tabstractnormalvarsym(procdef.localst.SymList[i]).getsize);
|
|
|
|
|
|
+ begin
|
|
|
|
+ localsize:=align(localsize,tabstractnormalvarsym(procdef.localst.SymList[i]).vardef.alignment);
|
|
|
|
+ inc(localsize,tabstractnormalvarsym(procdef.localst.SymList[i]).getsize);
|
|
|
|
+ end;
|
|
inc(stackframesize,localsize);
|
|
inc(stackframesize,localsize);
|
|
|
|
+ stackframesize:=align(stackframesize,target_info.alignment.localalignmax);
|
|
|
|
|
|
localsize:=0;
|
|
localsize:=0;
|
|
for i:=0 to procdef.parast.SymList.Count-1 do
|
|
for i:=0 to procdef.parast.SymList.Count-1 do
|
|
if tsym(procdef.parast.SymList[i]).typ=paravarsym then
|
|
if tsym(procdef.parast.SymList[i]).typ=paravarsym then
|
|
begin
|
|
begin
|
|
if tabstractnormalvarsym(procdef.parast.SymList[i]).varspez in [vs_var,vs_out,vs_constref] then
|
|
if tabstractnormalvarsym(procdef.parast.SymList[i]).varspez in [vs_var,vs_out,vs_constref] then
|
|
- inc(localsize,4)
|
|
|
|
|
|
+ begin
|
|
|
|
+ localsize:=align(localsize,4);
|
|
|
|
+ inc(localsize,4)
|
|
|
|
+ end
|
|
else if is_open_string(tabstractnormalvarsym(procdef.parast.SymList[i]).vardef) then
|
|
else if is_open_string(tabstractnormalvarsym(procdef.parast.SymList[i]).vardef) then
|
|
inc(localsize,256)
|
|
inc(localsize,256)
|
|
else
|
|
else
|
|
- inc(localsize,tabstractnormalvarsym(procdef.parast.SymList[i]).getsize);
|
|
|
|
|
|
+ begin
|
|
|
|
+ localsize:=align(localsize,tabstractnormalvarsym(procdef.parast.SymList[i]).vardef.alignment);
|
|
|
|
+ inc(localsize,tabstractnormalvarsym(procdef.parast.SymList[i]).getsize);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
inc(stackframesize,localsize);
|
|
inc(stackframesize,localsize);
|
|
|
|
+ stackframesize:=align(stackframesize,4);
|
|
|
|
|
|
if pi_needs_implicit_finally in flags then
|
|
if pi_needs_implicit_finally in flags then
|
|
inc(stackframesize,40);
|
|
inc(stackframesize,40);
|
|
@@ -131,6 +143,13 @@ unit cpupi;
|
|
if procdef.proctypeoption in [potype_constructor] then
|
|
if procdef.proctypeoption in [potype_constructor] then
|
|
inc(stackframesize,40*2);
|
|
inc(stackframesize,40*2);
|
|
|
|
|
|
|
|
+ { default spill area }
|
|
|
|
+ inc(stackframesize,4*4);
|
|
|
|
+
|
|
|
|
+ { additional spill area? }
|
|
|
|
+ if pi_do_call in current_procinfo.flags then
|
|
|
|
+ inc(stackframesize,maxcall*4);
|
|
|
|
+
|
|
inc(stackframesize,estimatedtempsize);
|
|
inc(stackframesize,estimatedtempsize);
|
|
|
|
|
|
stackframesize:=Align(stackframesize,target_info.alignment.localalignmax);
|
|
stackframesize:=Align(stackframesize,target_info.alignment.localalignmax);
|
|
@@ -143,13 +162,15 @@ unit cpupi;
|
|
r : byte;
|
|
r : byte;
|
|
regs: tcpuregisterset;
|
|
regs: tcpuregisterset;
|
|
begin
|
|
begin
|
|
|
|
+ maxpushedparasize:=align(maxpushedparasize,max(current_settings.alignment.localalignmin,4));
|
|
if pi_estimatestacksize in flags then
|
|
if pi_estimatestacksize in flags then
|
|
- result:=stackframesize
|
|
|
|
- else
|
|
|
|
begin
|
|
begin
|
|
- maxpushedparasize:=align(maxpushedparasize,max(current_settings.alignment.localalignmin,4));
|
|
|
|
- result:=Align(tg.direction*tg.lasttemp,max(current_settings.alignment.localalignmin,4))+maxpushedparasize;
|
|
|
|
- end;
|
|
|
|
|
|
+ if Align(tg.direction*tg.lasttemp,max(current_settings.alignment.localalignmin,4))+4*4+maxcall*4>stackframesize then
|
|
|
|
+ InternalError(2020082801);
|
|
|
|
+ result:=stackframesize
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ result:=Align(tg.direction*tg.lasttemp,max(current_settings.alignment.localalignmin,4))+maxpushedparasize;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|