Commit Graph

1917 Commits

Author SHA1 Message Date
Niko Matsakis
4c527457f1 rip out link guards
As discussed in
https://github.com/rust-lang/rust/pull/32293#issuecomment-200597130,
adding link guards are a heuristic that is causing undue complications:

- the link guards inject extra public symbols, which is not always OK.
- link guards as implemented could be a non-trivial performance hit,
  because no attempt is made to "de-duplicate" the dependency graph,
  so at worst you have O(N!) calls to the link guard functions.

Nonetheless, link guards are very helpful in detecting errors, so it may
be worth adding them back in some modified form in the future.
2016-03-25 14:07:20 -04:00
Niko Matsakis
e8dfaa71e6 Correections due to refactoring . 2016-03-25 14:07:20 -04:00
Niko Matsakis
977636156a unit-test symbol-names and item-paths 2016-03-25 14:07:19 -04:00
Niko Matsakis
2291abf313 refactor item-paths in diagnostics, symbol names
This change has a few parts. We introduce a new `item_path` module for
constructing item paths. The job of this module is basically to make
nice, user-readable paths -- but these paths are not necessarily 100%
unique. They meant to help a *human* find code, but not necessarily a
compute. These paths are used to drive `item_path_str` but also symbol
names.

Because the paths are not unique, we also modify the symbol name hash to
include the full `DefPath`, whereas before it included only those
aspects of the def-path that were not included in the "informative"
symbol name.

Eventually, I'd like to make the item-path infrastructure a bit more
declarative.  Right now it's based purely on strings. In particular, for
impls, we should supply the raw types to the `ItemPathBuffer`, so that
symbol names can be encoded using the C++ encoding scheme for better
integration with tooling.
2016-03-25 14:07:19 -04:00
Niko Matsakis
cd5cf09635 add krate_attrs accessor
makes better edges in dep graph
2016-03-25 14:07:19 -04:00
Niko Matsakis
7b6270b537 store krate information more uniformly
make DefPath store krate and enable uniform access to crate_name/crate_disambiguator
2016-03-25 14:07:19 -04:00
Michael Woerister
2475707322 Add a "link-guard" to avoid accidentally linking to a wrong dylib at runtime.
We want to prevent compiling something against one version
of a dynamic library and then, at runtime accidentally
using a different version of the dynamic library. With the
old symbol-naming scheme this could not happen because every
symbol had the SVH in it and you'd get an error by the
dynamic linker when using the wrong version of a dylib. With
the new naming scheme this isn't the case any more, so this
patch adds the "link-guard" to prevent this error case.

This is implemented as follows:

- In every crate that we compile, we emit a function called
  "__rustc_link_guard_<crate-name>_<crate-svh>"
- The body of this function contains calls to the
  "__rustc_link_guard" functions of all dependencies.
- An executable contains a call to it's own
  "__rustc_link_guard" function.

As a consequence the "__rustc_link_guard" function call graph
mirrors the crate graph and the dynamic linker will fail if a
wrong dylib is loaded somewhere because its
"__rustc_link_guard" function will contain a different SVH in
its name.
2016-03-25 14:07:19 -04:00
Michael Woerister
82b5f1d869 Remove old symbol naming code. 2016-03-25 14:07:18 -04:00
Michael Woerister
2eebb7b605 Make the compiler emit an error if the crate graph contains two crates with the same crate-name and crate-salt but different SVHs. 2016-03-25 14:07:18 -04:00
Michael Woerister
7def3768c6 Use new symbol names for items of various kinds. 2016-03-25 14:07:18 -04:00
Michael Woerister
68de171890 Use new symbol naming scheme for object shims. 2016-03-25 14:07:18 -04:00
Michael Woerister
8ef638e6fa Use new symbol naming scheme for fn-once-shims. 2016-03-25 14:07:18 -04:00
Michael Woerister
23e54b24ad Use new symbol naming scheme for fn-pointer-shims. 2016-03-25 14:07:18 -04:00
Michael Woerister
7a5a988579 Make drop glue use new symbol naming scheme. 2016-03-25 14:07:18 -04:00
Michael Woerister
6f60c9e1fd Make closures use stable symbol names. 2016-03-25 14:07:18 -04:00
Michael Woerister
c77f44eeee Make monomorphized functions use stable symbol names. 2016-03-25 14:07:18 -04:00
Michael Woerister
32a2e9a8e1 Compute a salt from arguments passed via -Cmetadata. 2016-03-25 14:07:17 -04:00
Michael Woerister
606c985a50 Make CrateStore::crate_name() return an InternedString to avoid unnecessary allocations. 2016-03-25 14:07:17 -04:00
Michael Woerister
5027a79279 Add missing entries for enum variants in trans::CrateContext::external_srcs. 2016-03-25 14:07:17 -04:00
Michael Woerister
6fdeecf62f CrateStore: Allow for custom def_id_to_string mappings in encode_type(). 2016-03-25 14:07:17 -04:00
bors
f1578d37dc Auto merge of #32428 - nikomatsakis:scopes-in-mir, r=nagisa
Scopes in mir

