Commit Graph

162 Commits

Author SHA1 Message Date
bors
d4abb08be6 Auto merge of #61919 - alexreg:fix-atb-1, r=nikomatsakis
Fix for "ambiguous associated type" issue with ATBs

Fixes #61752.

r? @nikomatsakis

CC @Centril
2019-08-07 09:33:34 +00:00
Oliver Scherer
7710820d18 Fiddle param env through to try_eval_bits in most places 2019-08-05 17:48:05 +02:00
Oliver Scherer
9b87d22ea8 Don't abort on unevaluated constants without at least tryting to eval them 2019-08-05 17:48:04 +02:00
Alexander Regueiro
8f9ca24f55 A few cosmetic improvements. 2019-08-05 15:16:27 +01:00
Alex Crichton
a120caf8b4 rustc: Update wasm32 support for LLVM 9
This commit brings in a number of minor updates for rustc's support for
the wasm target which has changed in the LLVM 9 update. Notable updates
include:

* The compiler now no longer manually inserts the `producers` section,
  instead relying on LLVM to do so. LLVM uses the `llvm.ident` metadata
  for the `processed-by` directive (which is now emitted on the wasm
  target in this PR) and it uses debuginfo to figure out what `language`
  to put in the `producers` section.

* Threaded WebAssembly code now requires different flags to be passed
  with LLD. In LLD we now pass:

  * `--shared-memory` - required since objects are compiled with
    atomics. This also means that the generated memory will be marked as
    `shared`.
  * `--max-memory=1GB` - required with the `--shared-memory` argument
    since shared memories in WebAssembly must have a maximum size. The
    1GB number is intended to be a conservative estimate for rustc, but
    it should be overridable with `-C link-arg` if necessary.
  * `--passive-segments` - this has become the default for multithreaded
    memory, but when compiling a threaded module all data segments need
    to be marked as passive to ensure they don't re-initialize memory
    for each thread. This will also cause LLD to emit a synthetic
    function to initialize memory which users will have to arrange to
    call.
  * The `__heap_base` and `__data_end` globals are explicitly exported
    since they're now hidden by default due to the `--export` flags we
    pass to LLD.
2019-07-25 07:08:45 -07:00
Shotaro Yamada
6a0abd6048 Remove unnecessary .clone() 2019-06-15 20:46:00 +09:00
Eduard-Mihai Burtescu
f3f9d6dfd9 Unify all uses of 'gcx and 'tcx. 2019-06-14 18:58:23 +03:00
Eduard-Mihai Burtescu
4c98cb6f75 rustc_codegen_llvm: deny(internal). 2019-06-12 16:06:35 +03:00
Eduard-Mihai Burtescu
87b6b86468 rustc_codegen_llvm: deny(unused_lifetimes). 2019-06-12 16:02:03 +03:00
Eduard-Mihai Burtescu
fff08cb043 Run rustfmt --file-lines ... for changes from previous commits. 2019-06-12 13:38:28 +03:00
Eduard-Mihai Burtescu
17cdd356da rustc: replace TyCtxt<'tcx, 'gcx, 'tcx> with TyCtxt<'gcx, 'tcx>. 2019-06-12 13:38:27 +03:00
Mark Mansi
c747f31ffc remove unneeded deps 2019-06-02 22:56:37 -05:00
Mark Mansi
8af151b30a remove reexport of rustc::ty::Instance 2019-06-02 22:32:42 -05:00
varkor
21551359a5 Use assert_usize instead of unwrap_usize in several places 2019-06-02 01:55:44 +01:00
Claude-Alban RANÉLY-VERGÉ-DÉPRÉ
6e5e0daff2 Changes the type mir::Mir into mir::Body
The commit should have changed comments as well.
At the time of writting, it passes the tidy and check tool.

Revisions asked by eddyb :
- Renamed of all the occurences of {visit/super}_mir
- Renamed test structures `CachedMir` to `Cached`

Fixing the missing import on `AggregateKind`
2019-05-28 19:17:51 +02:00
Mazdak Farrokhzad
1c4582c1ff Rollup merge of #60973 - nnethercote:fix-file_metadata-more, r=michaelwoerister
Avoid symbol interning in `file_metadata`.

This commit changes `created_files` so it uses strings directly as keys,
rather than symbols derived from the strings. This avoids the cost of
having to do the hash table lookups to produce the symbols from the
strings.

The commit also uses `entry` to avoid doing a repeated hash table lookup
(`get` + `insert`).

Note that PR #60467 improved this code somewhat; this is a further
improvement.

r? @davidtwco
2019-05-22 03:47:34 +02:00
Michael Woerister
46e3d04b2b debuginfo: Revert to old/more verbose behavior for -Cdebuginfo=1.
https://github.com/rust-lang/rust/commit/cff075009 made LLVM emit
less debuginfo when compiling with "line-tables-only". The change
was essentially correct but the reduced amount of debuginfo broke
a number of tools.

