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

Fix i686 struct returning in some scenarios #5726

Closed
wants to merge 2 commits into from

Conversation

brson
Copy link
Contributor

@brson brson commented Apr 4, 2013

r? @nikomatsakis

This doesn't completely fix the x86 ABI for structs, but it does fix some cases. On linux, structs appear to be returned correctly now. On windows, structs are only returned by pointer when they are greater than 8 bytes. That scenario works now.

In the case where the struct is less than 8 bytes our generated code looks peculiar. When returning a pair of u16, C packs both variables into %eax to return them. Our generated code though expects to find one of the pair in %ax and the other in %dx. Similar for u8. I haven't looked into it yet.

There appears to also be struct passing problems on linux, where my extern-pass-TwoU8s and extern-pass-TwoU16s tests are failing.

@nikomatsakis
Copy link
Contributor

Feel free to r+ it once the (minor) comments are resolved



This Adds a bunch of tests for passing and returning structs
of various sizes to C. It fixes the struct return rules on unix,
and on windows for structs of size > 8 bytes. Struct passing
on unix for structs under a certain size appears to still be broken.
bors added a commit that referenced this pull request Apr 18, 2013
r? @nikomatsakis

This doesn't completely fix the x86 ABI for structs, but it does fix some cases. On linux, structs appear to be returned correctly now. On windows, structs are only returned by pointer when they are greater than 8 bytes. That scenario works now.

In the case where the struct is less than 8 bytes our generated code looks peculiar. When returning a pair of u16, C packs both variables into %eax to return them. Our generated code though expects to find one of the pair in %ax and the other in %dx. Similar for u8. I haven't looked into it yet.

There appears to also be struct passing problems on linux, where my `extern-pass-TwoU8s` and `extern-pass-TwoU16s` tests are failing.
@bors bors closed this Apr 18, 2013
flip1995 added a commit to flip1995/rust that referenced this pull request Jun 23, 2020
Fix typo

changelog: extending it's lifetime -> extending its lifetime
flip1995 pushed a commit to flip1995/rust that referenced this pull request Jun 23, 2020
Rollup of 9 pull requests

Successful merges:

 - rust-lang#5178 (clippy-driver: pass all args to rustc if --rustc is present)
 - rust-lang#5705 (Downgrade unnested_or_patterns to pedantic)
 - rust-lang#5709 (Fix ICE in consts::binop)
 - rust-lang#5710 (typo)
 - rust-lang#5712 (Remove `bar` from blacklisted names)
 - rust-lang#5713 (Use lints in Clippy that are enabled in rustc bootstrap)
 - rust-lang#5716 (Fix typo in wildcard_imports)
 - rust-lang#5724 (redundant_pattern_matching: avoid non-`const fn` calls in const contexts)
 - rust-lang#5726 (Fix typo)

Failed merges:

r? @ghost

changelog: rollup
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.

3 participants