From 85702dd2638ed6ef1b61216524b4ee120a158514 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sat, 1 Dec 2018 20:30:24 +0000 Subject: [PATCH] + added support for clang as an assembler for llvm IR * adapted string used for macOS/iOS version in triple in llvm IR files to what clang expects (always a single digit patch version) git-svn-id: branches/debug_eh@40431 - --- compiler/llvm/agllvm.pas | 186 +++++++++++++++++++++++++++---------- compiler/llvm/llvmbase.pas | 2 +- compiler/options.pas | 20 +++- compiler/systems.inc | 3 +- 4 files changed, 155 insertions(+), 56 deletions(-) diff --git a/compiler/llvm/agllvm.pas b/compiler/llvm/agllvm.pas index 30af7ab08e..f16f1fa2fc 100644 --- a/compiler/llvm/agllvm.pas +++ b/compiler/llvm/agllvm.pas @@ -64,7 +64,6 @@ interface procedure WriteTai(const replaceforbidden: boolean; const do_line: boolean; var InlineLevel: cardinal; var asmblock: boolean; var hp: tai); public constructor CreateWithWriter(info: pasminfo; wr: TExternalAssemblerOutputFile; freewriter, smart: boolean); override; - function MakeCmdLine: TCmdStr; override; procedure WriteTree(p:TAsmList);override; procedure WriteAsmList;override; procedure WriteFunctionInlineAsmList(list: tasmlist); @@ -73,6 +72,16 @@ interface InstrWriter: TLLVMInstrWriter; end; + TLLVMLLCAssember=class(TLLVMAssember) + public + function MakeCmdLine: TCmdStr; override; + end; + + TLLVMClangAssember=class(TLLVMAssember) + public + function MakeCmdLine: TCmdStr; override; + end; + {# This is the base class for writing instructions. @@ -152,6 +161,7 @@ implementation extended2str:=hs end; + {****************************************************************************} { Decorator for module-level inline assembly } {****************************************************************************} @@ -769,47 +779,6 @@ implementation end; - function TLLVMAssember.MakeCmdLine: TCmdStr; - var - optstr: TCmdStr; - begin - result := inherited MakeCmdLine; - { standard optimization flags for llc -- todo: this needs to be split - into a call to opt and one to llc } - if cs_opt_level3 in current_settings.optimizerswitches then - optstr:='-O3' - else if cs_opt_level2 in current_settings.optimizerswitches then - optstr:='-O2' - else if cs_opt_level1 in current_settings.optimizerswitches then - optstr:='-O1' - else - optstr:='-O0'; - { stack frame elimination } - if not(cs_opt_stackframe in current_settings.optimizerswitches) then - optstr:=optstr+' -disable-fp-elim'; - { fast math } - if cs_opt_fastmath in current_settings.optimizerswitches then - optstr:=optstr+' -enable-unsafe-fp-math -fp-contract=fast'; { -enable-fp-mad support depends on version } - { smart linking } - if cs_create_smart in current_settings.moduleswitches then - optstr:=optstr+' -data-sections -function-sections'; - { pic } - if cs_create_pic in current_settings.moduleswitches then - optstr:=optstr+' -relocation-model=pic' - else if not(target_info.system in systems_darwin) then - optstr:=optstr+' -relocation-model=static' - else - optstr:=optstr+' -relocation-model=dynamic-no-pic'; - { our stack alignment is non-standard on some targets. The following - parameter is however ignored on some targets by llvm, so it may not - be enough } - optstr:=optstr+' -stack-alignment='+tostr(target_info.stackalign*8); - { force object output instead of textual assembler code } - optstr:=optstr+' -filetype=obj'; - replace(result,'$OPT',optstr); - end; - - procedure TLLVMAssember.WriteTree(p:TAsmList); var hp : tai; @@ -1497,22 +1466,141 @@ implementation end; - const - as_llvm_info : tasminfo = - ( - id : as_llvm; +{****************************************************************************} +{ llc Assember } +{****************************************************************************} - idtxt : 'LLVM-AS'; + function TLLVMLLCAssember.MakeCmdLine: TCmdStr; + var + optstr: TCmdStr; + begin + result:=inherited; + { standard optimization flags for llc -- todo: this needs to be split + into a call to opt and one to llc } + if cs_opt_level3 in current_settings.optimizerswitches then + optstr:='-O3' + else if cs_opt_level2 in current_settings.optimizerswitches then + optstr:='-O2' + else if cs_opt_level1 in current_settings.optimizerswitches then + optstr:='-O1' + else + optstr:='-O0'; + { stack frame elimination } + if not(cs_opt_stackframe in current_settings.optimizerswitches) then + optstr:=optstr+' -disable-fp-elim'; + { fast math } + if cs_opt_fastmath in current_settings.optimizerswitches then + optstr:=optstr+' -enable-unsafe-fp-math -fp-contract=fast'; { -enable-fp-mad support depends on version } + { smart linking } + if cs_create_smart in current_settings.moduleswitches then + optstr:=optstr+' -data-sections -function-sections'; + { pic } + if cs_create_pic in current_settings.moduleswitches then + optstr:=optstr+' -relocation-model=pic' + else if not(target_info.system in systems_darwin) then + optstr:=optstr+' -relocation-model=static' + else + optstr:=optstr+' -relocation-model=dynamic-no-pic'; + { our stack alignment is non-standard on some targets. The following + parameter is however ignored on some targets by llvm, so it may not + be enough } + optstr:=optstr+' -stack-alignment='+tostr(target_info.stackalign*8); + { force object output instead of textual assembler code } + optstr:=optstr+' -filetype=obj'; + replace(result,'$OPT',optstr); + end; + + +{****************************************************************************} +{ clang Assember } +{****************************************************************************} + + function TLLVMClangAssember.MakeCmdLine: TCmdStr; + var + optstr: TCmdStr; + begin + result:=inherited; + { standard optimization flags for llc -- todo: this needs to be split + into a call to opt and one to llc } + if cs_opt_level3 in current_settings.optimizerswitches then + optstr:='-O3' + else if cs_opt_level2 in current_settings.optimizerswitches then + optstr:='-O2' + else if cs_opt_level1 in current_settings.optimizerswitches then + optstr:='-O1' + else + optstr:='-O0'; + { stack frame elimination } + if not(cs_opt_stackframe in current_settings.optimizerswitches) then + optstr:=optstr+' -fno-omit-frame-pointer' + else + optstr:=optstr+' -fomit-frame-pointer'; + { fast math } + if cs_opt_fastmath in current_settings.optimizerswitches then + optstr:=optstr+' -ffast-math'; + { smart linking } + if cs_create_smart in current_settings.moduleswitches then + optstr:=optstr+' -fdata-sections -ffunction-sections'; + { pic } + if cs_create_pic in current_settings.moduleswitches then + optstr:=optstr+' -fpic' + else if not(target_info.system in systems_darwin) then + optstr:=optstr+' -static' + else + optstr:=optstr+' -mdynamic-no-pic'; + { our stack alignment is non-standard on some targets. The following + parameter is however ignored on some targets by llvm, so it may not + be enough } + optstr:=optstr+' -mstack-alignment='+tostr(target_info.stackalign*8); + if target_info.system in (systems_darwin-[system_i386_iphonesim,system_arm_darwin,system_aarch64_darwin,system_x86_64_iphonesim]) then + begin + if MacOSXVersionMin<>'' then + optstr:=optstr+' -mmacosx-version-min='+MacOSXVersionMin + end + else if target_info.system in [system_i386_iphonesim,system_arm_darwin,system_aarch64_darwin,system_x86_64_iphonesim] then + begin + if iPhoneOSVersionMin<>'' then + optstr:=optstr+' -mios-version-min='+iPhoneOSVersionMin; + end + else + begin + optstr:=optstr+' --target='+llvm_target_name; + end; + + replace(result,'$OPT',optstr); + end; + + + const + as_llvm_llc_info : tasminfo = + ( + id : as_llvm_llc; + + idtxt : 'LLVM-LLC'; asmbin : 'llc'; asmcmd: '$OPT -o $OBJ $ASM'; - supported_targets : [system_x86_64_linux,system_x86_64_darwin,system_powerpc64_darwin]; + supported_targets : [system_x86_64_linux,system_x86_64_darwin]; flags : [af_smartlink_sections]; labelprefix : 'L'; comment : '; '; dollarsign: '$'; ); + as_llvm_clang_info : tasminfo = + ( + id : as_llvm_clang; + + idtxt : 'LLVM-CLANG'; + asmbin : 'clang'; + asmcmd: '$OPT -c -o $OBJ $ASM'; + supported_targets : [system_x86_64_linux,system_x86_64_darwin]; + flags : [af_smartlink_sections]; + labelprefix : 'L'; + comment : '; '; + dollarsign: '$'; + ); begin - RegisterAssembler(as_llvm_info,TLLVMAssember); + RegisterAssembler(as_llvm_llc_info,TLLVMLLCAssember); + RegisterAssembler(as_llvm_clang_info,TLLVMClangAssember); end. diff --git a/compiler/llvm/llvmbase.pas b/compiler/llvm/llvmbase.pas index 1fe226086d..301f451bb7 100644 --- a/compiler/llvm/llvmbase.pas +++ b/compiler/llvm/llvmbase.pas @@ -154,7 +154,7 @@ implementation llvm_target_name:=llvm_target_name+'-ios'+iPhoneOSVersionMin; end else if target_info.system in (systems_linux+systems_android) then - llvm_target_name:=llvm_target_name+'-linux' + llvm_target_name:=llvm_target_name+'-unknown-linux-gnu' else if target_info.system in systems_windows then begin { WinCE isn't supported (yet) by llvm, but if/when added this is diff --git a/compiler/options.pas b/compiler/options.pas index e6a1e68590..69f0fc0216 100644 --- a/compiler/options.pas +++ b/compiler/options.pas @@ -917,9 +917,16 @@ function toption.ParseMacVersionMin(out minstr, emptystr: string; const compvarn end else if not ios and not osx_minor_two_digits then - compvarvalue:=compvarvalue+'0' + begin + compvarvalue:=compvarvalue+'0'; + minstr:=minstr+'.0' + end else - compvarvalue:=compvarvalue+'00'; + begin + compvarvalue:=compvarvalue+'00'; + { command line versions still only use one 0 though } + minstr:=minstr+'.0' + end; set_system_compvar(compvarname,compvarvalue); MacVersionSet:=true; result:=true; @@ -3972,8 +3979,11 @@ begin librarysearchpath.AddList(unitsearchpath,false); {$ifdef llvm} - { force llvm assembler writer } - option.paratargetasm:=as_llvm; + { default to clang } + if (option.paratargetasm=as_none) then + begin + option.paratargetasm:=as_llvm_clang; + end; {$endif llvm} { maybe override assembler } if (option.paratargetasm<>as_none) then @@ -3999,8 +4009,8 @@ begin begin option.paratargetdbg:=dbg_dwarf2; end; - end; + {TOptionheck a second time as we might have changed assembler just above } option.checkoptionscompatibility; diff --git a/compiler/systems.inc b/compiler/systems.inc index 80f5778735..a9587ec0b1 100644 --- a/compiler/systems.inc +++ b/compiler/systems.inc @@ -235,13 +235,14 @@ ,as_gas_powerpc_xcoff ,as_arm_elf32 ,as_i8086_omf - ,as_llvm + ,as_llvm_llc ,as_clang ,as_solaris_as ,as_m68k_vasm ,as_m68k_as_aout ,as_wasm_binaryen ,as_powerpc_gas_legacy { for systems with very old GAS versions only, which don't support eg. named sections } + ,as_llvm_clang ); tlink = (ld_none,