Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-enable preprocessing of pre/post JS file. NFC #21227

Merged
merged 1 commit into from
Feb 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,16 @@ See docs/process.md for more on how version tagging works.

3.1.54 (in development)
-----------------------
- Added `--use-port` option to `emcc`. This option allows ports to be enabled
by name and is designed to replace all existing `-sUSE_XXX` settings for
ports. You can use `--show-ports` to get the list of available ports that
- Added `--use-port` option to `emcc`. This option allows ports to be enabled
by name and is designed to replace all existing `-sUSE_XXX` settings for
ports. You can use `--show-ports` to get the list of available ports that
can be used with this new option. (#21214)

- `--pre-js` and `--post-js` files can now opt into being run through the JS
preprocessor. This change was originally landed in #18525, but it got
reverted in #19006. Now it requires explicit opt-in by adding `#preprocess` to
the top of the JS file. This is useful as it allows things like `{{{
POINTER_SIZE }}}` and `{{{ makeGetValue(..) }}}` to be used in pre/post JS
files, just like they can be in JS library files. (#21227)

3.1.53 - 01/29/24
-----------------
Expand Down
1 change: 1 addition & 0 deletions src/generated_struct_info32.json
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@
"EM_PROMISE_MATCH": 1,
"EM_PROMISE_MATCH_RELEASE": 2,
"EM_PROMISE_REJECT": 3,
"EM_THREAD_STATUS_NUMFIELDS": 7,
"EM_TIMING_RAF": 1,
"EM_TIMING_SETIMMEDIATE": 2,
"EM_TIMING_SETTIMEOUT": 0,
Expand Down
1 change: 1 addition & 0 deletions src/generated_struct_info64.json
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@
"EM_PROMISE_MATCH": 1,
"EM_PROMISE_MATCH_RELEASE": 2,
"EM_PROMISE_REJECT": 3,
"EM_THREAD_STATUS_NUMFIELDS": 7,
"EM_TIMING_RAF": 1,
"EM_TIMING_SETIMMEDIATE": 2,
"EM_TIMING_SETTIMEOUT": 0,
Expand Down
32 changes: 23 additions & 9 deletions src/jsifier.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,22 @@ function getTransitiveDeps(symbol) {
return Array.from(transitiveDeps);
}

function shouldPreprocess(fileName) {
return read(fileName).trim().startsWith('#preprocess\n');
}

function preJS() {
let result = '';
for (const fileName of PRE_JS_FILES) {
if (shouldPreprocess(fileName)) {
result += processMacros(preprocess(fileName));
} else {
result += read(fileName);
}
}
return result;
}

function runJSify() {
const libraryItems = [];
const symbolDeps = {};
Expand Down Expand Up @@ -583,15 +599,13 @@ function(${args}) {
libraryItems.push(JS);
}

function includeFile(fileName) {
function includeFile(fileName, needsPreprocess = true) {
print(`// include: ${fileName}`);
print(processMacros(preprocess(fileName)));
print(`// end include: ${fileName}`);
}

function includeFileRaw(fileName) {
print(`// include: ${fileName}`);
print(read(fileName));
if (needsPreprocess) {
print(processMacros(preprocess(fileName)));
} else {
print(read(fileName));
}
print(`// end include: ${fileName}`);
}

Expand Down Expand Up @@ -653,7 +667,7 @@ var proxiedFunctionTable = [
includeFile(postFile);

for (const fileName of POST_JS_FILES) {
includeFileRaw(fileName);
includeFile(fileName, shouldPreprocess(fileName));
}

print('//FORWARDED_DATA:' + JSON.stringify({
Expand Down
10 changes: 2 additions & 8 deletions src/parseTools.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ function preprocess(filename) {
if (showCurrentLine()) {
error(`${filename}:${i + 1}: #error ${trimmed.substring(trimmed.indexOf(' ')).trim()}`);
}
} else if (first === '#preprocess') {
// Do nothing
} else {
error(`${filename}:${i + 1}: Unknown preprocessor directive ${first}`);
}
Expand Down Expand Up @@ -1022,14 +1024,6 @@ function getEntryFunction() {
return `_${entryFunction}`;
}

function preJS() {
let result = '';
for (const fileName of PRE_JS_FILES) {
result += read(fileName);
}
return result;
}

function formattedMinNodeVersion() {
var major = MIN_NODE_VERSION / 10000
var minor = (MIN_NODE_VERSION / 100) % 100
Expand Down
6 changes: 6 additions & 0 deletions src/struct_info_internal.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@
"SIGCANCEL"
]
},
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this related to the preJS preprocessing?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is needed by threadprofiler.js which gets included as pre-js. It makes use of this to fix it --thread-profiler under wasm64. I forgot to mention that in the description. I will add that now.

"file": "threading_internal.h",
"defines": [
"EM_THREAD_STATUS_NUMFIELDS"
]
},
{
"file": "dynlink.h",
"structs": {
Expand Down
16 changes: 10 additions & 6 deletions src/threadprofiler.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#preprocess

/**
* @license
* Copyright 2015 The Emscripten Authors
Expand Down Expand Up @@ -41,7 +43,6 @@ var emscriptenThreadProfiler = {
}
for (var i = 0; i < threads.length; ++i) {
var threadPtr = threads[i];
var profilerBlock = Atomics.load(HEAPU32, (threadPtr + 8 /* {{{ C_STRUCTS.pthread.profilerBlock }}}*/) >> 2);
var threadName = PThread.getThreadName(threadPtr);
if (threadName) {
threadName = `"${threadName}" (${ptrToString(threadPtr)})`;
Expand Down Expand Up @@ -69,7 +70,10 @@ var emscriptenThreadProfiler = {

for (var i = 0; i < threads.length; ++i) {
var threadPtr = threads[i];
var profilerBlock = Atomics.load(HEAPU32, (threadPtr + 8 /* {{{ C_STRUCTS.pthread.profilerBlock }}}*/) >> 2);
var profilerBlock = Atomics.load({{{ getHeapForType('*') }}}, {{{ getHeapOffset('threadPtr + ' + C_STRUCTS.pthread.profilerBlock, '*') }}});
#if MEMORY64
profilerBlock = Number(profilerBlock);
#endif
var threadName = PThread.getThreadName(threadPtr);
if (threadName) {
threadName = `"${threadName}" (${ptrToString(threadPtr)})`;
Expand All @@ -81,11 +85,11 @@ var emscriptenThreadProfiler = {

var threadTimesInStatus = [];
var totalTime = 0;
var offset = profilerBlock + 16/*C_STRUCTS.thread_profiler_block.timeSpentInStatus*/;
for (var j = 0; j < 7/*EM_THREAD_STATUS_NUMFIELDS*/; ++j, offset += 8) {
threadTimesInStatus.push(Number(getValue(offset, 'double')));
var offset = profilerBlock + {{{ C_STRUCTS.thread_profiler_block.timeSpentInStatus }}};
for (var j = 0; j < {{{ cDefs.EM_THREAD_STATUS_NUMFIELDS }}}; ++j, offset += 8) {
threadTimesInStatus.push({{{ makeGetValue('offset', 0, 'double') }}});
totalTime += threadTimesInStatus[j];
setValue(offset, 0, 'double');
{{{ makeSetValue('offset', 0, 0, 'double') }}};
}
var recent = '';
if (threadTimesInStatus[1] > 0) recent += (threadTimesInStatus[1] / totalTime * 100.0).toFixed(1) + '% running. ';
Expand Down
18 changes: 18 additions & 0 deletions test/test_other.py
Original file line number Diff line number Diff line change
Expand Up @@ -14463,3 +14463,21 @@ def test_uuid(self):
def test_wasm64_no_asan(self):
err = self.expect_fail([EMCC, test_file('hello_world.c'), '-sMEMORY64', '-fsanitize=address'])
self.assertContained('error: MEMORY64 does not yet work with ASAN', err)

def test_js_preprocess_pre_post(self):
create_file('pre.js', '''
#preprocess
#if ASSERTIONS
console.log('assertions enabled')
#else
console.log('assertions disabled')
#endif
''')
create_file('post.js', '''
#preprocess
console.log({{{ POINTER_SIZE }}});
''')
self.emcc_args += ['--pre-js', 'pre.js', '--post-js', 'post.js']
self.do_runf(test_file('hello_world.c'), 'assertions enabled\n4', emcc_args=['-sASSERTIONS=1'])
self.do_runf(test_file('hello_world.c'), 'assertions disabled\n4', emcc_args=['-sASSERTIONS=0'])
sbc100 marked this conversation as resolved.
Show resolved Hide resolved
self.assertNotContained('#preprocess', read_file('hello_world.js'))
Loading