mirror of
https://github.com/compiler-explorer/compiler-explorer.git
synced 2025-12-27 09:23:52 -05:00
## What
Adds [Revive's Resolc](https://github.com/paritytech/revive) compiler
for compiling Solidity and Yul (Solidity IR) to RISC-V and PolkaVM
assembly.
### Main Additions
- [x] Implement new `ResolcCompiler`
- [x] Implement Yul language definition and config for Monaco
- [x] Add Resolc as a compiler for the Solidity and Yul languages
- The `ResolcCompiler` handles both kinds of language input
- [x] Implement initial `PolkaVMAsmParser` (no source mappings)
- [x] Enable viewing LLVM IR in a supplementary view
- [x] Implement a new LLVM IR backend option for toggling between
optimized and unoptimized ll
- Affects non-resolc files ([see
commit](606bab9a59))
- Disabled by default
- (Enable by setting `this.compiler.supportsIrViewOptToggleOption =
true` in a compiler's constructor)
- The compiler's `getIrOutputFilename()` will receive the LLVM IR
backend options
### CE Infra
Accompanying CE Infra PR:
https://github.com/compiler-explorer/infra/pull/1855
## Overall Usage
### Steps
(See screenshots)
* Choose between two input languages:
* Solidity
* Yul (Solidity IR)
* Choose a Resolc compiler
* View assembly:
* PolkaVM assembly (if enabling "Compile to binary")
* RISC-V (64 bits) assembly
* View intermediate results:
* Optimized LLVM IR (if enabling "Show Optimized" in the LLVM IR view)
* Unoptimized LLVM IR
### Notes
Source mappings currently only exist between:
- Yul and RISC-V
- Yul and LLVM-IR
## Screenshots
<img width="1502" height="903" alt="CE Yul RISC-V LLVM IR"
src="https://github.com/user-attachments/assets/7503b9b5-0f2c-4ddf-9405-669e4bdcd02d"
/>
<img width="1502" height="903" alt="CE Solidity PolkaVM"
src="https://github.com/user-attachments/assets/eeb51c99-3eaa-4dda-b13c-ac7783e66cb8"
/>
---------
Co-authored-by: Matt Godbolt <matt@godbolt.org>
44 lines
1.6 KiB
Plaintext
44 lines
1.6 KiB
Plaintext
object "Square" {
|
|
code {
|
|
{
|
|
let _1 := memoryguard(0x80)
|
|
mstore(64, _1)
|
|
if callvalue() { revert(0, 0) }
|
|
let _2 := datasize("Square_deployed")
|
|
codecopy(_1, dataoffset("Square_deployed"), _2)
|
|
return(_1, _2)
|
|
}
|
|
}
|
|
object "Square_deployed" {
|
|
code {
|
|
{
|
|
let _1 := memoryguard(0x80)
|
|
mstore(64, _1)
|
|
if iszero(lt(calldatasize(), 4))
|
|
{
|
|
if eq(0xd27b3841, shr(224, calldataload(0)))
|
|
{
|
|
if callvalue() { revert(0, 0) }
|
|
if slt(add(calldatasize(), not(3)), 32) { revert(0, 0) }
|
|
let value := calldataload(4)
|
|
let _2 := and(value, 0xffffffff)
|
|
if iszero(eq(value, _2)) { revert(0, 0) }
|
|
let product_raw := mul(_2, _2)
|
|
let product := and(product_raw, 0xffffffff)
|
|
if iszero(eq(product, product_raw))
|
|
{
|
|
mstore(0, shl(224, 0x4e487b71))
|
|
mstore(4, 0x11)
|
|
revert(0, 0x24)
|
|
}
|
|
mstore(_1, product)
|
|
return(_1, 32)
|
|
}
|
|
}
|
|
revert(0, 0)
|
|
}
|
|
}
|
|
data ".metadata" hex"a26469706673582212209b2b1b86ce0e1a75faa800884ba155bd6bc6a6bc71f210370f818535dcfc5ee364736f6c634300081e0033"
|
|
}
|
|
}
|