Skip to content
This repository has been archived by the owner on Nov 1, 2020. It is now read-only.

Wasm: add support for overflow checks on signed and unsigned ints multiply #8259

Merged
merged 7 commits into from
Aug 26, 2020

Conversation

yowl
Copy link
Contributor

@yowl yowl commented Aug 8, 2020

This PR add supports and a couple of tests for overflow checks on signed and unsigned int32s and int64s. Uses the check maxint / op1 > op2 to detect overflow.

@yowl yowl changed the title Wasm: add support for overflow checks on unsigned ints Wasm: add support for overflow checks on unsigned ints multiply Aug 11, 2020
@yowl yowl changed the title Wasm: add support for overflow checks on unsigned ints multiply Wasm: add support for overflow checks on signed and unsigned ints multiply Aug 12, 2020
@jkotas
Copy link
Member

jkotas commented Aug 25, 2020

I see that llvm has built-ins for this: https://github.com/llvm/llvm-project/blob/8799ebbc1f03a348f732fc14242ad4c395076bcc/clang/test/CodeGen/builtins-overflow.c#L103

Would it be better to use those here? Or is there a reason why these llvm builtins do not work in wasm?

@yowl
Copy link
Contributor Author

yowl commented Aug 26, 2020

I've had a dig around and done some testing. Webassembly doesn't seem to have overflow operations

WebAssembly/design#1021

but llvm is converting them to sensible wasm, so I've switched the mul checks to those as I can see that it's better, especially for #8230 . If it looks ok I'll go back and do the same for the add/sub. Thanks for pointing it out, I wasn't looking forward to the floating point ones.

CallOrInvoke(false, _builder, GetCurrentTryRegion(), llvmCheckFunction, new LLVMValueRef[] { GetShadowStack(), left, right }, ref nextInstrBlock);
}

private LLVMValueRef CallLlvmAbs(LLVMBuilderRef builder, LLVMValueRef operand, LLVMTypeRef sizeTypeRef)
Copy link
Member

Choose a reason for hiding this comment

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

Unused?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yes, removed

@jkotas
Copy link
Member

jkotas commented Aug 26, 2020

Could you please resolve the conflict?

Copy link
Member

@jkotas jkotas left a comment

Choose a reason for hiding this comment

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

Looks much better. Thanks!

