diff options
author | Fedor Indutny <fedor@indutny.com> | 2016-09-10 16:05:30 +0300 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2016-09-13 13:47:20 +0300 |
commit | 15d72c8365717e1ccbca4f3bdc388315ba10bc92 (patch) | |
tree | cacff42c4c6b25ab9fb291a2713b9698c6688abc /lib/internal/v8_prof_polyfill.js | |
parent | 7f2c9ba1ac343ebdd3d4fbe27757847555bf141d (diff) |
tickprocessor: apply c++filt manually on mac
`/bin/sh -c` trick wasn't working for several reasons:
* `/bin/sh -c "..."` expects the first argument after `"..."` to be a
`$0`, not a `$1`. Previously `-n` wasn't passed to `nm` because of
this, and many symbols were ordered improperly
* `c++filt` was applied not only to the names of the functions but to
their `nm` prefixes like `t` and `a` (`t xxx` turns into
`unsigned char xxx`).
Instead of applying `c++filt` wide and using `sh -c`, execute `nm` as
requested by `deps/v8/tools/tickprocessor.js` and apply `c++filt` to all
matching entries manually.
Included test demonstrates where previous approach failed: all builtins
were merged into `v8::internal::Builtins::~Builtins`, because they were
prefixed by `t` in `nm` output.
PR-URL: https://github.com/nodejs/node/pull/8480
Reviewed-By: Matthew Loring <mattloring@google.com>
Diffstat (limited to 'lib/internal/v8_prof_polyfill.js')
-rw-r--r-- | lib/internal/v8_prof_polyfill.js | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/lib/internal/v8_prof_polyfill.js b/lib/internal/v8_prof_polyfill.js index 145b09e345b..eed927f12a9 100644 --- a/lib/internal/v8_prof_polyfill.js +++ b/lib/internal/v8_prof_polyfill.js @@ -38,11 +38,12 @@ const os = { /^[0-9a-f]+-[0-9a-f]+$/.test(arg)) { return ''; } - } else if (process.platform === 'darwin') { - args.unshift('-c', name); - name = '/bin/sh'; } - return cp.spawnSync(name, args).stdout.toString(); + let out = cp.spawnSync(name, args).stdout.toString(); + // Auto c++filt names, but not [iItT] + if (process.platform === 'darwin' && name === 'nm') + out = macCppfiltNm(out); + return out; } }; const print = console.log; @@ -100,3 +101,30 @@ function versionCheck() { } } } + +function macCppfiltNm(out) { + // Re-grouped copy-paste from `tickprocessor.js` + const FUNC_RE = /^([0-9a-fA-F]{8,16} [iItT] )(.*)$/gm; + let entries = out.match(FUNC_RE); + if (entries === null) + return out; + + entries = entries.map((entry) => { + return entry.replace(/^[0-9a-fA-F]{8,16} [iItT] /, '') + }); + + let filtered; + try { + filtered = cp.spawnSync('c++filt', [ '-p' , '-i' ], { + input: entries.join('\n') + }).stdout.toString(); + } catch (e) { + return out; + } + + let i = 0; + filtered = filtered.split(/\n/g); + return out.replace(FUNC_RE, (all, prefix, postfix) => { + return prefix + (filtered[i++] || postfix); + }); +} |