mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-06 23:19:38 +01:00
+ support for inline nodes in node_complexity()
git-svn-id: trunk@11241 -
This commit is contained in:
parent
52c9e84255
commit
9c77c7743d
@ -95,7 +95,7 @@ implementation
|
|||||||
cutils,verbose,constexp,globals,
|
cutils,verbose,constexp,globals,
|
||||||
symconst,symdef,
|
symconst,symdef,
|
||||||
defutil,defcmp,
|
defutil,defcmp,
|
||||||
nbas,ncon,ncnv,nld,nflw,nset,ncal,nadd,nmem,
|
nbas,ncon,ncnv,nld,nflw,nset,ncal,nadd,nmem,ninl,
|
||||||
cpubase,cgbase,procinfo,
|
cpubase,cgbase,procinfo,
|
||||||
pass_1;
|
pass_1;
|
||||||
|
|
||||||
@ -703,6 +703,104 @@ implementation
|
|||||||
nothingn,
|
nothingn,
|
||||||
niln:
|
niln:
|
||||||
exit;
|
exit;
|
||||||
|
inlinen:
|
||||||
|
begin
|
||||||
|
{ this code assumes that the inline node has }
|
||||||
|
{ already been firstpassed, and consequently }
|
||||||
|
{ that inline nodes which are transformed into }
|
||||||
|
{ calls already have been transformed }
|
||||||
|
case tinlinenode(p).inlinenumber of
|
||||||
|
in_lo_qword,
|
||||||
|
in_hi_qword,
|
||||||
|
in_lo_long,
|
||||||
|
in_hi_long,
|
||||||
|
in_lo_word,
|
||||||
|
in_hi_word,
|
||||||
|
in_length_x,
|
||||||
|
in_assigned_x,
|
||||||
|
in_pred_x,
|
||||||
|
in_succ_x,
|
||||||
|
in_round_real,
|
||||||
|
in_trunc_real,
|
||||||
|
in_int_real,
|
||||||
|
in_frac_real,
|
||||||
|
in_cos_real,
|
||||||
|
in_sin_real,
|
||||||
|
in_arctan_real,
|
||||||
|
in_pi_real,
|
||||||
|
in_abs_real,
|
||||||
|
in_sqr_real,
|
||||||
|
in_sqrt_real,
|
||||||
|
in_ln_real,
|
||||||
|
{$ifdef SUPPORT_UNALIGNED}
|
||||||
|
in_unaligned_x,
|
||||||
|
{$endif SUPPORT_UNALIGNED}
|
||||||
|
in_prefetch_var:
|
||||||
|
begin
|
||||||
|
inc(result);
|
||||||
|
p:=tunarynode(p).left;
|
||||||
|
end;
|
||||||
|
in_abs_long:
|
||||||
|
begin
|
||||||
|
inc(result,10);
|
||||||
|
if (result >= NODE_COMPLEXITY_INF) then
|
||||||
|
begin
|
||||||
|
result:=NODE_COMPLEXITY_INF;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
p:=tunarynode(p).left;
|
||||||
|
end;
|
||||||
|
in_sizeof_x,
|
||||||
|
in_typeof_x:
|
||||||
|
begin
|
||||||
|
inc(result);
|
||||||
|
if (tinlinenode(p).left.nodetype<>typen) then
|
||||||
|
{ get instance vmt }
|
||||||
|
p:=tunarynode(p).left
|
||||||
|
else
|
||||||
|
{ type vmt = global symbol, result is }
|
||||||
|
{ already increased above }
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
{$ifdef SUPPORT_MMX}
|
||||||
|
in_mmx_pcmpeqb..in_mmx_pcmpgtw,
|
||||||
|
{$endif SUPPORT_MMX}
|
||||||
|
{ load from global symbol }
|
||||||
|
in_typeinfo_x,
|
||||||
|
{ load frame pointer }
|
||||||
|
in_get_frame,
|
||||||
|
in_get_caller_frame,
|
||||||
|
in_get_caller_addr:
|
||||||
|
begin
|
||||||
|
inc(result);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
in_inc_x,
|
||||||
|
in_dec_x,
|
||||||
|
in_include_x_y,
|
||||||
|
in_exclude_x_y,
|
||||||
|
in_assert_x_y :
|
||||||
|
begin
|
||||||
|
{ operation (add, sub, or, and }
|
||||||
|
inc(result);
|
||||||
|
{ left expression }
|
||||||
|
inc(result,node_complexity(tbinarynode(p).left));
|
||||||
|
if (result >= NODE_COMPLEXITY_INF) then
|
||||||
|
begin
|
||||||
|
result := NODE_COMPLEXITY_INF;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
p := tbinarynode(p).right;
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
result := NODE_COMPLEXITY_INF;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
result := NODE_COMPLEXITY_INF;
|
result := NODE_COMPLEXITY_INF;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user