# Conflicts:
#	tests/src/Simple/HelloWasm/Program.cs
@jkotas jkotas merged commit 34af164 into dotnet:master Aug 26, 2020
@yowl yowl deleted the wasm-mul-ovf-int branch August 26, 2020 21:23
RalfKornmannEnvision added a commit to RalfKornmannEnvision/corert that referenced this pull request Aug 28, 2020
* Fix alignment of marshaled inline arrays (dotnet#8275)

Fixes dotnet#8274

* Correct flags for allocating in RhpNewFastMisalign.  Add fast path (dotnet#8277)

* add switch case for LPUTF8Str in array element (dotnet#8278)

* Wasm: Add support for DefaultConstructorOf and hence Activator.CreateInstance<T> (dotnet#8279)

* Wasm: upgrade emscripten for an llvm and exception fixes. (dotnet#8281)

* upgrade emscripten for some llvm and exception fixes.

Correct retrieval of exception from landing pad.
end c++ exception when catch found.

* Update ILToWebAssemblyImporter.cs

remove cut/past comment

* Wasm: add support for new StackTrace().ToString() (dotnet#8201)

* wasm add rethrow support (dotnet#8206)

* Wasm: add support for overflow checks on signed and unsigned ints multiply (dotnet#8259)

* wasm-ovf-unsigned-int

* refactor for stack kind tests and add signed check

* use llvm intrinsics

* Wasm: bring add and sub overflow operations in line with mul (dotnet#8284)

* Support for ARM64 on UNIX like systems compiler and runtime (dotnet#8271)

* CoreRT-ARM64: Helper node asm code generation

* CoreRT ARM64: Add additional relocation support

* CoreRT ARM64: Use alternative functions for write Barriers

On ARM the Jit uses a special register interface for to call the write barrier functions. But as the regular once still used in other places we need two different implementations. The helper nodes need to call the custom variants

* ARM64 code generation

* unwind use only the dwarf index option

* ARM64 runtime assembler functions

* ARM64 unix stack walk

* ARM64 Exception Handling

* ARM64: Fix EH data decoding

* Move native layout signature from read only to data section on non Windows target

* Fix exception handling macro call

* ARM64 thunk helpers

* ARM64 process cfi data for elf

* ARM64 missing assembler macro

* ARM64 port more assembler helpers

* ARM64: Add missing case for the generic helper node

* ARM64 intrinsic support

* ARM64 object writer for ELF object files

* ARM64 llvm patches for object writer

* ARM64 include untested helper code with debug break

* ARM64 reenable scanning fail exception

* ARM64 Fix wrong function call for invoke return

* ARM64: Ensure module fixup node data is aligned

Data is updated with a compare exchange operation. Therefore it needs to be aligned or it will trigger a data exception on ARM64 CPUs

* Wasm fix LLVM Debug Information subroutine linkage (dotnet#8288)

* wasm - reinstate llvm debug subroutine linkage

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Co-authored-by: yowl <scott.waye@hubse.com>
RalfKornmannEnvision added a commit to RalfKornmannEnvision/corert that referenced this pull request Aug 28, 2020
* Arm64 (#5)

* CoreRT-ARM64: Helper node asm code generation

* CoreRT ARM64: Add additional relocation support

* CoreRT ARM64: Use alternative functions for write Barriers

On ARM the Jit uses a special register interface for to call the write barrier functions. But as the regular once still used in other places we need two different implemenations. The helper nodes need to call the custom variants

* ARM64 code generation

* unwind use only the dwarf index option

* ARM64 runtime assembler functions

* ARM64 unix stack walk

* ARM64 Exception Handling

* ARM64: Fix EH data decodeing

* Move nattive layout signature from read only to data section on non Windows target

* Fix exception handling macro call

* ARM64 thunk helpers

* ARM64 process cfi data for elf

* ARM64 missing assembler macro

* ARM64 port more assembler helpers

* ARM64: Add missing case for the gemeric helper node

* ARM64 intrinsic support

* ARM64 object writer for ELF object files

* ARM64 llvm patches for object writer

* ARM64 include untested helper code with debug break

* ARM64 reenable scanning fail exception

* Arm64 (#6)

* CoreRT-ARM64: Helper node asm code generation

* CoreRT ARM64: Add additional relocation support

* CoreRT ARM64: Use alternative functions for write Barriers

On ARM the Jit uses a special register interface for to call the write barrier functions. But as the regular once still used in other places we need two different implemenations. The helper nodes need to call the custom variants

* ARM64 code generation

* unwind use only the dwarf index option

* ARM64 runtime assembler functions

* ARM64 unix stack walk

* ARM64 Exception Handling

* ARM64: Fix EH data decodeing

* Move nattive layout signature from read only to data section on non Windows target

* Fix exception handling macro call

* ARM64 thunk helpers

* ARM64 process cfi data for elf

* ARM64 missing assembler macro

* ARM64 port more assembler helpers

* ARM64: Add missing case for the gemeric helper node

* ARM64 intrinsic support

* ARM64 object writer for ELF object files

* ARM64 llvm patches for object writer

* ARM64 include untested helper code with debug break

* ARM64 reenable scanning fail exception

* ARM64 formating

* ARM64: revert using alternative JIT

* Revert "ARM64 unix stack walk"

This reverts commit 6c9e235.

* Arm64 (#7)

* CoreRT-ARM64: Helper node asm code generation

* CoreRT ARM64: Add additional relocation support

* CoreRT ARM64: Use alternative functions for write Barriers

On ARM the Jit uses a special register interface for to call the write barrier functions. But as the regular once still used in other places we need two different implemenations. The helper nodes need to call the custom variants

* ARM64 code generation

* unwind use only the dwarf index option

* ARM64 runtime assembler functions

* ARM64 unix stack walk

* ARM64 Exception Handling

* ARM64: Fix EH data decodeing

* Move nattive layout signature from read only to data section on non Windows target

* Fix exception handling macro call

* ARM64 thunk helpers

* ARM64 process cfi data for elf

* ARM64 missing assembler macro

* ARM64 port more assembler helpers

* ARM64: Add missing case for the gemeric helper node

* ARM64 intrinsic support

* ARM64 object writer for ELF object files

* ARM64 llvm patches for object writer

* ARM64 include untested helper code with debug break

* ARM64 reenable scanning fail exception

* ARM64 formating

* ARM64: revert using alternative JIT

* Revert "ARM64 unix stack walk"

* ARM64 review reworks

* Arm64: review reworks (#10)

* Arm64 (#11)

* ARM64: remove left over code

* Update src/Native/Runtime/arm64/WriteBarriers.S

* Sync to head (#12)

* Fix alignment of marshaled inline arrays (dotnet#8275)

Fixes dotnet#8274

* Correct flags for allocating in RhpNewFastMisalign.  Add fast path (dotnet#8277)

* add switch case for LPUTF8Str in array element (dotnet#8278)

* Wasm: Add support for DefaultConstructorOf and hence Activator.CreateInstance<T> (dotnet#8279)

* Wasm: upgrade emscripten for an llvm and exception fixes. (dotnet#8281)

* upgrade emscripten for some llvm and exception fixes.

Correct retrieval of exception from landing pad.
end c++ exception when catch found.

* Update ILToWebAssemblyImporter.cs

remove cut/past comment

* Wasm: add support for new StackTrace().ToString() (dotnet#8201)

* wasm add rethrow support (dotnet#8206)

* Wasm: add support for overflow checks on signed and unsigned ints multiply (dotnet#8259)

* wasm-ovf-unsigned-int

* refactor for stack kind tests and add signed check

* use llvm intrinsics

* Wasm: bring add and sub overflow operations in line with mul (dotnet#8284)

* Support for ARM64 on UNIX like systems compiler and runtime (dotnet#8271)

* CoreRT-ARM64: Helper node asm code generation

* CoreRT ARM64: Add additional relocation support

* CoreRT ARM64: Use alternative functions for write Barriers

On ARM the Jit uses a special register interface for to call the write barrier functions. But as the regular once still used in other places we need two different implementations. The helper nodes need to call the custom variants

* ARM64 code generation

* unwind use only the dwarf index option

* ARM64 runtime assembler functions

* ARM64 unix stack walk

* ARM64 Exception Handling

* ARM64: Fix EH data decoding

* Move native layout signature from read only to data section on non Windows target

* Fix exception handling macro call

* ARM64 thunk helpers

* ARM64 process cfi data for elf

* ARM64 missing assembler macro

* ARM64 port more assembler helpers

* ARM64: Add missing case for the generic helper node

* ARM64 intrinsic support

* ARM64 object writer for ELF object files

* ARM64 llvm patches for object writer

* ARM64 include untested helper code with debug break

* ARM64 reenable scanning fail exception

* ARM64 Fix wrong function call for invoke return

* ARM64: Ensure module fixup node data is aligned

Data is updated with a compare exchange operation. Therefore it needs to be aligned or it will trigger a data exception on ARM64 CPUs

* Wasm fix LLVM Debug Information subroutine linkage (dotnet#8288)

* wasm - reinstate llvm debug subroutine linkage

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Co-authored-by: yowl <scott.waye@hubse.com>

Co-authored-by: Jan Kotas <jkotas@microsoft.com>
Co-authored-by: yowl <scott.waye@hubse.com>
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants