diff options
author | Gabriel Schulhof <gabriel.schulhof@intel.com> | 2020-01-06 06:48:46 +0300 |
---|---|---|
committer | Danielle Adams <adamzdanielle@gmail.com> | 2020-10-06 18:54:23 +0300 |
commit | 7dc6b2fac7834db3bd5711dc5aece10448fe5cae (patch) | |
tree | 739e89857aff437eb646f7a66aeb26af371abbeb /configure.py | |
parent | a4e5a3af855150cd7b0c9c0e4d9b3af4cd94eb34 (diff) |
build: add support for section ordering
Adds support for using a section ordering file with the gold linker.
This makes it possible to reorder functions in a build to optimize for
a specific workload.
`hfsort` is a tool that can be used to generate such a file from perf-
recorded last branch record (LBR) data by running Node.js as
`node --perf-basic-prof`.
Refs: https://github.com/facebook/hhvm/tree/9966d482c19c6120c621c6f3896525fb19fb3842/hphp/tools/hfsort
Refs: https://software.intel.com/content/www/us/en/develop/articles/runtime-optimization-blueprint-IA-optimization-with-last-branch-record.html
Refs: https://github.com/nodejs/node/pull/16891/
Signed-off-by: Gabriel Schulhof <gabriel.schulhof@intel.com>
PR-URL: https://github.com/nodejs/node/pull/35272
Reviewed-By: Christian Clauss <cclauss@me.com>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Diffstat (limited to 'configure.py')
-rwxr-xr-x | configure.py | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/configure.py b/configure.py index ff09f27f4d1..a015b8ad1ae 100755 --- a/configure.py +++ b/configure.py @@ -455,6 +455,14 @@ parser.add_option('--use-largepages-script-lld', dest='node_use_large_pages_script_lld', help='This option has no effect. --use-largepages is now a runtime option.') +parser.add_option('--use-section-ordering-file', + action='store', + dest='node_section_ordering_info', + default='', + help='Pass a section ordering file to the linker. This requires that ' + + 'Node.js be linked using the gold linker. The gold linker must have ' + + 'version 1.2 or greater.') + intl_optgroup.add_option('--with-intl', action='store', dest='with_intl', @@ -1709,6 +1717,29 @@ def configure_inspector(o): options.without_ssl) o['variables']['v8_enable_inspector'] = 0 if disable_inspector else 1 +def configure_section_file(o): + try: + proc = subprocess.Popen(['ld.gold'] + ['-v'], stdin = subprocess.PIPE, + stdout = subprocess.PIPE, stderr = subprocess.PIPE) + except OSError: + warn('''No acceptable ld.gold linker found!''') + return 0 + + match = re.match(r"^GNU gold.*([0-9]+)\.([0-9]+)$", + proc.communicate()[0].decode("utf-8")) + + if match: + gold_major_version = match.group(1) + gold_minor_version = match.group(2) + if int(gold_major_version) == 1 and int(gold_minor_version) <= 1: + error('''GNU gold version must be greater than 1.2 in order to use section + reordering''') + + if options.node_section_ordering_info != "": + o['variables']['node_section_ordering_info'] = os.path.realpath( + str(options.node_section_ordering_info)) + else: + o['variables']['node_section_ordering_info'] = "" def make_bin_override(): if sys.platform == 'win32': @@ -1774,6 +1805,7 @@ configure_openssl(output) configure_intl(output) configure_static(output) configure_inspector(output) +configure_section_file(output) # Forward OSS-Fuzz settings output['variables']['ossfuzz'] = b(options.ossfuzz) |