Skip to content

Commit

Permalink
Merge pull request ethereum#12193 from ethereum/use-src-ewasm-crash
Browse files Browse the repository at this point in the history
Fix crash when using @use-src while compiling yul -> ewasm
  • Loading branch information
chriseth authored Nov 11, 2021
2 parents 969707c + 49b4e77 commit 7334420
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 1 deletion.
1 change: 1 addition & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Compiler Features:


Bugfixes:
* Code Generator: Fix a crash when using ``@use-src`` and compiling from Yul to ewasm.


### 0.8.10 (2021-11-09)
Expand Down
6 changes: 5 additions & 1 deletion libyul/backends/wasm/EVMToEwasmTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,11 @@ void EVMToEwasmTranslator::parsePolyfill()
string(solidity::yul::wasm::polyfill::Logical) +
string(solidity::yul::wasm::polyfill::Memory) +
"}", "");
m_polyfill = Parser(errorReporter, WasmDialect::instance()).parse(charStream);

// Passing an empty SourceLocation() here is a workaround to prevent a crash
// when compiling from yul->ewasm. We're stripping nativeLocation and
// originLocation from the AST (but we only really need to strip nativeLocation)
m_polyfill = Parser(errorReporter, WasmDialect::instance(), langutil::SourceLocation()).parse(charStream);
if (!errors.empty())
{
string message;
Expand Down
1 change: 1 addition & 0 deletions test/cmdlineTests/yul_to_wasm_source_location_crash/args
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
--strict-assembly --yul-dialect evm --machine ewasm --optimize --ewasm-ir
1 change: 1 addition & 0 deletions test/cmdlineTests/yul_to_wasm_source_location_crash/err
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Warning: Yul is still experimental. Please use the output with care.
4 changes: 4 additions & 0 deletions test/cmdlineTests/yul_to_wasm_source_location_crash/input.yul
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/// @use-src 0:"test.sol"
object "C" {
code { sstore(0,0) }
}
34 changes: 34 additions & 0 deletions test/cmdlineTests/yul_to_wasm_source_location_crash/output
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

======= yul_to_wasm_source_location_crash/input.yul (Ewasm) =======

==========================

Translated source:
/// @use-src 0:"test.sol"
object "C" {
code {
function main()
{
let hi := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(0))), 32)
let y := i64.or(hi, i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(0, 32)))))
i64.store(0:i32, y)
i64.store(i32.add(0:i32, 8:i32), y)
i64.store(i32.add(0:i32, 16:i32), y)
i64.store(i32.add(0:i32, 24:i32), y)
i64.store(32:i32, y)
i64.store(i32.add(32:i32, 8:i32), y)
i64.store(i32.add(32:i32, 16:i32), y)
i64.store(i32.add(32:i32, 24:i32), y)
eth.storageStore(0:i32, 32:i32)
}
function bswap16(x:i32) -> y:i32
{
y := i32.or(i32.and(i32.shl(x, 8:i32), 0xff00:i32), i32.and(i32.shr_u(x, 8:i32), 0xff:i32))
}
function bswap32(x:i32) -> y:i32
{
let hi:i32 := i32.shl(bswap16(x), 16:i32)
y := i32.or(hi, bswap16(i32.shr_u(x, 16:i32)))
}
}
}

0 comments on commit 7334420

Please sign in to comment.