Skip to content

Commit 1b15088

Browse files
authored
Allow user override of default-enabled compile-time wasm features (#22966)
The signext feature is enabled by default by clang and can be overridden with the -msign-ext/-mno-sign-ext flags at compile time. However it cannot be individually controlled at link time (it can only be lowered by setting the min browser version). This PR allows -mno-sign-ext, -msign-ext (and likewise -mbulk-memory) to be used at link time as well, and override the browser version control.
1 parent 76ad476 commit 1b15088

File tree

3 files changed

+46
-6
lines changed

3 files changed

+46
-6
lines changed

emcc.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
from tools import cache
4747
from tools.settings import default_setting, user_settings, settings, MEM_SIZE_SETTINGS, COMPILE_TIME_SETTINGS
4848
from tools.utils import read_file, removeprefix
49+
from tools import feature_matrix
4950

5051
logger = logging.getLogger('emcc')
5152

@@ -1403,8 +1404,18 @@ def consume_arg_file():
14031404
settings.WASM_EXCEPTIONS = 0
14041405
elif arg == '-mbulk-memory':
14051406
settings.BULK_MEMORY = 1
1407+
feature_matrix.enable_feature(feature_matrix.Feature.BULK_MEMORY,
1408+
'-mbulk-memory',
1409+
override=True)
14061410
elif arg == '-mno-bulk-memory':
14071411
settings.BULK_MEMORY = 0
1412+
feature_matrix.disable_feature(feature_matrix.Feature.BULK_MEMORY)
1413+
elif arg == '-msign-ext':
1414+
feature_matrix.enable_feature(feature_matrix.Feature.SIGN_EXT,
1415+
'-msign-ext',
1416+
override=True)
1417+
elif arg == '-mno-sign-ext':
1418+
feature_matrix.disable_feature(feature_matrix.Feature.SIGN_EXT)
14081419
elif arg == '-fexceptions':
14091420
# TODO Currently -fexceptions only means Emscripten EH. Switch to wasm
14101421
# exception handling by default when -fexceptions is given when wasm

test/test_other.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10434,23 +10434,37 @@ def compile(flags):
1043410434
verify_features_sec('multivalue', True)
1043510435
verify_features_sec('reference-types', True)
1043610436

10437+
# Disable a feature
10438+
compile(['-mno-sign-ext', '-c'])
10439+
verify_features_sec('sign-ext', False)
10440+
# Disabling overrides default browser versions
10441+
compile(['-mno-sign-ext'])
10442+
verify_features_sec_linked('sign-ext', False)
10443+
# Disabling overrides manual browser versions
10444+
compile(['-sMIN_SAFARI_VERSION=150000', '-mno-sign-ext'])
10445+
# Disable via browser selection
10446+
compile(['-sMIN_FIREFOX_VERSION=61'])
10447+
verify_features_sec_linked('sign-ext', False)
10448+
# Manual enable overrides browser version
10449+
compile(['-sMIN_FIREFOX_VERSION=61', '-msign-ext'])
10450+
verify_features_sec_linked('sign-ext', True)
10451+
1043710452
compile(['-mnontrapping-fptoint', '-c'])
1043810453
verify_features_sec('nontrapping-fptoint', True)
1043910454

10440-
# BIGINT causes binaryen to not run, and keeps the target_features section after link
1044110455
# Setting this SAFARI_VERSION should enable bulk memory because it links in emscripten_memcpy_bulkmem
1044210456
# However it does not enable nontrapping-fptoint yet because it has no effect at compile time and
1044310457
# no libraries include nontrapping yet.
10444-
compile(['-sMIN_SAFARI_VERSION=150000', '-sWASM_BIGINT'])
10458+
compile(['-sMIN_SAFARI_VERSION=150000'])
1044510459
verify_features_sec_linked('sign-ext', True)
1044610460
verify_features_sec_linked('mutable-globals', True)
1044710461
verify_features_sec_linked('multivalue', True)
1044810462
verify_features_sec_linked('bulk-memory', True)
1044910463
verify_features_sec_linked('nontrapping-fptoint', False)
1045010464

10451-
compile(['-sMIN_SAFARI_VERSION=150000', '-mno-bulk-memory', '-sWASM_BIGINT'])
10452-
# FIXME? -mno-bulk-memory at link time does not override MIN_SAFARI_VERSION. it probably should?
10453-
verify_features_sec_linked('bulk-memory', True)
10465+
compile(['-sMIN_SAFARI_VERSION=150000', '-mno-bulk-memory'])
10466+
# -mno-bulk-memory at link time overrides MIN_SAFARI_VERSION
10467+
verify_features_sec_linked('bulk-memory', False)
1045410468

1045510469
def test_js_preprocess(self):
1045610470
# Use stderr rather than stdout here because stdout is redirected to the output JS file itself.

tools/feature_matrix.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class Feature(IntEnum):
3939

4040

4141
default_features = {Feature.SIGN_EXT, Feature.MUTABLE_GLOBALS}
42+
disable_override_features = set()
43+
enable_override_features = set()
4244

4345
min_browser_versions = {
4446
Feature.NON_TRAPPING_FPTOINT: {
@@ -93,6 +95,11 @@ class Feature(IntEnum):
9395

9496

9597
def caniuse(feature):
98+
if feature in disable_override_features:
99+
return False
100+
if feature in enable_override_features:
101+
return True
102+
96103
min_versions = min_browser_versions[feature]
97104

98105
def report_missing(setting_name):
@@ -114,10 +121,12 @@ def report_missing(setting_name):
114121
return True
115122

116123

117-
def enable_feature(feature, reason):
124+
def enable_feature(feature, reason, override=False):
118125
"""Updates default settings for browser versions such that the given
119126
feature is available everywhere.
120127
"""
128+
if override:
129+
enable_override_features.add(feature)
121130
for name, min_version in min_browser_versions[feature].items():
122131
name = f'MIN_{name.upper()}_VERSION'
123132
if settings[name] < min_version:
@@ -132,6 +141,12 @@ def enable_feature(feature, reason):
132141
setattr(settings, name, min_version)
133142

134143

144+
def disable_feature(feature):
145+
"""Allow the user to disable a feature that would otherwise be on by default.
146+
"""
147+
disable_override_features.add(feature)
148+
149+
135150
# apply minimum browser version defaults based on user settings. if
136151
# a user requests a feature that we know is only supported in browsers
137152
# from a specific version and above, we can assume that browser version.

0 commit comments

Comments
 (0)