--- Merging r40512 into '.':

A    tests/webtbs/tw33607.pp
U    compiler/aarch64/hlcgcpu.pas
--- Recording mergeinfo for merge of r40512 into '.':
 U   .
--- Merging r40566 into '.':
U    compiler/aarch64/cpupara.pas
--- Recording mergeinfo for merge of r40566 into '.':
 G   .
--- Merging r40567 into '.':
G    compiler/aarch64/cpupara.pas
--- Recording mergeinfo for merge of r40567 into '.':
 G   .
--- Merging r40573 into '.':
G    compiler/aarch64/cpupara.pas
--- Recording mergeinfo for merge of r40573 into '.':
 G   .
--- Merging r40629 into '.':
U    compiler/ncnv.pas
U    compiler/llvm/nllvmcnv.pas
--- Recording mergeinfo for merge of r40629 into '.':
 G   .
--- Merging r40637 into '.':
U    compiler/ncon.pas
A    tests/webtbs/tw33666.pp
--- Recording mergeinfo for merge of r40637 into '.':
 G   .
--- Merging r40729 into '.':
U    compiler/ncal.pas
U    compiler/jvm/njvminl.pas
U    compiler/ninl.pas
--- Recording mergeinfo for merge of r40729 into '.':
 G   .

git-svn-id: branches/fixes_3_2@40735 -
This commit is contained in:
Jonas Maebe 2019-01-01 16:49:46 +00:00
parent 5826dfa53d
commit fc9e9e804a
8 changed files with 32 additions and 18 deletions

View File

