123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464 |
- {$mode objfpc}
- {$inline on}
- type
- pshortstring=^shortstring;
- tr = record
- a,b,c,d,e: shortstring;
- end;
- ta = array[0..5] of shortstring;
- tc = record
- p: pointer;
- end;
- var
- p,p2,p3: pointer;
- inlined, failed: boolean;
- procedure error(err: longint);
- begin
- writeln('error near ',err, ' (inlined: ',inlined,')');
- failed:=true;
- end;
- function f1(p: pchar): tr;
- begin
- fillchar(result,sizeof(tr),0);
- if (p^<>'x') then
- error(1);
- f1.a:=p^;
- end;
- function f2(var s: shortstring): tr;
- begin
- fillchar(result,sizeof(tr),0);
- if (s<>'x') then
- error(2);
- f2.a:=s;
- end;
- function f3(const s: shortstring): tr;
- begin
- fillchar(result,sizeof(tr),0);
- if (s<>'x') then
- error(3);
- f3.a:=s;
- end;
- function f4(const t: tr): tr;
- begin
- fillchar(result,sizeof(tr),0);
- if (t.a<>'x') then
- error(4);
- f4:=t;
- end;
- function f5(p: pchar): ta;
- begin
- fillchar(result,sizeof(result),0);
- if (p^<>'x') then
- error(5);
- result[3]:=p^;
- end;
- function f6(var s: shortstring): ta;
- begin
- fillchar(result,sizeof(result),0);
- if (s<>'x') then
- error(6);
- result[3]:=s;
- end;
- function f7(const s: shortstring): ta;
- begin
- fillchar(result,sizeof(result),0);
- if (s<>'x') then
- error(7);
- result[3]:=s;
- end;
- function f8(const t: ta): ta;
- begin
- fillchar(result,sizeof(result),0);
- if (t[3]<>'x') then
- error(8);
- result:=t;
- end;
- procedure temp;
- begin
- if (pshortstring(p)^<>'x') then
- error(9);
- end;
- function f9: tr;
- begin
- fillchar(result,sizeof(result),0);
- temp;
- result.a:='x';
- end;
- procedure temp2(var a);
- begin
- p2:=@a;
- end;
- function f10: tr;
- begin
- fillchar(result,sizeof(result),0);
- if (pshortstring(p2)^<>'x') then
- error(10);
- result.a:='x';
- end;
- procedure testrec1;
- var
- t: tr;
- begin
- t.a:='x';
- t:=f1(@t.a[1]);
- end;
- procedure testrec2;
- var
- t: tr;
- begin
- t.a:='x';
- t:=f2(t.a);
- end;
- procedure testrec3;
- var
- t: tr;
- begin
- t.a:='x';
- t:=f3(t.a);
- end;
- procedure testrec4;
- var
- t: tr;
- begin
- t.a:='x';
- t:=f4(t);
- end;
- procedure testrec5;
- var
- t: tr;
- begin
- t.a:='x';
- p:[email protected];
- t:=f9;
- end;
- procedure testrecinl1; inline;
- var
- t: tr;
- begin
- inlined:=true;
- t.a:='x';
- t:=f1(@t.a[1]);
- end;
- procedure testrecinl2; inline;
- var
- t: tr;
- begin
- inlined:=true;
- t.a:='x';
- t:=f2(t.a);
- end;
- procedure testrecinl3; inline;
- var
- t: tr;
- begin
- inlined:=true;
- t.a:='x';
- t:=f3(t.a);
- end;
- procedure testrecinl4; inline;
- var
- t: tr;
- begin
- inlined:=true;
- t.a:='x';
- t:=f4(t);
- end;
- procedure testrecinl5; inline;
- var
- t: tr;
- begin
- inlined:=true;
- t.a:='x';
- p:[email protected];
- t:=f9;
- inlined:=false;
- end;
- procedure testrec2a;
- var
- t: tr;
- begin
- t.a:='x';
- temp2(t.a);
- t:=f10;
- end;
- procedure testrec2ainl; inline;
- var
- t: tr;
- begin
- inlined:=true;
- t.a:='x';
- temp2(t.a);
- t:=f10;
- inlined:=false;
- end;
- {$if defined(cpupowerpc32) or defined(cpupowerpc64) or defined(cpui386)}
- function f11: tr;
- begin
- fillchar(result,sizeof(result),0);
- if (pshortstring(p3)^<>'x') then
- error(11);
- result.a:='x';
- end;
- procedure testrec3a;
- var
- t: tr;
- begin
- asm
- {$ifdef cpupowerpc32}
- la r3,t
- {$ifndef macos}
- lis r4,p3@ha
- addi r4,r4,p3@l
- {$else}
- lwz r4,p3(r2)
- {$endif}
- stw r3,0(r4)
- {$endif}
- {$ifdef cpupowerpc64}
- la r3,t
- {$ifndef darwin}
- lis r4, p3@highesta
- ori r4, r4, p3@highera
- sldi r4, r4, 32
- oris r4, r4, p3@ha
- {$else darwin}
- lis r4, p3@ha
- {$endif darwin}
- std r3,p3@l(r4)
- {$endif}
- {$ifdef cpui386}
- leal t,%eax
- {$ifndef FPC_PIC}
- movl %eax,p3
- {$else FPC_PIC}
- call .Lpic
- .Lpic:
- popl %ecx
- {$ifdef darwin}
- movl %eax,p3-.Lpic(%ecx)
- {$else darwin}
- addl $_GLOBAL_OFFSET_TABLE_,%ecx
- movl %eax,p3@GOT(%ecx)
- {$endif darwin}
- {$endif FPC_PIC}
- {$endif cpui386}
- end;
- t.a:='x';
- t:=f11;
- end;
- procedure testrec3ainl; inline;
- var
- t: tr;
- begin
- inlined:=true;
- asm
- {$ifdef cpupowerpc32}
- la r3,t
- {$ifndef macos}
- lis r4,p3@ha
- addi r4,r4,p3@l
- {$else}
- lwz r4,p3(r2)
- {$endif}
- stw r3,0(r4)
- {$endif}
- {$ifdef cpupowerpc64}
- la r3,t
- {$ifndef darwin}
- lis r4, p3@highesta
- ori r4, r4, p3@highera
- sldi r4, r4, 32
- oris r4, r4, p3@ha
- {$else darwin}
- lis r4, p3@ha
- {$endif darwin}
- std r3,p3@l(r4)
- {$endif}
- {$ifdef cpui386}
- leal t,%eax
- {$ifndef FPC_PIC}
- movl %eax,p3
- {$else FPC_PIC}
- call .Lpic
- .Lpic:
- popl %ecx
- {$ifdef darwin}
- movl %eax,p3-.Lpic(%ecx)
- {$else darwin}
- addl $_GLOBAL_OFFSET_TABLE_,%ecx
- movl %eax,p3@GOT(%ecx)
- {$endif darwin}
- {$endif FPC_PIC}
- {$endif}
- end;
- t.a:='x';
- t:=f11;
- inlined:=false;
- end;
- {$endif}
- procedure testarr1;
- var
- t: ta;
- begin
- t[3]:='x';
- t:=f5(@t[3][1]);
- end;
- procedure testarr2;
- var
- t: ta;
- begin
- t[3]:='x';
- t:=f6(t[3]);
- end;
- procedure testarr3;
- var
- t: ta;
- begin
- t[3]:='x';
- t:=f7(t[3]);
- end;
- procedure testarr4;
- var
- t: ta;
- begin
- t[3]:='x';
- t:=f8(t);
- end;
- procedure testarrinl1; inline;
- var
- t: ta;
- begin
- inlined:=true;
- t[3]:='x';
- t:=f5(@t[3][1]);
- end;
- procedure testarrinl2; inline;
- var
- t: ta;
- begin
- inlined:=true;
- t[3]:='x';
- t:=f6(t[3]);
- end;
- procedure testarrinl3; inline;
- var
- t: ta;
- begin
- inlined:=true;
- t[3]:='x';
- t:=f7(t[3]);
- end;
- procedure testarrinl4; inline;
- var
- t: ta;
- begin
- inlined:=true;
- t[3]:='x';
- t:=f8(t);
- inlined:=false;
- end;
- begin
- testrec1;
- testrec2;
- testrec3;
- testrec4;
- testrec5;
- testrecinl1;
- testrecinl2;
- testrecinl3;
- testrecinl4;
- testrecinl5;
- testrec2a;
- testrec2ainl;
- {$if defined(cpupowerpc32) or defined(cpui386) or defined(cpupowerpc64)}
- testrec3a;
- testrec3ainl;
- {$endif}
- testarr1;
- testarr2;
- testarr3;
- testarr4;
- testarrinl1;
- testarrinl2;
- testarrinl3;
- testarrinl4;
- if failed then
- halt(1);
- end.
|