|  | @@ -49,7 +49,6 @@ fn main() {
 | 
											
												
													
														|  |          if !target.contains("wasm32") && !target.contains("nvptx") && !target.starts_with("riscv") {
 |  |          if !target.contains("wasm32") && !target.contains("nvptx") && !target.starts_with("riscv") {
 | 
											
												
													
														|  |              #[cfg(feature = "c")]
 |  |              #[cfg(feature = "c")]
 | 
											
												
													
														|  |              c::compile(&llvm_target);
 |  |              c::compile(&llvm_target);
 | 
											
												
													
														|  | -            println!("cargo:rustc-cfg=use_c");
 |  | 
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -91,15 +90,14 @@ mod c {
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        fn extend(&mut self, sources: &[&'static str]) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +        fn extend(&mut self, sources: &[(&'static str, &'static str)]) {
 | 
											
												
													
														|  |              // NOTE Some intrinsics have both a generic implementation (e.g.
 |  |              // NOTE Some intrinsics have both a generic implementation (e.g.
 | 
											
												
													
														|  |              // `floatdidf.c`) and an arch optimized implementation
 |  |              // `floatdidf.c`) and an arch optimized implementation
 | 
											
												
													
														|  |              // (`x86_64/floatdidf.c`). In those cases, we keep the arch optimized
 |  |              // (`x86_64/floatdidf.c`). In those cases, we keep the arch optimized
 | 
											
												
													
														|  |              // implementation and discard the generic implementation. If we don't
 |  |              // implementation and discard the generic implementation. If we don't
 | 
											
												
													
														|  |              // and keep both implementations, the linker will yell at us about
 |  |              // and keep both implementations, the linker will yell at us about
 | 
											
												
													
														|  |              // duplicate symbols!
 |  |              // duplicate symbols!
 | 
											
												
													
														|  | -            for &src in sources {
 |  | 
 | 
											
												
													
														|  | -                let symbol = Path::new(src).file_stem().unwrap().to_str().unwrap();
 |  | 
 | 
											
												
													
														|  | 
 |  | +            for (symbol, src) in sources {
 | 
											
												
													
														|  |                  if src.contains("/") {
 |  |                  if src.contains("/") {
 | 
											
												
													
														|  |                      // Arch-optimized implementation (preferred)
 |  |                      // Arch-optimized implementation (preferred)
 | 
											
												
													
														|  |                      self.map.insert(symbol, src);
 |  |                      self.map.insert(symbol, src);
 | 
											
										
											
												
													
														|  | @@ -155,42 +153,42 @@ mod c {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          let mut sources = Sources::new();
 |  |          let mut sources = Sources::new();
 | 
											
												
													
														|  |          sources.extend(&[
 |  |          sources.extend(&[
 | 
											
												
													
														|  | -            "absvdi2.c",
 |  | 
 | 
											
												
													
														|  | -            "absvsi2.c",
 |  | 
 | 
											
												
													
														|  | -            "addvdi3.c",
 |  | 
 | 
											
												
													
														|  | -            "addvsi3.c",
 |  | 
 | 
											
												
													
														|  | -            "apple_versioning.c",
 |  | 
 | 
											
												
													
														|  | -            "clzdi2.c",
 |  | 
 | 
											
												
													
														|  | -            "clzsi2.c",
 |  | 
 | 
											
												
													
														|  | -            "cmpdi2.c",
 |  | 
 | 
											
												
													
														|  | -            "ctzdi2.c",
 |  | 
 | 
											
												
													
														|  | -            "ctzsi2.c",
 |  | 
 | 
											
												
													
														|  | -            "divdc3.c",
 |  | 
 | 
											
												
													
														|  | -            "divsc3.c",
 |  | 
 | 
											
												
													
														|  | -            "divxc3.c",
 |  | 
 | 
											
												
													
														|  | -            "extendhfsf2.c",
 |  | 
 | 
											
												
													
														|  | -            "int_util.c",
 |  | 
 | 
											
												
													
														|  | -            "muldc3.c",
 |  | 
 | 
											
												
													
														|  | -            "mulsc3.c",
 |  | 
 | 
											
												
													
														|  | -            "mulvdi3.c",
 |  | 
 | 
											
												
													
														|  | -            "mulvsi3.c",
 |  | 
 | 
											
												
													
														|  | -            "mulxc3.c",
 |  | 
 | 
											
												
													
														|  | -            "negdf2.c",
 |  | 
 | 
											
												
													
														|  | -            "negdi2.c",
 |  | 
 | 
											
												
													
														|  | -            "negsf2.c",
 |  | 
 | 
											
												
													
														|  | -            "negvdi2.c",
 |  | 
 | 
											
												
													
														|  | -            "negvsi2.c",
 |  | 
 | 
											
												
													
														|  | -            "paritydi2.c",
 |  | 
 | 
											
												
													
														|  | -            "paritysi2.c",
 |  | 
 | 
											
												
													
														|  | -            "popcountdi2.c",
 |  | 
 | 
											
												
													
														|  | -            "popcountsi2.c",
 |  | 
 | 
											
												
													
														|  | -            "powixf2.c",
 |  | 
 | 
											
												
													
														|  | -            "subvdi3.c",
 |  | 
 | 
											
												
													
														|  | -            "subvsi3.c",
 |  | 
 | 
											
												
													
														|  | -            "truncdfhf2.c",
 |  | 
 | 
											
												
													
														|  | -            "truncdfsf2.c",
 |  | 
 | 
											
												
													
														|  | -            "truncsfhf2.c",
 |  | 
 | 
											
												
													
														|  | -            "ucmpdi2.c",
 |  | 
 | 
											
												
													
														|  | 
 |  | +            ("__absvdi2", "absvdi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__absvsi2", "absvsi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__addvdi3", "addvdi3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__addvsi3", "addvsi3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("apple_versioning", "apple_versioning.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__clzdi2", "clzdi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__clzsi2", "clzsi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__cmpdi2", "cmpdi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__ctzdi2", "ctzdi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__ctzsi2", "ctzsi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__divdc3", "divdc3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__divsc3", "divsc3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__divxc3", "divxc3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__extendhfsf2", "extendhfsf2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__int_util", "int_util.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__muldc3", "muldc3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__mulsc3", "mulsc3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__mulvdi3", "mulvdi3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__mulvsi3", "mulvsi3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__mulxc3", "mulxc3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__negdf2", "negdf2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__negdi2", "negdi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__negsf2", "negsf2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__negvdi2", "negvdi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__negvsi2", "negvsi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__paritydi2", "paritydi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__paritysi2", "paritysi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__popcountdi2", "popcountdi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__popcountsi2", "popcountsi2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__powixf2", "powixf2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__subvdi3", "subvdi3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__subvsi3", "subvsi3.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__truncdfhf2", "truncdfhf2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__truncdfsf2", "truncdfsf2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__truncsfhf2", "truncsfhf2.c"),
 | 
											
												
													
														|  | 
 |  | +            ("__ucmpdi2", "ucmpdi2.c"),
 | 
											
												
													
														|  |          ]);
 |  |          ]);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          // When compiling in rustbuild (the rust-lang/rust repo) this library
 |  |          // When compiling in rustbuild (the rust-lang/rust repo) this library
 | 
											
										
											
												
													
														|  | @@ -198,43 +196,49 @@ mod c {
 | 
											
												
													
														|  |          // need, so include a few more that aren't typically needed by
 |  |          // need, so include a few more that aren't typically needed by
 | 
											
												
													
														|  |          // LLVM/Rust.
 |  |          // LLVM/Rust.
 | 
											
												
													
														|  |          if cfg!(feature = "rustbuild") {
 |  |          if cfg!(feature = "rustbuild") {
 | 
											
												
													
														|  | -            sources.extend(&["ffsdi2.c"]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +            sources.extend(&[("__ffsdi2", "ffsdi2.c")]);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          // On iOS and 32-bit OSX these are all just empty intrinsics, no need to
 |  |          // On iOS and 32-bit OSX these are all just empty intrinsics, no need to
 | 
											
												
													
														|  |          // include them.
 |  |          // include them.
 | 
											
												
													
														|  |          if target_os != "ios" && (target_vendor != "apple" || target_arch != "x86") {
 |  |          if target_os != "ios" && (target_vendor != "apple" || target_arch != "x86") {
 | 
											
												
													
														|  |              sources.extend(&[
 |  |              sources.extend(&[
 | 
											
												
													
														|  | -                "absvti2.c",
 |  | 
 | 
											
												
													
														|  | -                "addvti3.c",
 |  | 
 | 
											
												
													
														|  | -                "clzti2.c",
 |  | 
 | 
											
												
													
														|  | -                "cmpti2.c",
 |  | 
 | 
											
												
													
														|  | -                "ctzti2.c",
 |  | 
 | 
											
												
													
														|  | -                "ffsti2.c",
 |  | 
 | 
											
												
													
														|  | -                "mulvti3.c",
 |  | 
 | 
											
												
													
														|  | -                "negti2.c",
 |  | 
 | 
											
												
													
														|  | -                "negvti2.c",
 |  | 
 | 
											
												
													
														|  | -                "parityti2.c",
 |  | 
 | 
											
												
													
														|  | -                "popcountti2.c",
 |  | 
 | 
											
												
													
														|  | -                "subvti3.c",
 |  | 
 | 
											
												
													
														|  | -                "ucmpti2.c",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                ("__absvti2", "absvti2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__addvti3", "addvti3.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__clzti2", "clzti2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__cmpti2", "cmpti2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__ctzti2", "ctzti2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__ffsti2", "ffsti2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__mulvti3", "mulvti3.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__negti2", "negti2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__negvti2", "negvti2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__parityti2", "parityti2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__popcountti2", "popcountti2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__subvti3", "subvti3.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__ucmpti2", "ucmpti2.c"),
 | 
											
												
													
														|  |              ]);
 |  |              ]);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          if target_vendor == "apple" {
 |  |          if target_vendor == "apple" {
 | 
											
												
													
														|  |              sources.extend(&[
 |  |              sources.extend(&[
 | 
											
												
													
														|  | -                "atomic_flag_clear.c",
 |  | 
 | 
											
												
													
														|  | -                "atomic_flag_clear_explicit.c",
 |  | 
 | 
											
												
													
														|  | -                "atomic_flag_test_and_set.c",
 |  | 
 | 
											
												
													
														|  | -                "atomic_flag_test_and_set_explicit.c",
 |  | 
 | 
											
												
													
														|  | -                "atomic_signal_fence.c",
 |  | 
 | 
											
												
													
														|  | -                "atomic_thread_fence.c",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                ("atomic_flag_clear", "atomic_flag_clear.c"),
 | 
											
												
													
														|  | 
 |  | +                ("atomic_flag_clear_explicit", "atomic_flag_clear_explicit.c"),
 | 
											
												
													
														|  | 
 |  | +                ("atomic_flag_test_and_set", "atomic_flag_test_and_set.c"),
 | 
											
												
													
														|  | 
 |  | +                (
 | 
											
												
													
														|  | 
 |  | +                    "atomic_flag_test_and_set_explicit",
 | 
											
												
													
														|  | 
 |  | +                    "atomic_flag_test_and_set_explicit.c",
 | 
											
												
													
														|  | 
 |  | +                ),
 | 
											
												
													
														|  | 
 |  | +                ("atomic_signal_fence", "atomic_signal_fence.c"),
 | 
											
												
													
														|  | 
 |  | +                ("atomic_thread_fence", "atomic_thread_fence.c"),
 | 
											
												
													
														|  |              ]);
 |  |              ]);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          if target_env == "msvc" {
 |  |          if target_env == "msvc" {
 | 
											
												
													
														|  |              if target_arch == "x86_64" {
 |  |              if target_arch == "x86_64" {
 | 
											
												
													
														|  | -                sources.extend(&["x86_64/floatdisf.c", "x86_64/floatdixf.c"]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +                sources.extend(&[
 | 
											
												
													
														|  | 
 |  | +                    ("__floatdisf", "x86_64/floatdisf.c"),
 | 
											
												
													
														|  | 
 |  | +                    ("__floatdixf", "x86_64/floatdixf.c"),
 | 
											
												
													
														|  | 
 |  | +                ]);
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |          } else {
 |  |          } else {
 | 
											
												
													
														|  |              // None of these seem to be used on x86_64 windows, and they've all
 |  |              // None of these seem to be used on x86_64 windows, and they've all
 | 
											
										
											
												
													
														|  | @@ -242,59 +246,59 @@ mod c {
 | 
											
												
													
														|  |              if target_os != "windows" {
 |  |              if target_os != "windows" {
 | 
											
												
													
														|  |                  if target_arch == "x86_64" {
 |  |                  if target_arch == "x86_64" {
 | 
											
												
													
														|  |                      sources.extend(&[
 |  |                      sources.extend(&[
 | 
											
												
													
														|  | -                        "x86_64/floatdisf.c",
 |  | 
 | 
											
												
													
														|  | -                        "x86_64/floatdixf.c",
 |  | 
 | 
											
												
													
														|  | -                        "x86_64/floatundidf.S",
 |  | 
 | 
											
												
													
														|  | -                        "x86_64/floatundisf.S",
 |  | 
 | 
											
												
													
														|  | -                        "x86_64/floatundixf.S",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        ("__floatdisf", "x86_64/floatdisf.c"),
 | 
											
												
													
														|  | 
 |  | +                        ("__floatdixf", "x86_64/floatdixf.c"),
 | 
											
												
													
														|  | 
 |  | +                        ("__floatundidf", "x86_64/floatundidf.S"),
 | 
											
												
													
														|  | 
 |  | +                        ("__floatundisf", "x86_64/floatundisf.S"),
 | 
											
												
													
														|  | 
 |  | +                        ("__floatundixf", "x86_64/floatundixf.S"),
 | 
											
												
													
														|  |                      ]);
 |  |                      ]);
 | 
											
												
													
														|  |                  }
 |  |                  }
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |              if target_arch == "x86" {
 |  |              if target_arch == "x86" {
 | 
											
												
													
														|  |                  sources.extend(&[
 |  |                  sources.extend(&[
 | 
											
												
													
														|  | -                    "i386/ashldi3.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/ashrdi3.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/divdi3.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/floatdidf.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/floatdisf.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/floatdixf.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/floatundidf.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/floatundisf.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/floatundixf.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/lshrdi3.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/moddi3.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/muldi3.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/udivdi3.S",
 |  | 
 | 
											
												
													
														|  | -                    "i386/umoddi3.S",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    ("__ashldi3", "i386/ashldi3.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__ashrdi3", "i386/ashrdi3.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__divdi3", "i386/divdi3.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__floatdidf", "i386/floatdidf.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__floatdisf", "i386/floatdisf.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__floatdixf", "i386/floatdixf.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__floatundidf", "i386/floatundidf.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__floatundisf", "i386/floatundisf.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__floatundixf", "i386/floatundixf.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__lshrdi3", "i386/lshrdi3.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__moddi3", "i386/moddi3.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__muldi3", "i386/muldi3.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__udivdi3", "i386/udivdi3.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__umoddi3", "i386/umoddi3.S"),
 | 
											
												
													
														|  |                  ]);
 |  |                  ]);
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          if target_arch == "arm" && target_os != "ios" && target_env != "msvc" {
 |  |          if target_arch == "arm" && target_os != "ios" && target_env != "msvc" {
 | 
											
												
													
														|  |              sources.extend(&[
 |  |              sources.extend(&[
 | 
											
												
													
														|  | -                "arm/aeabi_div0.c",
 |  | 
 | 
											
												
													
														|  | -                "arm/aeabi_drsub.c",
 |  | 
 | 
											
												
													
														|  | -                "arm/aeabi_frsub.c",
 |  | 
 | 
											
												
													
														|  | -                "arm/bswapdi2.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/bswapsi2.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/clzdi2.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/clzsi2.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/divmodsi4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/divsi3.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/modsi3.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/switch16.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/switch32.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/switch8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/switchu8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_synchronize.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/udivmodsi4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/udivsi3.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/umodsi3.S",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                ("__aeabi_div0", "arm/aeabi_div0.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__aeabi_drsub", "arm/aeabi_drsub.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__aeabi_frsub", "arm/aeabi_frsub.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__bswapdi2", "arm/bswapdi2.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__bswapsi2", "arm/bswapsi2.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__clzdi2", "arm/clzdi2.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__clzsi2", "arm/clzsi2.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__divmodsi4", "arm/divmodsi4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__divsi3", "arm/divsi3.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__modsi3", "arm/modsi3.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__switch16", "arm/switch16.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__switch32", "arm/switch32.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__switch8", "arm/switch8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__switchu8", "arm/switchu8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_synchronize", "arm/sync_synchronize.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__udivmodsi4", "arm/udivmodsi4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__udivsi3", "arm/udivsi3.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__umodsi3", "arm/umodsi3.S"),
 | 
											
												
													
														|  |              ]);
 |  |              ]);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |              if target_os == "freebsd" {
 |  |              if target_os == "freebsd" {
 | 
											
												
													
														|  | -                sources.extend(&["clear_cache.c"]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +                sources.extend(&[("__clear_cache", "clear_cache.c")]);
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |              // First of all aeabi_cdcmp and aeabi_cfcmp are never called by LLVM.
 |  |              // First of all aeabi_cdcmp and aeabi_cfcmp are never called by LLVM.
 | 
											
										
											
												
													
														|  | @@ -302,36 +306,36 @@ mod c {
 | 
											
												
													
														|  |              // Temporally workaround: exclude these files for big-endian targets.
 |  |              // Temporally workaround: exclude these files for big-endian targets.
 | 
											
												
													
														|  |              if !llvm_target[0].starts_with("thumbeb") && !llvm_target[0].starts_with("armeb") {
 |  |              if !llvm_target[0].starts_with("thumbeb") && !llvm_target[0].starts_with("armeb") {
 | 
											
												
													
														|  |                  sources.extend(&[
 |  |                  sources.extend(&[
 | 
											
												
													
														|  | -                    "arm/aeabi_cdcmp.S",
 |  | 
 | 
											
												
													
														|  | -                    "arm/aeabi_cdcmpeq_check_nan.c",
 |  | 
 | 
											
												
													
														|  | -                    "arm/aeabi_cfcmp.S",
 |  | 
 | 
											
												
													
														|  | -                    "arm/aeabi_cfcmpeq_check_nan.c",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    ("__aeabi_cdcmp", "arm/aeabi_cdcmp.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__aeabi_cdcmpeq_check_nan", "arm/aeabi_cdcmpeq_check_nan.c"),
 | 
											
												
													
														|  | 
 |  | +                    ("__aeabi_cfcmp", "arm/aeabi_cfcmp.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__aeabi_cfcmpeq_check_nan", "arm/aeabi_cfcmpeq_check_nan.c"),
 | 
											
												
													
														|  |                  ]);
 |  |                  ]);
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          if llvm_target[0] == "armv7" {
 |  |          if llvm_target[0] == "armv7" {
 | 
											
												
													
														|  |              sources.extend(&[
 |  |              sources.extend(&[
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_add_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_add_8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_and_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_and_8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_max_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_max_8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_min_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_min_8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_nand_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_nand_8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_or_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_or_8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_sub_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_sub_8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_umax_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_umax_8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_umin_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_umin_8.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_xor_4.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/sync_fetch_and_xor_8.S",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_add_4", "arm/sync_fetch_and_add_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_add_8", "arm/sync_fetch_and_add_8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_and_4", "arm/sync_fetch_and_and_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_and_8", "arm/sync_fetch_and_and_8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_max_4", "arm/sync_fetch_and_max_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_max_8", "arm/sync_fetch_and_max_8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_min_4", "arm/sync_fetch_and_min_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_min_8", "arm/sync_fetch_and_min_8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_nand_4", "arm/sync_fetch_and_nand_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_nand_8", "arm/sync_fetch_and_nand_8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_or_4", "arm/sync_fetch_and_or_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_or_8", "arm/sync_fetch_and_or_8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_sub_4", "arm/sync_fetch_and_sub_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_sub_8", "arm/sync_fetch_and_sub_8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_umax_4", "arm/sync_fetch_and_umax_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_umax_8", "arm/sync_fetch_and_umax_8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_umin_4", "arm/sync_fetch_and_umin_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_umin_8", "arm/sync_fetch_and_umin_8.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_xor_4", "arm/sync_fetch_and_xor_4.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__sync_fetch_and_xor_8", "arm/sync_fetch_and_xor_8.S"),
 | 
											
												
													
														|  |              ]);
 |  |              ]);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -345,73 +349,66 @@ mod c {
 | 
											
												
													
														|  |                  // do not support double precision floating points conversions so the files
 |  |                  // do not support double precision floating points conversions so the files
 | 
											
												
													
														|  |                  // that include such instructions are not included for these targets.
 |  |                  // that include such instructions are not included for these targets.
 | 
											
												
													
														|  |                  sources.extend(&[
 |  |                  sources.extend(&[
 | 
											
												
													
														|  | -                    "arm/fixdfsivfp.S",
 |  | 
 | 
											
												
													
														|  | -                    "arm/fixunsdfsivfp.S",
 |  | 
 | 
											
												
													
														|  | -                    "arm/floatsidfvfp.S",
 |  | 
 | 
											
												
													
														|  | -                    "arm/floatunssidfvfp.S",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    ("__fixdfsivfp", "arm/fixdfsivfp.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__fixunsdfsivfp", "arm/fixunsdfsivfp.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__floatsidfvfp", "arm/floatsidfvfp.S"),
 | 
											
												
													
														|  | 
 |  | +                    ("__floatunssidfvfp", "arm/floatunssidfvfp.S"),
 | 
											
												
													
														|  |                  ]);
 |  |                  ]);
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |              sources.extend(&[
 |  |              sources.extend(&[
 | 
											
												
													
														|  | -                "arm/fixsfsivfp.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/fixunssfsivfp.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/floatsisfvfp.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/floatunssisfvfp.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/floatunssisfvfp.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/restore_vfp_d8_d15_regs.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/save_vfp_d8_d15_regs.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/negdf2vfp.S",
 |  | 
 | 
											
												
													
														|  | -                "arm/negsf2vfp.S",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                ("__fixsfsivfp", "arm/fixsfsivfp.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__fixunssfsivfp", "arm/fixunssfsivfp.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__floatsisfvfp", "arm/floatsisfvfp.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__floatunssisfvfp", "arm/floatunssisfvfp.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__floatunssisfvfp", "arm/floatunssisfvfp.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__restore_vfp_d8_d15_regs", "arm/restore_vfp_d8_d15_regs.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__save_vfp_d8_d15_regs", "arm/save_vfp_d8_d15_regs.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__negdf2vfp", "arm/negdf2vfp.S"),
 | 
											
												
													
														|  | 
 |  | +                ("__negsf2vfp", "arm/negsf2vfp.S"),
 | 
											
												
													
														|  |              ]);
 |  |              ]);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          if target_arch == "aarch64" {
 |  |          if target_arch == "aarch64" {
 | 
											
												
													
														|  |              sources.extend(&[
 |  |              sources.extend(&[
 | 
											
												
													
														|  | -                "comparetf2.c",
 |  | 
 | 
											
												
													
														|  | -                "extenddftf2.c",
 |  | 
 | 
											
												
													
														|  | -                "extendsftf2.c",
 |  | 
 | 
											
												
													
														|  | -                "fixtfdi.c",
 |  | 
 | 
											
												
													
														|  | -                "fixtfsi.c",
 |  | 
 | 
											
												
													
														|  | -                "fixtfti.c",
 |  | 
 | 
											
												
													
														|  | -                "fixunstfdi.c",
 |  | 
 | 
											
												
													
														|  | -                "fixunstfsi.c",
 |  | 
 | 
											
												
													
														|  | -                "fixunstfti.c",
 |  | 
 | 
											
												
													
														|  | -                "floatditf.c",
 |  | 
 | 
											
												
													
														|  | -                "floatsitf.c",
 |  | 
 | 
											
												
													
														|  | -                "floatunditf.c",
 |  | 
 | 
											
												
													
														|  | -                "floatunsitf.c",
 |  | 
 | 
											
												
													
														|  | -                "trunctfdf2.c",
 |  | 
 | 
											
												
													
														|  | -                "trunctfsf2.c",
 |  | 
 | 
											
												
													
														|  | 
 |  | +                ("__comparetf2", "comparetf2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__extenddftf2", "extenddftf2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__extendsftf2", "extendsftf2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__fixtfdi", "fixtfdi.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__fixtfsi", "fixtfsi.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__fixtfti", "fixtfti.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__fixunstfdi", "fixunstfdi.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__fixunstfsi", "fixunstfsi.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__fixunstfti", "fixunstfti.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__floatditf", "floatditf.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__floatsitf", "floatsitf.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__floatunditf", "floatunditf.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__floatunsitf", "floatunsitf.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__trunctfdf2", "trunctfdf2.c"),
 | 
											
												
													
														|  | 
 |  | +                ("__trunctfsf2", "trunctfsf2.c"),
 | 
											
												
													
														|  |              ]);
 |  |              ]);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |              if target_os != "windows" {
 |  |              if target_os != "windows" {
 | 
											
												
													
														|  | -                sources.extend(&["multc3.c"]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +                sources.extend(&[("__multc3", "multc3.c")]);
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          // Remove the assembly implementations that won't compile for the target
 |  |          // Remove the assembly implementations that won't compile for the target
 | 
											
												
													
														|  |          if llvm_target[0] == "thumbv6m" || llvm_target[0] == "thumbv8m.base" {
 |  |          if llvm_target[0] == "thumbv6m" || llvm_target[0] == "thumbv8m.base" {
 | 
											
												
													
														|  | -            sources.remove(&[
 |  | 
 | 
											
												
													
														|  | -                "clzdi2",
 |  | 
 | 
											
												
													
														|  | -                "clzsi2",
 |  | 
 | 
											
												
													
														|  | -                "divmodsi4",
 |  | 
 | 
											
												
													
														|  | -                "divsi3",
 |  | 
 | 
											
												
													
														|  | -                "modsi3",
 |  | 
 | 
											
												
													
														|  | -                "switch16",
 |  | 
 | 
											
												
													
														|  | -                "switch32",
 |  | 
 | 
											
												
													
														|  | -                "switch8",
 |  | 
 | 
											
												
													
														|  | -                "switchu8",
 |  | 
 | 
											
												
													
														|  | -                "udivmodsi4",
 |  | 
 | 
											
												
													
														|  | -                "udivsi3",
 |  | 
 | 
											
												
													
														|  | -                "umodsi3",
 |  | 
 | 
											
												
													
														|  | -            ]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +            let mut to_remove = Vec::new();
 | 
											
												
													
														|  | 
 |  | +            for (k, v) in sources.map.iter() {
 | 
											
												
													
														|  | 
 |  | +                if v.ends_with(".S") {
 | 
											
												
													
														|  | 
 |  | +                    to_remove.push(*k);
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            sources.remove(&to_remove);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |              // But use some generic implementations where possible
 |  |              // But use some generic implementations where possible
 | 
											
												
													
														|  | -            sources.extend(&["clzdi2.c", "clzsi2.c"])
 |  | 
 | 
											
												
													
														|  | 
 |  | +            sources.extend(&[("__clzdi2", "clzdi2.c"), ("__clzsi2", "clzsi2.c")])
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          if llvm_target[0] == "thumbv7m" || llvm_target[0] == "thumbv7em" {
 |  |          if llvm_target[0] == "thumbv7m" || llvm_target[0] == "thumbv7em" {
 | 
											
												
													
														|  | -            sources.remove(&["aeabi_cdcmp", "aeabi_cfcmp"]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +            sources.remove(&["__aeabi_cdcmp", "__aeabi_cfcmp"]);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          // When compiling in rustbuild (the rust-lang/rust repo) this build
 |  |          // When compiling in rustbuild (the rust-lang/rust repo) this build
 | 
											
										
											
												
													
														|  | @@ -423,10 +420,11 @@ mod c {
 | 
											
												
													
														|  |          };
 |  |          };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          let src_dir = root.join("compiler-rt/lib/builtins");
 |  |          let src_dir = root.join("compiler-rt/lib/builtins");
 | 
											
												
													
														|  | -        for src in sources.map.values() {
 |  | 
 | 
											
												
													
														|  | 
 |  | +        for (sym, src) in sources.map.iter() {
 | 
											
												
													
														|  |              let src = src_dir.join(src);
 |  |              let src = src_dir.join(src);
 | 
											
												
													
														|  |              cfg.file(&src);
 |  |              cfg.file(&src);
 | 
											
												
													
														|  |              println!("cargo:rerun-if-changed={}", src.display());
 |  |              println!("cargo:rerun-if-changed={}", src.display());
 | 
											
												
													
														|  | 
 |  | +            println!("cargo:rustc-cfg={}=\"optimized-c\"", sym);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          cfg.compile("libcompiler-rt.a");
 |  |          cfg.compile("libcompiler-rt.a");
 |