-
Notifications
You must be signed in to change notification settings - Fork 13.2k
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
Trans Refactor: Episode 2 #7182
Conversation
count-llvm-insns has helped us find several major codegen problems, I'd prefer reworking it somehow, not removing it. |
Possible: sink it into the block wrapper struct, such that it reports a hierarchy of blocks, not translation fn calls? Alternative: tls? |
@graydon I removed the offending commit (I did see this coming, so deliberately made it easier for me to undo) and re-based. I'm just checking it now. I'll re-implement the counter using task-local storage, since it makes a bit more sense anyway. |
@graydon I fixed the issue with the error messages and took the opportunity to clean up the ppaux.rs code a little and make sure that the parameterized lifetimes print properly. Originally I changed it to print Because of that, this code: fn foo<'a, 'b, T>(a: Foo<'a,T>) -> Foo<'b,T> {
a
} would produce an error something like: In short, printing a type like I also added the commit I mentioned to make count-llvm-insn stuff use task-local storage instead of being directly attached to the crate context, though the stats themselves are still on the crate context. |
This makes the handling of atomic operations more generic, which does impose a specific naming convention for the intrinsics, but that seems ok with me, rather than having an individual case for each name. It also adds the intrinsics to the the intrinsics file.
This is another big refactoring of `trans` though this is unlikely to have much of an impact on code size or speed. The major change here is the implementation of a `Type` struct which is the new home for all your LLVM `TypeRef` needs. It's a simple wrapper struct, with static methods for constructing types, then regular methods for manipulating/interrogating them. The purpose of this is mostly to make the code surrounding them somewhat more ideomatic. A line like: `T_ptr(T_ptr(T_i8()))` is now `Type::i8().ptr_to().ptr_to()`,which is much more like regular Rust code. There are a variety of smaller changes here and there: * Remove address spaces. At least it doesn't generate them, I haven't spent much time looking for related code. * Use a macro for declaring the LLVM intrinsics, makes it look much nicer. * Make the type for a string slice actually create a named `str_slice` type in LLVM, this makes reading the appropriate code much easier. * Change the way struct and enum type names are generated. This just means that a struct like `struct Foo { a: int }` now produces the IR `%struct.Foo = type { i64 }`, which is much easier to read. Similarly, other structs are a bit tighter to make it easier to read. --- --- --- This PR did get away from me a little, as I occasionally got distracted or as I fixed up problems with unrelated code that were stopping me from continuing. One major thing is that this PR contains the work from #7168, since that would have conflicted with this and it was broken anyway. Sorry for bundling it like this. Fixes #3670 and #7063 --- --- --- EDIT: This no longer removes the llvm insn stats.
…ant, r=flip1995 For `to_*` variant don't lint in trait impl taking `self` when non-`Copy` type Lint name: `wrong_self_convention`. It relaxes rules for `to_*` variant, so it doesn't lint in trait definitions and implementations anymore. Although, non-`Copy` type implementing trait's `to_*` method taking `self` feels not good (consumes ownership, so should be rather named `into_`), it would be better if this case was a pedantic lint (allow-by-default) instead. More information in the discussion with `@flip1995` [here](rust-lang/rust-clippy#7002 (comment)) changelog: `wrong_self_convention`: For `to_*` variant don't lint in trait impl taking `self` when non-`Copy` type r? `@flip1995`
This is another big refactoring of
trans
though this is unlikely to have much of animpact on code size or speed.
The major change here is the implementation of a
Type
struct which is the newhome for all your LLVM
TypeRef
needs. It's a simple wrapper struct, with staticmethods for constructing types, then regular methods for
manipulating/interrogating them. The purpose of this is mostly to make the code
surrounding them somewhat more ideomatic. A line like:
T_ptr(T_ptr(T_i8()))
isnow
Type::i8().ptr_to().ptr_to()
,which is much more like regular Rust code.There are a variety of smaller changes here and there:
time looking for related code.
str_slice
type in LLVM,this makes reading the appropriate code much easier.
that a struct like
struct Foo { a: int }
now produces the IR%struct.Foo = type { i64 }
, which is much easier to read. Similarly, other structsare a bit tighter to make it easier to read.
This PR did get away from me a little, as I occasionally got distracted or as I fixed
up problems with unrelated code that were stopping me from continuing. One major
thing is that this PR contains the work from #7168, since that would have conflicted
with this and it was broken anyway. Sorry for bundling it like this.
Fixes #3670 and #7063
EDIT: This no longer removes the llvm insn stats.