@ -270,7 +270,8 @@ unit cpupara;
then indexed beyond its bounds) }
arraydef:
result:=
(calloption in cdecl_pocalls) or
((calloption in cdecl_pocalls) and
not is_dynamic_array(def)) or
is_open_array(def) or
is_array_of_const(def) or
is_array_constructor(def) or
@ -556,7 +557,10 @@ unit cpupara;
(side=callerside) and
is_ordinal(paradef) and
(paradef.size<4) then
paraloc^.size:=OS_32;
begin
paraloc^.size:=OS_32;
paraloc^.def:=u32inttype;
end;
{ in case it's a composite, "The argument is passed as though
it had been loaded into the registers from a double-word-
@ -567,7 +571,7 @@ unit cpupara;
if (target_info.endian=endian_big) and
not(paraloc^.size in [OS_64,OS_S64]) and
(paradef.typ in [setdef,recorddef,arraydef,objectdef]) then
paraloc^.shiftval:=-(8-tcgsize2size[paraloc^.size]);
paraloc^.shiftval:=-(8-tcgsize2size[paraloc^.size])*8;
end;
LOC_MMREGISTER:
begin
@ -581,7 +585,7 @@ unit cpupara;
paraloc^.loc:=LOC_REFERENCE;
{ the current stack offset may not be properly aligned in
case we're on Darwin have allocated a non-variadic argument
case we're on Darwin and have allocated a non-variadic argument
< 8 bytes previously }
if target_info.abi=abi_aarch64_darwin then
curstackoffset:=align(curstackoffset,paraloc^.def.alignment);

View File

@ -64,7 +64,10 @@ implementation
begin
tocgsize:=def_cgsize(tosize);
if (sreg.startbit<>0) or
not(sreg.bitlen in [32,64]) then
not((sreg.subsetregsize in [OS_32,OS_S32]) and
(sreg.bitlen=32)) or
not((sreg.subsetregsize in [OS_64,OS_S64]) and
(sreg.bitlen=64)) then
begin
if is_signed(subsetsize) then
op:=A_SBFX

View File

@ -521,7 +521,7 @@ implementation
function tjvminlinenode.first_setlength: tnode;
begin
{ reverse the parameter order so we can process them more easily }
left:=reverseparameters(tcallparanode(left));
reverseparameters(tcallparanode(left));
{ treat setlength(x,0) specially: used to init uninitialised locations }
if not is_shortstring(left.resultdef) and
not assigned(tcallparanode(tcallparanode(left).right).right) and
@ -535,7 +535,7 @@ implementation
{ strings are handled the same as on other platforms }
if left.resultdef.typ=stringdef then
begin
left:=reverseparameters(tcallparanode(left));
reverseparameters(tcallparanode(left));
result:=inherited first_setlength;
exit;
end;

View File

@ -80,7 +80,7 @@ class function tllvmtypeconvnode.target_specific_need_equal_typeconv(fromdef, to
result:=
(fromdef<>todef) and
{ two procdefs that are structurally the same but semantically different
still need a convertion }
still need a conversion }
(
((fromdef.typ=procvardef) and
(todef.typ=procvardef))

View File

@ -290,7 +290,7 @@ interface
dct_propput
);
function reverseparameters(p: tcallparanode): tcallparanode;
procedure reverseparameters(var p: tcallparanode);
function translate_disp_call(selfnode,parametersnode: tnode; calltype: tdispcalltype; const methodname : ansistring;
dispid : longint;resultdef : tdef) : tnode;
@ -331,21 +331,23 @@ implementation
HELPERS
****************************************************************************}
function reverseparameters(p: tcallparanode): tcallparanode;
procedure reverseparameters(var p: tcallparanode);
var
tmpp,
hp1, hp2: tcallparanode;
begin
hp1:=nil;
while assigned(p) do
tmpp:=p;
while assigned(tmpp) do
begin
{ pull out }
hp2:=p;
p:=tcallparanode(p.right);
hp2:=tmpp;
tmpp:=tcallparanode(tmpp.right);
{ pull in }
hp2.right:=hp1;
hp1:=hp2;
end;
reverseparameters:=hp1;
p:=hp1;
end;
function translate_disp_call(selfnode,parametersnode: tnode; calltype: tdispcalltype; const methodname : ansistring;

View File

@ -350,7 +350,8 @@ implementation
if equal_defs(p.resultdef,def) and
(p.resultdef.typ=def.typ) and
not is_bitpacked_access(p) and
not ctypeconvnode.target_specific_need_equal_typeconv(p.resultdef,def) then
((p.blocktype=bt_const) or
not ctypeconvnode.target_specific_need_equal_typeconv(p.resultdef,def)) then
begin
{ don't replace encoded string constants to rawbytestring encoding.
preserve the codepage }
@ -2440,7 +2441,8 @@ implementation
{$ifdef llvm}
{ we still may have to insert a type conversion at the
llvm level }
if (left.resultdef<>resultdef) and
if (blocktype<>bt_const) and
(left.resultdef<>resultdef) and
{ if unspecialised generic -> we won't generate any code
for this, and keeping the type conversion node will
cause valid_for_assign to fail because the typecast will be from/to something of 0

View File

@ -982,6 +982,7 @@ implementation
Message1(option_code_page_not_available,IntToStr(cp1));
initwidestring(pw);
setlengthwidestring(pw,len);
{ returns room for terminating 0 }
l:=Utf8ToUnicode(PUnicodeChar(pw^.data),len,value_str,len);
if (l<>getlengthwidestring(pw)) then
begin
@ -989,6 +990,7 @@ implementation
ReAllocMem(value_str,l);
end;
unicode2ascii(pw,value_str,cp1);
len:=l-1;
donewidestring(pw);
end
else
@ -1000,6 +1002,7 @@ implementation
initwidestring(pw);
setlengthwidestring(pw,len);
ascii2unicode(value_str,len,cp2,pw);
{ returns room for terminating 0 }
l:=UnicodeToUtf8(nil,0,PUnicodeChar(pw^.data),len);
if l<>len then
ReAllocMem(value_str,l);

View File

@ -1239,7 +1239,7 @@ implementation
{ reverse the parameters (needed to get the colon parameters in the }
{ correct order when processing write(ln) }
left := reverseparameters(tcallparanode(left));
reverseparameters(tcallparanode(left));
if is_rwstr then
begin
@ -1525,7 +1525,7 @@ implementation
valsinttype:=search_system_type('VALSINT').typedef;
{ reverse parameters for easier processing }
left := reverseparameters(tcallparanode(left));
reverseparameters(tcallparanode(left));
{ get the parameters }
tempcode := nil;