diff options
author | Florian Hahn <flo@fhahn.com> | 2019-02-06 18:43:37 +0000 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2019-02-06 18:43:37 +0000 |
commit | 169f64238fe966308427a6ff794bd62563a9f4bb (patch) | |
tree | 2f2c9a9c12ea7255ecf142a6a00b53f36b14715b | |
parent | feeedafd28b913fbabc43ccc37c5c0b449a11863 (diff) | |
download | bcm5719-llvm-169f64238fe966308427a6ff794bd62563a9f4bb.tar.gz bcm5719-llvm-169f64238fe966308427a6ff794bd62563a9f4bb.zip |
[opt-viewer] Add --filter option to select remarks for displaying.
This allows limiting the displayed remarks to the ones with names
matching the filter (regular) expression.
Generating html pages for a larger project with optimization remarks can
result in a huge HTML documents and using --filter allows to focus on a
set of interesting remarks.
Reviewers: hfinkel, anemet, thegameg, serge-sans-paille
Reviewed By: anemet
Differential Revision: https://reviews.llvm.org/D57827
llvm-svn: 353322
-rw-r--r-- | llvm/test/tools/opt-viewer/Outputs/filter/basic_or.c.html | 260 | ||||
-rw-r--r-- | llvm/test/tools/opt-viewer/Outputs/filter/basic_or.h.html | 217 | ||||
-rw-r--r-- | llvm/test/tools/opt-viewer/Outputs/filter/index.html | 124 | ||||
-rw-r--r-- | llvm/test/tools/opt-viewer/filter.test | 8 | ||||
-rwxr-xr-x | llvm/tools/opt-viewer/opt-viewer.py | 9 | ||||
-rw-r--r-- | llvm/tools/opt-viewer/optpmap.py | 8 | ||||
-rw-r--r-- | llvm/tools/opt-viewer/optrecord.py | 14 |
7 files changed, 631 insertions, 9 deletions
diff --git a/llvm/test/tools/opt-viewer/Outputs/filter/basic_or.c.html b/llvm/test/tools/opt-viewer/Outputs/filter/basic_or.c.html new file mode 100644 index 00000000000..005cc2e63cd --- /dev/null +++ b/llvm/test/tools/opt-viewer/Outputs/filter/basic_or.c.html @@ -0,0 +1,260 @@ + +<html> +<title>or.c</title> +<meta charset="utf-8" /> +<head> +<link rel='stylesheet' type='text/css' href='style.css'> +<script type="text/javascript"> +/* Simple helper to show/hide the expanded message of a remark. */ +function toggleExpandedMessage(e) { + var FullTextElems = e.parentElement.parentElement.getElementsByClassName("full-info"); + if (!FullTextElems || FullTextElems.length < 1) { + return false; + } + var FullText = FullTextElems[0]; + if (FullText.style.display == 'none') { + e.innerHTML = '-'; + FullText.style.display = 'block'; + } else { + e.innerHTML = '+'; + FullText.style.display = 'none'; + } +} +</script> +</head> +<body> +<div class="centered"> +<table class="source"> +<thead> +<tr> +<th style="width: 2%">Line</td> +<th style="width: 3%">Hotness</td> +<th style="width: 10%">Optimization</td> +<th style="width: 70%">Source</td> +<th style="width: 15%">Inline Context</td> +</tr> +</thead> +<tbody> + +<tr> +<td><a name="L1">1</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre>void bar();</pre></div></td> +</tr> + +<tr> +<td><a name="L2">2</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre>void foo() { bar(); }</pre></div></td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-red">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> bar will not be inlined into foo because its definition is unavailable </span></td> +<td class="column-entry-yellow">foo</td> +</tr> + +<tr> +<td><a name="L3">3</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L4">4</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre>#include "or.h"</pre></div></td> +</tr> + +<tr> +<td><a name="L5">5</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L6">6</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre>void Test(int *res, int *c, int *d, int *p, int n) {</pre></div></td> +</tr> + +<tr> +<td><a name="L7">7</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> int i;</pre></div></td> +</tr> + +<tr> +<td><a name="L8">8</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L9">9</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre>#pragma clang loop vectorize(assume_safety)</pre></div></td> +</tr> + +<tr> +<td><a name="L10">10</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> for (i = 0; i < 1600; i++) {</pre></div></td> +</tr> + +<tr> +<td><a name="L11">11</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];</pre></div></td> +</tr> + +<tr> +<td><a name="L12">12</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> }</pre></div></td> +</tr> + +<tr> +<td><a name="L13">13</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L14">14</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> for (i = 0; i < 16; i++) {</pre></div></td> +</tr> + +<tr> +<td><a name="L15">15</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];</pre></div></td> +</tr> + +<tr> +<td><a name="L16">16</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> }</pre></div></td> +</tr> + +<tr> +<td><a name="L17">17</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L18">18</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> foo();</pre></div></td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-white">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into Test with cost=30 (threshold=412) </span></td> +<td class="column-entry-yellow">Test</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-green">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into Test </span></td> +<td class="column-entry-yellow">Test</td> +</tr> + +<tr> +<td><a name="L19">19</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L20">20</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> foo(); bar(); foo();</pre></div></td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-red">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> bar will not be inlined into Test because its definition is unavailable </span></td> +<td class="column-entry-yellow">Test</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-white">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into Test with cost=30 (threshold=412) </span></td> +<td class="column-entry-yellow">Test</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-green">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into Test </span></td> +<td class="column-entry-yellow">Test</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-white">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into Test with cost=30 (threshold=412) </span></td> +<td class="column-entry-yellow">Test</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-green">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into Test </span></td> +<td class="column-entry-yellow">Test</td> +</tr> + +<tr> +<td><a name="L21">21</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre>}</pre></div></td> +</tr> + +<tr> +<td><a name="L22">22</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +</tbody> +</table> +</body> +</html> diff --git a/llvm/test/tools/opt-viewer/Outputs/filter/basic_or.h.html b/llvm/test/tools/opt-viewer/Outputs/filter/basic_or.h.html new file mode 100644 index 00000000000..19b0f1ed6c4 --- /dev/null +++ b/llvm/test/tools/opt-viewer/Outputs/filter/basic_or.h.html @@ -0,0 +1,217 @@ + +<html> +<title>or.h</title> +<meta charset="utf-8" /> +<head> +<link rel='stylesheet' type='text/css' href='style.css'> +<script type="text/javascript"> +/* Simple helper to show/hide the expanded message of a remark. */ +function toggleExpandedMessage(e) { + var FullTextElems = e.parentElement.parentElement.getElementsByClassName("full-info"); + if (!FullTextElems || FullTextElems.length < 1) { + return false; + } + var FullText = FullTextElems[0]; + if (FullText.style.display == 'none') { + e.innerHTML = '-'; + FullText.style.display = 'block'; + } else { + e.innerHTML = '+'; + FullText.style.display = 'none'; + } +} +</script> +</head> +<body> +<div class="centered"> +<table class="source"> +<thead> +<tr> +<th style="width: 2%">Line</td> +<th style="width: 3%">Hotness</td> +<th style="width: 10%">Optimization</td> +<th style="width: 70%">Source</td> +<th style="width: 15%">Inline Context</td> +</tr> +</thead> +<tbody> + +<tr> +<td><a name="L1">1</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre>void TestH(int *res, int *c, int *d, int *p, int n) {</pre></div></td> +</tr> + +<tr> +<td><a name="L2">2</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> int i;</pre></div></td> +</tr> + +<tr> +<td><a name="L3">3</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L4">4</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre>#pragma clang loop vectorize(assume_safety)</pre></div></td> +</tr> + +<tr> +<td><a name="L5">5</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> for (i = 0; i < 1600; i++) {</pre></div></td> +</tr> + +<tr> +<td><a name="L6">6</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];</pre></div></td> +</tr> + +<tr> +<td><a name="L7">7</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> }</pre></div></td> +</tr> + +<tr> +<td><a name="L8">8</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L9">9</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> for (i = 0; i < 16; i++) {</pre></div></td> +</tr> + +<tr> +<td><a name="L10">10</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> res[i] = (p[i] == 0) ? res[i] : res[i] + d[i];</pre></div></td> +</tr> + +<tr> +<td><a name="L11">11</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> }</pre></div></td> +</tr> + +<tr> +<td><a name="L12">12</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L13">13</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> foo();</pre></div></td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-white">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into TestH with cost=30 (threshold=412) </span></td> +<td class="column-entry-yellow">TestH</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-green">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into TestH </span></td> +<td class="column-entry-yellow">TestH</td> +</tr> + +<tr> +<td><a name="L14">14</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +<tr> +<td><a name="L15">15</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre> foo(); bar(); foo();</pre></div></td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-red">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> bar will not be inlined into TestH because its definition is unavailable </span></td> +<td class="column-entry-yellow">TestH</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-white">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into TestH with cost=30 (threshold=412) </span></td> +<td class="column-entry-yellow">TestH</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-green">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into TestH </span></td> +<td class="column-entry-yellow">TestH</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-white">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo can be inlined into TestH with cost=30 (threshold=412) </span></td> +<td class="column-entry-yellow">TestH</td> +</tr> + +<tr> +<td></td> +<td></td> +<td class="column-entry-green">inline</td> +<td><pre style="display:inline"> </pre><span class="column-entry-yellow"> foo inlined into TestH </span></td> +<td class="column-entry-yellow">TestH</td> +</tr> + +<tr> +<td><a name="L16">16</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre>}</pre></div></td> +</tr> + +<tr> +<td><a name="L17">17</a></td> +<td></td> +<td></td> +<td><div class="highlight"><pre></pre></div></td> +</tr> + +</tbody> +</table> +</body> +</html> diff --git a/llvm/test/tools/opt-viewer/Outputs/filter/index.html b/llvm/test/tools/opt-viewer/Outputs/filter/index.html new file mode 100644 index 00000000000..57aa9c86298 --- /dev/null +++ b/llvm/test/tools/opt-viewer/Outputs/filter/index.html @@ -0,0 +1,124 @@ + +<html> +<meta charset="utf-8" /> +<head> +<link rel='stylesheet' type='text/css' href='style.css'> +</head> +<body> +<div class="centered"> +<table> +<tr> +<td>Source Location</td> +<td>Hotness</td> +<td>Function</td> +<td>Pass</td> +</tr> + +<tr> +<td class="column-entry-0"><a href="basic_or.c.html#L2">basic/or.c:2:14</a></td> +<td class="column-entry-0"></td> +<td class="column-entry-0">foo</td> +<td class="column-entry-red">inline</td> +</tr> + +<tr> +<td class="column-entry-1"><a href="basic_or.c.html#L18">basic/or.c:18:3</a></td> +<td class="column-entry-1"></td> +<td class="column-entry-1">Test</td> +<td class="column-entry-white">inline</td> +</tr> + +<tr> +<td class="column-entry-0"><a href="basic_or.c.html#L18">basic/or.c:18:3</a></td> +<td class="column-entry-0"></td> +<td class="column-entry-0">Test</td> +<td class="column-entry-green">inline</td> +</tr> + +<tr> +<td class="column-entry-1"><a href="basic_or.c.html#L20">basic/or.c:20:3</a></td> +<td class="column-entry-1"></td> +<td class="column-entry-1">Test</td> +<td class="column-entry-white">inline</td> +</tr> + +<tr> +<td class="column-entry-0"><a href="basic_or.c.html#L20">basic/or.c:20:3</a></td> +<td class="column-entry-0"></td> +<td class="column-entry-0">Test</td> +<td class="column-entry-green">inline</td> +</tr> + +<tr> +<td class="column-entry-1"><a href="basic_or.c.html#L20">basic/or.c:20:10</a></td> +<td class="column-entry-1"></td> +<td class="column-entry-1">Test</td> +<td class="column-entry-red">inline</td> +</tr> + +<tr> +<td class="column-entry-0"><a href="basic_or.c.html#L20">basic/or.c:20:17</a></td> +<td class="column-entry-0"></td> +<td class="column-entry-0">Test</td> +<td class="column-entry-white">inline</td> +</tr> + +<tr> +<td class="column-entry-1"><a href="basic_or.c.html#L20">basic/or.c:20:17</a></td> +<td class="column-entry-1"></td> +<td class="column-entry-1">Test</td> +<td class="column-entry-green">inline</td> +</tr> + +<tr> +<td class="column-entry-0"><a href="basic_or.h.html#L13">basic/or.h:13:3</a></td> +<td class="column-entry-0"></td> +<td class="column-entry-0">TestH</td> +<td class="column-entry-white">inline</td> +</tr> + +<tr> +<td class="column-entry-1"><a href="basic_or.h.html#L13">basic/or.h:13:3</a></td> +<td class="column-entry-1"></td> +<td class="column-entry-1">TestH</td> +<td class="column-entry-green">inline</td> +</tr> + +<tr> +<td class="column-entry-0"><a href="basic_or.h.html#L15">basic/or.h:15:3</a></td> +<td class="column-entry-0"></td> +<td class="column-entry-0">TestH</td> +<td class="column-entry-white">inline</td> +</tr> + +<tr> +<td class="column-entry-1"><a href="basic_or.h.html#L15">basic/or.h:15:3</a></td> +<td class="column-entry-1"></td> +<td class="column-entry-1">TestH</td> +<td class="column-entry-green">inline</td> +</tr> + +<tr> +<td class="column-entry-0"><a href="basic_or.h.html#L15">basic/or.h:15:10</a></td> +<td class="column-entry-0"></td> +<td class="column-entry-0">TestH</td> +<td class="column-entry-red">inline</td> +</tr> + +<tr> +<td class="column-entry-1"><a href="basic_or.h.html#L15">basic/or.h:15:17</a></td> +<td class="column-entry-1"></td> +<td class="column-entry-1">TestH</td> +<td class="column-entry-white">inline</td> +</tr> + +<tr> +<td class="column-entry-0"><a href="basic_or.h.html#L15">basic/or.h:15:17</a></td> +<td class="column-entry-0"></td> +<td class="column-entry-0">TestH</td> +<td class="column-entry-green">inline</td> +</tr> + +</table> +</body> +</html> diff --git a/llvm/test/tools/opt-viewer/filter.test b/llvm/test/tools/opt-viewer/filter.test new file mode 100644 index 00000000000..a6913ce0c5a --- /dev/null +++ b/llvm/test/tools/opt-viewer/filter.test @@ -0,0 +1,8 @@ +# Since we're performing a full compare of the generate HTML files disable +# syntax highlighting; pygments generates slightly different code with +# different versions. + +RUN: %opt-viewer --filter inline -s %p/Inputs -o %t %p/Inputs/basic/or.yaml --no-highlight --demangler=llvm-cxxfilt +RUN: diff %p/Outputs/filter/index.html %t/index.html +RUN: diff %p/Outputs/filter/basic_or.h.html %t/basic_or.h.html +RUN: diff %p/Outputs/filter/basic_or.c.html %t/basic_or.c.html diff --git a/llvm/tools/opt-viewer/opt-viewer.py b/llvm/tools/opt-viewer/opt-viewer.py index 8aec321b959..4c105886cfd 100755 --- a/llvm/tools/opt-viewer/opt-viewer.py +++ b/llvm/tools/opt-viewer/opt-viewer.py @@ -239,7 +239,7 @@ class IndexRenderer: </html>''', file=self.stream) -def _render_file(source_dir, output_dir, ctx, no_highlight, entry): +def _render_file(source_dir, output_dir, ctx, no_highlight, entry, filter_): global context context = ctx filename, remarks = entry @@ -344,6 +344,11 @@ def main(): '--demangler', help='Set the demangler to be used (defaults to %s)' % optrecord.Remark.default_demangler) + parser.add_argument( + '--filter', + default='', + help='Only display remarks from passes matching filter expression') + # Do not make this a global variable. Values needed to be propagated through # to individual classes and functions to be portable with multiprocessing across # Windows and non-Windows. @@ -359,7 +364,7 @@ def main(): sys.exit(1) all_remarks, file_remarks, should_display_hotness = \ - optrecord.gather_results(files, args.jobs, print_progress) + optrecord.gather_results(files, args.jobs, print_progress, args.filter) map_remarks(all_remarks) diff --git a/llvm/tools/opt-viewer/optpmap.py b/llvm/tools/opt-viewer/optpmap.py index ff3e683f3d0..8124c8c9036 100644 --- a/llvm/tools/opt-viewer/optpmap.py +++ b/llvm/tools/opt-viewer/optpmap.py @@ -14,7 +14,7 @@ def _init(current, total): def _wrapped_func(func_and_args): - func, argument, should_print_progress = func_and_args + func, argument, should_print_progress, filter_ = func_and_args if should_print_progress: with _current.get_lock(): @@ -22,10 +22,10 @@ def _wrapped_func(func_and_args): sys.stdout.write('\r\t{} of {}'.format(_current.value, _total.value)) sys.stdout.flush() - return func(argument) + return func(argument, filter_) -def pmap(func, iterable, processes, should_print_progress, *args, **kwargs): +def pmap(func, iterable, processes, should_print_progress, filter_=None, *args, **kwargs): """ A parallel map function that reports on its progress. @@ -40,7 +40,7 @@ def pmap(func, iterable, processes, should_print_progress, *args, **kwargs): _current = multiprocessing.Value('i', 0) _total = multiprocessing.Value('i', len(iterable)) - func_and_args = [(func, arg, should_print_progress,) for arg in iterable] + func_and_args = [(func, arg, should_print_progress, filter_) for arg in iterable] if processes == 1: result = list(map(_wrapped_func, func_and_args, *args, **kwargs)) else: diff --git a/llvm/tools/opt-viewer/optrecord.py b/llvm/tools/opt-viewer/optrecord.py index 0193d25704c..e952d1befd6 100644 --- a/llvm/tools/opt-viewer/optrecord.py +++ b/llvm/tools/opt-viewer/optrecord.py @@ -24,6 +24,8 @@ try: except: pass +import re + import optpmap try: @@ -263,18 +265,24 @@ class Missed(Remark): return "red" -def get_remarks(input_file): +def get_remarks(input_file, filter_): max_hotness = 0 all_remarks = dict() file_remarks = defaultdict(functools.partial(defaultdict, list)) with open(input_file) as f: docs = yaml.load_all(f, Loader=Loader) + + filter_e = re.compile(filter_) for remark in docs: remark.canonicalize() # Avoid remarks withoug debug location or if they are duplicated if not hasattr(remark, 'DebugLoc') or remark.key in all_remarks: continue + + if filter_ and not filter_e.search(remark.Pass): + continue + all_remarks[remark.key] = remark file_remarks[remark.File][remark.Line].append(remark) @@ -289,13 +297,13 @@ def get_remarks(input_file): return max_hotness, all_remarks, file_remarks -def gather_results(filenames, num_jobs, should_print_progress): +def gather_results(filenames, num_jobs, should_print_progress, filter_): if should_print_progress: print('Reading YAML files...') if not Remark.demangler_proc: Remark.set_demangler(Remark.default_demangler) remarks = optpmap.pmap( - get_remarks, filenames, num_jobs, should_print_progress) + get_remarks, filenames, num_jobs, should_print_progress, filter_) max_hotness = max(entry[0] for entry in remarks) def merge_file_remarks(file_remarks_job, all_remarks, merged): |