Files
revive/crates/llvm-builder/tests/common.rs
T
LJ 3dc84349d9 Apply LLVM patches for deterministic operand order and correct peephole optimization for minsize (#500)
## Description

Applies LLVM patches that have not been backported to the major version
used in our submodule:

* [LLVM PR #163679](https://github.com/llvm/llvm-project/pull/163679)
  * *"[RISCV] Allow large div peephole optimization for minsize"*
* Fixes peephole optimization of large integers when `minsize` function
attribute is set.
* (Our revive codebase used a workaround that can be removed once this
500 PR is merged and we publish a new LLVM release.)
* [LLVM PR #190219](https://github.com/llvm/llvm-project/pull/190219)
* *"[TargetLowering] Speculative fix for a non-determinism issue between
different compilers"*
* Operand ordering of `mul i256` were different depending on the target
ABI when building LLVM, producing different RISC-V and PVM bytecode for
our Windows vs macOS/linux builds.
* The bytecode divergence (yet functionally equivalent) affected
Solidity contracts containing a value [multiplied by
itself](https://github.com/llvm/llvm-project/issues/190148) (e.g. via
explicit squaring or exponentiation), manifesting primarily when using
optimization level `-O0`.
2026-04-09 17:33:09 +02:00

56 lines
1.3 KiB
Rust

use assert_fs::TempDir;
pub const REVIVE_LLVM: &str = "revive-llvm";
pub struct TestDir {
_tempdir: TempDir,
path: std::path::PathBuf,
}
/// Creates a temporary directory for testing with submodule setup.
impl TestDir {
pub fn new() -> anyhow::Result<Self> {
let tempdir = TempDir::new()?;
let tmppath = tempdir.path();
// Initialize a git repo and add the LLVM submodule
std::process::Command::new("git")
.args(["init"])
.current_dir(tmppath)
.output()?;
std::process::Command::new("git")
.args([
"submodule",
"add",
"-b",
"release/21.x",
"https://github.com/llvm/llvm-project.git",
"llvm",
])
.current_dir(tmppath)
.output()?;
std::process::Command::new("git")
.args([
"submodule",
"update",
"--init",
"--recursive",
"--force",
"--depth 1",
])
.current_dir(tmppath)
.output()?;
Ok(Self {
path: tmppath.to_path_buf(),
_tempdir: tempdir,
})
}
pub fn path(&self) -> &std::path::Path {
&self.path
}
}