On 26/11/2020 09:56, Mark Geisert wrote:
Cut mkimport elapsed time in half by forking each iteration of the two
time-consuming loops within.  Only do this if more than one CPU is
present.  In the second loop, combine the two 'objdump' calls into one
system() invocation to avoid a system() invocation per iteration.

Nice.  Thanks for looking into this.

@@ -86,8 +94,18 @@ for my $f (keys %text) {
      if (!$text{$f}) {
        unlink $f;
      } else {
-       system $objcopy, '-R', '.text', $f and exit 1;
-       system $objcopy, '-R', '.bss', '-R', '.data', "t-$f" and exit 1;
+       if ($forking && fork) {
+           # Testing shows parent does need to sleep a short time here,
+           # otherwise system is inundated with hundreds of objcopy processes
+           # and the forked perl processes that launched them.
+           my $delay = 0.01; # NOTE: Slower systems may need to raise this
+           select(undef, undef, undef, $delay); # Supports fractional seconds
+       } else {
+           # Do two objcopy calls at once to avoid one system() call overhead
+           system '(', $objcopy, '-R', '.text', $f, ')', '||',
+               $objcopy, '-R', '.bss', '-R', '.data', "t-$f" and exit 1;
+           exit 0 if $forking;
+       }
      }
  }

Hmm... not so sure about this. This seems racy, as nothing ensures that these objcopies have finished before we combine all the produced .o files into a library.

I'm pretty sure with more understanding, this whole thing could be done better: For example, from a brief look, it seems that the t-*.o files are produced by gas, and then we remove .bss and .data sections. Could we not arrange to assemble these objects without those sections in the first place?

Reply via email to