Skip to content

Commit eadafba

Browse files
committed
file_packager.py: Add option to embed file data in wasm binary
This change not only adds the new option but uses this option whenever file_packager is used from within emcc. Hopefully we can find a way deprecate and remove the old JS embedded since that seems strictly worse in almost ever way. - Larger code size (JS base64 encoding is larger than binary) - No possiblity of zero copy, memory-backed files - Less compatible with standalone wasm / WASI
1 parent fc89621 commit eadafba

File tree

5 files changed

+250
-80
lines changed

5 files changed

+250
-80
lines changed

emcc.py

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -814,14 +814,7 @@ def array_contains_any_of(hay, needles):
814814

815815

816816
def get_clang_flags():
817-
return ['-target', get_llvm_target()]
818-
819-
820-
def get_llvm_target():
821-
if settings.MEMORY64:
822-
return 'wasm64-unknown-emscripten'
823-
else:
824-
return 'wasm32-unknown-emscripten'
817+
return ['-target', shared.get_llvm_target()]
825818

826819

827820
cflags = None
@@ -1053,7 +1046,7 @@ def run(args):
10531046
return 0
10541047

10551048
if '-dumpmachine' in args:
1056-
print(get_llvm_target())
1049+
print(shared.get_llvm_target())
10571050
return 0
10581051

10591052
if '-dumpversion' in args: # gcc's doc states "Print the compiler version [...] and don't do anything else."
@@ -1129,6 +1122,11 @@ def run(args):
11291122
# Link object files using wasm-ld or llvm-link (for bitcode linking)
11301123
linker_arguments = phase_calculate_linker_inputs(options, state, linker_inputs)
11311124

1125+
# Embed and preload files
1126+
if len(options.preload_files) or len(options.embed_files):
1127+
linker_arguments += package_files(options, target)
1128+
1129+
11321130
if options.oformat == OFormat.OBJECT:
11331131
logger.debug(f'link_to_object: {linker_arguments} -> {target}')
11341132
building.link_to_object(linker_arguments, target)
@@ -2718,34 +2716,45 @@ def phase_emscript(options, in_wasm, wasm_target, memfile):
27182716
save_intermediate('original')
27192717

27202718

2719+
def package_files(options, target):
2720+
rtn = []
2721+
logger.debug('setting up files')
2722+
file_args = ['--from-emcc', '--export-name=' + settings.EXPORT_NAME]
2723+
if options.preload_files:
2724+
file_args.append('--preload')
2725+
file_args += options.preload_files
2726+
if options.embed_files:
2727+
file_args.append('--embed')
2728+
file_args += options.embed_files
2729+
if options.exclude_files:
2730+
file_args.append('--exclude')
2731+
file_args += options.exclude_files
2732+
if options.use_preload_cache:
2733+
file_args.append('--use-preload-cache')
2734+
if settings.LZ4:
2735+
file_args.append('--lz4')
2736+
if options.use_preload_plugins:
2737+
file_args.append('--use-preload-plugins')
2738+
if not settings.ENVIRONMENT_MAY_BE_NODE:
2739+
file_args.append('--no-node')
2740+
use_obj_file = 'EMCC_OBJ_EMBED' in os.environ
2741+
if options.embed_files and use_obj_file:
2742+
object_file = in_temp('embedded_files.o')
2743+
file_args += ['--obj-output=' + object_file]
2744+
rtn.append(object_file)
2745+
2746+
cmd = [shared.FILE_PACKAGER, shared.replace_suffix(target, '.data')] + file_args
2747+
file_code = shared.check_call(cmd, stdout=PIPE).stdout
2748+
2749+
options.pre_js = js_manipulation.add_files_pre_js(options.pre_js, file_code)
2750+
2751+
return rtn
2752+
2753+
27212754
@ToolchainProfiler.profile_block('source transforms')
27222755
def phase_source_transforms(options, target):
27232756
global final_js
27242757

2725-
# Embed and preload files
2726-
if len(options.preload_files) or len(options.embed_files):
2727-
logger.debug('setting up files')
2728-
file_args = ['--from-emcc', '--export-name=' + settings.EXPORT_NAME]
2729-
if len(options.preload_files):
2730-
file_args.append('--preload')
2731-
file_args += options.preload_files
2732-
if len(options.embed_files):
2733-
file_args.append('--embed')
2734-
file_args += options.embed_files
2735-
if len(options.exclude_files):
2736-
file_args.append('--exclude')
2737-
file_args += options.exclude_files
2738-
if options.use_preload_cache:
2739-
file_args.append('--use-preload-cache')
2740-
if settings.LZ4:
2741-
file_args.append('--lz4')
2742-
if options.use_preload_plugins:
2743-
file_args.append('--use-preload-plugins')
2744-
if not settings.ENVIRONMENT_MAY_BE_NODE:
2745-
file_args.append('--no-node')
2746-
file_code = shared.check_call([shared.FILE_PACKAGER, shared.replace_suffix(target, '.data')] + file_args, stdout=PIPE).stdout
2747-
options.pre_js = js_manipulation.add_files_pre_js(options.pre_js, file_code)
2748-
27492758
# Apply pre and postjs files
27502759
if final_js and (options.pre_js or options.post_js):
27512760
logger.debug('applying pre/postjses')

src/library_fs.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1590,7 +1590,11 @@ FS.staticInit();` +
15901590
return FS.create(path, mode);
15911591
},
15921592
createDataFile: function(parent, name, data, canRead, canWrite, canOwn) {
1593-
var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;
1593+
var path = name;
1594+
if (parent) {
1595+
parent = typeof parent === 'string' ? parent : FS.getPath(parent);
1596+
path = name ? PATH.join2(parent, name) : parent;
1597+
}
15941598
var mode = FS.getMode(canRead, canWrite);
15951599
var node = FS.create(path, mode);
15961600
if (data) {

tests/other/metadce/hello_world_O3_MAIN_MODULE_2.funcs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ $__emscripten_stdout_seek
33
$__fwritex
44
$__stdio_write
55
$__towrite
6-
$__wasm_apply_global_relocs
6+
$__wasm_apply_data_relocs
77
$__wasm_call_ctors
8+
$__wasm_start
89
$dlmalloc
910
$legalstub$dynCall_jiji
1011
$main

0 commit comments

Comments
 (0)