* synchronized with trunk

git-svn-id: branches/wasm@46681 -
This commit is contained in:
nickysn 2020-08-25 00:15:56 +00:00
commit 7bab5b6483
9 changed files with 90 additions and 60 deletions

View File

@ -600,10 +600,10 @@ implementation
result:=inherited pass_1;
if assigned(result) then
exit;
{ set fforcedprocname so that even virtual method calls will be
{ set foverrideprocnamedef so that even virtual method calls will be
name-based (instead of based on VMT entry numbers) }
if procdefinition.typ=procdef then
fforcedprocname:=tprocdef(procdefinition).mangledname
foverrideprocnamedef:=tprocdef(procdefinition)
end;
end;

View File

@ -41,6 +41,7 @@ Type
llvmver_7_0,
llvmver_7_1,
llvmver_8_0,
llvmver_xc_11,
llvmver_9_0,
llvmver_10_0
);
@ -63,6 +64,7 @@ Const
'7.0',
'7.1',
'8.0',
'Xcode-11.0',
'9.0',
'10.0'
);
@ -75,6 +77,7 @@ Const
{ llvmver_7_0 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid],
{ llvmver_7_1 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid],
{ llvmver_8_0 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid],
{ llvmver_xc_11 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid],
{ llvmver_9_0 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext],
{ llvmver_10_0 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp]
);

View File

@ -39,6 +39,7 @@ interface
function paraneedsinlinetemp(para: tcallparanode; const pushconstaddr, complexpara: boolean): boolean; override;
function can_call_ref(var ref: treference): boolean; override;
procedure pushparas; override;
procedure pass_generate_code; override;
end;
@ -46,6 +47,7 @@ implementation
uses
verbose,
aasmbase,aasmdata,aasmllvm,
symconst,symdef;
{*****************************************************************************
@ -104,6 +106,30 @@ implementation
end;
end;
procedure tllvmcallnode.pass_generate_code;
var
asmsym: tasmsymbol;
begin
inherited;
if assigned(overrideprocnamedef) and
not overrideprocnamedef.in_currentunit then
begin
{ insert an llvm declaration for this def if it's not defined in
the current unit, because otherwise we will define it in the
LLVM IR using the def for which this procdef's name is used
first, which may be something completely different from the original
def. LLVM can take the original def into account to load certain
registers, so if we use a wrong def this can result in wrong code
generation. }
asmsym:=current_asmdata.RefAsmSymbol(overrideprocnamedef.mangledname,AT_FUNCTION);
if not asmsym.declared then
begin
current_asmdata.AsmLists[al_imports].Concat(taillvmdecl.createdecl(asmsym,overrideprocnamedef,nil,sec_code,overrideprocnamedef.alignment));
end;
end;
end;
begin
ccallnode:=tllvmcallnode;
end.

View File

@ -67,7 +67,7 @@ interface
private
{ number of parameters passed from the source, this does not include the hidden parameters }
paralength : smallint;
function getforcedprocname: TSymStr;
function getoverrideprocnamedef: tprocdef; inline;
function is_simple_para_load(p:tnode; may_be_in_reg: boolean):boolean;
procedure maybe_load_in_temp(var p:tnode);
function gen_high_tree(var p:tnode;paradef:tdef):tnode;
@ -90,6 +90,7 @@ interface
function pass1_normal:tnode;
procedure register_created_object_types;
function get_expect_loc: tcgloc;
protected
function safe_call_self_node: tnode;
procedure load_in_temp(var p:tnode);
@ -124,12 +125,8 @@ interface
to ppu, is set while processing the node). Also used on the JVM
target for calling virtual methods, as this is name-based and not
based on VMT entry locations }
{$ifdef symansistr}
fforcedprocname: TSymStr;
{$else symansistr}
fforcedprocname: pshortstring;
{$endif symansistr}
property forcedprocname: TSymStr read getforcedprocname;
foverrideprocnamedef: tprocdef;
property overrideprocnamedef: tprocdef read getoverrideprocnamedef;
public
{ the symbol containing the definition of the procedure }
{ to call }
@ -1656,9 +1653,6 @@ implementation
call_vmt_node.free;
vmt_entry.free;
spezcontext.free;
{$ifndef symansistr}
stringdispose(fforcedprocname);
{$endif symansistr}
inherited destroy;
end;
@ -1844,14 +1838,7 @@ implementation
end
else
n.varargsparas:=nil;
{$ifdef symansistr}
n.fforcedprocname:=fforcedprocname;
{$else symansistr}
if assigned(fforcedprocname) then
n.fforcedprocname:=stringdup(fforcedprocname^)
else
n.fforcedprocname:=nil;
{$endif symansistr}
n.foverrideprocnamedef:=foverrideprocnamedef;
result:=n;
end;
@ -2084,16 +2071,9 @@ implementation
end;
function tcallnode.getforcedprocname: TSymStr;
function tcallnode.getoverrideprocnamedef: tprocdef; inline;
begin
{$ifdef symansistr}
result:=fforcedprocname;
{$else}
if assigned(fforcedprocname) then
result:=fforcedprocname^
else
result:='';
{$endif}
result:=foverrideprocnamedef;
end;
@ -2670,7 +2650,7 @@ implementation
vmt_def: trecorddef;
begin
if not assigned(right) and
(forcedprocname='') and
not assigned(overrideprocnamedef) and
(po_virtualmethod in procdefinition.procoptions) and
not is_objectpascal_helper(tprocdef(procdefinition).struct) and
assigned(methodpointer) and
@ -2780,11 +2760,7 @@ implementation
(srsym.typ<>procsym) or
(tprocsym(srsym).ProcdefList.count<>1) then
Message1(cg_f_unknown_compilerproc,'objc.'+msgsendname);
{$ifdef symansistr}
fforcedprocname:=tprocdef(tprocsym(srsym).ProcdefList[0]).mangledname;
{$else symansistr}
fforcedprocname:=stringdup(tprocdef(tprocsym(srsym).ProcdefList[0]).mangledname);
{$endif symansistr}
foverrideprocnamedef:=tprocdef(tprocsym(srsym).ProcdefList[0]);
{ B) Handle self }
{ 1) in case of sending a message to a superclass, self is a pointer to

