@@ -26,9 +26,6 @@ use errors::emitter::Emitter;
2626use syntax_pos:: MultiSpan ;
2727use context:: { is_pie_binary, get_reloc_model} ;
2828
29- use std:: ascii;
30- use std:: char;
31- use std:: process:: Command ;
3229use std:: ffi:: { CStr , CString } ;
3330use std:: fs;
3431use std:: path:: { Path , PathBuf } ;
@@ -265,9 +262,6 @@ pub struct ModuleConfig {
265262 // make the object file bitcode. Provides easy compatibility with
266263 // emscripten's ecc compiler, when used as the linker.
267264 obj_is_bitcode : bool ,
268- // LLVM can't produce object files for MSP430. Instead, we'll make LLVM emit
269- // assembly and then use `msp430-as` to turn that assembly into an object file
270- obj_needs_as : bool ,
271265}
272266
273267unsafe impl Send for ModuleConfig { }
@@ -287,7 +281,6 @@ impl ModuleConfig {
287281 emit_asm : false ,
288282 emit_obj : false ,
289283 obj_is_bitcode : false ,
290- obj_needs_as : false ,
291284
292285 no_verify : false ,
293286 no_prepopulate_passes : false ,
@@ -307,7 +300,6 @@ impl ModuleConfig {
307300 self . time_passes = sess. time_passes ( ) ;
308301 self . inline_threshold = sess. opts . cg . inline_threshold ;
309302 self . obj_is_bitcode = sess. target . target . options . obj_is_bitcode ;
310- self . obj_needs_as = sess. target . target . options . obj_needs_as ;
311303
312304 // Copy what clang does by turning on loop vectorization at O2 and
313305 // slp vectorization at O3. Otherwise configure other optimization aspects
@@ -565,13 +557,10 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
565557 // machine code, instead copy the .o file from the .bc
566558 let write_bc = config. emit_bc || config. obj_is_bitcode ;
567559 let rm_bc = !config. emit_bc && config. obj_is_bitcode ;
568- let write_asm = config. emit_asm || config. obj_needs_as ;
569- let rm_asm = !config. emit_obj && config. obj_needs_as ;
570560 let write_obj = config. emit_obj && !config. obj_is_bitcode ;
571561 let copy_bc_to_obj = config. emit_obj && config. obj_is_bitcode ;
572562
573563 let bc_out = output_names. temp_path ( OutputType :: Bitcode , module_name) ;
574- let asm_out = output_names. temp_path ( OutputType :: Assembly , module_name) ;
575564 let obj_out = output_names. temp_path ( OutputType :: Object , module_name) ;
576565
577566 if write_bc {
@@ -589,25 +578,27 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
589578 } )
590579 }
591580
592- if write_asm {
581+ if config. emit_asm {
582+ let path = output_names. temp_path ( OutputType :: Assembly , module_name) ;
583+
593584 // We can't use the same module for asm and binary output, because that triggers
594585 // various errors like invalid IR or broken binaries, so we might have to clone the
595586 // module to produce the asm output
596- let llmod = if config. emit_obj && !config . obj_needs_as {
587+ let llmod = if config. emit_obj {
597588 llvm:: LLVMCloneModule ( llmod)
598589 } else {
599590 llmod
600591 } ;
601592 with_codegen ( tm, llmod, config. no_builtins , |cpm| {
602- write_output_file ( cgcx. handler , tm, cpm, llmod, & asm_out ,
593+ write_output_file ( cgcx. handler , tm, cpm, llmod, & path ,
603594 llvm:: FileType :: AssemblyFile ) ;
604595 } ) ;
605- if config. emit_obj && !config . obj_needs_as {
596+ if config. emit_obj {
606597 llvm:: LLVMDisposeModule ( llmod) ;
607598 }
608599 }
609600
610- if write_obj && !config . obj_needs_as {
601+ if write_obj {
611602 with_codegen ( tm, llmod, config. no_builtins , |cpm| {
612603 write_output_file ( cgcx. handler , tm, cpm, llmod, & obj_out,
613604 llvm:: FileType :: ObjectFile ) ;
@@ -622,73 +613,13 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
622613 }
623614 }
624615
625- if config. obj_needs_as {
626- // XXX most of the logic here has been copied from the link_natively
627- // function (src/librustc_trans/back/link.rs)
628- // TODO don't hardcode, maybe expose as a `as` field in the target
629- // specification
630- // TODO how to properly access `sess` here?
631- let mut cmd = Command :: new ( "msp430-as" ) ;
632- cmd. arg ( "-o" ) ;
633- cmd. arg ( obj_out) ;
634- cmd. arg ( & asm_out) ;
635-
636- info ! ( "{:?}" , & cmd) ;
637- // let prog = time(sess.time_passes(), "running assembler",
638- // || cmd.output());
639- let prog = cmd. output ( ) ;
640- match prog {
641- Ok ( prog) => {
642- fn escape_string ( s : & [ u8 ] ) -> String {
643- str:: from_utf8 ( s) . map ( |s| s. to_owned ( ) )
644- . unwrap_or_else ( |_| {
645- let mut x = "Non-UTF-8 output: " . to_string ( ) ;
646- x. extend ( s. iter ( )
647- . flat_map ( |& b| ascii:: escape_default ( b) )
648- . map ( |b| char:: from_u32 ( b as u32 ) . unwrap ( ) ) ) ;
649- x
650- } )
651- }
652- if !prog. status . success ( ) {
653- let mut output = prog. stderr . clone ( ) ;
654- output. extend_from_slice ( & prog. stdout ) ;
655- // sess.struct_err(&format!("assembling with `msp430-as` failed: {}",
656- // prog.status))
657- // .note(&format!("{:?}", &cmd))
658- // .note(&escape_string(&output[..]))
659- // .emit();
660- // sess.abort_if_errors();
661- }
662- info ! ( "linker stderr:\n {}" , escape_string( & prog. stderr[ ..] ) ) ;
663- info ! ( "linker stdout:\n {}" , escape_string( & prog. stdout[ ..] ) ) ;
664- } ,
665- Err ( _) => {
666- // sess.struct_err(&format!("could not exec the assembler `msp430-as`: {}", e))
667- // .note(&format!("{:?}", &cmd))
668- // .emit();
669- // if e.kind() == io::ErrorKind::NotFound {
670- // sess.note_without_error("MSP430 targets depend on the MSP430 assembler \
671- // but `msp430-as` was not found");
672- // }
673- // sess.abort_if_errors();
674- } ,
675- }
676- }
677-
678616 if rm_bc {
679617 debug ! ( "removing_bitcode {:?}" , bc_out) ;
680618 if let Err ( e) = fs:: remove_file ( & bc_out) {
681619 cgcx. handler . err ( & format ! ( "failed to remove bitcode: {}" , e) ) ;
682620 }
683621 }
684622
685- if rm_asm {
686- debug ! ( "removing_assembly {:?}" , bc_out) ;
687- if let Err ( e) = fs:: remove_file ( & asm_out) {
688- cgcx. handler . err ( & format ! ( "failed to remove assembly: {}" , e) ) ;
689- }
690- }
691-
692623 llvm:: LLVMRustDisposeTargetMachine ( tm) ;
693624}
694625
0 commit comments