This PR adds scopes to MIR. There is a tree of scopes (each represented by a `ScopeId`). Every statement, variable, and terminator now has an associated scope and span.  It also adds a `-Z dump-mir` switch one can use to conveniently examine the MIR as optimizations proceed.

The intention is two-fold. First, to support MIR debug-info. This PR does not attempt to modify trans to make use of the scope information, however.

Second, in a more temporary capacity, to support the goal of moving regionck and borowck into the MIR. To that end, the PR also constructs a "scope auxiliary" table storing the extent of each span (this is kept separate from the main MIR, since it contains node-ids) and the dom/post-dom of the region in the graph where the scope occurs. When we move to non-lexical lifetimes, I expect this auxiliary information to be discarded, but that is still some ways in the future (requires, at minimum, an RFC, and there are some thorny details to work out -- though I've got an in-progress draft).

Right now, I'm just dropping this auxiliary information after it is constructed. I was debating for some time whether to add some sort of sanity tests, but decided to just open this PR instead, because I couldn't figure out what such a test would look like (and we don't have independent tests for this today beyond the regionck and borrowck tests).

I'd prefer not to store the auxiliary data into any kind of "per-fn" map. Rather, I'd prefer that we do regionck/borrowck/whatever-else immediately after construction -- that is, we build the MIR for fn X and immediately thereafter do extended correctness checking on it. This will reduce peak memory usage and also ensure that the auxiliary data doesn't exist once optimizations begin. It also clarifies the transition point where static checks are complete and MIR can be more freely optimized.

cc @rust-lang/compiler @nagisa
2016-03-24 23:12:57 -07:00
Niko Matsakis
c5d74be4ed remove empty_substs_for_node_id 2016-03-24 14:01:28 -04:00
Niko Matsakis
f3ac50927a remove ErasedRegions from substitutions
This hack has long since outlived its usefulness; the transition to
trans passing around full substitutions is basically done. Instead of
`ErasedRegions`, just supply substitutions with a suitable number of
`'static` entries, and invoke `erase_regions` when needed (the latter of
which we already do).
2016-03-24 14:01:28 -04:00
Niko Matsakis
70d0123082 Address nit: Remove ScopedDataVec newtype 2016-03-23 16:42:54 -04:00
Niko Matsakis
3a16f57fbb extend Terminator into a struct so it can have additional fields 2016-03-23 16:42:52 -04:00
bors
98f0a9128f Auto merge of #32454 - eddyb:rollup, r=eddyb
Rollup of 11 pull requests

- Successful merges: #32404, #32420, #32423, #32425, #32429, #32430, #32431, #32434, #32437, #32441, #32443
- Failed merges:
2016-03-23 12:33:04 -07:00
Eduard-Mihai Burtescu
12e54bba21 Rollup merge of #32430 - sanxiyn:const-trans, r=arielb1
Fix const trans

Fix #30615.

The idea was that when there are N autoderefs, first do N-1 derefs and check for autoref. If there is autoref, done, if not, do one more deref. But when N is zero, doing one more deref is wrong.
2016-03-23 17:59:15 +02:00
bors
b76f818cad Auto merge of #32390 - japaric:untry, r=pnkfelix
convert 99.9% of `try!`s to `?`s

The first commit is an automated conversion using the [untry] tool and the following command:

```
$ find -name '*.rs' -type f | xargs untry
```

at the root of the Rust repo.

[untry]: https://github.com/japaric/untry

cc @rust-lang/lang @alexcrichton @brson
2016-03-23 08:59:10 -07:00
bors
26cfc269a0 Auto merge of #32410 - Ticki:master, r=eddyb
Add support for naked functions

See https://github.com/rust-lang/rfcs/pull/1201#issuecomment-199442239

This PR adds `#[naked]` for marking naked functions.
2016-03-23 03:49:02 -07:00
Jorge Aparicio
2628f3cc8f fix alignment 2016-03-22 22:03:54 -05:00
Jorge Aparicio
aa7fe93d4a sprinkle feature gates here and there 2016-03-22 22:02:47 -05:00
Jorge Aparicio
0f02309e4b try! -> ?
Automated conversion using the untry tool [1] and the following command:

```
$ find -name '*.rs' -type f | xargs untry
```

at the root of the Rust repo.

[1]: https://github.com/japaric/untry
2016-03-22 22:01:37 -05:00
Seo Sanghyeon
308dc55f78 Fix const trans
Const was dereferenced when autoderefs is zero.
2016-03-23 02:10:09 +09:00
bors
e3f2dfdece Auto merge of #32156 - pnkfelix:borrowck-on-mir-move-analysis, r=nikomatsakis
Move analysis for MIR borrowck

This PR adds code for doing MIR-based gathering of the moves in a `fn` and the dataflow to determine where uninitialized locations flow to, analogous to how the same thing is done in `borrowck`.

It also adds a couple attributes to print out graphviz visualizations of the analyzed MIR that includes the dataflow analysis results.

cc @nikomatsakis
2016-03-22 10:00:12 -07:00
Ticki
1605ab377b Add support for naked functions 2016-03-21 21:01:08 +01:00
Felix S. Klock II
baeae780e0 Switch libgraphviz from type params to associated types for Node/Edge. 2016-03-21 18:36:14 +01:00
Björn Steinbrink
4fd318b9e9 Fix tupling of fn args for rust-call ABI functions
Fixes #32389
2016-03-21 12:22:29 +01:00
bors
2af3dd73db Auto merge of #32010 - devonhollowood:non-c-like-enum-repr, r=Aatch
Add tests for #26114

First step in fixing #26114
2016-03-20 12:49:46 -07:00
bors
8eeb5062d1 Auto merge of #32244 - Amanieu:compare_exchange_result, r=alexcrichton
Change compare_exchange to return a Result<T, T>

As per the discussion in #31767

I also changed the feature name from `extended_compare_and_swap` to `compare_exchange`.

r? @alexcrichton
2016-03-19 12:25:34 -07:00
Amanieu d'Antras
421fed188c Change compare_exchange to return a Result<T, T> 2016-03-19 11:44:38 +00:00
Eduard-Mihai Burtescu
5bf1e58bc0 Rollup merge of #32347 - Amanieu:volatile_fat_ptr, r=eddyb
Fix volatile stores of fat pointers

This was previously causing an LLVM assertion.

r? @eddyb
2016-03-19 12:30:02 +02:00
Amanieu d'Antras
135d24dd03 Fix volatile stores of fat pointers 2016-03-19 02:24:37 +00:00
Ulrik Sverdrup
2dbac1fb8e Add intrinsics for float arithmetic with fast flag enabled
`fast` a.k.a UnsafeAlgebra is the flag for enabling all "unsafe"
(according to llvm) float optimizations.

See LangRef for more information http://llvm.org/docs/LangRef.html#fast-math-flags

Providing these operations with less precise associativity rules (for
example) is useful to numerical applications.

For example, the summation loop:

    let sum = 0.;
    for element in data {
        sum += *element;
    }

Using the default floating point semantics, this loop expresses the
floats must be added in a sequence, one after another. This constraint
is usually completely unintended, and it means that no autovectorization
is possible.
2016-03-18 17:31:41 +01:00
Eduard Burtescu
e177207b36 trans: Don't ignore zero-sized struct arguments on x86_64-pc-windows-gnu. 2016-03-18 14:28:11 +02:00
Eduard Burtescu
181097da33 trans: Decide whether to load volatile_store's argument based on its ArgType. 2016-03-18 05:29:53 +02:00
Eduard Burtescu
9a8b80762b trans: Pass newtypes of immediates as their inner-most type again. 2016-03-18 01:01:47 +02:00
Eduard Burtescu
02a141a550 mir: Don't memset allocas of types that do not require drop. 2016-03-17 22:48:07 +02:00
Eduard Burtescu
460e66457a mir: Store immediates used for indirect arguments in an alloca. 2016-03-17 22:48:07 +02:00
Eduard Burtescu
5739ed1f80 trans: Do not depend on having Expr's around for generic_simd_intrinsic. 2016-03-17 22:48:07 +02:00
Eduard Burtescu
7912f94b2d const_eval: Take just one set of substitutions in lookup_const_by_id. 2016-03-17 22:48:07 +02:00