@@ -37,6 +37,7 @@ use rustc::ty::layout::{self, Align, LayoutOf, PrimitiveExt, Size, TyLayout};
37
37
use rustc:: session:: config;
38
38
use rustc:: util:: nodemap:: FxHashMap ;
39
39
use rustc_fs_util:: path2cstr;
40
+ use rustc_data_structures:: small_c_str:: SmallCStr ;
40
41
41
42
use libc:: { c_uint, c_longlong} ;
42
43
use std:: ffi:: CString ;
@@ -274,7 +275,7 @@ impl RecursiveTypeDescription<'ll, 'tcx> {
274
275
// ... and attach them to the stub to complete it.
275
276
set_members_of_composite_type ( cx,
276
277
metadata_stub,
277
- & member_descriptions[ .. ] ) ;
278
+ member_descriptions) ;
278
279
return MetadataCreationResult :: new ( metadata_stub, true ) ;
279
280
}
280
281
}
@@ -349,7 +350,7 @@ fn vec_slice_metadata(
349
350
let ( pointer_size, pointer_align) = cx. size_and_align_of ( data_ptr_type) ;
350
351
let ( usize_size, usize_align) = cx. size_and_align_of ( cx. tcx . types . usize ) ;
351
352
352
- let member_descriptions = [
353
+ let member_descriptions = vec ! [
353
354
MemberDescription {
354
355
name: "data_ptr" . to_string( ) ,
355
356
type_metadata: data_ptr_metadata,
@@ -374,7 +375,7 @@ fn vec_slice_metadata(
374
375
slice_ptr_type,
375
376
& slice_type_name[ ..] ,
376
377
unique_type_id,
377
- & member_descriptions,
378
+ member_descriptions,
378
379
NO_SCOPE_METADATA ,
379
380
file_metadata,
380
381
span) ;
@@ -460,7 +461,7 @@ fn trait_pointer_metadata(
460
461
461
462
let data_ptr_field = layout. field ( cx, 0 ) ;
462
463
let vtable_field = layout. field ( cx, 1 ) ;
463
- let member_descriptions = [
464
+ let member_descriptions = vec ! [
464
465
MemberDescription {
465
466
name: "pointer" . to_string( ) ,
466
467
type_metadata: type_metadata( cx,
@@ -485,7 +486,7 @@ fn trait_pointer_metadata(
485
486
trait_object_type,
486
487
& trait_type_name[ ..] ,
487
488
unique_type_id,
488
- & member_descriptions,
489
+ member_descriptions,
489
490
containing_scope,
490
491
file_metadata,
491
492
syntax_pos:: DUMMY_SP )
@@ -746,8 +747,8 @@ fn file_metadata_raw(cx: &CodegenCx<'ll, '_>,
746
747
747
748
debug ! ( "file_metadata: file_name: {}, directory: {}" , file_name, directory) ;
748
749
749
- let file_name = CString :: new ( file_name) . unwrap ( ) ;
750
- let directory = CString :: new ( directory) . unwrap ( ) ;
750
+ let file_name = SmallCStr :: new ( file_name) ;
751
+ let directory = SmallCStr :: new ( directory) ;
751
752
752
753
let file_metadata = unsafe {
753
754
llvm:: LLVMRustDIBuilderCreateFile ( DIB ( cx) ,
@@ -782,7 +783,7 @@ fn basic_type_metadata(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll DIType {
782
783
} ;
783
784
784
785
let ( size, align) = cx. size_and_align_of ( t) ;
785
- let name = CString :: new ( name) . unwrap ( ) ;
786
+ let name = SmallCStr :: new ( name) ;
786
787
let ty_metadata = unsafe {
787
788
llvm:: LLVMRustDIBuilderCreateBasicType (
788
789
DIB ( cx) ,
@@ -813,7 +814,7 @@ fn pointer_type_metadata(
813
814
) -> & ' ll DIType {
814
815
let ( pointer_size, pointer_align) = cx. size_and_align_of ( pointer_type) ;
815
816
let name = compute_debuginfo_type_name ( cx, pointer_type, false ) ;
816
- let name = CString :: new ( name) . unwrap ( ) ;
817
+ let name = SmallCStr :: new ( & name) ;
817
818
unsafe {
818
819
llvm:: LLVMRustDIBuilderCreatePointerType (
819
820
DIB ( cx) ,
@@ -847,9 +848,9 @@ pub fn compile_unit_metadata(tcx: TyCtxt,
847
848
let producer = format ! ( "clang LLVM (rustc version {})" ,
848
849
( option_env!( "CFG_VERSION" ) ) . expect( "CFG_VERSION" ) ) ;
849
850
850
- let name_in_debuginfo = name_in_debuginfo. to_string_lossy ( ) . into_owned ( ) ;
851
- let name_in_debuginfo = CString :: new ( name_in_debuginfo) . unwrap ( ) ;
852
- let work_dir = CString :: new ( & tcx. sess . working_dir . 0 . to_string_lossy ( ) [ .. ] ) . unwrap ( ) ;
851
+ let name_in_debuginfo = name_in_debuginfo. to_string_lossy ( ) ;
852
+ let name_in_debuginfo = SmallCStr :: new ( & name_in_debuginfo) ;
853
+ let work_dir = SmallCStr :: new ( & tcx. sess . working_dir . 0 . to_string_lossy ( ) ) ;
853
854
let producer = CString :: new ( producer) . unwrap ( ) ;
854
855
let flags = "\0 " ;
855
856
let split_name = "\0 " ;
@@ -1187,7 +1188,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1187
1188
1188
1189
set_members_of_composite_type ( cx,
1189
1190
variant_type_metadata,
1190
- & member_descriptions[ .. ] ) ;
1191
+ member_descriptions) ;
1191
1192
vec ! [
1192
1193
MemberDescription {
1193
1194
name: "" . to_string( ) ,
@@ -1217,7 +1218,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1217
1218
1218
1219
set_members_of_composite_type ( cx,
1219
1220
variant_type_metadata,
1220
- & member_descriptions) ;
1221
+ member_descriptions) ;
1221
1222
MemberDescription {
1222
1223
name : "" . to_string ( ) ,
1223
1224
type_metadata : variant_type_metadata,
@@ -1244,7 +1245,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1244
1245
1245
1246
set_members_of_composite_type ( cx,
1246
1247
variant_type_metadata,
1247
- & variant_member_descriptions[ .. ] ) ;
1248
+ variant_member_descriptions) ;
1248
1249
1249
1250
// Encode the information about the null variant in the union
1250
1251
// member's name.
@@ -1416,8 +1417,7 @@ fn prepare_enum_metadata(
1416
1417
let enumerators_metadata: Vec < _ > = def. discriminants ( cx. tcx )
1417
1418
. zip ( & def. variants )
1418
1419
. map ( |( discr, v) | {
1419
- let token = v. name . as_str ( ) ;
1420
- let name = CString :: new ( token. as_bytes ( ) ) . unwrap ( ) ;
1420
+ let name = SmallCStr :: new ( & v. name . as_str ( ) ) ;
1421
1421
unsafe {
1422
1422
Some ( llvm:: LLVMRustDIBuilderCreateEnumerator (
1423
1423
DIB ( cx) ,
@@ -1442,7 +1442,7 @@ fn prepare_enum_metadata(
1442
1442
type_metadata ( cx, discr. to_ty ( cx. tcx ) , syntax_pos:: DUMMY_SP ) ;
1443
1443
let discriminant_name = get_enum_discriminant_name ( cx, enum_def_id) . as_str ( ) ;
1444
1444
1445
- let name = CString :: new ( discriminant_name. as_bytes ( ) ) . unwrap ( ) ;
1445
+ let name = SmallCStr :: new ( & discriminant_name) ;
1446
1446
let discriminant_type_metadata = unsafe {
1447
1447
llvm:: LLVMRustDIBuilderCreateEnumerationType (
1448
1448
DIB ( cx) ,
@@ -1482,10 +1482,10 @@ fn prepare_enum_metadata(
1482
1482
1483
1483
let ( enum_type_size, enum_type_align) = layout. size_and_align ( ) ;
1484
1484
1485
- let enum_name = CString :: new ( enum_name) . unwrap ( ) ;
1486
- let unique_type_id_str = CString :: new (
1487
- debug_context ( cx) . type_map . borrow ( ) . get_unique_type_id_as_string ( unique_type_id) . as_bytes ( )
1488
- ) . unwrap ( ) ;
1485
+ let enum_name = SmallCStr :: new ( & enum_name) ;
1486
+ let unique_type_id_str = SmallCStr :: new (
1487
+ debug_context ( cx) . type_map . borrow ( ) . get_unique_type_id_as_string ( unique_type_id)
1488
+ ) ;
1489
1489
let enum_metadata = unsafe {
1490
1490
llvm:: LLVMRustDIBuilderCreateUnionType (
1491
1491
DIB ( cx) ,
@@ -1531,7 +1531,7 @@ fn composite_type_metadata(
1531
1531
composite_type : Ty < ' tcx > ,
1532
1532
composite_type_name : & str ,
1533
1533
composite_type_unique_id : UniqueTypeId ,
1534
- member_descriptions : & [ MemberDescription < ' ll > ] ,
1534
+ member_descriptions : Vec < MemberDescription < ' ll > > ,
1535
1535
containing_scope : Option < & ' ll DIScope > ,
1536
1536
1537
1537
// Ignore source location information as long as it
@@ -1555,7 +1555,7 @@ fn composite_type_metadata(
1555
1555
1556
1556
fn set_members_of_composite_type ( cx : & CodegenCx < ' ll , ' _ > ,
1557
1557
composite_type_metadata : & ' ll DICompositeType ,
1558
- member_descriptions : & [ MemberDescription < ' ll > ] ) {
1558
+ member_descriptions : Vec < MemberDescription < ' ll > > ) {
1559
1559
// In some rare cases LLVM metadata uniquing would lead to an existing type
1560
1560
// description being used instead of a new one created in
1561
1561
// create_struct_stub. This would cause a hard to trace assertion in
@@ -1574,10 +1574,9 @@ fn set_members_of_composite_type(cx: &CodegenCx<'ll, '_>,
1574
1574
}
1575
1575
1576
1576
let member_metadata: Vec < _ > = member_descriptions
1577
- . iter ( )
1577
+ . into_iter ( )
1578
1578
. map ( |member_description| {
1579
- let member_name = member_description. name . as_bytes ( ) ;
1580
- let member_name = CString :: new ( member_name) . unwrap ( ) ;
1579
+ let member_name = CString :: new ( member_description. name ) . unwrap ( ) ;
1581
1580
unsafe {
1582
1581
Some ( llvm:: LLVMRustDIBuilderCreateMemberType (
1583
1582
DIB ( cx) ,
@@ -1613,10 +1612,10 @@ fn create_struct_stub(
1613
1612
) -> & ' ll DICompositeType {
1614
1613
let ( struct_size, struct_align) = cx. size_and_align_of ( struct_type) ;
1615
1614
1616
- let name = CString :: new ( struct_type_name) . unwrap ( ) ;
1617
- let unique_type_id = CString :: new (
1618
- debug_context ( cx) . type_map . borrow ( ) . get_unique_type_id_as_string ( unique_type_id) . as_bytes ( )
1619
- ) . unwrap ( ) ;
1615
+ let name = SmallCStr :: new ( struct_type_name) ;
1616
+ let unique_type_id = SmallCStr :: new (
1617
+ debug_context ( cx) . type_map . borrow ( ) . get_unique_type_id_as_string ( unique_type_id)
1618
+ ) ;
1620
1619
let metadata_stub = unsafe {
1621
1620
// LLVMRustDIBuilderCreateStructType() wants an empty array. A null
1622
1621
// pointer will lead to hard to trace and debug LLVM assertions
@@ -1651,10 +1650,10 @@ fn create_union_stub(
1651
1650
) -> & ' ll DICompositeType {
1652
1651
let ( union_size, union_align) = cx. size_and_align_of ( union_type) ;
1653
1652
1654
- let name = CString :: new ( union_type_name) . unwrap ( ) ;
1655
- let unique_type_id = CString :: new (
1656
- debug_context ( cx) . type_map . borrow ( ) . get_unique_type_id_as_string ( unique_type_id) . as_bytes ( )
1657
- ) . unwrap ( ) ;
1653
+ let name = SmallCStr :: new ( union_type_name) ;
1654
+ let unique_type_id = SmallCStr :: new (
1655
+ debug_context ( cx) . type_map . borrow ( ) . get_unique_type_id_as_string ( unique_type_id)
1656
+ ) ;
1658
1657
let metadata_stub = unsafe {
1659
1658
// LLVMRustDIBuilderCreateUnionType() wants an empty array. A null
1660
1659
// pointer will lead to hard to trace and debug LLVM assertions
@@ -1713,13 +1712,12 @@ pub fn create_global_var_metadata(
1713
1712
let is_local_to_unit = is_node_local_to_unit ( cx, def_id) ;
1714
1713
let variable_type = Instance :: mono ( cx. tcx , def_id) . ty ( cx. tcx ) ;
1715
1714
let type_metadata = type_metadata ( cx, variable_type, span) ;
1716
- let var_name = tcx. item_name ( def_id) . to_string ( ) ;
1717
- let var_name = CString :: new ( var_name) . unwrap ( ) ;
1715
+ let var_name = SmallCStr :: new ( & tcx. item_name ( def_id) . as_str ( ) ) ;
1718
1716
let linkage_name = if no_mangle {
1719
1717
None
1720
1718
} else {
1721
1719
let linkage_name = mangled_name_of_instance ( cx, Instance :: mono ( tcx, def_id) ) ;
1722
- Some ( CString :: new ( linkage_name. to_string ( ) ) . unwrap ( ) )
1720
+ Some ( SmallCStr :: new ( & linkage_name. as_str ( ) ) )
1723
1721
} ;
1724
1722
1725
1723
let global_align = cx. align_of ( variable_type) ;
0 commit comments