mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-06 11:50:19 +02:00
* fix LLVM after r48828
* global gotos really use the return type of fpc_setjmp to test where we come from git-svn-id: trunk@48835 -
This commit is contained in:
parent
9c831677ff
commit
fe57cd3536
@ -129,14 +129,13 @@ unit cgexcept;
|
||||
be modified, all temps should be allocated on the heap instead of the
|
||||
stack. }
|
||||
|
||||
|
||||
class procedure tcgexceptionstatehandler.get_exception_temps(list:TAsmList;var t:texceptiontemps);
|
||||
begin
|
||||
if not assigned(setjmpresulttype) then
|
||||
setjmpresulttype:=search_system_proc('fpc_setjmp').returndef;
|
||||
if not assigned(exceptionreasontype) then
|
||||
exceptionreasontype:=search_system_proc('fpc_setjmp').returndef;
|
||||
tg.gethltemp(list,rec_exceptaddr,rec_exceptaddr.size,tt_persistent,t.envbuf);
|
||||
tg.gethltemp(list,rec_jmp_buf,rec_jmp_buf.size,tt_persistent,t.jmpbuf);
|
||||
tg.gethltemp(list,setjmpresulttype,setjmpresulttype.size,tt_persistent,t.reasonbuf);
|
||||
tg.gethltemp(list,exceptionreasontype,exceptionreasontype.size,tt_persistent,t.reasonbuf);
|
||||
end;
|
||||
|
||||
|
||||
@ -209,7 +208,7 @@ unit cgexcept;
|
||||
location_reset(tmpresloc,LOC_REGISTER,def_cgsize(setjmpres.def));
|
||||
tmpresloc.register:=hlcg.getintregister(list,setjmpres.def);
|
||||
hlcg.gen_load_cgpara_loc(list,setjmpres.def,setjmpres,tmpresloc,true);
|
||||
hlcg.g_exception_reason_save(list,setjmpres.def,setjmpresulttype,tmpresloc.register,t.reasonbuf);
|
||||
hlcg.g_exception_reason_save(list,setjmpres.def,exceptionreasontype,tmpresloc.register,t.reasonbuf);
|
||||
{ if we get 1 here in the function result register, it means that we
|
||||
longjmp'd back here }
|
||||
hlcg.a_cmp_const_reg_label(list,setjmpres.def,OC_NE,0,tmpresloc.register,exceptstate.exceptionlabel);
|
||||
@ -239,9 +238,9 @@ unit cgexcept;
|
||||
popaddrstack(list);
|
||||
if not onlyfree then
|
||||
begin
|
||||
reasonreg:=hlcg.getintregister(list,setjmpresulttype);
|
||||
hlcg.g_exception_reason_load(list,setjmpresulttype,setjmpresulttype,t.reasonbuf,reasonreg);
|
||||
hlcg.a_cmp_const_reg_label(list,setjmpresulttype,OC_EQ,a,reasonreg,endexceptlabel);
|
||||
reasonreg:=hlcg.getintregister(list,exceptionreasontype);
|
||||
hlcg.g_exception_reason_load(list,exceptionreasontype,exceptionreasontype,t.reasonbuf,reasonreg);
|
||||
hlcg.a_cmp_const_reg_label(list,exceptionreasontype,OC_EQ,a,reasonreg,endexceptlabel);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -88,6 +88,8 @@ implementation
|
||||
|
||||
class procedure tllvmexceptionstatehandler.get_exception_temps(list: TAsmList; var t: texceptiontemps);
|
||||
begin
|
||||
if not assigned(exceptionreasontype) then
|
||||
exceptionreasontype:=ossinttype;
|
||||
tg.gethltemp(list,ossinttype,ossinttype.size,tt_persistent,t.reasonbuf);
|
||||
end;
|
||||
|
||||
|
@ -542,7 +542,7 @@ implementation
|
||||
{ we must also destroy the address frame which guards
|
||||
the exception object }
|
||||
cexceptionstatehandler.popaddrstack(list);
|
||||
hlcg.g_exception_reason_discard(list,setjmpresulttype,excepttemps.reasonbuf);
|
||||
hlcg.g_exception_reason_discard(list,exceptionreasontype,excepttemps.reasonbuf);
|
||||
if frametype=ft_except then
|
||||
begin
|
||||
cexceptionstatehandler.cleanupobjectstack(list);
|
||||
@ -875,8 +875,8 @@ implementation
|
||||
procedure tcgtryfinallynode.emit_jump_out_of_try_finally_frame(list: TasmList; const reason: byte; const finallycodelabel: tasmlabel; var excepttemps: tcgexceptionstatehandler.texceptiontemps; framelabel: tasmlabel);
|
||||
begin
|
||||
hlcg.a_label(list,framelabel);
|
||||
hlcg.g_exception_reason_discard(list,setjmpresulttype,excepttemps.reasonbuf);
|
||||
hlcg.g_exception_reason_save_const(list,setjmpresulttype,reason,excepttemps.reasonbuf);
|
||||
hlcg.g_exception_reason_discard(list,exceptionreasontype,excepttemps.reasonbuf);
|
||||
hlcg.g_exception_reason_save_const(list,exceptionreasontype,reason,excepttemps.reasonbuf);
|
||||
hlcg.a_jmp_always(list,finallycodelabel);
|
||||
end;
|
||||
|
||||
@ -936,13 +936,13 @@ implementation
|
||||
procedure handle_breakcontinueexit(const finallycode: tasmlabel; doreraise: boolean);
|
||||
begin
|
||||
{ no exception happened, but maybe break/continue/exit }
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,setjmpresulttype,OC_EQ,0,reasonreg,endfinallylabel);
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,exceptionreasontype,OC_EQ,0,reasonreg,endfinallylabel);
|
||||
if fc_exit in finallyexceptionstate.newflowcontrol then
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,setjmpresulttype,OC_EQ,2,reasonreg,oldCurrExitLabel);
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,exceptionreasontype,OC_EQ,2,reasonreg,oldCurrExitLabel);
|
||||
if fc_break in finallyexceptionstate.newflowcontrol then
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,setjmpresulttype,OC_EQ,3,reasonreg,oldBreakLabel);
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,exceptionreasontype,OC_EQ,3,reasonreg,oldBreakLabel);
|
||||
if fc_continue in finallyexceptionstate.newflowcontrol then
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,setjmpresulttype,OC_EQ,4,reasonreg,oldContinueLabel);
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,exceptionreasontype,OC_EQ,4,reasonreg,oldContinueLabel);
|
||||
if doreraise then
|
||||
cexceptionstatehandler.handle_reraise(current_asmdata.CurrAsmList,excepttemps,finallyexceptionstate,tek_normalfinally)
|
||||
else
|
||||
@ -1019,8 +1019,8 @@ implementation
|
||||
exit;
|
||||
if not implicitframe then
|
||||
current_asmdata.CurrAsmList.concat(tai_marker.create(mark_NoLineInfoStart));
|
||||
reasonreg:=hlcg.getintregister(current_asmdata.CurrAsmList,setjmpresulttype);
|
||||
hlcg.g_exception_reason_load(current_asmdata.CurrAsmList,setjmpresulttype,setjmpresulttype,excepttemps.reasonbuf,reasonreg);
|
||||
reasonreg:=hlcg.getintregister(current_asmdata.CurrAsmList,exceptionreasontype);
|
||||
hlcg.g_exception_reason_load(current_asmdata.CurrAsmList,exceptionreasontype,exceptionreasontype,excepttemps.reasonbuf,reasonreg);
|
||||
handle_breakcontinueexit(finallyNoExceptionLabel,false);
|
||||
|
||||
current_asmdata.CurrAsmList.concatList(tmplist);
|
||||
@ -1058,11 +1058,11 @@ implementation
|
||||
if not assigned(third) then
|
||||
begin
|
||||
{ the value should now be in the exception handler }
|
||||
reasonreg:=hlcg.getintregister(current_asmdata.CurrAsmList,setjmpresulttype);
|
||||
hlcg.g_exception_reason_load(current_asmdata.CurrAsmList,setjmpresulttype,setjmpresulttype,excepttemps.reasonbuf,reasonreg);
|
||||
reasonreg:=hlcg.getintregister(current_asmdata.CurrAsmList,exceptionreasontype);
|
||||
hlcg.g_exception_reason_load(current_asmdata.CurrAsmList,exceptionreasontype,exceptionreasontype,excepttemps.reasonbuf,reasonreg);
|
||||
if implicitframe then
|
||||
begin
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,setjmpresulttype,OC_EQ,0,reasonreg,endfinallylabel);
|
||||
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,exceptionreasontype,OC_EQ,0,reasonreg,endfinallylabel);
|
||||
{ finally code only needed to be executed on exception (-> in
|
||||
if-branch -> fc_inflowcontrol) }
|
||||
if current_procinfo.procdef.generate_safecall_wrapper then
|
||||
|
@ -522,7 +522,9 @@ implementation
|
||||
|
||||
class procedure tpsabiehexceptionstatehandler.get_exception_temps(list: TAsmList; var t: texceptiontemps);
|
||||
begin
|
||||
tg.gethltemp(list,ossinttype,ossinttype.size,tt_persistent,t.reasonbuf);
|
||||
if not assigned(exceptionreasontype) then
|
||||
exceptionreasontype:=ossinttype;
|
||||
tg.gethltemp(list,exceptionreasontype,exceptionreasontype.size,tt_persistent,t.reasonbuf);
|
||||
end;
|
||||
|
||||
|
||||
|
@ -460,15 +460,13 @@ implementation
|
||||
|
||||
procedure add_label_init(p:TObject;arg:pointer);
|
||||
begin
|
||||
if not assigned(setjmpresulttype) then
|
||||
setjmpresulttype:=search_system_proc('fpc_setjmp').returndef;
|
||||
if tstoredsym(p).typ=labelsym then
|
||||
begin
|
||||
addstatement(tstatementnode(arg^),
|
||||
cifnode.create(caddnode.create(equaln,
|
||||
ccallnode.createintern('fpc_setjmp',
|
||||
ccallparanode.create(cloadnode.create(tlabelsym(p).jumpbuf,tlabelsym(p).jumpbuf.owner),nil)),
|
||||
cordconstnode.create(1,setjmpresulttype,true))
|
||||
cordconstnode.create(1,search_system_proc('fpc_setjmp').returndef,true))
|
||||
,cgotonode.create(tlabelsym(p)),nil)
|
||||
);
|
||||
end;
|
||||
|
@ -1216,7 +1216,7 @@ interface
|
||||
{ type of classrefs, used for stabs }
|
||||
pvmttype,
|
||||
{ return type of the setjmp function }
|
||||
setjmpresulttype : tdef;
|
||||
exceptionreasontype : tdef;
|
||||
|
||||
{ pointer to the anchestor of all classes }
|
||||
class_tobject : tobjectdef;
|
||||
|
Loading…
Reference in New Issue
Block a user