summaryrefslogtreecommitdiff
path: root/configure.py
diff options
context:
space:
mode:
authorGabriel Schulhof <gabriel.schulhof@intel.com>2020-01-05 19:48:46 -0800
committerGabriel Schulhof <gabriel.schulhof@intel.com>2020-09-30 15:34:14 -0700
commit869ded3b0e9b1f53b7161827bc2275a584881fc7 (patch)
treebddc9f9e57795bdfd8d0dc8b1bdef47a2bc1a3d6 /configure.py
parentff4cf817a3159ddf7c4bf898819f88445c5fee53 (diff)
downloadnode-new-869ded3b0e9b1f53b7161827bc2275a584881fc7.tar.gz
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-xconfigure.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/configure.py b/configure.py
index 2e253aba84..d68d8fc96a 100755
--- a/configure.py
+++ b/configure.py
@@ -498,6 +498,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',
@@ -1748,6 +1756,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':
@@ -1813,6 +1844,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)