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: 9966d482c1/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>
This commit is contained in:
parent
ff4cf817a3
commit
869ded3b0e
17
common.gypi
17
common.gypi
@ -111,6 +111,9 @@
|
|||||||
['target_arch in "ppc64 s390x"', {
|
['target_arch in "ppc64 s390x"', {
|
||||||
'v8_enable_backtrace': 1,
|
'v8_enable_backtrace': 1,
|
||||||
}],
|
}],
|
||||||
|
['OS=="linux"', {
|
||||||
|
'node_section_ordering_info%': ''
|
||||||
|
}]
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -172,6 +175,20 @@
|
|||||||
},
|
},
|
||||||
'cflags': [ '-O3' ],
|
'cflags': [ '-O3' ],
|
||||||
'conditions': [
|
'conditions': [
|
||||||
|
['OS=="linux"', {
|
||||||
|
'conditions': [
|
||||||
|
['node_section_ordering_info!=""', {
|
||||||
|
'cflags': [
|
||||||
|
'-fuse-ld=gold',
|
||||||
|
'-ffunction-sections',
|
||||||
|
],
|
||||||
|
'ldflags': [
|
||||||
|
'-fuse-ld=gold',
|
||||||
|
'-Wl,--section-ordering-file=<(node_section_ordering_info)',
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
}],
|
||||||
['OS=="solaris"', {
|
['OS=="solaris"', {
|
||||||
# pull in V8's postmortem metadata
|
# pull in V8's postmortem metadata
|
||||||
'ldflags': [ '-Wl,-z,allextract' ]
|
'ldflags': [ '-Wl,-z,allextract' ]
|
||||||
|
32
configure.py
32
configure.py
@ -498,6 +498,14 @@ parser.add_option('--use-largepages-script-lld',
|
|||||||
dest='node_use_large_pages_script_lld',
|
dest='node_use_large_pages_script_lld',
|
||||||
help='This option has no effect. --use-largepages is now a runtime option.')
|
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',
|
intl_optgroup.add_option('--with-intl',
|
||||||
action='store',
|
action='store',
|
||||||
dest='with_intl',
|
dest='with_intl',
|
||||||
@ -1748,6 +1756,29 @@ def configure_inspector(o):
|
|||||||
options.without_ssl)
|
options.without_ssl)
|
||||||
o['variables']['v8_enable_inspector'] = 0 if disable_inspector else 1
|
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():
|
def make_bin_override():
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
@ -1813,6 +1844,7 @@ configure_openssl(output)
|
|||||||
configure_intl(output)
|
configure_intl(output)
|
||||||
configure_static(output)
|
configure_static(output)
|
||||||
configure_inspector(output)
|
configure_inspector(output)
|
||||||
|
configure_section_file(output)
|
||||||
|
|
||||||
# Forward OSS-Fuzz settings
|
# Forward OSS-Fuzz settings
|
||||||
output['variables']['ossfuzz'] = b(options.ossfuzz)
|
output['variables']['ossfuzz'] = b(options.ossfuzz)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user