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

Flesh out emscripten metadata #8519

Merged
merged 3 commits into from
May 2, 2019
Merged
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
24 changes: 19 additions & 5 deletions tools/shared.py
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ def get_emscripten_version(path):
# For the Emscripten-specific WASM metadata section, follows semver, changes
# whenever metadata section changes structure
# NB: major version 0 implies no compatibility
(EMSCRIPTEN_METADATA_MAJOR, EMSCRIPTEN_METADATA_MINOR) = (0, 0)
(EMSCRIPTEN_METADATA_MAJOR, EMSCRIPTEN_METADATA_MINOR) = (0, 1)
# For the JS/WASM ABI, specifies the minimum ABI version required of
# the WASM runtime implementation by the generated WASM binary. It follows
# semver and changes whenever C types change size/signedness or
Expand Down Expand Up @@ -2979,8 +2979,20 @@ def delebify(buf, offset):

@staticmethod
def add_emscripten_metadata(js_file, wasm_file):
mem_size = Settings.STATIC_BUMP
WASM_PAGE_SIZE = 65536
Copy link
Collaborator

Choose a reason for hiding this comment

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

so STATIC_BUMP is no longer needed?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

STATIC_BUMP was being used to compute DYNAMICTOP_PTR and tempDoublePtr but since those are now not derived from STATIC_BUMP it's no longer necessary to store that.


mem_size = Settings.TOTAL_MEMORY // WASM_PAGE_SIZE
Copy link
Collaborator

@sbc100 sbc100 Apr 30, 2019

Choose a reason for hiding this comment

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

Doesn't // do the wrong thing here and round down? I guess TOTAL_MEMORY is already guaranteed to be a multiple so probably fine.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, the intent is to make sure mem_size is an integer. I could have done int(TOTAL_MEMORY / WASM_PAGE_SIZE) but this seemed better.

table_size = Settings.WASM_TABLE_SIZE
global_base = Settings.GLOBAL_BASE

js = open(js_file).read()
m = re.search(r"(^|\s)tempDoublePtr\s+=\s+(\d+)", js)
tempdouble_ptr = int(m.group(2))
m = re.search(r"(^|\s)DYNAMIC_BASE\s+=\s+(\d+)", js)
dynamic_base = int(m.group(2))
m = re.search(r"(^|\s)DYNAMICTOP_PTR\s+=\s+(\d+)", js)
dynamictop_ptr = int(m.group(2))

logger.debug('creating wasm emscripten metadata section with mem size %d, table size %d' % (mem_size, table_size,))
name = b'\x13emscripten_metadata' # section name, including prefixed size
contents = (
Expand All @@ -2994,11 +3006,13 @@ def add_emscripten_metadata(js_file, wasm_file):
WebAssembly.lebify(EMSCRIPTEN_ABI_MAJOR) +
WebAssembly.lebify(EMSCRIPTEN_ABI_MINOR) +

# static bump
WebAssembly.lebify(mem_size) +
WebAssembly.lebify(table_size) +
WebAssembly.lebify(global_base) +
WebAssembly.lebify(dynamic_base) +
WebAssembly.lebify(dynamictop_ptr) +
WebAssembly.lebify(tempdouble_ptr)

# table size
WebAssembly.lebify(table_size)
# NB: more data can be appended here as long as you increase
# the EMSCRIPTEN_METADATA_MINOR
)
Expand Down