Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a test generator that checks edge cases #315

Closed

Conversation

tgross35
Copy link
Contributor

This uses the same edge cases as compiler-builtins.

This crate builds math symbols from a musl checkout and provides a Rust
interface. The intent is that we will be able to compare our
implementations against musl on more than just linux (which are the only
currently the only targets we run `*-musl` targets against for
comparison).

Musl libc can't compile on anything other than Linux; however, the
routines in `src/math` are cross platform enough to build on MacOS and
windows-gnu with only minor adjustments. We take advantage of this and
build only needed files using `cc`.

The build script also performs remapping (via defines) so that e.g.
`cos` gets defined as `musl_cos`. This gives us more certainty that we
are actually testing against the intended symbol; without it, it is easy
to unknowingly link to system libraries or even Rust's `libm` itself and
wind up with an ineffective test. There is also a small procedure to
verify remapping worked correctly by checking symbols in object files.
Introduce `libm_test::for_each_function`. which macro takes a callback
macro and invokes it once per function signature. This provides an
easier way of registering various tests and benchmarks without
duplicating the function names and signatures each time.
Use a build script for `libm-test` to enumerate all symbols provided by
`libm` and provide this list in a variable. This will allow us to make
sure no functions are missed anytime they must be manually listed.

Additionally, introduce some helper config options.
Create a new test that checks `for_each_fn` against `ALL_FUNCTIONS`,
i.e. the manually entered function list against the automatically
collected list. If any are missing (e.g. new symbol added), then this
will produce an error.
These traits are simplified versions of what we have in
`compiler_builtins` and will be used for tests.
These traits give us a more generic way to interface with tuples used
for (1) test input, (2) function arguments, and (3) test input.
Add a type that caches values used to implement `GenerateInput` on a
variety of signatures.
Create a test generator that creates a known number of random inputs and
caches them, such that the same inputs are used for all functions.
Check our functions against `musl-math-sys`. This is similar to the
existing musl tests that go through binary serialization, but works on
more platforms.
These targets are tested in `compiler-builtins`, but not yet `libm`. Add
dockerfiles to prepare for this.
This brings the targets tested here in line with those tested in
`compiler-builtins`.
This uses the same edge cases as `compiler-builtins`.
@tgross35 tgross35 marked this pull request as draft October 22, 2024 19:34
@tgross35
Copy link
Contributor Author

This depends on #300

@tgross35 tgross35 force-pushed the tgross35/test-refactoring branch 6 times, most recently from 0218e3f to 23d4b39 Compare October 28, 2024 04:56
@tgross35 tgross35 deleted the branch rust-lang:tgross35/test-refactoring October 28, 2024 20:03
@tgross35 tgross35 closed this Oct 28, 2024
@tgross35 tgross35 deleted the test-edge-cases branch December 29, 2024 05:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant