@@ -32,11 +32,14 @@ tag output_type {
32
32
output_type_exe;
33
33
}
34
34
35
- fn llvm_err ( sess : session:: session , msg : str ) {
35
+ fn llvm_err ( sess : session:: session , msg : & istr ) {
36
36
let buf = llvm:: LLVMRustGetLastError ( ) ;
37
37
if buf as uint == 0 u {
38
- sess. fatal ( msg) ;
39
- } else { sess. fatal ( msg + ": " + str:: str_from_cstr ( buf) ) ; }
38
+ sess. fatal ( istr:: to_estr ( msg) ) ;
39
+ } else {
40
+ sess. fatal (
41
+ istr:: to_estr ( msg) + ": " + str:: str_from_cstr ( buf) ) ;
42
+ }
40
43
}
41
44
42
45
fn link_intrinsics ( sess : session:: session , llmod : ModuleRef ) {
@@ -46,19 +49,20 @@ fn link_intrinsics(sess: session::session, llmod: ModuleRef) {
46
49
let membuf =
47
50
llvm:: LLVMRustCreateMemoryBufferWithContentsOfFile ( str:: buf ( path) ) ;
48
51
if membuf as uint == 0 u {
49
- llvm_err ( sess, "installation problem: couldn't open " + path) ;
52
+ llvm_err ( sess, ~"installation problem: couldn' t open "
53
+ + istr::from_estr(path));
50
54
fail;
51
55
}
52
56
let llintrinsicsmod = llvm::LLVMRustParseBitcode(membuf);
53
57
llvm::LLVMDisposeMemoryBuffer(membuf);
54
58
if llintrinsicsmod as uint == 0u {
55
- llvm_err ( sess, "installation problem: couldn't parse intrinsics.bc" ) ;
59
+ llvm_err(sess, ~ " installation problem: couldn' t parse intrinsics. bc") ;
56
60
fail;
57
61
}
58
62
let linkres = llvm:: LLVMLinkModules ( llmod, llintrinsicsmod) ;
59
63
llvm:: LLVMDisposeModule ( llintrinsicsmod) ;
60
64
if linkres == False {
61
- llvm_err ( sess, "couldn't link the module with the intrinsics" ) ;
65
+ llvm_err( sess, ~ "couldn' t link the module with the intrinsics") ;
62
66
fail;
63
67
}
64
68
}
@@ -74,15 +78,15 @@ mod write {
74
78
75
79
// Decides what to call an intermediate file, given the name of the output
76
80
// and the extension to use.
77
- fn mk_intermediate_name ( output_path : str , extension : str ) -> str {
78
- let dot_pos = str :: index ( output_path, '.' as u8 ) ;
81
+ fn mk_intermediate_name ( output_path : & istr , extension : & istr ) -> istr {
82
+ let dot_pos = istr :: index ( output_path, '.' as u8 ) ;
79
83
let stem;
80
84
if dot_pos < 0 {
81
85
stem = output_path;
82
- } else { stem = str :: substr ( output_path, 0 u, dot_pos as uint ) ; }
83
- ret stem + "." + extension;
86
+ } else { stem = istr :: substr ( output_path, 0 u, dot_pos as uint ) ; }
87
+ ret stem + ~ ". " + extension;
84
88
}
85
- fn run_passes ( sess : session:: session , llmod : ModuleRef , output : str ) {
89
+ fn run_passes ( sess : session:: session , llmod : ModuleRef , output : & istr ) {
86
90
let opts = sess. get_opts ( ) ;
87
91
if opts. time_llvm_passes { llvm:: LLVMRustEnableTimePasses ( ) ; }
88
92
link_intrinsics ( sess, llmod) ;
@@ -99,12 +103,14 @@ mod write {
99
103
alt opts. output_type {
100
104
output_type_bitcode. {
101
105
if opts. optimize != 0 u {
102
- let filename = mk_intermediate_name ( output, "no-opt.bc" ) ;
106
+ let filename = mk_intermediate_name ( output, ~"no-opt. bc ") ;
107
+ let filename = istr:: to_estr ( filename) ;
103
108
llvm:: LLVMWriteBitcodeToFile ( llmod, str:: buf ( filename) ) ;
104
109
}
105
110
}
106
111
_ {
107
- let filename = mk_intermediate_name ( output, "bc" ) ;
112
+ let filename = mk_intermediate_name ( output, ~"bc") ;
113
+ let filename = istr:: to_estr ( filename) ;
108
114
llvm:: LLVMWriteBitcodeToFile ( llmod, str:: buf ( filename) ) ;
109
115
}
110
116
}
@@ -176,14 +182,16 @@ mod write {
176
182
if opts. save_temps {
177
183
// Always output the bitcode file with --save-temps
178
184
179
- let filename = mk_intermediate_name ( output, "opt.bc" ) ;
185
+ let filename = mk_intermediate_name ( output, ~"opt. bc ") ;
186
+ let filename = istr:: to_estr ( filename) ;
180
187
llvm:: LLVMRunPassManager ( pm. llpm , llmod) ;
181
188
llvm:: LLVMWriteBitcodeToFile ( llmod, str:: buf ( filename) ) ;
182
189
pm = mk_pass_manager ( ) ;
183
190
// Save the assembly file if -S is used
184
191
185
192
if opts. output_type == output_type_assembly {
186
193
let triple = x86:: get_target_triple ( ) ;
194
+ let output = istr:: to_estr ( output) ;
187
195
llvm:: LLVMRustWriteOutputFile ( pm. llpm , llmod,
188
196
str:: buf ( triple) ,
189
197
str:: buf ( output) ,
@@ -197,6 +205,7 @@ mod write {
197
205
if opts. output_type == output_type_object ||
198
206
opts. output_type == output_type_exe {
199
207
let triple = x86:: get_target_triple ( ) ;
208
+ let output = istr:: to_estr ( output) ;
200
209
llvm:: LLVMRustWriteOutputFile ( pm. llpm , llmod,
201
210
str:: buf ( triple) ,
202
211
str:: buf ( output) ,
@@ -208,6 +217,7 @@ mod write {
208
217
// type corresponding to the '-c' or '-S' flag used
209
218
210
219
let triple = x86:: get_target_triple ( ) ;
220
+ let output = istr:: to_estr ( output) ;
211
221
llvm:: LLVMRustWriteOutputFile ( pm. llpm , llmod,
212
222
str:: buf ( triple) ,
213
223
str:: buf ( output) , FileType ,
@@ -223,6 +233,7 @@ mod write {
223
233
// flag, then output it here
224
234
225
235
llvm:: LLVMRunPassManager ( pm. llpm , llmod) ;
236
+ let output = istr:: to_estr ( output) ;
226
237
llvm:: LLVMWriteBitcodeToFile ( llmod, str:: buf ( output) ) ;
227
238
llvm:: LLVMDisposeModule ( llmod) ;
228
239
if opts. time_llvm_passes { llvm:: LLVMRustPrintPassTimings ( ) ; }
@@ -281,32 +292,32 @@ mod write {
281
292
*
282
293
*/
283
294
284
- type link_meta = { name : str , vers : str , extras_hash : str } ;
295
+ type link_meta = { name : istr , vers : istr , extras_hash : istr } ;
285
296
286
- fn build_link_meta ( sess : & session:: session , c : & ast:: crate , output : & str ,
297
+ fn build_link_meta ( sess : & session:: session , c : & ast:: crate , output : & istr ,
287
298
sha : sha1 ) -> link_meta {
288
299
289
300
type provided_metas =
290
- { name : option:: t < str > ,
291
- vers : option:: t < str > ,
301
+ { name : option:: t < istr > ,
302
+ vers : option:: t < istr > ,
292
303
cmh_items : [ @ast:: meta_item ] } ;
293
304
294
305
fn provided_link_metas ( sess : & session:: session , c : & ast:: crate ) ->
295
306
provided_metas {
296
- let name: option:: t < str > = none;
297
- let vers: option:: t < str > = none;
307
+ let name: option:: t < istr > = none;
308
+ let vers: option:: t < istr > = none;
298
309
let cmh_items: [ @ast:: meta_item ] = [ ] ;
299
310
let linkage_metas = attr:: find_linkage_metas ( c. node . attrs ) ;
300
311
attr:: require_unique_names ( sess, linkage_metas) ;
301
312
for meta: @ast:: meta_item in linkage_metas {
302
313
if attr:: get_meta_item_name ( meta) == ~"name" {
303
314
alt attr:: get_meta_item_value_str ( meta) {
304
- some ( v) { name = some ( v ) ; }
315
+ some ( v) { name = some ( istr :: from_estr ( v ) ) ; }
305
316
none. { cmh_items += [ meta] ; }
306
317
}
307
318
} else if attr:: get_meta_item_name ( meta) == ~"vers" {
308
319
alt attr:: get_meta_item_value_str ( meta) {
309
- some ( v) { vers = some ( v ) ; }
320
+ some ( v) { vers = some ( istr :: from_estr ( v ) ) ; }
310
321
none. { cmh_items += [ meta] ; }
311
322
}
312
323
} else { cmh_items += [ meta] ; }
@@ -316,7 +327,7 @@ fn build_link_meta(sess: &session::session, c: &ast::crate, output: &str,
316
327
317
328
// This calculates CMH as defined above
318
329
fn crate_meta_extras_hash ( sha : sha1 , _crate : & ast:: crate ,
319
- metas : & provided_metas ) -> str {
330
+ metas : & provided_metas ) -> istr {
320
331
fn len_and_str ( s : & istr ) -> istr {
321
332
ret istr:: from_estr ( #fmt[ "%u_%s" ,
322
333
istr:: byte_len ( s) ,
@@ -349,39 +360,39 @@ fn build_link_meta(sess: &session::session, c: &ast::crate, output: &str,
349
360
ret truncated_sha1_result ( sha) ;
350
361
}
351
362
352
- fn warn_missing ( sess : & session:: session , name : str , default : str ) {
363
+ fn warn_missing ( sess : & session:: session , name : & istr , default : & istr ) {
353
364
if !sess. get_opts ( ) . library { ret; }
354
365
sess. warn ( #fmt[ "missing crate link meta '%s', using '%s' as default" ,
355
- name, default] ) ;
366
+ istr :: to_estr ( name) , istr :: to_estr ( default) ] ) ;
356
367
}
357
368
358
369
fn crate_meta_name ( sess : & session:: session , _crate : & ast:: crate ,
359
- output : & str , metas : & provided_metas ) -> str {
370
+ output : & istr , metas : & provided_metas ) -> istr {
360
371
ret alt metas. name {
361
372
some ( v) { v }
362
373
none. {
363
374
let name =
364
375
{
365
376
let os = istr:: split (
366
- fs:: basename ( istr :: from_estr ( output) ) ,
377
+ fs:: basename ( output) ,
367
378
'.' as u8 ) ;
368
379
assert ( vec:: len ( os) >= 2 u) ;
369
380
vec:: pop ( os) ;
370
- istr:: to_estr ( istr :: connect ( os, ~". ") )
381
+ istr:: connect ( os, ~". ")
371
382
} ;
372
- warn_missing ( sess, "name" , name) ;
383
+ warn_missing ( sess, ~ "name", name) ;
373
384
name
374
385
}
375
386
} ;
376
387
}
377
388
378
389
fn crate_meta_vers ( sess : & session:: session , _crate : & ast:: crate ,
379
- metas : & provided_metas ) -> str {
390
+ metas : & provided_metas ) -> istr {
380
391
ret alt metas. vers {
381
392
some ( v) { v }
382
393
none. {
383
- let vers = "0.0" ;
384
- warn_missing ( sess, "vers" , vers) ;
394
+ let vers = ~ "0.0 ";
395
+ warn_missing ( sess, ~ "vers", vers) ;
385
396
vers
386
397
}
387
398
} ;
@@ -395,32 +406,32 @@ fn build_link_meta(sess: &session::session, c: &ast::crate, output: &str,
395
406
ret { name : name, vers : vers, extras_hash : extras_hash} ;
396
407
}
397
408
398
- fn truncated_sha1_result ( sha : sha1 ) -> str {
399
- ret istr:: to_estr ( istr :: substr ( sha. result_str ( ) , 0 u, 16 u) ) ;
409
+ fn truncated_sha1_result ( sha : sha1 ) -> istr {
410
+ ret istr:: substr ( sha. result_str ( ) , 0 u, 16 u) ;
400
411
}
401
412
402
413
403
414
// This calculates STH for a symbol, as defined above
404
415
fn symbol_hash ( tcx : ty:: ctxt , sha : sha1 , t : ty:: t , link_meta : & link_meta ) ->
405
- str {
416
+ istr {
406
417
// NB: do *not* use abbrevs here as we want the symbol names
407
418
// to be independent of one another in the crate.
408
419
409
420
sha. reset ( ) ;
410
- sha. input_str ( istr :: from_estr ( link_meta. name ) ) ;
421
+ sha. input_str ( link_meta. name ) ;
411
422
sha. input_str ( ~"-");
412
423
// FIXME: This wants to be link_meta.meta_hash
413
- sha.input_str(istr::from_estr( link_meta.name) );
424
+ sha.input_str(link_meta.name);
414
425
sha.input_str(~" -");
415
426
sha.input_str(encoder::encoded_ty(tcx, t));
416
427
let hash = truncated_sha1_result(sha);
417
428
// Prefix with _ so that it never blends into adjacent digits
418
429
419
- ret " _" + hash;
430
+ ret ~ " _" + hash;
420
431
}
421
432
422
- fn get_symbol_hash ( ccx : & @crate_ctxt , t : ty:: t ) -> str {
423
- let hash = "" ;
433
+ fn get_symbol_hash ( ccx : & @crate_ctxt , t : ty:: t ) -> istr {
434
+ let hash = ~ "";
424
435
alt ccx. type_sha1s . find ( t) {
425
436
some ( h) { hash = h; }
426
437
none. {
@@ -431,47 +442,52 @@ fn get_symbol_hash(ccx: &@crate_ctxt, t: ty::t) -> str {
431
442
ret hash;
432
443
}
433
444
434
- fn mangle ( ss : & [ str ] ) -> str {
445
+ fn mangle ( ss : & [ istr ] ) -> istr {
435
446
// Follow C++ namespace-mangling style
436
447
437
- let n = "_ZN" ; // Begin name-sequence.
448
+ let n = ~ "_ZN"; // Begin name-sequence.
438
449
439
- for s: str in ss { n += #fmt[ "%u%s" , str:: byte_len ( s) , s] ; }
440
- n += "E" ; // End name-sequence.
450
+ for s: istr in ss {
451
+ n += istr:: from_estr ( #fmt[ "%u%s" ,
452
+ istr:: byte_len ( s) ,
453
+ istr:: to_estr ( s) ] ) ;
454
+ }
455
+ n += ~"E "; // End name-sequence.
441
456
442
457
ret n;
443
458
}
444
459
445
- fn exported_name ( path : & [ str ] , hash : & str , _vers : & str ) -> str {
460
+ fn exported_name ( path : & [ istr ] , hash : & istr , _vers : & istr ) -> istr {
446
461
// FIXME: versioning isn't working yet
447
462
448
463
ret mangle ( path + [ hash] ) ; // + "@" + vers;
449
464
450
465
}
451
466
452
- fn mangle_exported_name ( ccx : & @crate_ctxt , path : & [ str ] , t : ty:: t ) -> str {
467
+ fn mangle_exported_name ( ccx : & @crate_ctxt , path : & [ istr ] , t : ty:: t ) -> istr {
453
468
let hash = get_symbol_hash ( ccx, t) ;
454
469
ret exported_name ( path, hash, ccx. link_meta . vers ) ;
455
470
}
456
471
457
- fn mangle_internal_name_by_type_only ( ccx : & @crate_ctxt , t : ty:: t , name : & str )
458
- -> str {
472
+ fn mangle_internal_name_by_type_only ( ccx : & @crate_ctxt , t : ty:: t , name : & istr )
473
+ -> istr {
459
474
let s = util:: ppaux:: ty_to_short_str ( ccx. tcx , t) ;
460
475
let hash = get_symbol_hash ( ccx, t) ;
461
- ret mangle( [ name, istr :: to_estr ( s ) , hash] ) ;
476
+ ret mangle( [ name, s , hash] ) ;
462
477
}
463
478
464
- fn mangle_internal_name_by_path_and_seq ( ccx : & @crate_ctxt , path : & [ str ] ,
465
- flav : & str ) -> str {
466
- ret mangle ( path + [ ccx. names . next ( flav) ] ) ;
479
+ fn mangle_internal_name_by_path_and_seq ( ccx : & @crate_ctxt , path : & [ istr ] ,
480
+ flav : & istr ) -> istr {
481
+ ret mangle ( path +
482
+ istr:: from_estrs ( [ ccx. names . next ( istr:: to_estr ( flav) ) ] ) ) ;
467
483
}
468
484
469
- fn mangle_internal_name_by_path ( _ccx : & @crate_ctxt , path : & [ str ] ) -> str {
485
+ fn mangle_internal_name_by_path ( _ccx : & @crate_ctxt , path : & [ istr ] ) -> istr {
470
486
ret mangle ( path) ;
471
487
}
472
488
473
- fn mangle_internal_name_by_seq ( ccx : & @crate_ctxt , flav : & str ) -> str {
474
- ret ccx. names . next ( flav) ;
489
+ fn mangle_internal_name_by_seq ( ccx : & @crate_ctxt , flav : & istr ) -> istr {
490
+ ret istr :: from_estr ( ccx. names . next ( istr :: to_estr ( flav) ) ) ;
475
491
}
476
492
//
477
493
// Local Variables:
0 commit comments