Skip to content

feat: compiler v2 #206

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

Merged
merged 9 commits into from
May 26, 2025
Merged
Show file tree
Hide file tree
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
19 changes: 18 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

48 changes: 26 additions & 22 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ move-bytecode-utils = { git = "https://github.com/aptos-labs/aptos-core.git", re
move-cli = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "46ff583f7c392d9a34cc445f7b279c2d7930a374" }
move-command-line-common = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "46ff583f7c392d9a34cc445f7b279c2d7930a374" }
legacy-move-compiler = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "46ff583f7c392d9a34cc445f7b279c2d7930a374" }
move-compiler-v2 = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "46ff583f7c392d9a34cc445f7b279c2d7930a374" }
move-linter = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "46ff583f7c392d9a34cc445f7b279c2d7930a374" }
move-coverage = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "46ff583f7c392d9a34cc445f7b279c2d7930a374" }
move-core-types = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "46ff583f7c392d9a34cc445f7b279c2d7930a374" }
move-docgen = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "46ff583f7c392d9a34cc445f7b279c2d7930a374" }
Expand All @@ -146,25 +148,27 @@ move-vm-types = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "4
# END MOVE DEPENDENCIES

# FOR LOCAL DEVELOPMENNT
# move-binary-format = { path = "../move/move-binary-format" }
# move-bytecode-verifier = { path = "../move/move-bytecode-verifier" }
# move-bytecode-utils = { path = "../move/tools/move-bytecode-utils" }
# move-cli = { path = "../move/tools/move-cli" }
# move-command-line-common = { path = "../move/move-command-line-common" }
# move-compiler = { path = "../move/move-compiler" }
# move-coverage ={ path = "../move/tools/move-coverage" }
# move-core-types = { path = "../move/move-core/types" }
# move-docgen = { path = "../move/move-prover/move-docgen" }
# move-model = { path = "../move/move-model" }
# move-package = { path = "../move/tools/move-package" }
# move-prover = { path = "../move/move-prover" }
# move-prover-boogie-backend = { path = "../move/move-prover/boogie-backend" }
# move-prover-bytecode-pipeline = { path = "../move/move-prover/bytecode-pipeline" }
# move-resource-viewer = { path = "../move/tools/move-resource-viewer" }
# move-stackless-bytecode = { path = "../move/move-model/bytecode" }
# move-stdlib = { path = "../move/move-stdlib" }
# move-symbol-pool = { path = "../move/move-symbol-pool" }
# move-unit-test = { path = "../move/tools/move-unit-test" }
# move-vm-runtime = { path = "../move/move-vm/runtime" }
# move-vm-test-utils = { path = "../move/move-vm/test-utils" }
# move-vm-types = { path = "../move/move-vm/types" }
# move-binary-format = { path = "../aptos-core/third_party/move/move-binary-format" }
# move-bytecode-verifier = { path = "../aptos-core/third_party/move/move-bytecode-verifier" }
# move-bytecode-utils = { path = "../aptos-core/third_party/move/tools/move-bytecode-utils" }
# move-cli = { path = "../aptos-core/third_party/move/tools/move-cli" }
# move-command-line-common = { path = "../aptos-core/third_party/move/move-command-line-common" }
# legacy-move-compiler = { path = "../aptos-core/third_party/move/move-compiler-v2/legacy-move-compiler" }
# move-compiler-v2 = { path = "../aptos-core/third_party/move/move-compiler-v2" }
# move-linter = { path = "../aptos-core/third_party/move/tools/move-linter" }
# move-coverage ={ path = "../aptos-core/third_party/move/tools/move-coverage" }
# move-core-types = { path = "../aptos-core/third_party/move/move-core/types" }
# move-docgen = { path = "../aptos-core/third_party/move/move-prover/move-docgen" }
# move-model = { path = "../aptos-core/third_party/move/move-model" }
# move-package = { path = "../aptos-core/third_party/move/tools/move-package" }
# move-prover = { path = "../aptos-core/third_party/move/move-prover" }
# move-prover-boogie-backend = { path = "../aptos-core/third_party/move/move-prover/boogie-backend" }
# move-prover-bytecode-pipeline = { path = "../aptos-core/third_party/move/move-prover/bytecode-pipeline" }
# move-resource-viewer = { path = "../aptos-core/third_party/move/tools/move-resource-viewer" }
# move-stackless-bytecode = { path = "../aptos-core/third_party/move/move-model/bytecode" }
# move-stdlib = { path = "../aptos-core/third_party/move/move-stdlib" }
# move-symbol-pool = { path = "../aptos-core/third_party/move/move-symbol-pool" }
# move-unit-test = { path = "../aptos-core/third_party/move/tools/move-unit-test" }
# move-vm-runtime = { path = "../aptos-core/third_party/move/move-vm/runtime" }
# move-vm-test-utils = { path = "../aptos-core/third_party/move/move-vm/test-utils" }
# move-vm-types = { path = "../aptos-core/third_party/move/move-vm/types" }
2 changes: 2 additions & 0 deletions crates/compiler/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ move-vm-test-utils = { workspace = true }
move-binary-format = { workspace = true }
move-model = { workspace = true }
legacy-move-compiler = { workspace = true }
move-compiler-v2 = { workspace = true }
move-linter = { workspace = true }
move-docgen = { workspace = true }
move-prover = { workspace = true }
move-prover-boogie-backend = { workspace = true }
Expand Down
86 changes: 79 additions & 7 deletions crates/compiler/src/built_package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::{docgen::DocgenPackage, extended_checks};
use anyhow::bail;
use codespan_reporting::{
diagnostic::Severity,
term::termcolor::{ColorChoice, StandardStream},
term::termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor},
};
use initia_move_types::metadata::{
self, RuntimeModuleMetadataV0, INITIA_METADATA_KEY_V0, METADATA_V0_MIN_FILE_FORMAT_VERSION,
Expand All @@ -11,8 +11,10 @@ use itertools::Itertools;
use legacy_move_compiler::compiled_unit::{CompiledUnit, NamedCompiledModule};
use move_binary_format::CompiledModule;
use move_command_line_common::files::MOVE_COMPILED_EXTENSION;
use move_compiler_v2::{options::Options, Experiment};
use move_core_types::{language_storage::ModuleId, metadata::Metadata};
use move_docgen::DocgenOptions;
use move_linter::MoveLintChecks;
use move_model::metadata::{CompilerVersion, LanguageVersion};
use move_package::{
compilation::{compiled_package::CompiledPackage, package_layout::CompiledPackageLayout},
Expand All @@ -21,7 +23,7 @@ use move_package::{
};
use std::{
collections::BTreeMap,
io::stderr,
io::{stderr, Write},
path::{Path, PathBuf},
};

Expand All @@ -45,7 +47,7 @@ impl BuiltPackage {
) -> anyhow::Result<Self> {
eprintln!("Compiling, may take a little while to download git dependencies...");
let generate_docs = config.generate_docs || docgen_options.is_some();
let bytecode_version = config.compiler_config.bytecode_version;
let external_checks = vec![MoveLintChecks::make()];

// customize config
let mut new_config = config.clone();
Expand All @@ -56,20 +58,39 @@ impl BuiltPackage {
.known_attributes
.clone_from(metadata::get_all_attribute_names());

// use v2 as default
// use latest stable version as default
if new_config.compiler_config.compiler_version.is_none() {
new_config.compiler_config.compiler_version = Some(CompilerVersion::V2_0);
new_config.compiler_config.compiler_version = Some(CompilerVersion::latest_stable());
}
if new_config.compiler_config.language_version.is_none() {
new_config.compiler_config.language_version = Some(LanguageVersion::V2_0);
new_config.compiler_config.language_version = Some(LanguageVersion::latest_stable());
}

// check versions
check_versions(
&new_config.compiler_config.compiler_version,
&new_config.compiler_config.language_version,
)?;

// infer bytecode version
let bytecode_version = inferred_bytecode_version(
new_config.compiler_config.language_version,
new_config.compiler_config.bytecode_version,
);
new_config.compiler_config.bytecode_version = bytecode_version;

let resolved_graph = Self::prepare_resolution_graph(&package_path, new_config.clone())?;
let (mut package, model_opt) =
new_config.compile_package_no_exit(resolved_graph, vec![], &mut stderr())?;
new_config.compile_package_no_exit(resolved_graph, external_checks, &mut stderr())?;

// Run extended checks as well as derive runtime metadata
let model = &model_opt.expect("move model");
if let Some(model_options) = model.get_extension::<Options>() {
if model_options.experiment_on(Experiment::STOP_BEFORE_EXTENDED_CHECKS) {
std::process::exit(if model.has_warnings() { 1 } else { 0 })
}
}

let runtime_metadata = extended_checks::run_extended_checks(model);
if model.diag_count(Severity::Warning) > 0 {
let mut error_writer = StandardStream::stderr(ColorChoice::Auto);
Expand All @@ -79,6 +100,14 @@ impl BuiltPackage {
}
}

if let Some(model_options) = model.get_extension::<Options>() {
if model_options.experiment_on(Experiment::FAIL_ON_WARNING) && model.has_warnings() {
bail!("found warning(s), and `--fail-on-warning` is set")
} else if model_options.experiment_on(Experiment::STOP_AFTER_EXTENDED_CHECKS) {
std::process::exit(if model.has_warnings() { 1 } else { 0 })
}
}

let compiled_pkg_path = package
.compiled_package_info
.build_flags
Expand Down Expand Up @@ -232,3 +261,46 @@ fn inject_runtime_metadata(
}
Ok(())
}

// Check versions and warn user if using unstable ones.
pub fn check_versions(
compiler_version: &Option<CompilerVersion>,
language_version: &Option<LanguageVersion>,
) -> anyhow::Result<()> {
let effective_compiler_version = compiler_version.unwrap_or_default();
let effective_language_version = language_version.unwrap_or_default();
let mut error_writer = StandardStream::stderr(ColorChoice::Auto);
if effective_compiler_version.unstable() {
error_writer.set_color(ColorSpec::new().set_fg(Some(Color::Yellow)))?;
writeln!(
&mut error_writer,
"Warning: compiler version `{}` is experimental \
and should not be used in production",
effective_compiler_version
)?;
error_writer.reset()?;
}
if effective_language_version.unstable() {
error_writer.set_color(ColorSpec::new().set_fg(Some(Color::Yellow)))?;
writeln!(
&mut error_writer,
"Warning: language version `{}` is experimental \
and should not be used in production",
effective_language_version
)?;
error_writer.reset()?;
}
effective_compiler_version.check_language_support(effective_language_version)?;
Ok(())
}

pub fn inferred_bytecode_version(
language_version: Option<LanguageVersion>,
bytecode_version: Option<u32>,
) -> Option<u32> {
Some(
language_version
.unwrap_or_default()
.infer_bytecode_version(bytecode_version),
)
}
Loading
Loading