From 58ae32e2d17658584369529d195ec78ca66c68f5 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Thu, 7 Jan 2016 22:06:00 +0000 Subject: [PATCH] * factored out writing the LLVM linkage flags, take into account version differences and also write them for procdefs git-svn-id: trunk@32882 - --- compiler/llvm/agllvm.pas | 48 ++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/compiler/llvm/agllvm.pas b/compiler/llvm/agllvm.pas index 5c02c42e06..bab23bf335 100644 --- a/compiler/llvm/agllvm.pas +++ b/compiler/llvm/agllvm.pas @@ -87,7 +87,7 @@ implementation fmodule,verbose, aasmcnst,symconst,symdef,symtable, llvmbase,aasmllvm,itllvm,llvmdef, - cgbase,cgutils,cpubase; + cgbase,cgutils,cpubase,llvminfo; const line_length = 70; @@ -727,6 +727,32 @@ implementation procedure TLLVMAssember.WriteTai(const replaceforbidden: boolean; const do_line: boolean; var InlineLevel: cardinal; var asmblock: boolean; var hp: tai); + procedure WriteLinkageVibilityFlags(bind: TAsmSymBind); + begin + case bind of + AB_EXTERNAL: + writer.AsmWrite(' external'); + AB_COMMON: + writer.AsmWrite(' common'); + AB_LOCAL: + writer.AsmWrite(' internal'); + AB_GLOBAL: + writer.AsmWrite(''); + AB_WEAK_EXTERNAL: + writer.AsmWrite(' extern_weak'); + AB_PRIVATE_EXTERN: + begin + if not(llvmflag_linker_private in llvmversion_properties[current_settings.llvmversion]) then + writer.AsmWrite(' hidden') + else + writer.AsmWrite(' linker_private'); + end + else + internalerror(2014020104); + end; + end; + + procedure WriteFunctionFlags(pd: tprocdef); begin if (pos('FPC_SETJMP',upper(pd.mangledname))<>0) or @@ -950,6 +976,7 @@ implementation else begin writer.AsmWrite('define'); + WriteLinkageVibilityFlags(taillvmdecl(hp).namesym.bind); writer.AsmWrite(llvmencodeproctype(tprocdef(taillvmdecl(hp).def), '', lpd_def)); WriteFunctionFlags(tprocdef(taillvmdecl(hp).def)); writer.AsmWriteln(' {'); @@ -958,22 +985,9 @@ implementation else begin writer.AsmWrite(LlvmAsmSymName(taillvmdecl(hp).namesym)); - case taillvmdecl(hp).namesym.bind of - AB_EXTERNAL: - writer.AsmWrite(' = external '); - AB_COMMON: - writer.AsmWrite(' = common '); - AB_LOCAL: - writer.AsmWrite(' = internal '); - AB_GLOBAL: - writer.AsmWrite(' = '); - AB_WEAK_EXTERNAL: - writer.AsmWrite(' = extern_weak '); - AB_PRIVATE_EXTERN: - writer.AsmWrite('= linker_private '); - else - internalerror(2014020104); - end; + writer.AsmWrite(' ='); + WriteLinkageVibilityFlags(taillvmdecl(hp).namesym.bind); + writer.AsmWrite(' '); if (ldf_tls in taillvmdecl(hp).flags) then writer.AsmWrite('thread_local '); if ldf_unnamed_addr in taillvmdecl(hp).flags then