View File

@ -1067,10 +1067,10 @@ implementation
end;
{$endif vtentry}
name_to_call:=forcedprocname;
{ When methodpointer is typen we don't need (and can't) load
a pointer. We can directly call the correct procdef (PFV) }
if (name_to_call='') and
name_to_call:='';
if not assigned(overrideprocnamedef) and
(po_virtualmethod in procdefinition.procoptions) and
not is_objectpascal_helper(tprocdef(procdefinition).struct) and
assigned(methodpointer) and
@ -1164,8 +1164,13 @@ implementation
extra_interrupt_code;
extra_call_code;
retloc.resetiftemp;
if (name_to_call='') then
name_to_call:=tprocdef(procdefinition).mangledname;
if name_to_call='' then
begin
if not assigned(overrideprocnamedef) then
name_to_call:=tprocdef(procdefinition).mangledname
else
name_to_call:=overrideprocnamedef.mangledname;
end;
if cnf_inherited in callnodeflags then
retloc:=hlcg.a_call_name_inherited(current_asmdata.CurrAsmList,tprocdef(procdefinition),name_to_call,paralocs)
{ under certain conditions, a static call (i.e. without PIC) can be generated }

View File

@ -670,6 +670,7 @@ implementation
extdbgcmdstr:=maybequoted(current_module.sharedlibfilename);
end;
LinkSymsFileName:='';
if not texportlibunix(exportlib).exportedsymnames.empty then
begin
LinkSymsFileName:=UniqueName('linksyms')+'.fpc';
@ -721,7 +722,7 @@ implementation
DeleteFile(ordersymfile);
DeleteFile(linkscript.fn);
linkscript.free;
if not texportlibunix(exportlib).exportedsymnames.empty then
if LinkSymsFileName<>'' then
DeleteFile(outputexedir+LinkSymsFileName);
DeleteFile(outputexedir+LinkFilesFileName);
end;

View File

@ -101,14 +101,19 @@ interface
end;
procedure TCPUAddNode.second_cmpsmallset;
procedure TCPUAddNode.second_cmpsmallset;
var
tmpreg : tregister;
cond: TOpCmp;
instr: taicpu;
truelab, falselab: TAsmLabel;
begin
pass_left_right;
if (not(nf_swapped in flags) and
(nodetype = lten)) or
((nf_swapped in flags) and
(nodetype = gten)) then
swapleftright;
current_asmdata.getjumplabel(truelab);
current_asmdata.getjumplabel(falselab);
@ -116,18 +121,27 @@ interface
force_reg_left_right(false,false);
case nodetype of
equaln: cond:=OC_EQ;
unequaln: cond:=OC_NE;
ltn: cond:=OC_LT;
lten: cond:=OC_LT;
gtn: cond:=OC_GT;
gten: cond:=OC_GTE;
else
internalerror(2020030801);
equaln:
begin
cg.a_cmp_reg_reg_label(current_asmdata.CurrAsmList,OS_INT,OC_EQ,left.location.register,right.location.register,location.truelabel);
cg.a_jmp_always(current_asmdata.CurrAsmList,location.falselabel);
end;
unequaln:
begin
cg.a_cmp_reg_reg_label(current_asmdata.CurrAsmList,OS_INT,OC_NE,left.location.register,right.location.register,location.truelabel);
cg.a_jmp_always(current_asmdata.CurrAsmList,location.falselabel);
end;
lten,
gten:
begin
tmpreg:=cg.getintregister(current_asmdata.CurrAsmList,location.size);
cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList,OP_AND,OS_32,left.location.register,right.location.register,tmpreg);
cg.a_cmp_reg_reg_label(current_asmdata.CurrAsmList,OS_INT,OC_EQ,tmpreg,right.location.register,location.truelabel);
cg.a_jmp_always(current_asmdata.CurrAsmList,location.falselabel);
end;
else
internalerror(2020082401);
end;
cg.a_cmp_reg_reg_label(current_asmdata.CurrAsmList,OS_INT,cond,left.location.register,right.location.register,location.truelabel);
cg.a_jmp_always(current_asmdata.CurrAsmList,location.falselabel);
end;

View File

@ -75,11 +75,16 @@ unit esp32;
procedure _FPC_haltproc; public name '_haltproc';noreturn;
begin
printpchar('_haltproc called, going to deep sleep, exit code: $');
printdword(operatingsystem_result);
printpchar(#10);
while true do
esp_deep_sleep_start;
if operatingsystem_result <> 0 then
writeln('Runtime error ', operatingsystem_result);
writeln('_haltproc called, exit code: ',operatingsystem_result);
flushOutput(TextRec(Output));
repeat
// Allow other tasks to run
// Do not enter deep sleep, can lead to problems with flashing
vTaskDelay(1000);
until false;
end;

View File

@ -56,7 +56,7 @@ unit esp8266;
if operatingsystem_result <> 0 then
writeln('Runtime error ', operatingsystem_result);
writeln('_haltproc called...');
writeln('_haltproc called, exit code: ',operatingsystem_result);
flushOutput(TextRec(Output));
repeat
// Allow other tasks to run