mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-06-14 22:41:07 +00:00
87c1d7a8be
- Support for passing LLVM command line options via the prcoess input or providing one or more `--llvm-arg='..'` resolc CLI flag. This allows more fine-grained control over the LLVM backend configuration. - Make LLVM initialization idempotent. --------- Signed-off-by: Cyrill Leutwiler <bigcyrill@hotmail.com>
143 lines
4.2 KiB
Rust
143 lines
4.2 KiB
Rust
//! The LLVM IR generator context tests.
|
|
|
|
use crate::optimizer::settings::Settings as OptimizerSettings;
|
|
use crate::optimizer::Optimizer;
|
|
use crate::polkavm::context::attribute::Attribute;
|
|
use crate::polkavm::context::Context;
|
|
use crate::polkavm::DummyDependency;
|
|
|
|
pub fn create_context(
|
|
llvm: &inkwell::context::Context,
|
|
optimizer_settings: OptimizerSettings,
|
|
) -> Context<DummyDependency> {
|
|
crate::initialize_llvm(crate::Target::PVM, "resolc", Default::default());
|
|
|
|
let module = llvm.create_module("test");
|
|
let optimizer = Optimizer::new(optimizer_settings);
|
|
|
|
Context::<DummyDependency>::new(
|
|
llvm,
|
|
module,
|
|
optimizer,
|
|
None,
|
|
true,
|
|
Default::default(),
|
|
Default::default(),
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
pub fn check_attribute_null_pointer_is_invalid() {
|
|
let llvm = inkwell::context::Context::create();
|
|
let mut context = create_context(&llvm, OptimizerSettings::cycles());
|
|
|
|
let function = context
|
|
.add_function(
|
|
"test",
|
|
context
|
|
.word_type()
|
|
.fn_type(&[context.word_type().into()], false),
|
|
1,
|
|
Some(inkwell::module::Linkage::External),
|
|
)
|
|
.expect("Failed to add function");
|
|
assert!(!function
|
|
.borrow()
|
|
.declaration()
|
|
.value
|
|
.attributes(inkwell::attributes::AttributeLoc::Function)
|
|
.contains(&llvm.create_enum_attribute(Attribute::NullPointerIsValid as u32, 0)));
|
|
}
|
|
|
|
#[test]
|
|
pub fn check_attribute_optimize_for_size_mode_3() {
|
|
let llvm = inkwell::context::Context::create();
|
|
let mut context = create_context(&llvm, OptimizerSettings::cycles());
|
|
|
|
let function = context
|
|
.add_function(
|
|
"test",
|
|
context
|
|
.word_type()
|
|
.fn_type(&[context.word_type().into()], false),
|
|
1,
|
|
Some(inkwell::module::Linkage::External),
|
|
)
|
|
.expect("Failed to add function");
|
|
assert!(!function
|
|
.borrow()
|
|
.declaration()
|
|
.value
|
|
.attributes(inkwell::attributes::AttributeLoc::Function)
|
|
.contains(&llvm.create_enum_attribute(Attribute::OptimizeForSize as u32, 0)));
|
|
}
|
|
|
|
#[test]
|
|
pub fn check_attribute_optimize_for_size_mode_z() {
|
|
let llvm = inkwell::context::Context::create();
|
|
let mut context = create_context(&llvm, OptimizerSettings::size());
|
|
|
|
let function = context
|
|
.add_function(
|
|
"test",
|
|
context
|
|
.word_type()
|
|
.fn_type(&[context.word_type().into()], false),
|
|
1,
|
|
Some(inkwell::module::Linkage::External),
|
|
)
|
|
.expect("Failed to add function");
|
|
assert!(function
|
|
.borrow()
|
|
.declaration()
|
|
.value
|
|
.attributes(inkwell::attributes::AttributeLoc::Function)
|
|
.contains(&llvm.create_enum_attribute(Attribute::OptimizeForSize as u32, 0)));
|
|
}
|
|
|
|
#[test]
|
|
pub fn check_attribute_min_size_mode_3() {
|
|
let llvm = inkwell::context::Context::create();
|
|
let mut context = create_context(&llvm, OptimizerSettings::cycles());
|
|
|
|
let function = context
|
|
.add_function(
|
|
"test",
|
|
context
|
|
.word_type()
|
|
.fn_type(&[context.word_type().into()], false),
|
|
1,
|
|
Some(inkwell::module::Linkage::External),
|
|
)
|
|
.expect("Failed to add function");
|
|
assert!(!function
|
|
.borrow()
|
|
.declaration()
|
|
.value
|
|
.attributes(inkwell::attributes::AttributeLoc::Function)
|
|
.contains(&llvm.create_enum_attribute(Attribute::MinSize as u32, 0)));
|
|
}
|
|
|
|
#[test]
|
|
pub fn check_attribute_min_size_mode_z() {
|
|
let llvm = inkwell::context::Context::create();
|
|
let mut context = create_context(&llvm, OptimizerSettings::size());
|
|
|
|
let function = context
|
|
.add_function(
|
|
"test",
|
|
context
|
|
.word_type()
|
|
.fn_type(&[context.word_type().into()], false),
|
|
1,
|
|
Some(inkwell::module::Linkage::External),
|
|
)
|
|
.expect("Failed to add function");
|
|
assert!(function
|
|
.borrow()
|
|
.declaration()
|
|
.value
|
|
.attributes(inkwell::attributes::AttributeLoc::Function)
|
|
.contains(&llvm.create_enum_attribute(Attribute::MinSize as u32, 0)));
|
|
}
|