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 { | pub struct CompiledModule { | ||||||
|     module_ref: LLVMModuleRef, |     module_ref: LLVMModuleRef, | ||||||
|     _context: LLVMContext, |     _context: LLVMContext, | ||||||
|  |     cpu: String, | ||||||
|  |     features: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub struct CompileOutput { | pub struct CompileOutput { | ||||||
| @ -84,8 +86,8 @@ impl CompiledModule { | |||||||
|             let target_machine = LLVMCreateTargetMachine( |             let target_machine = LLVMCreateTargetMachine( | ||||||
|                 target, |                 target, | ||||||
|                 triple, |                 triple, | ||||||
|                 c"generic".as_ptr(), |                 into_cstring(self.cpu.clone()).as_ptr(), | ||||||
|                 c"".as_ptr(), |                 into_cstring(self.features.clone()).as_ptr(), | ||||||
|                 llvm_sys::target_machine::LLVMCodeGenOptLevel::LLVMCodeGenLevelLess, |                 llvm_sys::target_machine::LLVMCodeGenOptLevel::LLVMCodeGenLevelLess, | ||||||
|                 llvm_sys::target_machine::LLVMRelocMode::LLVMRelocDefault, |                 llvm_sys::target_machine::LLVMRelocMode::LLVMRelocDefault, | ||||||
|                 llvm_sys::target_machine::LLVMCodeModel::LLVMCodeModelDefault, |                 llvm_sys::target_machine::LLVMCodeModel::LLVMCodeModelDefault, | ||||||
| @ -142,7 +144,7 @@ impl CompiledModule { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Context { | impl Context { | ||||||
|     pub fn compile(&self) -> CompiledModule { |     pub fn compile(&self, cpu: Option<String>, features: Vec<String>) -> CompiledModule { | ||||||
|         unsafe { |         unsafe { | ||||||
|             let context_ref = LLVMContextCreate(); |             let context_ref = LLVMContextCreate(); | ||||||
| 
 | 
 | ||||||
| @ -173,6 +175,8 @@ impl Context { | |||||||
|             CompiledModule { |             CompiledModule { | ||||||
|                 module_ref: main_module_ref, |                 module_ref: main_module_ref, | ||||||
|                 _context: context, |                 _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)?; |         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(( |             Ok(( | ||||||
|                 CompileOutput { |                 CompileOutput { | ||||||
|                     triple, |                     triple, | ||||||
|  | |||||||
| @ -19,12 +19,9 @@ use crate::{ | |||||||
|     intrinsics::IntrinsicFunction, |     intrinsics::IntrinsicFunction, | ||||||
|     lexer::{FullToken, Position}, |     lexer::{FullToken, Position}, | ||||||
|     mir::{ |     mir::{ | ||||||
|         self, |         self, implement::TypeCategory, pass::ScopeBinopKey, CustomTypeKey, FunctionDefinitionKind, | ||||||
|         implement::TypeCategory, |         Metadata, NamedVariableRef, SourceModuleId, StructField, StructType, TypeDefinition, | ||||||
|         pass::{ScopeBinopDef, ScopeBinopKey}, |         TypeDefinitionKind, TypeKind, VagueLiteral, WhileStatement, | ||||||
|         CustomTypeKey, FunctionDefinitionKind, Metadata, NamedVariableRef, SourceModuleId, |  | ||||||
|         StructField, StructType, TypeDefinition, TypeDefinitionKind, TypeKind, VagueLiteral, |  | ||||||
|         WhileStatement, |  | ||||||
|     }, |     }, | ||||||
|     util::try_all, |     util::try_all, | ||||||
| }; | }; | ||||||
| @ -45,8 +42,8 @@ pub struct CodegenContext<'ctx> { | |||||||
| impl<'ctx> CodegenContext<'ctx> { | impl<'ctx> CodegenContext<'ctx> { | ||||||
|     /// Compile contained LLIR into LLVM IR and produce `hello.o` and
 |     /// Compile contained LLIR into LLVM IR and produce `hello.o` and
 | ||||||
|     /// `hello.asm`
 |     /// `hello.asm`
 | ||||||
|     pub fn compile(&self) -> CompiledModule { |     pub fn compile(&self, cpu: Option<String>, features: Vec<String>) -> CompiledModule { | ||||||
|         self.context.compile() |         self.context.compile(cpu, features) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -216,6 +216,8 @@ pub fn compile_and_pass<'map>( | |||||||
|     source: &str, |     source: &str, | ||||||
|     path: PathBuf, |     path: PathBuf, | ||||||
|     module_map: &'map mut ErrorModules, |     module_map: &'map mut ErrorModules, | ||||||
|  |     cpu: Option<String>, | ||||||
|  |     features: Vec<String>, | ||||||
| ) -> Result<(CompileOutput, CustomIRs), ReidError> { | ) -> Result<(CompileOutput, CustomIRs), ReidError> { | ||||||
|     let path = path.canonicalize().unwrap(); |     let path = path.canonicalize().unwrap(); | ||||||
|     let name = path.file_name().unwrap().to_str().unwrap().to_owned(); |     let name = path.file_name().unwrap().to_str().unwrap().to_owned(); | ||||||
| @ -241,7 +243,7 @@ pub fn compile_and_pass<'map>( | |||||||
|     #[cfg(debug_assertions)] |     #[cfg(debug_assertions)] | ||||||
|     println!("{}", &codegen_modules.context); |     println!("{}", &codegen_modules.context); | ||||||
| 
 | 
 | ||||||
|     let compiled = codegen_modules.compile(); |     let compiled = codegen_modules.compile(cpu, features); | ||||||
|     Ok(( |     Ok(( | ||||||
|         compiled.output(), |         compiled.output(), | ||||||
|         CustomIRs { |         CustomIRs { | ||||||
| @ -259,7 +261,9 @@ pub struct CustomIRs { | |||||||
| pub fn compile_simple( | pub fn compile_simple( | ||||||
|     source: &str, |     source: &str, | ||||||
|     path: PathBuf, |     path: PathBuf, | ||||||
|  |     cpu: Option<String>, | ||||||
|  |     features: Vec<String>, | ||||||
| ) -> Result<(CompileOutput, CustomIRs), ReidError> { | ) -> Result<(CompileOutput, CustomIRs), ReidError> { | ||||||
|     let mut map = ErrorModules::default(); |     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 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 time = SystemTime::now(); | ||||||
|         let in_path = PathBuf::from(format!( |         let in_path = PathBuf::from(format!( | ||||||
|             "/tmp/temp-{}.o", |             "/tmp/temp-{}.o", | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user