Skip to content

Commit c3b37c6

Browse files
authored
extract_metadata: Improve detection of mainReadsParams (#17702)
In non-optimizing modes llvm can generate extra local.set/local.get instructions which was throwing off this function.
1 parent 6153cb3 commit c3b37c6

14 files changed

+26
-23
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
27498
1+
25683

test/other/metadce/test_metadce_mem_O3.exports

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,3 @@ b
22
c
33
d
44
e
5-
f
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
$__wasm_call_ctors
22
$main
33
$sbrk
4-
$stackAlloc
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6153
1+
5284
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5957
1+
5935

test/other/metadce/test_metadce_mem_O3_grow.exports

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,3 @@ b
22
c
33
d
44
e
5-
f
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
$__wasm_call_ctors
22
$main
33
$sbrk
4-
$stackAlloc
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6484
1+
5606
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5958
1+
5936
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
83875
1+
83653
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
56428
1+
56206
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
65940
1+
65556

test/test_other.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10055,7 +10055,7 @@ def test_main_reads_params(self):
1005510055
no = os.path.getsize('no.js')
1005610056
create_file('yes.c', '''
1005710057
int main(int argc, char **argv) {
10058-
return argc;
10058+
return (long)argv[argc-1];
1005910059
}
1006010060
''')
1006110061
self.run_process([EMCC, 'yes.c', '-O3', '-o', 'yes.js'])

tools/extract_metadata.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def skip_function_header(module):
1717
num_local_decls -= 1
1818

1919

20-
def is_wrapper_function(module, function):
20+
def is_orig_main_wrapper(module, function):
2121
module.seek(function.offset)
2222
skip_function_header(module)
2323
end = function.offset + function.size
@@ -29,11 +29,15 @@ def is_wrapper_function(module, function):
2929
print(e)
3030
return False
3131
if opcode == OpCode.CALL:
32-
callee = module.read_uleb() # noqa
33-
elif opcode == OpCode.END:
34-
break
32+
module.read_uleb() # callee
33+
elif opcode in (OpCode.LOCAL_GET, OpCode.LOCAL_SET):
34+
module.read_uleb() # local index
35+
elif opcode in (OpCode.END, OpCode.RETURN):
36+
pass
3537
else:
38+
# Any other opcodes and we assume this not a simple wrapper
3639
return False
40+
3741
assert opcode == OpCode.END
3842
return True
3943

@@ -199,17 +203,20 @@ def get_asm_strings(module, export_map):
199203

200204
def get_main_reads_params(module, export_map):
201205
if settings.STANDALONE_WASM:
202-
return 1
206+
return True
203207

204208
main = export_map.get('main') or export_map.get('__main_argc_argv')
205209
if not main or main.kind != webassembly.ExternType.FUNC:
206-
return 0
210+
return False
207211

208212
main_func = module.get_function(main.index)
209-
if is_wrapper_function(module, main_func):
210-
return 0
211-
else:
212-
return 1
213+
if is_orig_main_wrapper(module, main_func):
214+
# If main is simple wrapper function then we know that __orginial_main
215+
# doesn't read arguments.
216+
return False
217+
218+
# By default assume params are read
219+
return True
213220

214221

215222
def get_named_globals(module, exports):

0 commit comments

Comments
 (0)