+ 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 -
This commit is contained in:
Jonas Maebe 2018-12-01 20:30:24 +00:00
parent 645a4da831
commit 85702dd263
4 changed files with 155 additions and 56 deletions

View File

@ -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.

View File

@ -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

View File

@ -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;

View File

@ -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,