@@ -26,9 +26,6 @@ use errors::emitter::Emitter;
26
26
use syntax_pos:: MultiSpan ;
27
27
use context:: { is_pie_binary, get_reloc_model} ;
28
28
29
- use std:: ascii;
30
- use std:: char;
31
- use std:: process:: Command ;
32
29
use std:: ffi:: { CStr , CString } ;
33
30
use std:: fs;
34
31
use std:: path:: { Path , PathBuf } ;
@@ -265,9 +262,6 @@ pub struct ModuleConfig {
265
262
// make the object file bitcode. Provides easy compatibility with
266
263
// emscripten's ecc compiler, when used as the linker.
267
264
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 ,
271
265
}
272
266
273
267
unsafe impl Send for ModuleConfig { }
@@ -287,7 +281,6 @@ impl ModuleConfig {
287
281
emit_asm : false ,
288
282
emit_obj : false ,
289
283
obj_is_bitcode : false ,
290
- obj_needs_as : false ,
291
284
292
285
no_verify : false ,
293
286
no_prepopulate_passes : false ,
@@ -307,7 +300,6 @@ impl ModuleConfig {
307
300
self . time_passes = sess. time_passes ( ) ;
308
301
self . inline_threshold = sess. opts . cg . inline_threshold ;
309
302
self . obj_is_bitcode = sess. target . target . options . obj_is_bitcode ;
310
- self . obj_needs_as = sess. target . target . options . obj_needs_as ;
311
303
312
304
// Copy what clang does by turning on loop vectorization at O2 and
313
305
// slp vectorization at O3. Otherwise configure other optimization aspects
@@ -565,13 +557,10 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
565
557
// machine code, instead copy the .o file from the .bc
566
558
let write_bc = config. emit_bc || config. obj_is_bitcode ;
567
559
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 ;
570
560
let write_obj = config. emit_obj && !config. obj_is_bitcode ;
571
561
let copy_bc_to_obj = config. emit_obj && config. obj_is_bitcode ;
572
562
573
563
let bc_out = output_names. temp_path ( OutputType :: Bitcode , module_name) ;
574
- let asm_out = output_names. temp_path ( OutputType :: Assembly , module_name) ;
575
564
let obj_out = output_names. temp_path ( OutputType :: Object , module_name) ;
576
565
577
566
if write_bc {
@@ -589,25 +578,27 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
589
578
} )
590
579
}
591
580
592
- if write_asm {
581
+ if config. emit_asm {
582
+ let path = output_names. temp_path ( OutputType :: Assembly , module_name) ;
583
+
593
584
// We can't use the same module for asm and binary output, because that triggers
594
585
// various errors like invalid IR or broken binaries, so we might have to clone the
595
586
// module to produce the asm output
596
- let llmod = if config. emit_obj && !config . obj_needs_as {
587
+ let llmod = if config. emit_obj {
597
588
llvm:: LLVMCloneModule ( llmod)
598
589
} else {
599
590
llmod
600
591
} ;
601
592
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 ,
603
594
llvm:: FileType :: AssemblyFile ) ;
604
595
} ) ;
605
- if config. emit_obj && !config . obj_needs_as {
596
+ if config. emit_obj {
606
597
llvm:: LLVMDisposeModule ( llmod) ;
607
598
}
608
599
}
609
600
610
- if write_obj && !config . obj_needs_as {
601
+ if write_obj {
611
602
with_codegen ( tm, llmod, config. no_builtins , |cpm| {
612
603
write_output_file ( cgcx. handler , tm, cpm, llmod, & obj_out,
613
604
llvm:: FileType :: ObjectFile ) ;
@@ -622,73 +613,13 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
622
613
}
623
614
}
624
615
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
-
678
616
if rm_bc {
679
617
debug ! ( "removing_bitcode {:?}" , bc_out) ;
680
618
if let Err ( e) = fs:: remove_file ( & bc_out) {
681
619
cgcx. handler . err ( & format ! ( "failed to remove bitcode: {}" , e) ) ;
682
620
}
683
621
}
684
622
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
-
692
623
llvm:: LLVMRustDisposeTargetMachine ( tm) ;
693
624
}
694
625
0 commit comments