'-fPIE',
'-pie',
);
-# Renaming rules for the output so the regex parts are not visible.
+my @def_ldflags_pic = (
+ '-fPIC',
+ '-fpic',
+);
+# Renaming rules for the output so the regex parts are not visible. Also
+# stores string values of flag regexps above, see compile_flag_regexp().
my %flag_renames = (
'-O(?:2|3)' => '-O2',
'-Wl,(-z,)?relro' => '-Wl,-z,relro',
sub error_flags {
my ($message, $missing_flags_ref, $flag_renames_ref, $line) = @_;
- # Rename flags if requested.
+ # Get string value of qr//-escaped regexps and if requested rename them.
my @missing_flags = map {
- (exists $flag_renames_ref->{$_})
- ? $flag_renames_ref->{$_}
- : $_
- } @{$missing_flags_ref};
+ $flag_renames_ref->{$_}
+ } @{$missing_flags_ref};
my $flags = join ' ', @missing_flags;
printf "%s (%s)%s %s",
my ($line, @flags) = @_;
foreach my $flag (@flags) {
- return 1 if $line =~ /\s$flag(?:\s|\\)/;
+ return 1 if $line =~ /$flag/;
}
return 0;
my @missing_flags = ();
foreach my $flag (@flags) {
- if ($line !~ /\s$flag(?:\s|\\)/) {
+ if (not $line =~ /$flag/) {
push @missing_flags, $flag;
}
}
my ($line, $pie, $missing_flags_ref, @flags_pie) = @_;
return 0 if not $pie;
- return 0 if not any_flags_used($line, ('-fPIC', '-fpic'));
+ return 0 if not any_flags_used($line, @def_ldflags_pic);
my %flags = map { $_ => 1 } @flags_pie;
return 1;
}
+sub compile_flag_regexp {
+ my ($flag_renames_ref, @flags) = @_;
+
+ my @result = ();
+ foreach my $flag (@flags) {
+ # Store flag name in replacement string for correct flags in messages
+ # with qr//ed flag regexps.
+ $flag_renames_ref->{qr/\s$flag(?:\s|\\)/}
+ = (exists $flag_renames_ref->{$flag})
+ ? $flag_renames_ref->{$flag}
+ : $flag;
+
+ # Compile flag regexp for faster execution.
+ push @result, qr/\s$flag(?:\s|\\)/;
+ }
+ return @result;
+}
+
sub extension_found {
my ($extensions_ref, @extensions) = @_;
$option_bindnow = 1;
}
+# Precompile all flag regexps. any_flags_used(), all_flags_used() get a lot
+# faster with this.
+@def_cflags = compile_flag_regexp(\%flag_renames, @def_cflags);
+@def_cflags_format = compile_flag_regexp(\%flag_renames, @def_cflags_format);
+@def_cflags_fortify = compile_flag_regexp(\%flag_renames, @def_cflags_fortify);
+@def_cflags_stack = compile_flag_regexp(\%flag_renames, @def_cflags_stack);
+@def_cflags_pie = compile_flag_regexp(\%flag_renames, @def_cflags_pie);
+@def_cxxflags = compile_flag_regexp(\%flag_renames, @def_cxxflags);
+@def_cppflags = compile_flag_regexp(\%flag_renames, @def_cppflags);
+@def_cppflags_fortify = compile_flag_regexp(\%flag_renames, @def_cppflags_fortify);
+@def_ldflags = compile_flag_regexp(\%flag_renames, @def_ldflags);
+@def_ldflags_relro = compile_flag_regexp(\%flag_renames, @def_ldflags_relro);
+@def_ldflags_bindnow = compile_flag_regexp(\%flag_renames, @def_ldflags_bindnow);
+@def_ldflags_pie = compile_flag_regexp(\%flag_renames, @def_ldflags_pie);
+@def_ldflags_pic = compile_flag_regexp(\%flag_renames, @def_ldflags_pic);
+
# Final exit code.
my $exit = 0;