Add flags and cpu to options that are configurable
This commit is contained in:
parent
dbd539fb76
commit
023d3b75b6
@ -56,6 +56,8 @@ impl Drop for LLVMContext {
|
||||
pub struct CompiledModule {
|
||||
module_ref: LLVMModuleRef,
|
||||
_context: LLVMContext,
|
||||
cpu: String,
|
||||
features: String,
|
||||
}
|
||||
|
||||
pub struct CompileOutput {
|
||||
@ -84,8 +86,8 @@ impl CompiledModule {
|
||||
let target_machine = LLVMCreateTargetMachine(
|
||||
target,
|
||||
triple,
|
||||
c"generic".as_ptr(),
|
||||
c"".as_ptr(),
|
||||
into_cstring(self.cpu.clone()).as_ptr(),
|
||||
into_cstring(self.features.clone()).as_ptr(),
|
||||
llvm_sys::target_machine::LLVMCodeGenOptLevel::LLVMCodeGenLevelLess,
|
||||
llvm_sys::target_machine::LLVMRelocMode::LLVMRelocDefault,
|
||||
llvm_sys::target_machine::LLVMCodeModel::LLVMCodeModelDefault,
|
||||
@ -142,7 +144,7 @@ impl CompiledModule {
|
||||
}
|
||||
|
||||
impl Context {
|
||||
pub fn compile(&self) -> CompiledModule {
|
||||
pub fn compile(&self, cpu: Option<String>, features: Vec<String>) -> CompiledModule {
|
||||
unsafe {
|
||||
let context_ref = LLVMContextCreate();
|
||||
|
||||
@ -173,6 +175,8 @@ impl Context {
|
||||
CompiledModule {
|
||||
module_ref: main_module_ref,
|
||||
_context: context,
|
||||
cpu: cpu.unwrap_or("generic".to_owned()),
|
||||
features: features.join(","),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,10 @@ fn main() -> Result<(), std::io::Error> {
|
||||
|
||||
let text = fs::read_to_string(&path)?;
|
||||
|
||||
match compile_simple(&text, PathBuf::from(&path)) {
|
||||
let cpu = std::env::var("CPU").unwrap_or("generic".to_owned());
|
||||
let features = std::env::var("REIDFLAGS").unwrap_or("".to_owned());
|
||||
|
||||
match compile_simple(&text, PathBuf::from(&path), Some(cpu), vec![features]) {
|
||||
Ok((
|
||||
CompileOutput {
|
||||
triple,
|
||||
|
@ -19,12 +19,9 @@ use crate::{
|
||||
intrinsics::IntrinsicFunction,
|
||||
lexer::{FullToken, Position},
|
||||
mir::{
|
||||
self,
|
||||
implement::TypeCategory,
|
||||
pass::{ScopeBinopDef, ScopeBinopKey},
|
||||
CustomTypeKey, FunctionDefinitionKind, Metadata, NamedVariableRef, SourceModuleId,
|
||||
StructField, StructType, TypeDefinition, TypeDefinitionKind, TypeKind, VagueLiteral,
|
||||
WhileStatement,
|
||||
self, implement::TypeCategory, pass::ScopeBinopKey, CustomTypeKey, FunctionDefinitionKind,
|
||||
Metadata, NamedVariableRef, SourceModuleId, StructField, StructType, TypeDefinition,
|
||||
TypeDefinitionKind, TypeKind, VagueLiteral, WhileStatement,
|
||||
},
|
||||
util::try_all,
|
||||
};
|
||||
@ -45,8 +42,8 @@ pub struct CodegenContext<'ctx> {
|
||||
impl<'ctx> CodegenContext<'ctx> {
|
||||
/// Compile contained LLIR into LLVM IR and produce `hello.o` and
|
||||
/// `hello.asm`
|
||||
pub fn compile(&self) -> CompiledModule {
|
||||
self.context.compile()
|
||||
pub fn compile(&self, cpu: Option<String>, features: Vec<String>) -> CompiledModule {
|
||||
self.context.compile(cpu, features)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -216,6 +216,8 @@ pub fn compile_and_pass<'map>(
|
||||
source: &str,
|
||||
path: PathBuf,
|
||||
module_map: &'map mut ErrorModules,
|
||||
cpu: Option<String>,
|
||||
features: Vec<String>,
|
||||
) -> Result<(CompileOutput, CustomIRs), ReidError> {
|
||||
let path = path.canonicalize().unwrap();
|
||||
let name = path.file_name().unwrap().to_str().unwrap().to_owned();
|
||||
@ -241,7 +243,7 @@ pub fn compile_and_pass<'map>(
|
||||
#[cfg(debug_assertions)]
|
||||
println!("{}", &codegen_modules.context);
|
||||
|
||||
let compiled = codegen_modules.compile();
|
||||
let compiled = codegen_modules.compile(cpu, features);
|
||||
Ok((
|
||||
compiled.output(),
|
||||
CustomIRs {
|
||||
@ -259,7 +261,9 @@ pub struct CustomIRs {
|
||||
pub fn compile_simple(
|
||||
source: &str,
|
||||
path: PathBuf,
|
||||
cpu: Option<String>,
|
||||
features: Vec<String>,
|
||||
) -> Result<(CompileOutput, CustomIRs), ReidError> {
|
||||
let mut map = ErrorModules::default();
|
||||
compile_and_pass(source, path, &mut map)
|
||||
compile_and_pass(source, path, &mut map, cpu, features)
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ fn test(source: &str, name: &str, expected_exit_code: Option<i32>) {
|
||||
|
||||
let codegen = assert_err(mir_context.codegen(&context));
|
||||
|
||||
let output = codegen.compile().output();
|
||||
let output = codegen.compile(None, Vec::new()).output();
|
||||
let time = SystemTime::now();
|
||||
let in_path = PathBuf::from(format!(
|
||||
"/tmp/temp-{}.o",
|
||||
|
Loading…
Reference in New Issue
Block a user