@@ -607,9 +607,6 @@ fn tuple_metadata(cx: &mut CrateContext,
607607 span) ;
608608}
609609
610- // The stage0 snapshot does not yet support the fixes from PR #7557, so there are two versions of
611- // following function for now
612- #[ cfg( not( stage0) ) ]
613610fn enum_metadata ( cx : & mut CrateContext ,
614611 enum_type : ty:: t ,
615612 enum_def_id : ast:: def_id ,
@@ -772,142 +769,6 @@ fn enum_metadata(cx: &mut CrateContext,
772769 }
773770}
774771
775- #[ cfg( stage0) ]
776- fn enum_metadata ( cx : & mut CrateContext ,
777- enum_type : ty:: t ,
778- enum_def_id : ast:: def_id ,
779- substs : & ty:: substs ,
780- span : span )
781- -> DIType {
782-
783- let enum_name = ty_to_str ( cx. tcx , enum_type) ;
784-
785- // For empty enums there is an early exit. Just describe it as an empty struct with the
786- // appropriate type name
787- if ty:: type_is_empty ( cx. tcx , enum_type) {
788- return composite_type_metadata ( cx, Type :: nil ( ) , enum_name, & [ ] , & [ ] , & [ ] , span) ;
789- }
790-
791- // Prepare some data (llvm type, size, align, ...) about the discriminant. This data will be
792- // needed in all of the following cases.
793- let discriminant_llvm_type = Type :: enum_discrim ( cx) ;
794- let ( discriminant_size, discriminant_align) = size_and_align_of ( cx, discriminant_llvm_type) ;
795-
796- assert ! ( Type :: enum_discrim( cx) == cx. int_type) ;
797- let discriminant_type_metadata = type_metadata ( cx, ty:: mk_int ( ) , span) ;
798-
799- let variants: & [ @ty:: VariantInfo ] = * ty:: enum_variants ( cx. tcx , enum_def_id) ;
800-
801- let enumerators_metadata: ~[ DIDescriptor ] = variants
802- . iter ( )
803- . transform ( |v| {
804- let name: & str = cx. sess . str_of ( v. name ) ;
805- let discriminant_value = v. disr_val as c_ulonglong ;
806-
807- do name. as_c_str |name| {
808- unsafe {
809- llvm:: LLVMDIBuilderCreateEnumerator (
810- DIB ( cx) ,
811- name,
812- discriminant_value)
813- }
814- }
815- } )
816- . collect ( ) ;
817-
818- let loc = span_start ( cx, span) ;
819- let file_metadata = file_metadata ( cx, loc. file . name ) ;
820-
821- let discriminant_type_metadata = do enum_name. as_c_str |enum_name| {
822- unsafe {
823- llvm:: LLVMDIBuilderCreateEnumerationType (
824- DIB ( cx) ,
825- file_metadata,
826- enum_name,
827- file_metadata,
828- loc. line as c_uint ,
829- bytes_to_bits ( discriminant_size) ,
830- bytes_to_bits ( discriminant_align) ,
831- create_DIArray ( DIB ( cx) , enumerators_metadata) ,
832- discriminant_type_metadata)
833- }
834- } ;
835-
836- if ty:: type_is_c_like_enum ( cx. tcx , enum_type) {
837- return discriminant_type_metadata;
838- }
839-
840- let is_univariant = variants. len ( ) == 1 ;
841-
842- let variants_metadata = do variants. map |& vi| {
843-
844- let raw_types: & [ ty:: t ] = vi. args ;
845- let arg_types = do raw_types. map |& raw_type| { ty:: subst ( cx. tcx , substs, raw_type) } ;
846-
847- let mut arg_llvm_types = do arg_types. map |& ty| { type_of:: type_of ( cx, ty) } ;
848- let mut arg_names = match vi. arg_names {
849- Some ( ref names) => do names. map |ident| { cx. sess . str_of ( * ident) . to_owned ( ) } ,
850- None => do arg_types. map |_| { ~"" }
851- } ;
852-
853- let mut arg_metadata = do arg_types. map |& ty| { type_metadata ( cx, ty, span) } ;
854-
855- if !is_univariant {
856- arg_llvm_types. insert ( 0 , discriminant_llvm_type) ;
857- arg_names. insert ( 0 , ~"") ;
858- arg_metadata. insert ( 0 , discriminant_type_metadata) ;
859- }
860-
861- let variant_llvm_type = Type :: struct_ ( arg_llvm_types, false ) ;
862- let ( variant_type_size, variant_type_align) = size_and_align_of ( cx, variant_llvm_type) ;
863-
864- let variant_type_metadata = composite_type_metadata (
865- cx,
866- variant_llvm_type,
867- & "" ,
868- arg_llvm_types,
869- arg_names,
870- arg_metadata,
871- span) ;
872-
873- do "" . as_c_str |name| {
874- unsafe {
875- llvm:: LLVMDIBuilderCreateMemberType (
876- DIB ( cx) ,
877- file_metadata,
878- name,
879- file_metadata,
880- loc. line as c_uint ,
881- bytes_to_bits ( variant_type_size) ,
882- bytes_to_bits ( variant_type_align) ,
883- bytes_to_bits ( 0 ) ,
884- 0 ,
885- variant_type_metadata)
886- }
887- }
888- } ;
889-
890- let enum_llvm_type = type_of:: type_of ( cx, enum_type) ;
891- let ( enum_type_size, enum_type_align) = size_and_align_of ( cx, enum_llvm_type) ;
892-
893- return do enum_name. as_c_str |enum_name| {
894- unsafe {
895- llvm:: LLVMDIBuilderCreateUnionType (
896- DIB ( cx) ,
897- file_metadata,
898- enum_name,
899- file_metadata,
900- loc. line as c_uint ,
901- bytes_to_bits ( enum_type_size) ,
902- bytes_to_bits ( enum_type_align) ,
903- 0 , // Flags
904- create_DIArray ( DIB ( cx) , variants_metadata) ,
905- 0 ) // RuntimeLang
906- }
907- } ;
908- }
909-
910-
911772/// Creates debug information for a composite type, that is, anything that results in a LLVM struct.
912773///
913774/// Examples of Rust types to use this are: structs, tuples, boxes, vecs, and enums.
0 commit comments