This commit reverts the change so we get back the old behavior,
until we figure out how to do this properly and give external
tools to adapt to the new format.

See https://github.com/rust-lang/rust/issues/60020 for more info.
2019-05-21 13:48:29 +02:00
Nicholas Nethercote
c5d9401756 Avoid symbol interning in file_metadata.
This commit changes `created_files` so it uses strings directly as keys,
rather than symbols derived from the strings. This avoids the cost of
having to do the hash table lookups to produce the symbols from the
strings.

The commit also uses `entry` to avoid doing a repeated hash table lookup
(`get` + `insert`).

Note that PR #60467 improved this code somewhat; this is a further
improvement.
2019-05-20 18:56:53 +10:00
Nicholas Nethercote
fb084a48e2 Pass a Symbol to check_name, emit_feature_err, and related functions. 2019-05-13 09:29:22 +10:00
bors
e232636693 Auto merge of #59897 - tmandry:variantful-generators, r=eddyb
Multi-variant layouts for generators

This allows generators to overlap fields using variants, but doesn't do any such overlapping yet. It creates one variant for every state of the generator (unresumed, returned, panicked, plus one for every yield), and puts every stored local in each of the yield-point variants.

Required for optimizing generator layouts (#52924).

There was quite a lot of refactoring needed for this change. I've done my best in later commits to eliminate assumptions in the code that only certain kinds of types are multi-variant, and to centralize knowledge of the inner mechanics of generators in as few places as possible.

This change also emits debuginfo about the fields contained in each variant, as well as preserving debuginfo about stored locals while running in the generator.

Also, fixes #59972.

Future work:
- Use this change for an optimization pass that actually overlaps locals within the generator struct (#52924)
- In the type layout fields, don't include locals that are uninitialized for a particular variant, so miri and UB sanitizers can check our memory (see https://github.com/rust-lang/rust/issues/59972#issuecomment-483058172)
- Preserve debuginfo scopes across generator yield points
2019-05-04 03:18:14 +00:00
Tyler Mandry
77a6d29f48 Address review comments 2019-05-03 19:25:35 -07:00
Tyler Mandry
15dbe652ff Split out debuginfo from type info in MIR GeneratorLayout 2019-05-03 16:03:05 -07:00
Tyler Mandry
f7c2f2475a Make variant_fields inner an IndexVec 2019-05-03 14:25:22 -07:00
Nicholas Nethercote
6ef39e69ea Avoid repeated interning of static strings.
`file_metadata_raw` interns the strings `"<unknown>"` and `""` very
frequently. This commit avoids that, which reduces the number of symbols
interned significantly and reduces instruction counts by up to 0.5% on
some workloads.
2019-05-02 20:47:20 +10:00
varkor
a3470c6189 Update handling of Tuple 2019-04-26 21:09:32 +01:00
Tyler Mandry
b8f6de4aca Generalize discriminant info calls for generators and ADTs 2019-04-25 10:28:09 -07:00
Tyler Mandry
f772c39bf9 Include generator locals as field names in debuginfo 2019-04-25 10:28:09 -07:00
Tyler Mandry
6e2e17d115 Make generator object debuginfo easier to read 2019-04-25 10:28:09 -07:00
Tyler Mandry
961ba95e5a Describe generator variants in debuginfo 2019-04-25 10:28:09 -07:00
Tyler Mandry
5a7af5480c Support variantful generators
This allows generators to overlap fields using variants.
2019-04-25 10:28:09 -07:00
Eduard-Mihai Burtescu
e6ec968485 rustc_codegen_ssa: rename debuginfo_upvar_decls_ops_sequence to debuginfo_upvar_ops_sequence. 2019-04-23 23:35:21 +03:00
bjorn3
d4e7b083ce Move cg_llvm/debuginfo/type_names.rs to cg_ssa 2019-04-20 13:21:40 +02:00
Tyler Mandry
7c626a67ba Add discr_index to multi-variant layouts
We relax the assumption that the discriminant is always field 0, in
preparations for layouts like generators where this is not going to be
the case.
2019-04-11 17:44:43 -07:00
Tyler Mandry
b58624727c describe_enum_variant: Reduce code duplication 2019-04-11 17:44:43 -07:00
Alex Crichton
d5985bc9ec rustc: Start implementing compat with LLVM 9
This commit doesn't actually migrate to LLVM 9, but it brings our own
C++ bindings in line with LLVM 9 and able to compile against tip of
tree. The changes made were:

* The `MainSubprogram` flag for debuginfo moved between flag types.
* Iteration of archive members was tweaked slightly and we have to
  construct the two iterators before constructing the returned
  `RustArchiveIterator` value.
* The `getOrInsertFunction` binding now returns a wrapper which we use
  `getCallee()` on to get the value we're interested in.
2019-04-05 08:10:18 -07:00
Aaron Hill
c13daeb036 Fix typo 2019-04-01 13:41:41 -04:00
Aaron Hill
d2584e3b6a Only track 'visited' state for function types 2019-03-31 22:53:27 -04:00
Aaron Hill
c4556a5a65 Fix typos 2019-03-31 20:09:30 -04:00
Aaron Hill
e1837a0d1a Fix inverted panic check 2019-03-31 20:09:30 -04:00
Aaron Hill
512069f8e5 Fix stack overflow when generating debuginfo for 'recursive' type
By using 'impl trait', it's possible to create a self-referential
type as follows:

fn foo() -> impl Copy { foo }

This is a function which returns itself.
Normally, the signature of this function would be impossible
to write - it would look like 'fn foo() -> fn() -> fn() ...'
e.g. a function which returns a function, which returns a function...

Using 'impl trait' allows us to avoid writing this infinitely long
type. While it's useless for practical purposes, it does compile and run

However, issues arise when we try to generate llvm debuginfo for such a
type. All 'impl trait' types (e.g. ty::Opaque) are resolved when we
generate debuginfo, which can lead to us recursing back to the original
'fn' type when we try to process its return type.

To resolve this, I've modified debuginfo generation to account for these
kinds of weird types. Unfortunately, there's no 'correct' debuginfo that
we can generate - 'impl trait' does not exist in debuginfo, and this
kind of recursive type is impossible to directly represent.

To ensure that we emit *something*, this commit emits dummy
debuginfo/type names whenever it encounters a self-reference. In
practice, this should never happen - it's just to ensure that we can
emit some kind of debuginfo, even if it's not particularly meaningful

Fixes #58463
2019-03-31 20:09:29 -04:00
Mazdak Farrokhzad
0171fe5598 Rollup merge of #59519 - eddyb:layout-variants-refactor, r=oli-obk
rustc_target: factor out common fields of non-Single Variants.

@tmandry and I were discussing ways to generalize the current variants/discriminant layout to allow more fields in the "`enum`" (or another multi-variant types, such as potentially generator state, in the future), shared by all variants, than just the tag/niche discriminant.

This refactor should make it easier to extend multi-variant layouts, as nothing is duplicating anymore between "tagged enums" and "niche-filling enums".

r? @oli-obk
2019-03-31 19:19:50 +02:00
Mazdak Farrokhzad
ae2551825d Rollup merge of #59380 - philipc:thinlto-variant, r=michaelwoerister
Fix invalid DWARF for enums when using ThinLTO

We were setting the same identifier for both the DW_TAG_structure_type
and the DW_TAG_variant_part. This becomes a problem when using ThinLTO
becauses it uses the identifier as a key for a map of types that is used
to delete duplicates based on the ODR, so one of them is deleted as a
duplicate, resulting in invalid DWARF.

The DW_TAG_variant_part isn't a standalone type, so it doesn't need
an identifier. Fix by omitting its identifier.

ODR uniquing is [enabled here](f21dee2c61/src/rustllvm/PassWrapper.cpp (L1101)).
2019-03-30 14:14:53 +01:00
bjorn3
7de0b1de19 Move get_param and set_value_name 2019-03-29 17:17:13 +01:00
bjorn3
794ecd965a [WIP] Make some debug info methods take &mut FunctionDebugContext
declare_local still takes &FunctionDebugContext, because of borrowck errors
2019-03-29 17:17:12 +01:00
bjorn3
ab8f1527e4 Remove internal mutability from source_locations_enabled 2019-03-29 17:17:12 +01:00
Eduard-Mihai Burtescu
5b7f4e9e21 rustc_target: factor out common fields of non-Single Variants. 2019-03-29 09:33:48 +02:00
Mazdak Farrokhzad
f90ac4f04a Rollup merge of #58717 - hellow554:nonzero_parse, r=oli-obk
Add FromStr impl for NonZero types

This is a WIP implementation because I do have some questions regarding the solution.

Somebody should ping the lang team on this I guess.
Please see the annotations on the code for more details.

Closes #58604
2019-03-28 13:35:29 +01:00
Marcel Hellwig
8f3e862797 fixed shift overflow
Fix according to oli-obk
(https://github.com/rust-lang/rust/pull/58717#issuecomment-477494457)
2019-03-28 10:12:17 +01:00
Philip Craig
3a5a8a529a Give variant parts their own unique id
and bump llvm version in test
2019-03-27 15:22:37 +10:00
Philip Craig
e8de4c3b1f Fix invalid DWARF for enums when using thinlto
We were setting the same identifier for both the DW_TAG_structure_type
and the DW_TAG_variant_part. This becomes a problem when using thinlto
becauses it uses the identifier as a key for a map of types that is used
to delete duplicates based on the ODR, so one of them is deleted as a
duplicate, resulting in invalid DWARF.

The DW_TAG_variant_part isn't a standalone type, so it doesn't need
an identifier. Fix by omitting its identifier.
2019-03-23 17:13:58 +10:00