Skip to content

Commit 3c8b008

Browse files
committed
ovmerge: Check intra fragment merge order
Ensure that intra fragments are not being applied to fragments that have already been merged, in a way that can be used by overlaycheck. Signed-off-by: Phil Elwell <[email protected]>
1 parent a0a6cc1 commit 3c8b008

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

ovmerge/ovmerge

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,9 @@ sub dtparse
493493
}
494494
}
495495

496+
# Check the fragment order
497+
ordercheck($dt, {}) if ($dt->{'plugin'});
498+
496499
# Check the overrides
497500
my $overrides = get_node($dt, '/__overrides__');
498501
foreach my $param (@{$overrides->[1]})
@@ -978,6 +981,43 @@ sub ovapply
978981
}
979982
}
980983

984+
sub ordercheck
985+
{
986+
my ($ov, $applied) = @_;
987+
988+
# Try to apply fragments that target other fragments within the overlay
989+
foreach my $fragment (get_fragments($ov))
990+
{
991+
my $overlay = get_child($fragment, '__overlay__');
992+
next if (!$overlay);
993+
my $target_node;
994+
my $target = get_prop($fragment, 'target');
995+
if ($target)
996+
{
997+
my $label = get_label_ref($target->[1]);
998+
die "* Invalid target reference\n" if ($label !~ /^&(.*)/);
999+
$target_node = $ov->{'labels'}->{$1};
1000+
if ($target_node)
1001+
{
1002+
my $target_fragment = fragment_of($target_node);
1003+
die "* $fragment->[0] should precede " . ($target_fragment ? $target_fragment->[0] : "fragment@?") . "\n"
1004+
if ($applied->{$target_node});
1005+
set_applied($overlay, $applied);
1006+
}
1007+
}
1008+
}
1009+
}
1010+
1011+
sub set_applied
1012+
{
1013+
my ($node, $applied) = @_;
1014+
$applied->{$node} = 1;
1015+
foreach my $subnode (get_children($node))
1016+
{
1017+
set_applied($subnode, $applied);
1018+
}
1019+
}
1020+
9811021
sub parse_node
9821022
{
9831023
my ($state, $parent, $depth, $node, @newlabels) = @_;
@@ -1178,6 +1218,14 @@ sub resolve_alias
11781218
}
11791219
}
11801220

1221+
sub fragment_of
1222+
{
1223+
my ($node) = @_;
1224+
return undef if (!$node);
1225+
return $node if ($node->[0] =~ /^fragment@/);
1226+
return fragment_of($node->[4]);
1227+
}
1228+
11811229
sub dump_node
11821230
{
11831231
my ($node, $depth) = @_;

0 commit comments

Comments
 (0)