about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTrevor Gross <tmgross@umich.edu>2025-04-09 01:21:44 +0000
committerTrevor Gross <t.gross35@gmail.com>2025-04-18 17:49:25 -0400
commit3a0b9c9f51ebfae460d1014080dfe20388fa9d29 (patch)
treefea65da59966f8b68be6c3e4107059136a4535fc
parent7077daa6ad9fecd1cb5fa10a431ac86273abbb20 (diff)
downloadrust-3a0b9c9f51ebfae460d1014080dfe20388fa9d29.tar.gz
rust-3a0b9c9f51ebfae460d1014080dfe20388fa9d29.zip
refactor: Introduce a virtual manifest
Move the workspace configuration to a virtual manifest. This
reorganization makes a more clear separation between package contents
and support files that don't get distributed. It will also make it
easier to merge this repository with `compiler-builtins` which is
planned (builtins had a similar update done in [1]).

LICENSE.txt and README.md are symlinkedinto the new directory to ensure
they get included in the package.

[1]: https://github.com/rust-lang/compiler-builtins/pull/702
-rw-r--r--library/compiler-builtins/libm/Cargo.toml37
-rwxr-xr-xlibrary/compiler-builtins/libm/ci/ci-util.py2
-rw-r--r--library/compiler-builtins/libm/etc/function-definitions.json502
-rwxr-xr-xlibrary/compiler-builtins/libm/etc/update-api-list.py26
-rw-r--r--library/compiler-builtins/libm/libm/Cargo.toml38
l---------library/compiler-builtins/libm/libm/LICENSE.txt1
l---------library/compiler-builtins/libm/libm/README.md1
7 files changed, 305 insertions, 302 deletions
diff --git a/library/compiler-builtins/libm/Cargo.toml b/library/compiler-builtins/libm/Cargo.toml
new file mode 100644
index 00000000000..268b6fb0e6d
--- /dev/null
+++ b/library/compiler-builtins/libm/Cargo.toml
@@ -0,0 +1,37 @@
+[workspace]
+resolver = "2"
+members = [
+  "libm",
+  "crates/libm-macros",
+  "crates/libm-test",
+  "crates/musl-math-sys",
+  "crates/util",
+]
+default-members = [
+  "libm",
+  "crates/libm-macros",
+  "crates/libm-test"
+]
+exclude = [
+  # Requires `panic = abort` so can't be a member of the workspace
+  "crates/compiler-builtins-smoke-test",
+]
+
+# The default release profile is unchanged.
+
+# Release mode with debug assertions
+[profile.release-checked]
+inherits = "release"
+debug-assertions = true
+overflow-checks = true
+
+# Release with maximum optimizations, which is very slow to build. This is also
+# what is needed to check `no-panic`.
+[profile.release-opt]
+inherits = "release"
+codegen-units = 1
+lto = "fat"
+
+[profile.bench]
+# Required for iai-callgrind
+debug = true
diff --git a/library/compiler-builtins/libm/ci/ci-util.py b/library/compiler-builtins/libm/ci/ci-util.py
index ed63d6deea1..d9e402d6bd7 100755
--- a/library/compiler-builtins/libm/ci/ci-util.py
+++ b/library/compiler-builtins/libm/ci/ci-util.py
@@ -25,7 +25,7 @@ USAGE = cleandoc(
     COMMAND:
         generate-matrix
             Calculate a matrix of which functions had source change, print that as
-             a JSON object.
+            a JSON object.
 
         locate-baseline [--download] [--extract]
             Locate the most recent benchmark baseline available in CI and, if flags
diff --git a/library/compiler-builtins/libm/etc/function-definitions.json b/library/compiler-builtins/libm/etc/function-definitions.json
index ead1f807fc9..3e33343c464 100644
--- a/library/compiler-builtins/libm/etc/function-definitions.json
+++ b/library/compiler-builtins/libm/etc/function-definitions.json
@@ -2,1067 +2,1067 @@
     "__comment": "Autogenerated by update-api-list.py. List of files that define a function with a given name. This file is checked in to make it obvious if refactoring breaks things",
     "acos": {
         "sources": [
-            "src/math/acos.rs"
+            "libm/src/math/acos.rs"
         ],
         "type": "f64"
     },
     "acosf": {
         "sources": [
-            "src/math/acosf.rs"
+            "libm/src/math/acosf.rs"
         ],
         "type": "f32"
     },
     "acosh": {
         "sources": [
-            "src/math/acosh.rs"
+            "libm/src/math/acosh.rs"
         ],
         "type": "f64"
     },
     "acoshf": {
         "sources": [
-            "src/math/acoshf.rs"
+            "libm/src/math/acoshf.rs"
         ],
         "type": "f32"
     },
     "asin": {
         "sources": [
-            "src/math/asin.rs"
+            "libm/src/math/asin.rs"
         ],
         "type": "f64"
     },
     "asinf": {
         "sources": [
-            "src/math/asinf.rs"
+            "libm/src/math/asinf.rs"
         ],
         "type": "f32"
     },
     "asinh": {
         "sources": [
-            "src/math/asinh.rs"
+            "libm/src/math/asinh.rs"
         ],
         "type": "f64"
     },
     "asinhf": {
         "sources": [
-            "src/math/asinhf.rs"
+            "libm/src/math/asinhf.rs"
         ],
         "type": "f32"
     },
     "atan": {
         "sources": [
-            "src/math/atan.rs"
+            "libm/src/math/atan.rs"
         ],
         "type": "f64"
     },
     "atan2": {
         "sources": [
-            "src/math/atan2.rs"
+            "libm/src/math/atan2.rs"
         ],
         "type": "f64"
     },
     "atan2f": {
         "sources": [
-            "src/math/atan2f.rs"
+            "libm/src/math/atan2f.rs"
         ],
         "type": "f32"
     },
     "atanf": {
         "sources": [
-            "src/math/atanf.rs"
+            "libm/src/math/atanf.rs"
         ],
         "type": "f32"
     },
     "atanh": {
         "sources": [
-            "src/math/atanh.rs"
+            "libm/src/math/atanh.rs"
         ],
         "type": "f64"
     },
     "atanhf": {
         "sources": [
-            "src/math/atanhf.rs"
+            "libm/src/math/atanhf.rs"
         ],
         "type": "f32"
     },
     "cbrt": {
         "sources": [
-            "src/math/cbrt.rs"
+            "libm/src/math/cbrt.rs"
         ],
         "type": "f64"
     },
     "cbrtf": {
         "sources": [
-            "src/math/cbrtf.rs"
+            "libm/src/math/cbrtf.rs"
         ],
         "type": "f32"
     },
     "ceil": {
         "sources": [
-            "src/math/arch/i586.rs",
-            "src/math/arch/wasm32.rs",
-            "src/math/ceil.rs",
-            "src/math/generic/ceil.rs"
+            "libm/src/math/arch/i586.rs",
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/ceil.rs",
+            "libm/src/math/generic/ceil.rs"
         ],
         "type": "f64"
     },
     "ceilf": {
         "sources": [
-            "src/math/arch/wasm32.rs",
-            "src/math/ceil.rs",
-            "src/math/generic/ceil.rs"
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/ceil.rs",
+            "libm/src/math/generic/ceil.rs"
         ],
         "type": "f32"
     },
     "ceilf128": {
         "sources": [
-            "src/math/ceil.rs",
-            "src/math/generic/ceil.rs"
+            "libm/src/math/ceil.rs",
+            "libm/src/math/generic/ceil.rs"
         ],
         "type": "f128"
     },
     "ceilf16": {
         "sources": [
-            "src/math/ceil.rs",
-            "src/math/generic/ceil.rs"
+            "libm/src/math/ceil.rs",
+            "libm/src/math/generic/ceil.rs"
         ],
         "type": "f16"
     },
     "copysign": {
         "sources": [
-            "src/math/copysign.rs",
-            "src/math/generic/copysign.rs"
+            "libm/src/math/copysign.rs",
+            "libm/src/math/generic/copysign.rs"
         ],
         "type": "f64"
     },
     "copysignf": {
         "sources": [
-            "src/math/copysign.rs",
-            "src/math/generic/copysign.rs"
+            "libm/src/math/copysign.rs",
+            "libm/src/math/generic/copysign.rs"
         ],
         "type": "f32"
     },
     "copysignf128": {
         "sources": [
-            "src/math/copysign.rs",
-            "src/math/generic/copysign.rs"
+            "libm/src/math/copysign.rs",
+            "libm/src/math/generic/copysign.rs"
         ],
         "type": "f128"
     },
     "copysignf16": {
         "sources": [
-            "src/math/copysign.rs",
-            "src/math/generic/copysign.rs"
+            "libm/src/math/copysign.rs",
+            "libm/src/math/generic/copysign.rs"
         ],
         "type": "f16"
     },
     "cos": {
         "sources": [
-            "src/math/cos.rs"
+            "libm/src/math/cos.rs"
         ],
         "type": "f64"
     },
     "cosf": {
         "sources": [
-            "src/math/cosf.rs"
+            "libm/src/math/cosf.rs"
         ],
         "type": "f32"
     },
     "cosh": {
         "sources": [
-            "src/math/cosh.rs"
+            "libm/src/math/cosh.rs"
         ],
         "type": "f64"
     },
     "coshf": {
         "sources": [
-            "src/math/coshf.rs"
+            "libm/src/math/coshf.rs"
         ],
         "type": "f32"
     },
     "erf": {
         "sources": [
-            "src/math/erf.rs"
+            "libm/src/math/erf.rs"
         ],
         "type": "f64"
     },
     "erfc": {
         "sources": [
-            "src/math/erf.rs"
+            "libm/src/math/erf.rs"
         ],
         "type": "f64"
     },
     "erfcf": {
         "sources": [
-            "src/math/erff.rs"
+            "libm/src/math/erff.rs"
         ],
         "type": "f32"
     },
     "erff": {
         "sources": [
-            "src/math/erff.rs"
+            "libm/src/math/erff.rs"
         ],
         "type": "f32"
     },
     "exp": {
         "sources": [
-            "src/math/exp.rs"
+            "libm/src/math/exp.rs"
         ],
         "type": "f64"
     },
     "exp10": {
         "sources": [
-            "src/math/exp10.rs"
+            "libm/src/math/exp10.rs"
         ],
         "type": "f64"
     },
     "exp10f": {
         "sources": [
-            "src/math/exp10f.rs"
+            "libm/src/math/exp10f.rs"
         ],
         "type": "f32"
     },
     "exp2": {
         "sources": [
-            "src/math/exp2.rs"
+            "libm/src/math/exp2.rs"
         ],
         "type": "f64"
     },
     "exp2f": {
         "sources": [
-            "src/math/exp2f.rs"
+            "libm/src/math/exp2f.rs"
         ],
         "type": "f32"
     },
     "expf": {
         "sources": [
-            "src/math/expf.rs"
+            "libm/src/math/expf.rs"
         ],
         "type": "f32"
     },
     "expm1": {
         "sources": [
-            "src/math/expm1.rs"
+            "libm/src/math/expm1.rs"
         ],
         "type": "f64"
     },
     "expm1f": {
         "sources": [
-            "src/math/expm1f.rs"
+            "libm/src/math/expm1f.rs"
         ],
         "type": "f32"
     },
     "fabs": {
         "sources": [
-            "src/math/arch/wasm32.rs",
-            "src/math/fabs.rs",
-            "src/math/generic/fabs.rs"
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/fabs.rs",
+            "libm/src/math/generic/fabs.rs"
         ],
         "type": "f64"
     },
     "fabsf": {
         "sources": [
-            "src/math/arch/wasm32.rs",
-            "src/math/fabs.rs",
-            "src/math/generic/fabs.rs"
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/fabs.rs",
+            "libm/src/math/generic/fabs.rs"
         ],
         "type": "f32"
     },
     "fabsf128": {
         "sources": [
-            "src/math/fabs.rs",
-            "src/math/generic/fabs.rs"
+            "libm/src/math/fabs.rs",
+            "libm/src/math/generic/fabs.rs"
         ],
         "type": "f128"
     },
     "fabsf16": {
         "sources": [
-            "src/math/fabs.rs",
-            "src/math/generic/fabs.rs"
+            "libm/src/math/fabs.rs",
+            "libm/src/math/generic/fabs.rs"
         ],
         "type": "f16"
     },
     "fdim": {
         "sources": [
-            "src/math/fdim.rs",
-            "src/math/generic/fdim.rs"
+            "libm/src/math/fdim.rs",
+            "libm/src/math/generic/fdim.rs"
         ],
         "type": "f64"
     },
     "fdimf": {
         "sources": [
-            "src/math/fdim.rs",
-            "src/math/generic/fdim.rs"
+            "libm/src/math/fdim.rs",
+            "libm/src/math/generic/fdim.rs"
         ],
         "type": "f32"
     },
     "fdimf128": {
         "sources": [
-            "src/math/fdim.rs",
-            "src/math/generic/fdim.rs"
+            "libm/src/math/fdim.rs",
+            "libm/src/math/generic/fdim.rs"
         ],
         "type": "f128"
     },
     "fdimf16": {
         "sources": [
-            "src/math/fdim.rs",
-            "src/math/generic/fdim.rs"
+            "libm/src/math/fdim.rs",
+            "libm/src/math/generic/fdim.rs"
         ],
         "type": "f16"
     },
     "floor": {
         "sources": [
-            "src/math/arch/i586.rs",
-            "src/math/arch/wasm32.rs",
-            "src/math/floor.rs",
-            "src/math/generic/floor.rs"
+            "libm/src/math/arch/i586.rs",
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/floor.rs",
+            "libm/src/math/generic/floor.rs"
         ],
         "type": "f64"
     },
     "floorf": {
         "sources": [
-            "src/math/arch/wasm32.rs",
-            "src/math/floor.rs",
-            "src/math/generic/floor.rs"
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/floor.rs",
+            "libm/src/math/generic/floor.rs"
         ],
         "type": "f32"
     },
     "floorf128": {
         "sources": [
-            "src/math/floor.rs",
-            "src/math/generic/floor.rs"
+            "libm/src/math/floor.rs",
+            "libm/src/math/generic/floor.rs"
         ],
         "type": "f128"
     },
     "floorf16": {
         "sources": [
-            "src/math/floor.rs",
-            "src/math/generic/floor.rs"
+            "libm/src/math/floor.rs",
+            "libm/src/math/generic/floor.rs"
         ],
         "type": "f16"
     },
     "fma": {
         "sources": [
-            "src/math/arch/aarch64.rs",
-            "src/math/fma.rs"
+            "libm/src/math/arch/aarch64.rs",
+            "libm/src/math/fma.rs"
         ],
         "type": "f64"
     },
     "fmaf": {
         "sources": [
-            "src/math/arch/aarch64.rs",
-            "src/math/fma_wide.rs"
+            "libm/src/math/arch/aarch64.rs",
+            "libm/src/math/fma_wide.rs"
         ],
         "type": "f32"
     },
     "fmaf128": {
         "sources": [
-            "src/math/fma.rs"
+            "libm/src/math/fma.rs"
         ],
         "type": "f128"
     },
     "fmax": {
         "sources": [
-            "src/math/fmin_fmax.rs",
-            "src/math/generic/fmax.rs"
+            "libm/src/math/fmin_fmax.rs",
+            "libm/src/math/generic/fmax.rs"
         ],
         "type": "f64"
     },
     "fmaxf": {
         "sources": [
-            "src/math/fmin_fmax.rs",
-            "src/math/generic/fmax.rs"
+            "libm/src/math/fmin_fmax.rs",
+            "libm/src/math/generic/fmax.rs"
         ],
         "type": "f32"
     },
     "fmaxf128": {
         "sources": [
-            "src/math/fmin_fmax.rs",
-            "src/math/generic/fmax.rs"
+            "libm/src/math/fmin_fmax.rs",
+            "libm/src/math/generic/fmax.rs"
         ],
         "type": "f128"
     },
     "fmaxf16": {
         "sources": [
-            "src/math/fmin_fmax.rs",
-            "src/math/generic/fmax.rs"
+            "libm/src/math/fmin_fmax.rs",
+            "libm/src/math/generic/fmax.rs"
         ],
         "type": "f16"
     },
     "fmaximum": {
         "sources": [
-            "src/math/fminimum_fmaximum.rs",
-            "src/math/generic/fmaximum.rs"
+            "libm/src/math/fminimum_fmaximum.rs",
+            "libm/src/math/generic/fmaximum.rs"
         ],
         "type": "f64"
     },
     "fmaximum_num": {
         "sources": [
-            "src/math/fminimum_fmaximum_num.rs",
-            "src/math/generic/fmaximum_num.rs"
+            "libm/src/math/fminimum_fmaximum_num.rs",
+            "libm/src/math/generic/fmaximum_num.rs"
         ],
         "type": "f64"
     },
     "fmaximum_numf": {
         "sources": [
-            "src/math/fminimum_fmaximum_num.rs",
-            "src/math/generic/fmaximum_num.rs"
+            "libm/src/math/fminimum_fmaximum_num.rs",
+            "libm/src/math/generic/fmaximum_num.rs"
         ],
         "type": "f32"
     },
     "fmaximum_numf128": {
         "sources": [
-            "src/math/fminimum_fmaximum_num.rs",
-            "src/math/generic/fmaximum_num.rs"
+            "libm/src/math/fminimum_fmaximum_num.rs",
+            "libm/src/math/generic/fmaximum_num.rs"
         ],
         "type": "f128"
     },
     "fmaximum_numf16": {
         "sources": [
-            "src/math/fminimum_fmaximum_num.rs",
-            "src/math/generic/fmaximum_num.rs"
+            "libm/src/math/fminimum_fmaximum_num.rs",
+            "libm/src/math/generic/fmaximum_num.rs"
         ],
         "type": "f16"
     },
     "fmaximumf": {
         "sources": [
-            "src/math/fminimum_fmaximum.rs",
-            "src/math/generic/fmaximum.rs"
+            "libm/src/math/fminimum_fmaximum.rs",
+            "libm/src/math/generic/fmaximum.rs"
         ],
         "type": "f32"
     },
     "fmaximumf128": {
         "sources": [
-            "src/math/fminimum_fmaximum.rs",
-            "src/math/generic/fmaximum.rs"
+            "libm/src/math/fminimum_fmaximum.rs",
+            "libm/src/math/generic/fmaximum.rs"
         ],
         "type": "f128"
     },
     "fmaximumf16": {
         "sources": [
-            "src/math/fminimum_fmaximum.rs",
-            "src/math/generic/fmaximum.rs"
+            "libm/src/math/fminimum_fmaximum.rs",
+            "libm/src/math/generic/fmaximum.rs"
         ],
         "type": "f16"
     },
     "fmin": {
         "sources": [
-            "src/math/fmin_fmax.rs",
-            "src/math/generic/fmin.rs"
+            "libm/src/math/fmin_fmax.rs",
+            "libm/src/math/generic/fmin.rs"
         ],
         "type": "f64"
     },
     "fminf": {
         "sources": [
-            "src/math/fmin_fmax.rs",
-            "src/math/generic/fmin.rs"
+            "libm/src/math/fmin_fmax.rs",
+            "libm/src/math/generic/fmin.rs"
         ],
         "type": "f32"
     },
     "fminf128": {
         "sources": [
-            "src/math/fmin_fmax.rs",
-            "src/math/generic/fmin.rs"
+            "libm/src/math/fmin_fmax.rs",
+            "libm/src/math/generic/fmin.rs"
         ],
         "type": "f128"
     },
     "fminf16": {
         "sources": [
-            "src/math/fmin_fmax.rs",
-            "src/math/generic/fmin.rs"
+            "libm/src/math/fmin_fmax.rs",
+            "libm/src/math/generic/fmin.rs"
         ],
         "type": "f16"
     },
     "fminimum": {
         "sources": [
-            "src/math/fminimum_fmaximum.rs",
-            "src/math/generic/fminimum.rs"
+            "libm/src/math/fminimum_fmaximum.rs",
+            "libm/src/math/generic/fminimum.rs"
         ],
         "type": "f64"
     },
     "fminimum_num": {
         "sources": [
-            "src/math/fminimum_fmaximum_num.rs",
-            "src/math/generic/fminimum_num.rs"
+            "libm/src/math/fminimum_fmaximum_num.rs",
+            "libm/src/math/generic/fminimum_num.rs"
         ],
         "type": "f64"
     },
     "fminimum_numf": {
         "sources": [
-            "src/math/fminimum_fmaximum_num.rs",
-            "src/math/generic/fminimum_num.rs"
+            "libm/src/math/fminimum_fmaximum_num.rs",
+            "libm/src/math/generic/fminimum_num.rs"
         ],
         "type": "f32"
     },
     "fminimum_numf128": {
         "sources": [
-            "src/math/fminimum_fmaximum_num.rs",
-            "src/math/generic/fminimum_num.rs"
+            "libm/src/math/fminimum_fmaximum_num.rs",
+            "libm/src/math/generic/fminimum_num.rs"
         ],
         "type": "f128"
     },
     "fminimum_numf16": {
         "sources": [
-            "src/math/fminimum_fmaximum_num.rs",
-            "src/math/generic/fminimum_num.rs"
+            "libm/src/math/fminimum_fmaximum_num.rs",
+            "libm/src/math/generic/fminimum_num.rs"
         ],
         "type": "f16"
     },
     "fminimumf": {
         "sources": [
-            "src/math/fminimum_fmaximum.rs",
-            "src/math/generic/fminimum.rs"
+            "libm/src/math/fminimum_fmaximum.rs",
+            "libm/src/math/generic/fminimum.rs"
         ],
         "type": "f32"
     },
     "fminimumf128": {
         "sources": [
-            "src/math/fminimum_fmaximum.rs",
-            "src/math/generic/fminimum.rs"
+            "libm/src/math/fminimum_fmaximum.rs",
+            "libm/src/math/generic/fminimum.rs"
         ],
         "type": "f128"
     },
     "fminimumf16": {
         "sources": [
-            "src/math/fminimum_fmaximum.rs",
-            "src/math/generic/fminimum.rs"
+            "libm/src/math/fminimum_fmaximum.rs",
+            "libm/src/math/generic/fminimum.rs"
         ],
         "type": "f16"
     },
     "fmod": {
         "sources": [
-            "src/math/fmod.rs",
-            "src/math/generic/fmod.rs"
+            "libm/src/math/fmod.rs",
+            "libm/src/math/generic/fmod.rs"
         ],
         "type": "f64"
     },
     "fmodf": {
         "sources": [
-            "src/math/fmod.rs",
-            "src/math/generic/fmod.rs"
+            "libm/src/math/fmod.rs",
+            "libm/src/math/generic/fmod.rs"
         ],
         "type": "f32"
     },
     "fmodf128": {
         "sources": [
-            "src/math/fmod.rs",
-            "src/math/generic/fmod.rs"
+            "libm/src/math/fmod.rs",
+            "libm/src/math/generic/fmod.rs"
         ],
         "type": "f128"
     },
     "fmodf16": {
         "sources": [
-            "src/math/fmod.rs",
-            "src/math/generic/fmod.rs"
+            "libm/src/math/fmod.rs",
+            "libm/src/math/generic/fmod.rs"
         ],
         "type": "f16"
     },
     "frexp": {
         "sources": [
-            "src/math/frexp.rs"
+            "libm/src/math/frexp.rs"
         ],
         "type": "f64"
     },
     "frexpf": {
         "sources": [
-            "src/math/frexpf.rs"
+            "libm/src/math/frexpf.rs"
         ],
         "type": "f32"
     },
     "hypot": {
         "sources": [
-            "src/math/hypot.rs"
+            "libm/src/math/hypot.rs"
         ],
         "type": "f64"
     },
     "hypotf": {
         "sources": [
-            "src/math/hypotf.rs"
+            "libm/src/math/hypotf.rs"
         ],
         "type": "f32"
     },
     "ilogb": {
         "sources": [
-            "src/math/ilogb.rs"
+            "libm/src/math/ilogb.rs"
         ],
         "type": "f64"
     },
     "ilogbf": {
         "sources": [
-            "src/math/ilogbf.rs"
+            "libm/src/math/ilogbf.rs"
         ],
         "type": "f32"
     },
     "j0": {
         "sources": [
-            "src/math/j0.rs"
+            "libm/src/math/j0.rs"
         ],
         "type": "f64"
     },
     "j0f": {
         "sources": [
-            "src/math/j0f.rs"
+            "libm/src/math/j0f.rs"
         ],
         "type": "f32"
     },
     "j1": {
         "sources": [
-            "src/math/j1.rs"
+            "libm/src/math/j1.rs"
         ],
         "type": "f64"
     },
     "j1f": {
         "sources": [
-            "src/math/j1f.rs"
+            "libm/src/math/j1f.rs"
         ],
         "type": "f32"
     },
     "jn": {
         "sources": [
-            "src/math/jn.rs"
+            "libm/src/math/jn.rs"
         ],
         "type": "f64"
     },
     "jnf": {
         "sources": [
-            "src/math/jnf.rs"
+            "libm/src/math/jnf.rs"
         ],
         "type": "f32"
     },
     "ldexp": {
         "sources": [
-            "src/math/ldexp.rs"
+            "libm/src/math/ldexp.rs"
         ],
         "type": "f64"
     },
     "ldexpf": {
         "sources": [
-            "src/math/ldexp.rs"
+            "libm/src/math/ldexp.rs"
         ],
         "type": "f32"
     },
     "ldexpf128": {
         "sources": [
-            "src/math/ldexp.rs"
+            "libm/src/math/ldexp.rs"
         ],
         "type": "f128"
     },
     "ldexpf16": {
         "sources": [
-            "src/math/ldexp.rs"
+            "libm/src/math/ldexp.rs"
         ],
         "type": "f16"
     },
     "lgamma": {
         "sources": [
-            "src/math/lgamma.rs"
+            "libm/src/math/lgamma.rs"
         ],
         "type": "f64"
     },
     "lgamma_r": {
         "sources": [
-            "src/math/lgamma_r.rs"
+            "libm/src/math/lgamma_r.rs"
         ],
         "type": "f64"
     },
     "lgammaf": {
         "sources": [
-            "src/math/lgammaf.rs"
+            "libm/src/math/lgammaf.rs"
         ],
         "type": "f32"
     },
     "lgammaf_r": {
         "sources": [
-            "src/math/lgammaf_r.rs"
+            "libm/src/math/lgammaf_r.rs"
         ],
         "type": "f32"
     },
     "log": {
         "sources": [
-            "src/math/log.rs"
+            "libm/src/math/log.rs"
         ],
         "type": "f64"
     },
     "log10": {
         "sources": [
-            "src/math/log10.rs"
+            "libm/src/math/log10.rs"
         ],
         "type": "f64"
     },
     "log10f": {
         "sources": [
-            "src/math/log10f.rs"
+            "libm/src/math/log10f.rs"
         ],
         "type": "f32"
     },
     "log1p": {
         "sources": [
-            "src/math/log1p.rs"
+            "libm/src/math/log1p.rs"
         ],
         "type": "f64"
     },
     "log1pf": {
         "sources": [
-            "src/math/log1pf.rs"
+            "libm/src/math/log1pf.rs"
         ],
         "type": "f32"
     },
     "log2": {
         "sources": [
-            "src/math/log2.rs"
+            "libm/src/math/log2.rs"
         ],
         "type": "f64"
     },
     "log2f": {
         "sources": [
-            "src/math/log2f.rs"
+            "libm/src/math/log2f.rs"
         ],
         "type": "f32"
     },
     "logf": {
         "sources": [
-            "src/math/logf.rs"
+            "libm/src/math/logf.rs"
         ],
         "type": "f32"
     },
     "modf": {
         "sources": [
-            "src/math/modf.rs"
+            "libm/src/math/modf.rs"
         ],
         "type": "f64"
     },
     "modff": {
         "sources": [
-            "src/math/modff.rs"
+            "libm/src/math/modff.rs"
         ],
         "type": "f32"
     },
     "nextafter": {
         "sources": [
-            "src/math/nextafter.rs"
+            "libm/src/math/nextafter.rs"
         ],
         "type": "f64"
     },
     "nextafterf": {
         "sources": [
-            "src/math/nextafterf.rs"
+            "libm/src/math/nextafterf.rs"
         ],
         "type": "f32"
     },
     "pow": {
         "sources": [
-            "src/math/pow.rs"
+            "libm/src/math/pow.rs"
         ],
         "type": "f64"
     },
     "powf": {
         "sources": [
-            "src/math/powf.rs"
+            "libm/src/math/powf.rs"
         ],
         "type": "f32"
     },
     "remainder": {
         "sources": [
-            "src/math/remainder.rs"
+            "libm/src/math/remainder.rs"
         ],
         "type": "f64"
     },
     "remainderf": {
         "sources": [
-            "src/math/remainderf.rs"
+            "libm/src/math/remainderf.rs"
         ],
         "type": "f32"
     },
     "remquo": {
         "sources": [
-            "src/math/remquo.rs"
+            "libm/src/math/remquo.rs"
         ],
         "type": "f64"
     },
     "remquof": {
         "sources": [
-            "src/math/remquof.rs"
+            "libm/src/math/remquof.rs"
         ],
         "type": "f32"
     },
     "rint": {
         "sources": [
-            "src/math/arch/aarch64.rs",
-            "src/math/arch/wasm32.rs",
-            "src/math/rint.rs"
+            "libm/src/math/arch/aarch64.rs",
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/rint.rs"
         ],
         "type": "f64"
     },
     "rintf": {
         "sources": [
-            "src/math/arch/aarch64.rs",
-            "src/math/arch/wasm32.rs",
-            "src/math/rint.rs"
+            "libm/src/math/arch/aarch64.rs",
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/rint.rs"
         ],
         "type": "f32"
     },
     "rintf128": {
         "sources": [
-            "src/math/rint.rs"
+            "libm/src/math/rint.rs"
         ],
         "type": "f128"
     },
     "rintf16": {
         "sources": [
-            "src/math/arch/aarch64.rs",
-            "src/math/rint.rs"
+            "libm/src/math/arch/aarch64.rs",
+            "libm/src/math/rint.rs"
         ],
         "type": "f16"
     },
     "round": {
         "sources": [
-            "src/math/generic/round.rs",
-            "src/math/round.rs"
+            "libm/src/math/generic/round.rs",
+            "libm/src/math/round.rs"
         ],
         "type": "f64"
     },
     "roundeven": {
         "sources": [
-            "src/math/roundeven.rs"
+            "libm/src/math/roundeven.rs"
         ],
         "type": "f64"
     },
     "roundevenf": {
         "sources": [
-            "src/math/roundeven.rs"
+            "libm/src/math/roundeven.rs"
         ],
         "type": "f32"
     },
     "roundevenf128": {
         "sources": [
-            "src/math/roundeven.rs"
+            "libm/src/math/roundeven.rs"
         ],
         "type": "f128"
     },
     "roundevenf16": {
         "sources": [
-            "src/math/roundeven.rs"
+            "libm/src/math/roundeven.rs"
         ],
         "type": "f16"
     },
     "roundf": {
         "sources": [
-            "src/math/generic/round.rs",
-            "src/math/round.rs"
+            "libm/src/math/generic/round.rs",
+            "libm/src/math/round.rs"
         ],
         "type": "f32"
     },
     "roundf128": {
         "sources": [
-            "src/math/generic/round.rs",
-            "src/math/round.rs"
+            "libm/src/math/generic/round.rs",
+            "libm/src/math/round.rs"
         ],
         "type": "f128"
     },
     "roundf16": {
         "sources": [
-            "src/math/generic/round.rs",
-            "src/math/round.rs"
+            "libm/src/math/generic/round.rs",
+            "libm/src/math/round.rs"
         ],
         "type": "f16"
     },
     "scalbn": {
         "sources": [
-            "src/math/generic/scalbn.rs",
-            "src/math/scalbn.rs"
+            "libm/src/math/generic/scalbn.rs",
+            "libm/src/math/scalbn.rs"
         ],
         "type": "f64"
     },
     "scalbnf": {
         "sources": [
-            "src/math/generic/scalbn.rs",
-            "src/math/scalbn.rs"
+            "libm/src/math/generic/scalbn.rs",
+            "libm/src/math/scalbn.rs"
         ],
         "type": "f32"
     },
     "scalbnf128": {
         "sources": [
-            "src/math/generic/scalbn.rs",
-            "src/math/scalbn.rs"
+            "libm/src/math/generic/scalbn.rs",
+            "libm/src/math/scalbn.rs"
         ],
         "type": "f128"
     },
     "scalbnf16": {
         "sources": [
-            "src/math/generic/scalbn.rs",
-            "src/math/scalbn.rs"
+            "libm/src/math/generic/scalbn.rs",
+            "libm/src/math/scalbn.rs"
         ],
         "type": "f16"
     },
     "sin": {
         "sources": [
-            "src/math/sin.rs"
+            "libm/src/math/sin.rs"
         ],
         "type": "f64"
     },
     "sincos": {
         "sources": [
-            "src/math/sincos.rs"
+            "libm/src/math/sincos.rs"
         ],
         "type": "f64"
     },
     "sincosf": {
         "sources": [
-            "src/math/sincosf.rs"
+            "libm/src/math/sincosf.rs"
         ],
         "type": "f32"
     },
     "sinf": {
         "sources": [
-            "src/math/sinf.rs"
+            "libm/src/math/sinf.rs"
         ],
         "type": "f32"
     },
     "sinh": {
         "sources": [
-            "src/math/sinh.rs"
+            "libm/src/math/sinh.rs"
         ],
         "type": "f64"
     },
     "sinhf": {
         "sources": [
-            "src/math/sinhf.rs"
+            "libm/src/math/sinhf.rs"
         ],
         "type": "f32"
     },
     "sqrt": {
         "sources": [
-            "src/math/arch/aarch64.rs",
-            "src/math/arch/i686.rs",
-            "src/math/arch/wasm32.rs",
-            "src/math/generic/sqrt.rs",
-            "src/math/sqrt.rs"
+            "libm/src/math/arch/aarch64.rs",
+            "libm/src/math/arch/i686.rs",
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/generic/sqrt.rs",
+            "libm/src/math/sqrt.rs"
         ],
         "type": "f64"
     },
     "sqrtf": {
         "sources": [
-            "src/math/arch/aarch64.rs",
-            "src/math/arch/i686.rs",
-            "src/math/arch/wasm32.rs",
-            "src/math/generic/sqrt.rs",
-            "src/math/sqrt.rs"
+            "libm/src/math/arch/aarch64.rs",
+            "libm/src/math/arch/i686.rs",
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/generic/sqrt.rs",
+            "libm/src/math/sqrt.rs"
         ],
         "type": "f32"
     },
     "sqrtf128": {
         "sources": [
-            "src/math/generic/sqrt.rs",
-            "src/math/sqrt.rs"
+            "libm/src/math/generic/sqrt.rs",
+            "libm/src/math/sqrt.rs"
         ],
         "type": "f128"
     },
     "sqrtf16": {
         "sources": [
-            "src/math/arch/aarch64.rs",
-            "src/math/generic/sqrt.rs",
-            "src/math/sqrt.rs"
+            "libm/src/math/arch/aarch64.rs",
+            "libm/src/math/generic/sqrt.rs",
+            "libm/src/math/sqrt.rs"
         ],
         "type": "f16"
     },
     "tan": {
         "sources": [
-            "src/math/tan.rs"
+            "libm/src/math/tan.rs"
         ],
         "type": "f64"
     },
     "tanf": {
         "sources": [
-            "src/math/tanf.rs"
+            "libm/src/math/tanf.rs"
         ],
         "type": "f32"
     },
     "tanh": {
         "sources": [
-            "src/math/tanh.rs"
+            "libm/src/math/tanh.rs"
         ],
         "type": "f64"
     },
     "tanhf": {
         "sources": [
-            "src/math/tanhf.rs"
+            "libm/src/math/tanhf.rs"
         ],
         "type": "f32"
     },
     "tgamma": {
         "sources": [
-            "src/math/tgamma.rs"
+            "libm/src/math/tgamma.rs"
         ],
         "type": "f64"
     },
     "tgammaf": {
         "sources": [
-            "src/math/tgammaf.rs"
+            "libm/src/math/tgammaf.rs"
         ],
         "type": "f32"
     },
     "trunc": {
         "sources": [
-            "src/math/arch/wasm32.rs",
-            "src/math/generic/trunc.rs",
-            "src/math/trunc.rs"
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/generic/trunc.rs",
+            "libm/src/math/trunc.rs"
         ],
         "type": "f64"
     },
     "truncf": {
         "sources": [
-            "src/math/arch/wasm32.rs",
-            "src/math/generic/trunc.rs",
-            "src/math/trunc.rs"
+            "libm/src/math/arch/wasm32.rs",
+            "libm/src/math/generic/trunc.rs",
+            "libm/src/math/trunc.rs"
         ],
         "type": "f32"
     },
     "truncf128": {
         "sources": [
-            "src/math/generic/trunc.rs",
-            "src/math/trunc.rs"
+            "libm/src/math/generic/trunc.rs",
+            "libm/src/math/trunc.rs"
         ],
         "type": "f128"
     },
     "truncf16": {
         "sources": [
-            "src/math/generic/trunc.rs",
-            "src/math/trunc.rs"
+            "libm/src/math/generic/trunc.rs",
+            "libm/src/math/trunc.rs"
         ],
         "type": "f16"
     },
     "y0": {
         "sources": [
-            "src/math/j0.rs"
+            "libm/src/math/j0.rs"
         ],
         "type": "f64"
     },
     "y0f": {
         "sources": [
-            "src/math/j0f.rs"
+            "libm/src/math/j0f.rs"
         ],
         "type": "f32"
     },
     "y1": {
         "sources": [
-            "src/math/j1.rs"
+            "libm/src/math/j1.rs"
         ],
         "type": "f64"
     },
     "y1f": {
         "sources": [
-            "src/math/j1f.rs"
+            "libm/src/math/j1f.rs"
         ],
         "type": "f32"
     },
     "yn": {
         "sources": [
-            "src/math/jn.rs"
+            "libm/src/math/jn.rs"
         ],
         "type": "f64"
     },
     "ynf": {
         "sources": [
-            "src/math/jnf.rs"
+            "libm/src/math/jnf.rs"
         ],
         "type": "f32"
     }
diff --git a/library/compiler-builtins/libm/etc/update-api-list.py b/library/compiler-builtins/libm/etc/update-api-list.py
index 950824fc442..0770a8b20fb 100755
--- a/library/compiler-builtins/libm/etc/update-api-list.py
+++ b/library/compiler-builtins/libm/etc/update-api-list.py
@@ -18,10 +18,10 @@ from typing import Any, Callable, TypeAlias
 
 SELF_PATH = Path(__file__)
 ETC_DIR = SELF_PATH.parent
-LIBM_DIR = ETC_DIR.parent.joinpath("libm")
+ROOT_DIR = ETC_DIR.parent
 
 # These files do not trigger a retest.
-IGNORED_SOURCES = ["src/libm_helper.rs", "src/math/support/float_traits.rs"]
+IGNORED_SOURCES = ["libm/src/libm_helper.rs", "libm/src/math/support/float_traits.rs"]
 
 IndexTy: TypeAlias = dict[str, dict[str, Any]]
 """Type of the `index` item in rustdoc's JSON output"""
@@ -66,7 +66,7 @@ class Crate:
         j = sp.check_output(
             [
                 "rustdoc",
-                "src/lib.rs",
+                "libm/src/lib.rs",
                 "--edition=2021",
                 "--document-private-items",
                 "--output-format=json",
@@ -75,7 +75,7 @@ class Crate:
                 "-Zunstable-options",
                 "-o-",
             ],
-            cwd=LIBM_DIR,
+            cwd=ROOT_DIR,
             text=True,
         )
         j = json.loads(j)
@@ -94,7 +94,9 @@ class Crate:
         # Collect a list of source IDs for reexported items in `lib.rs` or `mod math`.
         use = (i for i in public if "use" in i["inner"])
         use = (
-            i for i in use if i["span"]["filename"] in ["src/math/mod.rs", "src/lib.rs"]
+            i
+            for i in use
+            if i["span"]["filename"] in ["libm/src/math/mod.rs", "libm/src/lib.rs"]
         )
         reexported_ids = [item["inner"]["use"]["id"] for item in use]
 
@@ -121,8 +123,8 @@ class Crate:
 
         # A lot of the `arch` module is often configured out so doesn't show up in docs. Use
         # string matching as a fallback.
-        for fname in glob("src/math/arch/**.rs", root_dir=LIBM_DIR):
-            contents = (LIBM_DIR.joinpath(fname)).read_text()
+        for fname in glob("libm/src/math/arch/**.rs", root_dir=ROOT_DIR):
+            contents = (ROOT_DIR.joinpath(fname)).read_text()
 
             for name in self.public_functions:
                 if f"fn {name}" in contents:
@@ -188,10 +190,10 @@ class Crate:
         include all public API.
         """
 
-        flist = sp.check_output(["git", "ls-files"], cwd=LIBM_DIR, text=True)
+        flist = sp.check_output(["git", "ls-files"], cwd=ROOT_DIR, text=True)
 
         for path in flist.splitlines():
-            fpath = LIBM_DIR.joinpath(path)
+            fpath = ROOT_DIR.joinpath(path)
             if fpath.is_dir() or fpath == SELF_PATH:
                 continue
 
@@ -229,7 +231,7 @@ class Crate:
         if len(not_found) == 0:
             return
 
-        relpath = fpath.relative_to(LIBM_DIR)
+        relpath = fpath.relative_to(ROOT_DIR)
         eprint(f"functions not found at {relpath}:{line_num}: {not_found}")
         exit(1)
 
@@ -244,7 +246,7 @@ def validate_delimited_block(
     """Identify blocks of code wrapped within `start` and `end`, collect their contents
     to a list of strings, and call `validate` for each of those lists.
     """
-    relpath = fpath.relative_to(LIBM_DIR)
+    relpath = fpath.relative_to(ROOT_DIR)
     block_lines = []
     block_start_line: None | int = None
     for line_num, line in enumerate(lines):
@@ -274,7 +276,7 @@ def validate_delimited_block(
 
 def ensure_sorted(fpath: Path, block_start_line: int, lines: list[str]) -> None:
     """Ensure that a list of lines is sorted, otherwise print a diff and exit."""
-    relpath = fpath.relative_to(LIBM_DIR)
+    relpath = fpath.relative_to(ROOT_DIR)
     diff_and_exit(
         "\n".join(lines),
         "\n".join(sorted(lines)),
diff --git a/library/compiler-builtins/libm/libm/Cargo.toml b/library/compiler-builtins/libm/libm/Cargo.toml
index e0aeb07d527..44154c1a8f5 100644
--- a/library/compiler-builtins/libm/libm/Cargo.toml
+++ b/library/compiler-builtins/libm/libm/Cargo.toml
@@ -10,7 +10,6 @@ readme = "README.md"
 repository = "https://github.com/rust-lang/libm"
 version = "0.2.11"
 edition = "2021"
-exclude = ["/ci/", "/.github/workflows/"]
 rust-version = "1.63"
 
 [features]
@@ -40,24 +39,6 @@ unstable-float = []
 # hard float operations.
 force-soft-floats = []
 
-[workspace]
-resolver = "2"
-members = [
-  "crates/libm-macros",
-  "crates/libm-test",
-  "crates/musl-math-sys",
-  "crates/util",
-]
-default-members = [
-  ".",
-  "crates/libm-macros",
-  "crates/libm-test",
-]
-exclude = [
-  # Requires `panic = abort` so can't be a member of the workspace
-  "crates/compiler-builtins-smoke-test",
-]
-
 [dev-dependencies]
 no-panic = "0.1.35"
 
@@ -66,22 +47,3 @@ unexpected_cfgs = { level = "warn", check-cfg = [
   # compiler-builtins sets this feature, but we use it in `libm`
   'cfg(feature, values("compiler-builtins"))',
 ] }
-
-# The default release profile is unchanged.
-
-# Release mode with debug assertions
-[profile.release-checked]
-inherits = "release"
-debug-assertions = true
-overflow-checks = true
-
-# Release with maximum optimizations, which is very slow to build. This is also
-# what is needed to check `no-panic`.
-[profile.release-opt]
-inherits = "release"
-codegen-units = 1
-lto = "fat"
-
-[profile.bench]
-# Required for iai-callgrind
-debug = true
diff --git a/library/compiler-builtins/libm/libm/LICENSE.txt b/library/compiler-builtins/libm/libm/LICENSE.txt
new file mode 120000
index 00000000000..4ab43736a83
--- /dev/null
+++ b/library/compiler-builtins/libm/libm/LICENSE.txt
@@ -0,0 +1 @@
+../LICENSE.txt
\ No newline at end of file
diff --git a/library/compiler-builtins/libm/libm/README.md b/library/compiler-builtins/libm/libm/README.md
new file mode 120000
index 00000000000..32d46ee883b
--- /dev/null
+++ b/library/compiler-builtins/libm/libm/README.md
@@ -0,0 +1 @@
+../README.md
\ No newline at end of file