diff --git a/Cargo.lock b/Cargo.lock index b1709d34..7597d0fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -83,9 +83,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f35429a652765189c1c5092870d8360ee7b7769b09b06d89ebaefd34676446" +checksum = "8edae627382349b56cd6a7a2106f4fd69b243a9233e560c55c2e03cabb7e1d3c" dependencies = [ "alloy-rlp", "bytes", @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" +checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" dependencies = [ "alloy-rlp-derive", "arrayvec 0.7.6", @@ -121,13 +121,13 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" +checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -302,7 +302,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -486,6 +486,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "boolinator" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" + [[package]] name = "bumpalo" version = "3.16.0" @@ -506,9 +512,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "c-kzg" @@ -527,9 +533,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.30" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -817,7 +823,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -837,7 +843,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "unicode-xid", ] @@ -910,9 +916,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -926,7 +932,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -937,7 +943,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -949,7 +955,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "era-compiler-common" version = "1.5.0" -source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#ce91855778bd5e1821f9b46751f92bafafd88435" +source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#11cc7ed039fb96ef04d45d71c009e8dc8fffda9a" dependencies = [ "anyhow", "base58", @@ -964,8 +970,8 @@ dependencies = [ [[package]] name = "era-compiler-downloader" -version = "0.1.0" -source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#ce91855778bd5e1821f9b46751f92bafafd88435" +version = "1.5.0" +source = "git+https://github.com/matter-labs/era-compiler-common?branch=main#11cc7ed039fb96ef04d45d71c009e8dc8fffda9a" dependencies = [ "anyhow", "colored", @@ -978,7 +984,7 @@ dependencies = [ [[package]] name = "era-compiler-llvm-context" version = "1.5.0" -source = "git+https://github.com/matter-labs/era-compiler-llvm-context?branch=main#23bd5c502ab9d246c44ed61802153de47a7d9dfd" +source = "git+https://github.com/matter-labs/era-compiler-llvm-context?branch=main#67bb2349e221627f15b09893e59f807094ab81ca" dependencies = [ "anyhow", "era-compiler-common", @@ -993,9 +999,10 @@ dependencies = [ [[package]] name = "era-compiler-solidity" version = "1.5.6" -source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#12befad5d65a40166a8ffc6fd4f2008cb92a173b" +source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#2b32d2de6039165bb91569375673fd750c8a10b0" dependencies = [ "anyhow", + "boolinator", "era-compiler-common", "era-compiler-llvm-context", "era-yul", @@ -1022,8 +1029,8 @@ dependencies = [ [[package]] name = "era-compiler-vyper" -version = "1.5.5" -source = "git+https://github.com/matter-labs/era-compiler-vyper?branch=main#be758e3a119f45e960f796f177db2de5d56c72ab" +version = "1.5.6" +source = "git+https://github.com/matter-labs/era-compiler-vyper?branch=main#90a858bc42d1a83be3fe95beb858f60c14f910cb" dependencies = [ "anyhow", "era-compiler-common", @@ -1046,7 +1053,7 @@ dependencies = [ [[package]] name = "era-yul" version = "1.5.6" -source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#12befad5d65a40166a8ffc6fd4f2008cb92a173b" +source = "git+https://github.com/matter-labs/era-compiler-solidity?branch=main#2b32d2de6039165bb91569375673fd750c8a10b0" dependencies = [ "anyhow", "regex", @@ -1281,7 +1288,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1644,7 +1651,7 @@ source = "git+https://github.com/matter-labs-forks/inkwell?branch=llvm-17#c50692 dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1777,9 +1784,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libfuzzer-sys" @@ -1794,9 +1801,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libmimalloc-sys" @@ -2056,7 +2063,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2082,9 +2089,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.67" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b8cefcf97f41316955f9294cd61f639bdcfa9f2f230faac6cb896aa8ab64704" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -2103,7 +2110,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2114,9 +2121,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.3.2+3.3.2" +version = "300.4.0+3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b" +checksum = "a709e02f2b4aca747929cca5ed248880847c650233cf8b8cdc48f40aaf4898a6" dependencies = [ "cc", ] @@ -2235,29 +2242,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -2357,9 +2364,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -2754,9 +2761,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ "bitflags 2.6.0", "errno", @@ -2828,27 +2835,27 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scale-info" -version = "2.11.3" +version = "2.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +checksum = "1aa7ffc1c0ef49b0452c6e2986abf2b07743320641ffd5fc63d552458e3b779b" dependencies = [ "bitvec", "cfg-if", - "derive_more 0.99.18", + "derive_more 1.0.0", "parity-scale-codec", "scale-info-derive", ] [[package]] name = "scale-info-derive" -version = "2.11.3" +version = "2.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +checksum = "46385cc24172cf615450267463f937c10072516359b3ff1cb24228a4a08bf951" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.85", ] [[package]] @@ -3003,7 +3010,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -3282,9 +3289,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -3363,7 +3370,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -3401,9 +3408,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -3500,7 +3507,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -3692,7 +3699,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "wasm-bindgen-shared", ] @@ -3726,7 +3733,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4005,7 +4012,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -4025,7 +4032,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -4095,7 +4102,7 @@ dependencies = [ [[package]] name = "zksync_vm2" version = "0.2.1" -source = "git+https://github.com/matter-labs/vm2#a233d44bbe61dc6a758a754c3b78fe4f83e56699" +source = "git+https://github.com/matter-labs/vm2#df5bec3d04d64d434f9b0ccb285ba4681008f7b3" dependencies = [ "enum_dispatch", "primitive-types", @@ -4107,7 +4114,7 @@ dependencies = [ [[package]] name = "zksync_vm2_interface" version = "0.2.1" -source = "git+https://github.com/matter-labs/vm2#a233d44bbe61dc6a758a754c3b78fe4f83e56699" +source = "git+https://github.com/matter-labs/vm2#df5bec3d04d64d434f9b0ccb285ba4681008f7b3" dependencies = [ "primitive-types", ] diff --git a/LLVM.lock b/LLVM.lock index 9b393bc3..15b374ab 100644 --- a/LLVM.lock +++ b/LLVM.lock @@ -1,2 +1,2 @@ url = "https://github.com/matter-labs/era-compiler-llvm" -branch = "main" +branch = "kpv-eravm-fix-linker-duplicating-symbols" diff --git a/README.md b/README.md index a802f68e..e9834f0f 100644 --- a/README.md +++ b/README.md @@ -169,7 +169,7 @@ When testing is done, these tags should be removed. - [0.4.10; latest] for compiling Solidity via EVM assembly - [0.3.3, 0.3.9] for compiling Vyper via LLL IR -### Compiler pipelines +### Compiler codegens Currently only relevant for the Solidity compiler, where you can choose the IR: diff --git a/compiler_tester/src/compilers/eravm/mod.rs b/compiler_tester/src/compilers/eravm/mod.rs index e47a77e3..b9a6d598 100644 --- a/compiler_tester/src/compilers/eravm/mod.rs +++ b/compiler_tester/src/compilers/eravm/mod.rs @@ -27,7 +27,7 @@ impl Compiler for EraVMCompiler { &self, _test_path: String, sources: Vec<(String, String)>, - _libraries: BTreeMap>, + _libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, _mode: &Mode, llvm_options: Vec, debug_config: Option, @@ -54,6 +54,7 @@ impl Compiler for EraVMCompiler { let build = project.compile_to_eravm( &mut vec![], true, + BTreeMap::new(), era_compiler_common::HashType::Ipfs, era_compiler_llvm_context::OptimizerSettings::none(), llvm_options, @@ -75,7 +76,7 @@ impl Compiler for EraVMCompiler { &self, _test_path: String, _sources: Vec<(String, String)>, - _libraries: BTreeMap>, + _libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, _mode: &Mode, _test_params: Option<&solidity_adapter::Params>, _llvm_options: Vec, diff --git a/compiler_tester/src/compilers/llvm/mod.rs b/compiler_tester/src/compilers/llvm/mod.rs index 607f6163..333cca86 100644 --- a/compiler_tester/src/compilers/llvm/mod.rs +++ b/compiler_tester/src/compilers/llvm/mod.rs @@ -4,7 +4,6 @@ pub mod mode; -use std::collections::BTreeMap; use std::collections::HashMap; use era_compiler_solidity::CollectableError; @@ -40,7 +39,7 @@ impl Compiler for LLVMCompiler { &self, _test_path: String, sources: Vec<(String, String)>, - _libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, llvm_options: Vec, debug_config: Option, @@ -53,6 +52,8 @@ impl Compiler for LLVMCompiler { .0 .clone(); + let linker_symbols = libraries.as_linker_symbols()?; + let project = era_compiler_solidity::Project::try_from_llvm_ir_sources( sources .into_iter() @@ -63,12 +64,14 @@ impl Compiler for LLVMCompiler { ) }) .collect(), + libraries, None, )?; let build = project.compile_to_eravm( &mut vec![], true, + linker_symbols, era_compiler_common::HashType::Ipfs, mode.llvm_optimizer_settings.to_owned(), llvm_options, @@ -90,7 +93,7 @@ impl Compiler for LLVMCompiler { &self, _test_path: String, sources: Vec<(String, String)>, - _libraries: BTreeMap>, + _libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, _test_params: Option<&solidity_adapter::Params>, llvm_options: Vec, @@ -114,6 +117,7 @@ impl Compiler for LLVMCompiler { ) }) .collect(), + era_compiler_solidity::SolcStandardJsonInputSettingsLibraries::default(), None, )?; diff --git a/compiler_tester/src/compilers/mod.rs b/compiler_tester/src/compilers/mod.rs index c29d7ee9..54162604 100644 --- a/compiler_tester/src/compilers/mod.rs +++ b/compiler_tester/src/compilers/mod.rs @@ -10,8 +10,6 @@ pub mod solidity; pub mod vyper; pub mod yul; -use std::collections::BTreeMap; - use crate::vm::eravm::input::Input as EraVMInput; use crate::vm::evm::input::Input as EVMInput; @@ -28,7 +26,7 @@ pub trait Compiler: Send + Sync + 'static { &self, test_path: String, sources: Vec<(String, String)>, - libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, llvm_options: Vec, debug_config: Option, @@ -41,7 +39,7 @@ pub trait Compiler: Send + Sync + 'static { &self, test_path: String, sources: Vec<(String, String)>, - libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, test_params: Option<&solidity_adapter::Params>, llvm_options: Vec, diff --git a/compiler_tester/src/compilers/solidity/cache_key.rs b/compiler_tester/src/compilers/solidity/cache_key.rs index 2bb9e654..3968f716 100644 --- a/compiler_tester/src/compilers/solidity/cache_key.rs +++ b/compiler_tester/src/compilers/solidity/cache_key.rs @@ -12,7 +12,7 @@ pub struct CacheKey { /// The Solidity compiler version. pub version: semver::Version, /// The Solidity compiler output type. - pub pipeline: era_compiler_solidity::SolcPipeline, + pub codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, /// Whether to enable the EVMLA codegen via Yul IR. pub via_ir: bool, /// Whether to run the Solidity compiler optimizer. @@ -26,14 +26,14 @@ impl CacheKey { pub fn new( test_path: String, version: semver::Version, - pipeline: era_compiler_solidity::SolcPipeline, + codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, via_ir: bool, optimize: bool, ) -> Self { Self { test_path, version, - pipeline, + codegen, via_ir, optimize, } diff --git a/compiler_tester/src/compilers/solidity/mod.rs b/compiler_tester/src/compilers/solidity/mod.rs index f2fd25a8..c534d105 100644 --- a/compiler_tester/src/compilers/solidity/mod.rs +++ b/compiler_tester/src/compilers/solidity/mod.rs @@ -7,6 +7,7 @@ pub mod mode; pub mod upstream; use std::collections::BTreeMap; +use std::collections::BTreeSet; use std::collections::HashMap; use std::path::Path; @@ -39,28 +40,26 @@ lazy_static::lazy_static! { /// All compilers must be downloaded before initialization. /// static ref MODES: Vec = { - let mut solc_pipeline_versions = Vec::new(); - for (pipeline, optimize, via_ir) in [ - (era_compiler_solidity::SolcPipeline::EVMLA, false, false), - (era_compiler_solidity::SolcPipeline::EVMLA, true, false), - (era_compiler_solidity::SolcPipeline::EVMLA, true, true), - (era_compiler_solidity::SolcPipeline::Yul, false, true), - (era_compiler_solidity::SolcPipeline::Yul, true, true), + let mut solc_codegen_versions = Vec::new(); + for (codegen, optimize, via_ir) in [ + (era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA, true, false), + (era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA, true, true), + (era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul, true, true), ] { - for version in SolidityCompiler::all_versions(pipeline, via_ir).expect("`solc` versions analysis error") { - solc_pipeline_versions.push((pipeline, optimize, via_ir, version)); + for version in SolidityCompiler::all_versions(codegen, via_ir).expect("`solc` versions analysis error") { + solc_codegen_versions.push((codegen, optimize, via_ir, version)); } } era_compiler_llvm_context::OptimizerSettings::combinations() .into_iter() - .cartesian_product(solc_pipeline_versions) + .cartesian_product(solc_codegen_versions) .map( - |(mut llvm_optimizer_settings, (pipeline, optimize, via_ir, version))| { + |(mut llvm_optimizer_settings, (codegen, optimize, via_ir, version))| { llvm_optimizer_settings.enable_fallback_to_size(); SolidityMode::new( version, - pipeline, + codegen, via_ir, optimize, llvm_optimizer_settings, @@ -102,7 +101,7 @@ impl SolidityCompiler { pub fn executable( version: &semver::Version, ) -> anyhow::Result { - era_compiler_solidity::SolcCompiler::new( + era_compiler_solidity::SolcCompiler::try_from_path( format!("{}/solc-{}", Self::DIRECTORY, version).as_str(), ) } @@ -111,16 +110,16 @@ impl SolidityCompiler { /// Returns the `solc` executable used to compile system contracts. /// pub fn system_contract_executable() -> anyhow::Result { - era_compiler_solidity::SolcCompiler::new( + era_compiler_solidity::SolcCompiler::try_from_path( format!("{}/solc-system-contracts", Self::DIRECTORY).as_str(), ) } /// - /// Returns the compiler versions downloaded for the specified compilation pipeline. + /// Returns the compiler versions downloaded for the specified compilation codegen. /// pub fn all_versions( - pipeline: era_compiler_solidity::SolcPipeline, + codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, via_ir: bool, ) -> anyhow::Result> { let mut versions = Vec::new(); @@ -150,12 +149,12 @@ impl SolidityCompiler { Ok(version) => version, Err(_) => continue, }; - if era_compiler_solidity::SolcPipeline::Yul == pipeline + if era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul == codegen && version < era_compiler_solidity::SolcCompiler::FIRST_YUL_VERSION { continue; } - if era_compiler_solidity::SolcPipeline::EVMLA == pipeline + if era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA == codegen && via_ir && version < era_compiler_solidity::SolcCompiler::FIRST_VIA_IR_VERSION { @@ -172,7 +171,7 @@ impl SolidityCompiler { /// fn standard_json_output( sources: &[(String, String)], - libraries: &BTreeMap>, + libraries: &era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &SolidityMode, ) -> anyhow::Result { let solc_compiler = if mode.is_system_contracts_mode { @@ -182,42 +181,48 @@ impl SolidityCompiler { }?; let mut output_selection = - era_compiler_solidity::SolcStandardJsonInputSettingsSelection::new_required(Some( - mode.solc_pipeline, - )); - output_selection.extend_with_eravm_assembly(); - - let optimizer = era_compiler_solidity::SolcStandardJsonInputSettingsOptimizer::new( - mode.solc_optimize, - None, - &mode.solc_version, - false, + era_compiler_solidity::SolcStandardJsonInputSettingsSelection::new_required( + mode.solc_codegen, + ); + output_selection.extend( + era_compiler_solidity::SolcStandardJsonInputSettingsSelection::new(vec![ + era_compiler_solidity::SolcStandardJsonInputSettingsSelectionFlag::EraVMAssembly, + ]), ); - let evm_version = if mode.solc_version >= semver::Version::new(0, 8, 24) - /* TODO */ - { - Some(era_compiler_common::EVMVersion::Cancun) - } else { - None - }; + let evm_version = + if mode.solc_version >= era_compiler_solidity::SolcCompiler::FIRST_CANCUN_VERSION { + Some(era_compiler_common::EVMVersion::Cancun) + } else { + None + }; + + let sources: BTreeMap = sources + .iter() + .map(|(path, source)| { + ( + path.to_owned(), + era_compiler_solidity::SolcStandardJsonInputSource::from(source.to_owned()), + ) + }) + .collect(); let mut solc_input = era_compiler_solidity::SolcStandardJsonInput::try_from_solidity_sources( + sources, + libraries.to_owned(), + BTreeSet::new(), + era_compiler_solidity::SolcStandardJsonInputSettingsOptimizer::default(), + Some(mode.solc_codegen), evm_version, - sources.iter().cloned().collect(), - libraries.clone(), - None, - output_selection, - optimizer, - None, - mode.solc_pipeline == era_compiler_solidity::SolcPipeline::EVMLA, - mode.via_ir, mode.enable_eravm_extensions, - false, + output_selection, + era_compiler_solidity::SolcStandardJsonInputSettingsMetadata::default(), vec![], - vec![era_compiler_solidity::MessageType::SendTransfer], + vec![era_compiler_solidity::ErrorType::SendTransfer], vec![], + false, + mode.via_ir, ) .map_err(|error| anyhow::anyhow!("Solidity standard JSON I/O error: {}", error))?; @@ -229,7 +234,7 @@ impl SolidityCompiler { solc_compiler.standard_json( &mut solc_input, - Some(mode.solc_pipeline), + Some(mode.solc_codegen), &mut vec![], None, vec![], @@ -244,13 +249,13 @@ impl SolidityCompiler { &self, test_path: String, sources: &[(String, String)], - libraries: &BTreeMap>, + libraries: &era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &SolidityMode, ) -> anyhow::Result { let cache_key = CacheKey::new( test_path, mode.solc_version.clone(), - mode.solc_pipeline, + mode.solc_codegen, mode.via_ir, mode.solc_optimize, ); @@ -270,14 +275,9 @@ impl SolidityCompiler { fn get_method_identifiers( solc_output: &era_compiler_solidity::SolcStandardJsonOutput, ) -> anyhow::Result>> { - let files = solc_output - .contracts - .as_ref() - .ok_or_else(|| anyhow::anyhow!("Solidity contracts not found in the output"))?; - let mut method_identifiers = BTreeMap::new(); - for (path, contracts) in files.iter() { - for (name, contract) in contracts.iter() { + for (path, file) in solc_output.contracts.iter() { + for (name, contract) in file.iter() { let mut contract_identifiers = BTreeMap::new(); for (entry, selector) in contract .evm @@ -320,28 +320,18 @@ impl SolidityCompiler { solc_output: &era_compiler_solidity::SolcStandardJsonOutput, sources: &[(String, String)], ) -> anyhow::Result { - solc_output - .sources - .as_ref() - .ok_or_else(|| { - anyhow::anyhow!( - "The Solidity sources are empty. Found errors: {:?}", - solc_output.errors - ) - }) - .and_then(|output_sources| { - for (path, _source) in sources.iter().rev() { - match output_sources - .get(path) - .ok_or_else(|| anyhow::anyhow!("The last source not found in the output"))? - .last_contract_name() - { - Ok(name) => return Ok(format!("{path}:{name}")), - Err(_error) => continue, - } - } - anyhow::bail!("The last source not found in the output") - }) + for (path, _source) in sources.iter().rev() { + match solc_output + .sources + .get(path) + .ok_or_else(|| anyhow::anyhow!("The last source not found in the output"))? + .last_contract_name() + { + Ok(name) => return Ok(format!("{path}:{name}")), + Err(_error) => continue, + } + } + anyhow::bail!("The last source not found in the output") } } @@ -350,7 +340,7 @@ impl Compiler for SolidityCompiler { &self, test_path: String, sources: Vec<(String, String)>, - libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, llvm_options: Vec, debug_config: Option, @@ -374,9 +364,11 @@ impl Compiler for SolidityCompiler { SolidityCompiler::executable(&mode.solc_version) }?; + let linker_symbols = libraries.as_linker_symbols()?; + let project = era_compiler_solidity::Project::try_from_solc_output( libraries, - mode.solc_pipeline, + mode.solc_codegen, &mut solc_output, &solc_compiler, debug_config.as_ref(), @@ -385,6 +377,7 @@ impl Compiler for SolidityCompiler { let build = project.compile_to_eravm( &mut vec![], mode.enable_eravm_extensions, + linker_symbols, era_compiler_common::HashType::Ipfs, mode.llvm_optimizer_settings.to_owned(), llvm_options, @@ -415,7 +408,6 @@ impl Compiler for SolidityCompiler { mode.solc_version.to_owned(), None, )), - &semver::Version::new(0, 0, 0), )?; solc_output.collect_errors()?; @@ -430,7 +422,7 @@ impl Compiler for SolidityCompiler { &self, test_path: String, sources: Vec<(String, String)>, - libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, _test_params: Option<&solidity_adapter::Params>, llvm_options: Vec, @@ -450,7 +442,7 @@ impl Compiler for SolidityCompiler { let project = era_compiler_solidity::Project::try_from_solc_output( libraries, - mode.solc_pipeline, + mode.solc_codegen, &mut solc_output, &solc_compiler, debug_config.as_ref(), diff --git a/compiler_tester/src/compilers/solidity/mode.rs b/compiler_tester/src/compilers/solidity/mode.rs index 296abf7f..45d3d0c2 100644 --- a/compiler_tester/src/compilers/solidity/mode.rs +++ b/compiler_tester/src/compilers/solidity/mode.rs @@ -16,7 +16,7 @@ pub struct Mode { /// The Solidity compiler version. pub solc_version: semver::Version, /// The Solidity compiler output type. - pub solc_pipeline: era_compiler_solidity::SolcPipeline, + pub solc_codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, /// Whether to enable the EVMLA codegen via Yul IR. pub via_ir: bool, /// Whether to run the Solidity compiler optimizer. @@ -35,7 +35,7 @@ impl Mode { /// pub fn new( solc_version: semver::Version, - solc_pipeline: era_compiler_solidity::SolcPipeline, + solc_codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, via_ir: bool, solc_optimize: bool, mut llvm_optimizer_settings: era_compiler_llvm_context::OptimizerSettings, @@ -49,7 +49,7 @@ impl Mode { Self { solc_version, - solc_pipeline, + solc_codegen, via_ir, solc_optimize, llvm_optimizer_settings, @@ -112,16 +112,16 @@ impl Mode { return false; } - match self.solc_pipeline { - era_compiler_solidity::SolcPipeline::Yul => { + match self.solc_codegen { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul => { params.compile_via_yul != solidity_adapter::CompileViaYul::False && params.abi_encoder_v1_only != solidity_adapter::ABIEncoderV1Only::True } - era_compiler_solidity::SolcPipeline::EVMLA if self.via_ir => { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA if self.via_ir => { params.compile_via_yul != solidity_adapter::CompileViaYul::False && params.abi_encoder_v1_only != solidity_adapter::ABIEncoderV1Only::True } - era_compiler_solidity::SolcPipeline::EVMLA => { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA => { params.compile_via_yul != solidity_adapter::CompileViaYul::True } } @@ -133,10 +133,12 @@ impl std::fmt::Display for Mode { write!( f, "{}{}{} {}", - match self.solc_pipeline { - era_compiler_solidity::SolcPipeline::Yul => "Y", - era_compiler_solidity::SolcPipeline::EVMLA if self.via_ir => "I", - era_compiler_solidity::SolcPipeline::EVMLA => "E", + match self.solc_codegen { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul => "Y", + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA + if self.via_ir => + "I", + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA => "E", }, if self.solc_optimize { '+' } else { '-' }, self.llvm_optimizer_settings, diff --git a/compiler_tester/src/compilers/solidity/upstream/mod.rs b/compiler_tester/src/compilers/solidity/upstream/mod.rs index 42b3854c..10078d40 100644 --- a/compiler_tester/src/compilers/solidity/upstream/mod.rs +++ b/compiler_tester/src/compilers/solidity/upstream/mod.rs @@ -49,16 +49,16 @@ lazy_static::lazy_static! { /// static ref SOLIDITY_MODES: Vec = { let mut modes = Vec::new(); - for (pipeline, optimize, via_ir) in [ - (era_compiler_solidity::SolcPipeline::EVMLA, false, false), - (era_compiler_solidity::SolcPipeline::EVMLA, false, true), - (era_compiler_solidity::SolcPipeline::EVMLA, true, false), - (era_compiler_solidity::SolcPipeline::EVMLA, true, true), - (era_compiler_solidity::SolcPipeline::Yul, false, true), - (era_compiler_solidity::SolcPipeline::Yul, true, true), + for (codegen, optimize, via_ir) in [ + (era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA, false, false), + (era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA, false, true), + (era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA, true, false), + (era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA, true, true), + (era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul, false, true), + (era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul, true, true), ] { - for version in SolidityCompiler::all_versions(pipeline, via_ir).expect("`solc` versions analysis error") { - modes.push(SolidityUpstreamMode::new(version, pipeline, via_ir, false, optimize).into()); + for version in SolidityCompiler::all_versions(codegen, via_ir).expect("`solc` versions analysis error") { + modes.push(SolidityUpstreamMode::new(version, codegen, via_ir, false, optimize).into()); } } modes @@ -74,7 +74,7 @@ lazy_static::lazy_static! { for optimize in [ false, true ] { - for version in SolidityCompiler::all_versions(era_compiler_solidity::SolcPipeline::Yul, true).expect("`solc` versions analysis error") { + for version in SolidityCompiler::all_versions(era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul, true).expect("`solc` versions analysis error") { modes.push(YulUpstreamMode::new(version, false, optimize).into()); } } @@ -87,7 +87,7 @@ lazy_static::lazy_static! { /// All compilers must be downloaded before initialization. /// static ref SOLIDITY_MLIR_MODES: Vec = { - vec![SolidityUpstreamMode::new(semver::Version::new(0, 8, 26), era_compiler_solidity::SolcPipeline::Yul, false, true, false).into()] + vec![SolidityUpstreamMode::new(semver::Version::new(0, 8, 26), era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul, false, true, false).into()] }; /// @@ -137,10 +137,10 @@ impl SolidityCompiler { } /// - /// Returns the compiler versions downloaded for the specified compilation pipeline. + /// Returns the compiler versions downloaded for the specified compilation codegen. /// pub fn all_versions( - pipeline: era_compiler_solidity::SolcPipeline, + codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, via_ir: bool, ) -> anyhow::Result> { let mut versions = Vec::new(); @@ -170,12 +170,12 @@ impl SolidityCompiler { Ok(version) => version, Err(_) => continue, }; - if era_compiler_solidity::SolcPipeline::Yul == pipeline + if era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul == codegen && version < SolcUpstreamCompiler::FIRST_YUL_VERSION { continue; } - if era_compiler_solidity::SolcPipeline::EVMLA == pipeline + if era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA == codegen && via_ir && version < SolcUpstreamCompiler::FIRST_VIA_IR_VERSION { @@ -194,7 +194,7 @@ impl SolidityCompiler { language: SolcStandardJsonInputLanguage, toolchain: Toolchain, sources: &[(String, String)], - libraries: &BTreeMap>, + libraries: &era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, test_params: Option<&solidity_adapter::Params>, ) -> anyhow::Result { @@ -206,8 +206,10 @@ impl SolidityCompiler { let mut solc = Self::executable(toolchain, solc_version)?; let output_selection = SolcStandardJsonInputSettingsSelection::new_required(match mode { - Mode::SolidityUpstream(mode) => mode.solc_pipeline, - Mode::YulUpstream(_mode) => era_compiler_solidity::SolcPipeline::Yul, + Mode::SolidityUpstream(mode) => mode.solc_codegen, + Mode::YulUpstream(_mode) => { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul + } mode => anyhow::bail!("Unsupported mode: {mode}"), }); @@ -281,7 +283,7 @@ impl SolidityCompiler { test_path: String, language: SolcStandardJsonInputLanguage, sources: &[(String, String)], - libraries: &BTreeMap>, + libraries: &era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, test_params: Option<&solidity_adapter::Params>, ) -> anyhow::Result { @@ -289,14 +291,14 @@ impl SolidityCompiler { Mode::SolidityUpstream(mode) => CacheKey::new( test_path, mode.solc_version.to_owned(), - mode.solc_pipeline, + mode.solc_codegen, mode.via_ir, mode.solc_optimize, ), Mode::YulUpstream(mode) => CacheKey::new( test_path, mode.solc_version.to_owned(), - era_compiler_solidity::SolcPipeline::Yul, + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul, true, mode.solc_optimize, ), @@ -425,7 +427,7 @@ impl Compiler for SolidityCompiler { &self, test_path: String, sources: Vec<(String, String)>, - libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, _llvm_options: Vec, _debug_config: Option, @@ -517,7 +519,7 @@ impl Compiler for SolidityCompiler { &self, test_path: String, sources: Vec<(String, String)>, - libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, test_params: Option<&solidity_adapter::Params>, _llvm_options: Vec, diff --git a/compiler_tester/src/compilers/solidity/upstream/mode.rs b/compiler_tester/src/compilers/solidity/upstream/mode.rs index 6c9157d6..3a37b435 100644 --- a/compiler_tester/src/compilers/solidity/upstream/mode.rs +++ b/compiler_tester/src/compilers/solidity/upstream/mode.rs @@ -14,7 +14,7 @@ pub struct Mode { /// The Solidity compiler version. pub solc_version: semver::Version, /// The Solidity compiler output type. - pub solc_pipeline: era_compiler_solidity::SolcPipeline, + pub solc_codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, /// Whether to enable the EVMLA codegen via Yul IR. pub via_ir: bool, /// Whether to enable the MLIR codegen. @@ -29,14 +29,14 @@ impl Mode { /// pub fn new( solc_version: semver::Version, - solc_pipeline: era_compiler_solidity::SolcPipeline, + solc_codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, via_ir: bool, via_mlir: bool, solc_optimize: bool, ) -> Self { Self { solc_version, - solc_pipeline, + solc_codegen, via_ir, via_mlir, solc_optimize, @@ -97,16 +97,16 @@ impl Mode { return false; } - match self.solc_pipeline { - era_compiler_solidity::SolcPipeline::Yul => { + match self.solc_codegen { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul => { params.compile_via_yul != solidity_adapter::CompileViaYul::False && params.abi_encoder_v1_only != solidity_adapter::ABIEncoderV1Only::True } - era_compiler_solidity::SolcPipeline::EVMLA if self.via_ir => { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA if self.via_ir => { params.compile_via_yul != solidity_adapter::CompileViaYul::False && params.abi_encoder_v1_only != solidity_adapter::ABIEncoderV1Only::True } - era_compiler_solidity::SolcPipeline::EVMLA => { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA => { params.compile_via_yul != solidity_adapter::CompileViaYul::True } } @@ -122,10 +122,12 @@ impl std::fmt::Display for Mode { write!( f, "{}{} {}", - match self.solc_pipeline { - era_compiler_solidity::SolcPipeline::Yul => "Y", - era_compiler_solidity::SolcPipeline::EVMLA if self.via_ir => "I", - era_compiler_solidity::SolcPipeline::EVMLA => "E", + match self.solc_codegen { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul => "Y", + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA + if self.via_ir => + "I", + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA => "E", }, if self.solc_optimize { '+' } else { '-' }, self.solc_version, diff --git a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/mod.rs b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/mod.rs index 993d26f7..a1feb86d 100644 --- a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/mod.rs +++ b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/mod.rs @@ -45,7 +45,7 @@ impl Input { language: Language, evm_version: Option, sources: BTreeMap, - libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, remappings: Option>, output_selection: SolcStandardJsonInputSettingsSelection, via_ir: bool, diff --git a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/mod.rs b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/mod.rs index 16581b11..1ffd5b12 100644 --- a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/mod.rs +++ b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/mod.rs @@ -6,7 +6,6 @@ pub mod debug; pub mod optimizer; pub mod selection; -use std::collections::BTreeMap; use std::collections::BTreeSet; use serde::Serialize; @@ -25,8 +24,11 @@ pub struct Settings { #[serde(skip_serializing_if = "Option::is_none")] pub evm_version: Option, /// The linker library addresses. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub libraries: Option>>, + #[serde( + default, + skip_serializing_if = "era_compiler_solidity::SolcStandardJsonInputSettingsLibraries::is_empty" + )] + pub libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, /// The sorted list of remappings. #[serde(skip_serializing_if = "Option::is_none")] pub remappings: Option>, @@ -60,7 +62,7 @@ impl Settings { /// pub fn new( evm_version: Option, - libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, remappings: Option>, output_selection: Selection, via_ir: bool, @@ -70,7 +72,7 @@ impl Settings { ) -> Self { Self { evm_version, - libraries: Some(libraries), + libraries, remappings, output_selection: Some(output_selection), via_ir: if via_ir { Some(true) } else { None }, diff --git a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/file/flag.rs b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/file/flag.rs index dc86bc50..e5eb3fce 100644 --- a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/file/flag.rs +++ b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/file/flag.rs @@ -28,11 +28,11 @@ pub enum Flag { EVMLA, } -impl From for Flag { - fn from(pipeline: era_compiler_solidity::SolcPipeline) -> Self { - match pipeline { - era_compiler_solidity::SolcPipeline::Yul => Self::Yul, - era_compiler_solidity::SolcPipeline::EVMLA => Self::EVMLA, +impl From for Flag { + fn from(codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen) -> Self { + match codegen { + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul => Self::Yul, + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::EVMLA => Self::EVMLA, } } } diff --git a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/file/mod.rs b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/file/mod.rs index 70b82559..d49a842c 100644 --- a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/file/mod.rs +++ b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/file/mod.rs @@ -27,13 +27,15 @@ impl File { /// /// Creates the selection required by EVM compilation process. /// - pub fn new_required(pipeline: era_compiler_solidity::SolcPipeline) -> Self { + pub fn new_required( + codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, + ) -> Self { Self { per_file: Some(HashSet::from_iter([SelectionFlag::AST])), per_contract: Some(HashSet::from_iter([ SelectionFlag::Bytecode, SelectionFlag::MethodIdentifiers, - SelectionFlag::from(pipeline), + SelectionFlag::from(codegen), ])), } } diff --git a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/mod.rs b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/mod.rs index c8f84ecd..4e8ffcf5 100644 --- a/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/mod.rs +++ b/compiler_tester/src/compilers/solidity/upstream/solc/standard_json/input/settings/selection/mod.rs @@ -22,9 +22,11 @@ impl Selection { /// /// Creates the selection required by EVM compilation process. /// - pub fn new_required(pipeline: era_compiler_solidity::SolcPipeline) -> Self { + pub fn new_required( + codegen: era_compiler_solidity::SolcStandardJsonInputSettingsCodegen, + ) -> Self { Self { - all: Some(FileSelection::new_required(pipeline)), + all: Some(FileSelection::new_required(codegen)), } } } diff --git a/compiler_tester/src/compilers/vyper/mod.rs b/compiler_tester/src/compilers/vyper/mod.rs index bae7e2b6..b89f2a61 100644 --- a/compiler_tester/src/compilers/vyper/mod.rs +++ b/compiler_tester/src/compilers/vyper/mod.rs @@ -195,7 +195,7 @@ impl Compiler for VyperCompiler { &self, test_path: String, sources: Vec<(String, String)>, - _libraries: BTreeMap>, + _libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, llvm_options: Vec, debug_config: Option, @@ -258,7 +258,7 @@ impl Compiler for VyperCompiler { &self, _test_path: String, _sources: Vec<(String, String)>, - _libraries: BTreeMap>, + _libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, _mode: &Mode, _test_params: Option<&solidity_adapter::Params>, _llvm_options: Vec, diff --git a/compiler_tester/src/compilers/yul/mod.rs b/compiler_tester/src/compilers/yul/mod.rs index b8ddbfbd..824bf22b 100644 --- a/compiler_tester/src/compilers/yul/mod.rs +++ b/compiler_tester/src/compilers/yul/mod.rs @@ -5,7 +5,6 @@ pub mod mode; pub mod mode_upstream; -use std::collections::BTreeMap; use std::collections::HashMap; use era_compiler_solidity::CollectableError; @@ -55,7 +54,7 @@ impl Compiler for YulCompiler { &self, _test_path: String, sources: Vec<(String, String)>, - _libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, llvm_options: Vec, debug_config: Option, @@ -65,8 +64,10 @@ impl Compiler for YulCompiler { let solc_version = if mode.enable_eravm_extensions { None } else { - Some(era_compiler_solidity::SolcVersion::new_simple( + Some(era_compiler_solidity::SolcVersion::new( + era_compiler_solidity::SolcCompiler::LAST_SUPPORTED_VERSION.to_string(), era_compiler_solidity::SolcCompiler::LAST_SUPPORTED_VERSION, + None, )) }; @@ -76,17 +77,21 @@ impl Compiler for YulCompiler { .0 .clone(); + let linker_symbols = libraries.as_linker_symbols()?; + + let sources = sources + .into_iter() + .map(|(path, source)| { + ( + path, + era_compiler_solidity::SolcStandardJsonInputSource::from(source), + ) + }) + .collect(); + let project = era_compiler_solidity::Project::try_from_yul_sources( - sources - .into_iter() - .map(|(path, source)| { - ( - path, - era_compiler_solidity::SolcStandardJsonInputSource::from(source), - ) - }) - .collect(), - BTreeMap::new(), + sources, + libraries, None, solc_version.as_ref(), debug_config.as_ref(), @@ -95,6 +100,7 @@ impl Compiler for YulCompiler { let build = project.compile_to_eravm( &mut vec![], mode.enable_eravm_extensions, + linker_symbols, era_compiler_common::HashType::Ipfs, mode.llvm_optimizer_settings.to_owned(), llvm_options, @@ -125,7 +131,7 @@ impl Compiler for YulCompiler { &self, test_path: String, sources: Vec<(String, String)>, - libraries: BTreeMap>, + libraries: era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, mode: &Mode, test_params: Option<&solidity_adapter::Params>, _llvm_options: Vec, diff --git a/compiler_tester/src/directories/ethereum/test.rs b/compiler_tester/src/directories/ethereum/test.rs index abbcb664..99172fc7 100644 --- a/compiler_tester/src/directories/ethereum/test.rs +++ b/compiler_tester/src/directories/ethereum/test.rs @@ -124,7 +124,7 @@ impl EthereumTest { ) -> anyhow::Result<( web3::types::Address, BTreeMap, - BTreeMap>, + era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, )> { let mut caller = solidity_adapter::account_address(solidity_adapter::DEFAULT_ACCOUNT_INDEX); @@ -163,7 +163,7 @@ impl EthereumTest { } let contract_address = contract_address.expect("Always valid"); - Ok((contract_address, libraries_addresses, libraries)) + Ok((contract_address, libraries_addresses, libraries.into())) } /// diff --git a/compiler_tester/src/directories/matter_labs/test/mod.rs b/compiler_tester/src/directories/matter_labs/test/mod.rs index 3cf54aac..313e7863 100644 --- a/compiler_tester/src/directories/matter_labs/test/mod.rs +++ b/compiler_tester/src/directories/matter_labs/test/mod.rs @@ -230,7 +230,7 @@ impl MatterLabsTest { &self, address_iterator: &mut API, ) -> ( - BTreeMap>, + era_compiler_solidity::SolcStandardJsonInputSettingsLibraries, BTreeMap, ) where @@ -262,7 +262,7 @@ impl MatterLabsTest { libraries.insert(file_path.to_string_lossy().to_string(), file_libraries); } - (libraries, library_addresses) + (libraries.into(), library_addresses) } /// diff --git a/compiler_tester/src/vm/eravm/mod.rs b/compiler_tester/src/vm/eravm/mod.rs index 5cd6c8f9..1ebc6c56 100644 --- a/compiler_tester/src/vm/eravm/mod.rs +++ b/compiler_tester/src/vm/eravm/mod.rs @@ -105,7 +105,7 @@ impl EraVM { ); let solc_version = system_contracts_solc_downloader_config - .binaries + .executables .keys() .next() .ok_or_else(|| { diff --git a/compiler_tester/src/vm/eravm/system_contracts.rs b/compiler_tester/src/vm/eravm/system_contracts.rs index a6842843..8dc79694 100644 --- a/compiler_tester/src/vm/eravm/system_contracts.rs +++ b/compiler_tester/src/vm/eravm/system_contracts.rs @@ -2,7 +2,6 @@ //! The EraVM system contracts. //! -use std::collections::BTreeMap; use std::collections::HashMap; use std::fs::File; use std::path::PathBuf; @@ -294,7 +293,7 @@ impl SystemContracts { let solidity_optimizer_settings = era_compiler_llvm_context::OptimizerSettings::cycles(); let solidity_mode = SolidityMode::new( solc_version, - era_compiler_solidity::SolcPipeline::Yul, + era_compiler_solidity::SolcStandardJsonInputSettingsCodegen::Yul, true, true, solidity_optimizer_settings, @@ -431,7 +430,7 @@ impl SystemContracts { .compile_for_eravm( "system-contracts".to_owned(), sources, - BTreeMap::new(), + era_compiler_solidity::SolcStandardJsonInputSettingsLibraries::default(), mode, llvm_options, debug_config, diff --git a/era-contracts b/era-contracts index 31465df1..daba783e 160000 --- a/era-contracts +++ b/era-contracts @@ -1 +1 @@ -Subproject commit 31465df18b212c420c288bf8c05af7b47046a369 +Subproject commit daba783e8ee9ad578a69a1a15716b5fd3680a5bd diff --git a/fuzzer/fuzz_targets/common.rs b/fuzzer/fuzz_targets/common.rs index d6213294..6e3044b5 100644 --- a/fuzzer/fuzz_targets/common.rs +++ b/fuzzer/fuzz_targets/common.rs @@ -9,7 +9,7 @@ use std::{path::PathBuf, sync::Arc}; use compiler_tester::{ Buildable, EthereumTest, Mode, SolidityCompiler, SolidityMode, Summary, Workflow, }; -use era_compiler_solidity::SolcPipeline; +use era_compiler_solidity::SolcStandardJsonInputSettingsCodegen; pub use solidity_adapter::{ test::function_call::parser::{ @@ -160,7 +160,7 @@ pub fn build_and_run(test: EthereumTest) -> anyhow::Result { let solc_version = semver::Version::new(0, 8, 26); let mode = Mode::Solidity(SolidityMode::new( solc_version, - SolcPipeline::Yul, + SolcStandardJsonInputSettingsCodegen::Yul, true, true, era_compiler_llvm_context::OptimizerSettings::try_from_cli('3') diff --git a/system-contracts-stable-build b/system-contracts-stable-build index 69366327..a8c8ada2 100644 Binary files a/system-contracts-stable-build and b/system-contracts-stable-build differ