Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign upCompiling libcore without SSE leads to LLVM ERROR: SSE register return with SSE disabled #26449
Comments
steveklabnik
added
the
A-LLVM
label
Jun 23, 2015
This comment has been minimized.
This comment has been minimized.
Roxxik
commented
Jun 29, 2015
|
I've investigated this a little further:
the command above without those three disabled works for me
I haven't tested whether the resulting object file is functional.
rustc 1.3.0-dev (40db46c 2015-06-29) |
This comment has been minimized.
This comment has been minimized.
|
To explain somewhat: The x86_64 ABI states that it is mandatory for floating-point return values to be passed in SSE registers. On one level, this makes an enormous amount of sense: the 387 FPU being a weird 80-bit thing causes real issues, and every x86_64 CPU possesses SSE2. On the other hand, LLVM doesn't offer any functionality along the lines of GCC's |
This comment has been minimized.
This comment has been minimized.
|
And to state why one would want to disable SSE etc. When writing kernel-mode code, it is very undesirable to touch the floating-point or vector units, as they both require explicit initialization, and have very large register states that would have to be saved on all context switches. |
This comment has been minimized.
This comment has been minimized.
|
Personally, I'd actually like the idea of splitting libcore into float-free and float-using parts, as there are embedded CPUs with no FPU that are also of interest. |
This comment has been minimized.
This comment has been minimized.
|
Just adding a feature to disable floating point related functions/types etc. should be sufficient for architectures that do not support it or codebases that do not want to use it, right? |
This comment has been minimized.
This comment has been minimized.
|
@gz Adding a I'm not sure what the best long-run solution would be, but probably having a As a related note - Could that LLVM error message be changed to include the offending function? (I'm not sure where such a change would happen, in the rust branch, or in upstream LLVM) |
gz
added a commit
to gz/rust
that referenced
this issue
Jul 3, 2015
gz
added a commit
to gz/rust
that referenced
this issue
Jul 3, 2015
gz
added a commit
to gz/rust
that referenced
this issue
Jul 3, 2015
This comment has been minimized.
This comment has been minimized.
|
FYI I submitted a pull request for this: #26749 |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
If you build libcore with floating point support and link to it using @gz I don't think building libcore without floating point has ever worked. Do you happen to know a version where this works? |
This comment has been minimized.
This comment has been minimized.
|
I'm also getting bitten by this one, for much the same reasons that the powersgang mentions above. I'm starting from Philipp Oppermann's series of blog posts on writing an OS in Rust, and trying to add interrupt support. Unfortunately, saving the floating point registers on every interrupt slows everything down and requires much more fiddling around, which is why most x86 kernels avoid floating point. And of course, there are plenty of other processors without floating point out there. For this kind of bare-metal use, it would be very nice to have some way of convincing Rust to stop emitting floating point instructions and still manage to build core. |
This comment has been minimized.
This comment has been minimized.
|
At the moment - the best way is to patch libcore locally before compiling, I'm still maintaining the patchset that does that for my kernel project. |
This comment has been minimized.
This comment has been minimized.
|
@thepowersgang: Thank you for the suggestion! For anybody else running into this problem, I found a copy of disable_float libcore_nofp patch in @thepowersgang's OS repository. It's surprisingly small. Looking at your patch, it looks very straightforward and "principled", if you will: It specifically excludes everything in libcore related to floating point without any gross hackery. It just disables |
This comment has been minimized.
This comment has been minimized.
emk
referenced this issue
Nov 11, 2015
Open
Float-free libcore (for embedded systems and kernel drivers, among other things) #1364
This comment has been minimized.
This comment has been minimized.
|
@gz You need to add the |
gz commentedJun 20, 2015
May be related to: #26025
At least compilation seems to work for June 17th nightly and earlier.
I tried this (creating libcore library without the use of vector instructions; this is typically done in case one wants to use libcore in kernel level code):
I expected to see this happen: Successful compilation.
Instead, this happened: LLVM ERROR: SSE register return with SSE disabled
Meta
rustc --version --verbose:rustc 1.2.0-nightly (2f56839 2015-06-18)
binary: rustc
commit-hash: 2f56839
commit-date: 2015-06-18
host: x86_64-unknown-linux-gnu
release: 1.2.0-nightly