forked from M-Labs/nac3
Determine size_t using LLVM target machine
This commit is contained in:
parent
266707df9d
commit
5faeede0e5
|
@ -24,6 +24,7 @@ use std::rc::Rc;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use inkwell::{
|
use inkwell::{
|
||||||
|
context::Context,
|
||||||
memory_buffer::MemoryBuffer,
|
memory_buffer::MemoryBuffer,
|
||||||
module::{Linkage, Module},
|
module::{Linkage, Module},
|
||||||
passes::PassBuilderOptions,
|
passes::PassBuilderOptions,
|
||||||
|
@ -625,7 +626,9 @@ impl Nac3 {
|
||||||
let buffer = buffer.as_slice().into();
|
let buffer = buffer.as_slice().into();
|
||||||
membuffer.lock().push(buffer);
|
membuffer.lock().push(buffer);
|
||||||
})));
|
})));
|
||||||
let size_t = if self.isa == Isa::Host { 64 } else { 32 };
|
let size_t = Context::create()
|
||||||
|
.ptr_sized_int_type(&self.get_llvm_target_machine().get_target_data(), None)
|
||||||
|
.get_bit_width();
|
||||||
let num_threads = if is_multithreaded() { 4 } else { 1 };
|
let num_threads = if is_multithreaded() { 4 } else { 1 };
|
||||||
let thread_names: Vec<String> = (0..num_threads).map(|_| "main".to_string()).collect();
|
let thread_names: Vec<String> = (0..num_threads).map(|_| "main".to_string()).collect();
|
||||||
let threads: Vec<_> = thread_names
|
let threads: Vec<_> = thread_names
|
||||||
|
|
|
@ -9,15 +9,11 @@
|
||||||
#![allow(clippy::too_many_lines, clippy::wildcard_imports)]
|
#![allow(clippy::too_many_lines, clippy::wildcard_imports)]
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
use inkwell::context::Context;
|
||||||
use inkwell::{
|
use inkwell::{
|
||||||
memory_buffer::MemoryBuffer, passes::PassBuilderOptions, support::is_multithreaded, targets::*,
|
memory_buffer::MemoryBuffer, passes::PassBuilderOptions, support::is_multithreaded, targets::*,
|
||||||
OptimizationLevel,
|
OptimizationLevel,
|
||||||
};
|
};
|
||||||
use parking_lot::{Mutex, RwLock};
|
|
||||||
use std::collections::HashSet;
|
|
||||||
use std::num::NonZeroUsize;
|
|
||||||
use std::{collections::HashMap, fs, path::Path, sync::Arc};
|
|
||||||
|
|
||||||
use nac3core::{
|
use nac3core::{
|
||||||
codegen::{
|
codegen::{
|
||||||
concrete_type::ConcreteTypeStore, irrt::load_irrt, CodeGenLLVMOptions,
|
concrete_type::ConcreteTypeStore, irrt::load_irrt, CodeGenLLVMOptions,
|
||||||
|
@ -39,6 +35,10 @@ use nac3parser::{
|
||||||
ast::{Constant, Expr, ExprKind, StmtKind, StrRef},
|
ast::{Constant, Expr, ExprKind, StmtKind, StrRef},
|
||||||
parser,
|
parser,
|
||||||
};
|
};
|
||||||
|
use parking_lot::{Mutex, RwLock};
|
||||||
|
use std::collections::HashSet;
|
||||||
|
use std::num::NonZeroUsize;
|
||||||
|
use std::{collections::HashMap, fs, path::Path, sync::Arc};
|
||||||
|
|
||||||
mod basic_symbol_resolver;
|
mod basic_symbol_resolver;
|
||||||
use basic_symbol_resolver::*;
|
use basic_symbol_resolver::*;
|
||||||
|
@ -241,8 +241,6 @@ fn handle_assignment_pattern(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
const SIZE_T: u32 = usize::BITS;
|
|
||||||
|
|
||||||
let cli = CommandLineArgs::parse();
|
let cli = CommandLineArgs::parse();
|
||||||
let CommandLineArgs { file_name, threads, opt_level, emit_llvm, triple, mcpu, target_features } =
|
let CommandLineArgs { file_name, threads, opt_level, emit_llvm, triple, mcpu, target_features } =
|
||||||
cli;
|
cli;
|
||||||
|
@ -275,6 +273,24 @@ fn main() {
|
||||||
_ => OptimizationLevel::Aggressive,
|
_ => OptimizationLevel::Aggressive,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let target_machine_options = CodeGenTargetMachineOptions {
|
||||||
|
triple,
|
||||||
|
cpu: mcpu,
|
||||||
|
features: target_features,
|
||||||
|
reloc_mode: RelocMode::PIC,
|
||||||
|
..host_target_machine
|
||||||
|
};
|
||||||
|
|
||||||
|
let size_t = Context::create()
|
||||||
|
.ptr_sized_int_type(
|
||||||
|
&target_machine_options
|
||||||
|
.create_target_machine(opt_level)
|
||||||
|
.map(|tm| tm.get_target_data())
|
||||||
|
.unwrap(),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.get_bit_width();
|
||||||
|
|
||||||
let program = match fs::read_to_string(file_name.clone()) {
|
let program = match fs::read_to_string(file_name.clone()) {
|
||||||
Ok(program) => program,
|
Ok(program) => program,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
@ -283,9 +299,9 @@ fn main() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let primitive: PrimitiveStore = TopLevelComposer::make_primitives(SIZE_T).0;
|
let primitive: PrimitiveStore = TopLevelComposer::make_primitives(size_t).0;
|
||||||
let (mut composer, builtins_def, builtins_ty) =
|
let (mut composer, builtins_def, builtins_ty) =
|
||||||
TopLevelComposer::new(vec![], ComposerConfig::default(), SIZE_T);
|
TopLevelComposer::new(vec![], ComposerConfig::default(), size_t);
|
||||||
|
|
||||||
let internal_resolver: Arc<ResolverInternal> = ResolverInternal {
|
let internal_resolver: Arc<ResolverInternal> = ResolverInternal {
|
||||||
id_to_type: builtins_ty.into(),
|
id_to_type: builtins_ty.into(),
|
||||||
|
@ -373,16 +389,7 @@ fn main() {
|
||||||
instance_to_stmt[""].clone()
|
instance_to_stmt[""].clone()
|
||||||
};
|
};
|
||||||
|
|
||||||
let llvm_options = CodeGenLLVMOptions {
|
let llvm_options = CodeGenLLVMOptions { opt_level, target: target_machine_options };
|
||||||
opt_level,
|
|
||||||
target: CodeGenTargetMachineOptions {
|
|
||||||
triple,
|
|
||||||
cpu: mcpu,
|
|
||||||
features: target_features,
|
|
||||||
reloc_mode: RelocMode::PIC,
|
|
||||||
..host_target_machine
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
let task = CodeGenTask {
|
let task = CodeGenTask {
|
||||||
subst: Vec::default(),
|
subst: Vec::default(),
|
||||||
|
@ -405,7 +412,7 @@ fn main() {
|
||||||
membuffer.lock().push(buffer);
|
membuffer.lock().push(buffer);
|
||||||
})));
|
})));
|
||||||
let threads = (0..threads)
|
let threads = (0..threads)
|
||||||
.map(|i| Box::new(DefaultCodeGenerator::new(format!("module{i}"), SIZE_T)))
|
.map(|i| Box::new(DefaultCodeGenerator::new(format!("module{i}"), size_t)))
|
||||||
.collect();
|
.collect();
|
||||||
let (registry, handles) = WorkerRegistry::create_workers(threads, top_level, &llvm_options, &f);
|
let (registry, handles) = WorkerRegistry::create_workers(threads, top_level, &llvm_options, &f);
|
||||||
registry.add_task(task);
|
registry.add_task(task);
|
||||||
|
|
Loading…
Reference in New Issue