diff --git a/compiler/llvm/agllvm.pas b/compiler/llvm/agllvm.pas index c89a7fcf8a..99ad694925 100644 --- a/compiler/llvm/agllvm.pas +++ b/compiler/llvm/agllvm.pas @@ -1195,6 +1195,14 @@ implementation WriteLinkageVibilityFlags(taillvmdecl(hp).namesym.bind); writer.AsmWrite(llvmencodeproctype(tprocdef(taillvmdecl(hp).def), '', lpd_def)); WriteFunctionFlags(tprocdef(taillvmdecl(hp).def)); + if assigned(tprocdef(taillvmdecl(hp).def).personality) then + begin + writer.AsmWrite(' personality i8* bitcast ('); + writer.AsmWrite(llvmencodeproctype(tprocdef(taillvmdecl(hp).def).personality, '', lpd_procvar)); + writer.AsmWrite('* '); + writer.AsmWrite(llvmmangledname(tprocdef(taillvmdecl(hp).def).personality.mangledname)); + writer.AsmWrite(' to i8*)'); + end; writer.AsmWriteln(' {'); end; end diff --git a/compiler/llvm/llvmpi.pas b/compiler/llvm/llvmpi.pas index 7e584eb699..8acba1a774 100644 --- a/compiler/llvm/llvmpi.pas +++ b/compiler/llvm/llvmpi.pas @@ -38,6 +38,7 @@ interface public constructor create(aparent: tprocinfo); override; destructor destroy; override; + procedure set_first_temp_offset; override; procedure pushexceptlabel(lab: TAsmLabel); procedure popexceptlabel(lab: TAsmLabel); function CurrExceptLabel: TAsmLabel; inline; @@ -46,7 +47,7 @@ interface implementation uses - globtype,verbose, + globtype,verbose,systems, symtable; @@ -65,6 +66,15 @@ implementation end; + procedure tllvmprocinfo.set_first_temp_offset; + begin + inherited; + if not(target_info.system in systems_windows) and + (([pi_uses_exceptions,pi_needs_implicit_finally]*flags)<>[]) then + procdef.personality:=search_system_proc('_FPC_EXCEPTION_PERSONALITY_DO_NOTHING_V0'); + end; + + procedure tllvmprocinfo.pushexceptlabel(lab: TAsmLabel); begin fexceptlabelstack.add(lab); diff --git a/compiler/llvm/llvmtype.pas b/compiler/llvm/llvmtype.pas index 37d4ccca91..cab46a9852 100644 --- a/compiler/llvm/llvmtype.pas +++ b/compiler/llvm/llvmtype.pas @@ -401,7 +401,15 @@ implementation ait_typedconst: insert_typedconst_typeconversion(toplevellist,tai_abstracttypedconst(p)); ait_llvmdecl: - insert_asmlist_typeconversions(toplevellist,taillvmdecl(p).initdata); + begin + if (ldf_definition in taillvmdecl(p).flags) and + (taillvmdecl(p).def.typ=procdef) and + assigned(tprocdef(taillvmdecl(p).def).personality) then + maybe_insert_extern_sym_decl(toplevellist, + current_asmdata.RefAsmSymbol(tprocdef(taillvmdecl(p).def).personality.mangledname,AT_FUNCTION,false), + tprocdef(taillvmdecl(p).def).personality); + insert_asmlist_typeconversions(toplevellist,taillvmdecl(p).initdata); + end; end; end;