Commit Graph

2786 Commits

Author SHA1 Message Date
Mark Simulacrum
611e90b118 Simplify intrinsic match statement 2016-12-20 20:03:30 -07:00
Mark Simulacrum
c693bcc625 Inline memfill and merge with memset_intrinsic. 2016-12-20 20:03:30 -07:00
Mark Simulacrum
f051c60d92 Reduce extensions to FunctionContext in cleanup. 2016-12-20 20:03:30 -07:00
Mark-Simulacrum
1804131b6d Remove Ref::clone for MirContext mir 2016-12-20 20:03:30 -07:00
Mark-Simulacrum
937001a1f8 Refactor Callee::call to take bcx by-reference.
Also change to not return anything; nothing used the return ValueRef.

Inlines with_cond.
2016-12-20 20:03:29 -07:00
Mark-Simulacrum
9a198534e2 Remove unused imports 2016-12-20 20:03:29 -07:00
Mark-Simulacrum
21bd747948 Remove unused functions in abi 2016-12-20 20:03:29 -07:00
Mark-Simulacrum
88b2024a28 Cleanup instruction counting 2016-12-20 20:03:29 -07:00
Mark-Simulacrum
449c6d82a7 Simplify basic_block.rs 2016-12-20 20:03:29 -07:00
Mark-Simulacrum
cc1e210ee8 Inline trans_exchange_free 2016-12-20 20:03:28 -07:00
Mark-Simulacrum
9c38a54cae Inline FunctionContext.mir 2016-12-20 20:03:28 -07:00
Mark-Simulacrum
65f040031e Remove FunctionContext.landingpad_alloca. 2016-12-20 20:03:28 -07:00
Mark-Simulacrum
05d107d4a1 Inline validate_substs 2016-12-20 20:03:28 -07:00
Mark-Simulacrum
85ab08084d Remove global builder 2016-12-20 20:03:28 -07:00
Mark-Simulacrum
755850f318 Merge OwnedBuilder and Builder 2016-12-20 20:03:27 -07:00
Mark-Simulacrum
8ed11209d6 Minor cleanup to context 2016-12-20 20:03:27 -07:00
Mark-Simulacrum
c4f6173af8 Replace init with get_entry_block. 2016-12-20 20:03:27 -07:00
Mark-Simulacrum
cbbdb73eb0 Remove FunctionContext::cleanup, replacing it with a Drop impl.
Move alloca and initial entry block creation into FunctionContext::new.
2016-12-20 20:03:27 -07:00
Mark-Simulacrum
bf8614b55a Rename Builder::alloca to dynamic_alloca 2016-12-20 20:03:27 -07:00
Mark-Simulacrum
5262113fa6 Remove fcx.span 2016-12-20 20:03:26 -07:00
Mark-Simulacrum
820164582d Remove DebugLoc. 2016-12-20 20:03:24 -07:00
Mark-Simulacrum
be981dce80 Start FunctionContext privatization and reduction 2016-12-20 20:02:53 -07:00
Mark-Simulacrum
bc0b172f3b Remove BlockAndBuilder.funclet 2016-12-20 20:02:53 -07:00
Mark-Simulacrum
28f511cfbd Remove global Builder 2016-12-20 20:02:52 -07:00
Mark-Simulacrum
e0ccc81bbf Remove needless allows 2016-12-20 20:02:52 -07:00
Mark-Simulacrum
da23332b65 Remove remaining traces of block_arena 2016-12-20 20:02:52 -07:00
Mark-Simulacrum
5bdcc22b79 Remove FIXME 2016-12-20 20:02:52 -07:00
Mark-Simulacrum
dda6c8cf2f Inline base::malloc_raw_dyn.
Move comment about not unwinding into liballoc.
2016-12-20 20:02:52 -07:00
Mark-Simulacrum
14ae76d96b Unbox FunctionDebugContextData.
It is only a pointer and a Cell, which is quite small.
2016-12-20 20:02:51 -07:00
Mark-Simulacrum
b10d89a096 Move around code in cleanup for a more logical ordering, and fix comments 2016-12-20 20:02:51 -07:00
Mark-Simulacrum
c7f8b0cd81 Eagerly evaluate landing pads for cleanup scopes 2016-12-20 20:02:51 -07:00
Mark-Simulacrum
31691692a2 Deduplicate store_operand_direct and store_operand 2016-12-20 20:02:51 -07:00
Mark-Simulacrum
6710af3580 Slightly simplify tvec::slice_for_each 2016-12-20 20:02:51 -07:00
Mark-Simulacrum
6441c977cb Remove push_ctxt 2016-12-20 20:02:50 -07:00
Mark-Simulacrum
3265afa08f Inline and simplify Callee::call duplicates. 2016-12-20 20:02:50 -07:00
Mark-Simulacrum
cd57bbe27a Refactor get_landing_pad to take a CleanupScope
It unwrapped the Option anyway, so this more closely resembles the
reality of what's happening.
2016-12-20 20:02:50 -07:00
Mark-Simulacrum
28d00e781b Remove cleanup scope from FunctionContext 2016-12-20 20:02:50 -07:00
Mark-Simulacrum
51dfba1185 Refactor Vec<CleanupScope> into Option<CleanupScope>. 2016-12-20 20:02:50 -07:00
Mark-Simulacrum
91707dc991 Merge need_invoke and needs_invoke 2016-12-20 20:02:49 -07:00
Mark-Simulacrum
6412f3128d Propagate CleanupScope::needs_invoke being always true 2016-12-20 20:02:49 -07:00
Mark-Simulacrum
85ef02d404 Only one DropValue per CleanupScope 2016-12-20 20:02:49 -07:00
Mark-Simulacrum
da971b7652 Pull out get_or_create landing pad to avoid issues with dynamic borrowck. 2016-12-20 20:02:49 -07:00
Mark-Simulacrum
48715a15ff Reformatting 2016-12-20 20:02:49 -07:00
Mark-Simulacrum
2842912583 Remove DropValue.is_immediate 2016-12-20 20:02:48 -07:00
Mark-Simulacrum
ec518a0069 Remove EarlyExitLabel, it only has one variant and is as such useless 2016-12-20 20:02:48 -07:00
Mark-Simulacrum
5a36f88feb Remove debug_loc from CleanupScope and privatize various helpers 2016-12-20 20:02:48 -07:00
Mark-Simulacrum
ed989d39a1 Simple cleanups/inlines in cleanup 2016-12-20 20:02:48 -07:00
Mark-Simulacrum
86b2bdb435 Rename LandingPad to Funclet
Changes internal storage to direct field values instead of Options,
since both fields are always either set or not set.
2016-12-20 20:02:48 -07:00
Mark-Simulacrum
8f3d824cc7 Remove common::Block. 2016-12-20 20:02:46 -07:00
Mark-Simulacrum
3dbd141b8c Remove unused map_block 2016-12-20 20:01:41 -07:00
Mark-Simulacrum
fec59c5f73 Replace lpad().and_then(..) with None 2016-12-20 20:01:41 -07:00
Mark-Simulacrum
ad0a901d37 Remove *_builder 2016-12-20 20:01:40 -07:00
Mark-Simulacrum
e77d928990 Add notes regarding malloc_raw_dyn being unwind incompatible 2016-12-20 20:01:40 -07:00
Mark-Simulacrum
59ef51c12a Replace build.rs with calling functions on builder directly 2016-12-20 20:01:40 -07:00
Mark-Simulacrum
3f17ab9618 Remove unreachable and terminated from Block 2016-12-20 20:01:40 -07:00
Mark-Simulacrum
bf7d4534a7 Refactor Block into BlockAndBuilder 2016-12-20 20:01:40 -07:00
Alex Crichton
5f1ecb0fdc Merge branch 'fix_closure_debuginfo' of https://github.com/camlorn/rust into rollup
Conflicts:
	src/librustc_trans/mir/mod.rs
2016-12-20 12:59:14 -08:00
Austin Hicks
e1d8806efd Fix closure debuginfo. 2016-12-19 21:14:27 -05:00
Jorge Aparicio
79d40c2bbe implement cabi for 32-bit sparc 2016-12-19 12:23:37 -05:00
Jorge Aparicio
bd85a6dbe7 target spec: add an asm-args field to pass arguments to the external ..
assembler
2016-12-18 22:25:46 -05:00
bors
71c06a56a1 Auto merge of #38051 - sanxiyn:unused-type-alias-3, r=eddyb
Warn unused type aliases, reimplemented

Reimplementation of #37631. Fix #37455.
2016-12-18 22:06:34 +00:00
bors
1f965cc8e9 Auto merge of #38369 - aturon:stab-1.15, r=alexcrichton
Library stabilizations/deprecations for 1.15 release

Stabilized:

- `std::iter::Iterator::{min_by, max_by}`
- `std::os::*::fs::FileExt`
- `std::sync::atomic::Atomic*::{get_mut, into_inner}`
- `std::vec::IntoIter::{as_slice, as_mut_slice}`
- `std::sync::mpsc::Receiver::try_iter`
- `std::os::unix::process::CommandExt::before_exec`
- `std::rc::Rc::{strong_count, weak_count}`
- `std::sync::Arc::{strong_count, weak_count}`
- `std::char::{encode_utf8, encode_utf16}`
- `std::cell::Ref::clone`
- `std::io::Take::into_inner`

Deprecated:

- `std::rc::Rc::{would_unwrap, is_unique}`
- `std::cell::RefCell::borrow_state`

Closes #23755
Closes #27733
Closes #27746
Closes #27784
Closes #28356
Closes #31398
Closes #34931
Closes #35601
Closes #35603
Closes #35918
Closes #36105
2016-12-18 17:37:25 +00:00
Seo Sanghyeon
5a1b62c0fd Fix Windows 2016-12-18 22:19:57 +09:00
bors
8327b5afaf Auto merge of #37429 - camlorn:univariant_layout_optimization, r=eddyb
struct field reordering and optimization

This is work in progress.  The goal is to divorce the order of fields in source code from the order of fields in the LLVM IR, then optimize structs (and tuples/enum variants)by always ordering fields from least to most aligned.  It does not work yet.  I intend to check compiler memory usage as a benchmark, and a crater run will probably be required.

I don't know enough of the compiler to complete this work unaided.  If you see places that still need updating, please mention them.  The only one I know of currently is debuginfo, which I'm putting off intentionally until a bit later.

r? @eddyb
2016-12-18 07:59:32 +00:00
Alex Crichton
1b8e6c152c rustbuild: Fix LC_ID_DYLIB directives on OSX
Currently libraries installed by rustbuild on OSX have an incorrect
`LC_ID_DYLIB` directive located in the dynamic libraries that are
installed. The directive we expect looks like:

    @rpath/libstd.dylib

Which means that if you want to find that dynamic library you should
look at the dylib's other `@rpath` directives. Typically our `@rpath`
directives look like `@loader_path/../lib` for the compiler as that's
where the installed libraries will be located. Currently, though,
rustbuild produces dylibs with the directive that looks like:

    /Users/rustbuild/src/rust-buildbot/slave/nightly-dist-rustc-mac/build/build/x86_64-apple-darwin/stage1-std/x86_64-apple-darwin/release/deps/libstd-713ad88203512705.dylib

In other words, the build directory is encoded erroneously. The compiler
already [knows how] to change this directive, but it only passes that
argument when `-C rpath` is also passed. The rustbuild system, however,
explicitly [does not pass] this option explicitly and instead bakes its
own. This logic then also erroneously didn't pass `-Wl,-install_name`
like the compiler.

[knows how]: 4a008cccaa/src/librustc_trans/back/linker.rs (L210-L214)
[does not pass]: 4a008cccaa/src/bootstrap/bin/rustc.rs (L133-L158)

To fix this regression this patch introduces a new `-Z` flag, `-Z
osx-rpath-install-name` which basically just forces the compiler to take
the previous `-install_name` branch when creating a dynamic library.
Hopefully we can sort out a better rpath story in the future, but for
now this "hack" should suffice in getting our nightly builds back to the
same state as before.

Closes #38430
2016-12-17 16:14:11 -08:00
Aaron Turon
9a5cef4de5 Address fallout 2016-12-16 19:42:17 -08:00
Austin Hicks
f22a22b286 Incorporate review comments. 2016-12-16 12:06:12 -05:00
Ariel Ben-Yehuda
e1d4b8fc8c Use StableHasher everywhere
The standard implementations of Hasher have architecture-dependent
results when hashing integers. This causes problems when the hashes are
stored within metadata - metadata written by one host architecture can't
be read by another.

To fix that, implement an architecture-independent StableHasher and use
it in all places an architecture-independent hasher is needed.

Fixes #38177.
2016-12-15 20:48:59 +02:00
Austin Hicks
9966bbd1b1 Fix computation of enum names based off the discrfield in the case of the null pointer optimization. This functionality is needed by pretty printers for gdb and lldb. 2016-12-14 12:28:26 -05:00
Austin Hicks
c8c3579bff Fix closure arguments which are immediate because of field reordering.
While building immediates goes through type_of::type_of, extracting them must account for field reorderings.
2016-12-14 12:28:24 -05:00
Austin Hicks
adae9bc25e Make tidy 2016-12-14 12:28:21 -05:00
Austin Hicks
3d23dc7956 Modify debuginfo to deal with the difference between source and memory order
Fix gdb enum tests to ignore garbage variants, as we no longer actually know what the garbage is.
2016-12-14 12:28:21 -05:00
Austin Hicks
0e61c0e231 Incorporate a bunch of review comments. 2016-12-14 12:28:20 -05:00
Austin Hicks
d754778083 Fix tuple and closure literals. 2016-12-14 12:28:19 -05:00
Austin Hicks
1969aeb3d7 Make constant field access account for field reordering. 2016-12-14 12:28:19 -05:00
Austin Hicks
cae94e8ec0 Optimize anything using a layout::Struct by introducing a mapping from source code field order to in-memory field order and sorting by alignment. 2016-12-14 12:28:18 -05:00
bors
7f78b420b0 Auto merge of #38317 - shepmaster:llvm-4.0-debuginfo-alignment, r=eddyb
[LLVM 4.0] Move debuginfo alignment argument

Alignment was removed from createBasicType and moved to

- createGlobalVariable
- createAutoVariable
- createStaticMemberType (unused in Rust)
- createTempGlobalVariableFwdDecl (unused in Rust)

e69c459a6e
2016-12-13 15:27:19 +00:00
Vadzim Dambrouski
9d764fc3c1 Do not generate '@' character in symbol names.
MSP430 assembler does not like '@' character in symbol names, so we should
only use alphanumerics when we generate a new name.

Fixes #38116
2016-12-12 21:56:52 +03:00
Jake Goulding
5bce12c95f [LLVM 4.0] Move debuginfo alignment argument
Alignment was removed from createBasicType and moved to

- createGlobalVariable
- createAutoVariable
- createStaticMemberType (unused in Rust)
- createTempGlobalVariableFwdDecl (unused in Rust)

e69c459a6e
2016-12-12 09:00:04 -05:00
bors
6d5ec58912 Auto merge of #38272 - michaelwoerister:incr-symbol-visibility, r=nikomatsakis
incr.comp.: Take symbol visibility into account for CGU hashes

r? @nikomatsakis
2016-12-11 18:20:52 +00:00
bors
368e092c26 Auto merge of #38250 - michaelwoerister:trait-methods-in-reachable, r=alexcrichton
Consider provided trait methods in middle::reachable

Fixes https://github.com/rust-lang/rust/issues/38226 by also considering trait methods with default implementation instead of just methods provided in an impl.

r? @alexcrichton
cc @panicbit
2016-12-11 06:37:19 +00:00
Michael Woerister
4a494ed8df incr.comp.: Take symbol visibility into account for CGU hashes. 2016-12-09 17:47:56 -05:00
Oliver Schneider
d74d15345c
move the check for instantiation from metadata encoding to the actual decision site
before it was assumed that anything that had a MIR was fair game for local instatiation
2016-12-09 17:29:01 +01:00
Oliver Schneider
acfb06fd59
remove double negation in comment 2016-12-09 11:27:45 +01:00
Michael Woerister
5d35dfb01e Improve debug output in trans:🔙:symbol_export. 2016-12-08 17:06:56 -05:00
bors
1842efbae4 Auto merge of #37994 - upsuper:msvc-link-opt, r=alexcrichton
Don't apply msvc link opts for non-opt build

`/OPT:REF,ICF` sometimes takes lots of time. It makes no sense to apply them when doing debug build. MSVC's linker by default disables these optimizations when `/DEBUG` is specified, unless they are explicitly passed.
2016-12-06 14:16:49 +00:00
bors
1692c0b587 Auto merge of #37973 - vadimcn:dllimport, r=alexcrichton
Implement RFC 1717

Implement the first two points from #37403.

r? @alexcrichton
2016-12-06 10:54:45 +00:00
Mark-Simulacrum
296ec5f9b7 Refactor FnSig to contain a Slice for its inputs and outputs. 2016-12-05 22:33:38 -07:00
Mark-Simulacrum
1eab19dba8 Refactor ty::FnSig to privatize all fields 2016-12-05 22:22:49 -07:00
Michael Woerister
3548c8f560 Mention cdylibs in LTO error message. 2016-12-05 11:05:25 -05:00
Michael Woerister
93da4f81bf Export the plugin registrar from proc-macro crates (and not much else) 2016-12-05 11:05:25 -05:00
Michael Woerister
bfd4910fa2 Linking: Include export lists in debug output. 2016-12-05 11:05:25 -05:00
Michael Woerister
e48160f6e4 Generate a version script for linkers on Linux. 2016-12-05 11:05:25 -05:00
Michael Woerister
133aeacf2f Refactor symbol export list generation. 2016-12-05 11:05:25 -05:00
Michael Woerister
5fd7c2bfef trans: Rename reachable to exported_symbols where appropriate. 2016-12-05 11:05:25 -05:00
Michael Woerister
d1a6d47f94 Make LLVM symbol visibility FFI types more stable. 2016-12-05 11:05:25 -05:00
bors
2190f6c3c2 Auto merge of #38086 - semarie:openbsd-i686, r=alexcrichton
Add i686-unknown-openbsd target.

It is a preliminary work. I still have some tests failing, but I have a working rustc binary which is able to rebuild itself.

an update of libc should be required too, but I dunno how to do it with vendor/ layout.

r? @alexcrichton
2016-12-04 16:35:09 +00:00
Xidorn Quan
257f643ee3 Disable ICF opt of MSVC for non-opt build 2016-12-04 23:55:24 +11:00
Sébastien Marie
6774e7aa92 OpenBSD under x86 has particular ABI for returning a struct.
It is like OSX or Windows: small structs are returned as integers.
2016-12-04 07:18:56 +01:00
bors
125474de07 Auto merge of #37857 - shepmaster:llvm-4.0-dinodes, r=michaelwoerister
[LLVM 4.0] Handle new DIFlags enum
2016-12-04 02:30:23 +00:00
bors
28d6623bcc Auto merge of #38148 - frewsxcv:rollup, r=frewsxcv
Rollup of 15 pull requests

- Successful merges: #37859, #37919, #38020, #38028, #38029, #38065, #38073, #38077, #38089, #38090, #38096, #38112, #38113, #38130, #38141
- Failed merges:
2016-12-03 20:59:08 +00:00
Corey Farwell
fa1af0c260 Rollup merge of #38096 - michaelwoerister:more-incremental-info, r=nikomatsakis
incr.comp.: Add more output to -Z incremental-info.

Also makes sure that all output from `-Z incremental-info` is prefixed with `incremental:` for better grep-ability.

r? @nikomatsakis
2016-12-03 15:39:53 -05:00
bors
2cdbd5eb42 Auto merge of #38079 - BurntSushi:attrtarget, r=alexcrichton
Add new #[target_feature = "..."] attribute.

This commit adds a new attribute that instructs the compiler to emit
target specific code for a single function. For example, the following
function is permitted to use instructions that are part of SSE 4.2:

    #[target_feature = "+sse4.2"]
    fn foo() { ... }

In particular, use of this attribute does not require setting the
-C target-feature or -C target-cpu options on rustc.

This attribute does not have any protections built into it. For example,
nothing stops one from calling the above `foo` function on hosts without
SSE 4.2 support. Doing so may result in a SIGILL.

I've also expanded the x86 target feature whitelist.
2016-12-03 17:41:14 +00:00
Jake Goulding
dbdd60e6d7 [LLVM] Introduce a stable representation of DIFlags
In LLVM 4.0, this enum becomes an actual type-safe enum, which breaks
all of the interfaces. Introduce our own copy of the bitflags that we
can then safely convert to the LLVM one.
2016-12-02 21:13:31 -05:00
bors
c80c31a502 Auto merge of #38053 - eddyb:lazy-9, r=nikomatsakis
[9/n] rustc: move type information out of AdtDef and TraitDef.

_This is part of a series ([prev](https://github.com/rust-lang/rust/pull/37688) | [next]()) of patches designed to rework rustc into an out-of-order on-demand pipeline model for both better feature support (e.g. [MIR-based](https://github.com/solson/miri) early constant evaluation) and incremental execution of compiler passes (e.g. type-checking), with beneficial consequences to IDE support as well.
If any motivation is unclear, please ask for additional PR description clarifications or code comments._

<hr>

Both `AdtDef` and `TraitDef` contained type information (field types, generics and predicates) which was required to create them, preventing their use before that type information exists, or in the case of field types, *mutation* was required, leading to a variance-magicking implementation of `ivar`s.

This PR takes that information out and the resulting cleaner setup could even eventually end up merged with HIR, because, just like `AssociatedItem` before it, there's no dependency on types anymore.
(With one exception, variant discriminants should probably be moved into their own map later.)
2016-12-02 15:06:36 +00:00
Vadim Chugunov
bc019dfb39 Emit 'dllimport' attribute for dylib foreign items on Windows. 2016-12-01 16:22:04 -08:00
Ariel Ben-Yehuda
242cd7ebe2 limit the length of types in monomorphization
This adds the new insta-stable `#![type_size_limit]` crate attribute to control
the limit, and is obviously a [breaking-change] fixable by that.
2016-12-02 00:54:22 +02:00
bors
908dba0c94 Auto merge of #38048 - rkruppe:llvm-stringref-fixes, r=alexcrichton
[LLVM 4.0] Don't assume llvm::StringRef is null terminated

StringRefs have a length and their contents are not usually null-terminated. The solution is to either copy the string data (in `rustc_llvm::diagnostic`) or take the size into account (in LLVMRustPrintPasses).

I couldn't trigger a bug caused by this (apparently all the strings returned in practice are actually null-terminated) but this is more correct and more future-proof.

cc #37609
2016-12-01 15:21:11 +00:00
Michael Woerister
29a6ffa401 incr.comp.: Add more output to -Z incremental-info. 2016-11-30 17:33:52 -05:00
bors
ecff71a45c Auto merge of #37800 - alexcrichton:new-bootstrap, r=eddyb
Update the bootstrap compiler

Now that we've got a beta build, let's use it!
2016-11-30 19:17:24 +00:00
Alex Crichton
2186660b51 Update the bootstrap compiler
Now that we've got a beta build, let's use it!
2016-11-30 10:38:08 -08:00
bors
3abaf43f77 Auto merge of #37954 - eddyb:rustdoc-2, r=alexcrichton
rustdoc: link to cross-crate sources directly.

Fixes #37684 by implementing proper support for getting the `Span` of definitions across crates.
In rustdoc this is used to generate direct links to the original source instead of fragile redirects.

This functionality could be expanded further for making error reporting code more uniform and seamless across crates, although at the moment there is no actual source to print, only file/line/column information.

Closes #37870 which is also "fixes" #37684 by throwing away the builtin macro docs from libcore.
After this lands, #37727 could be reverted, although it doesn't matter much either way.
2016-11-30 07:46:00 +00:00
Eduard-Mihai Burtescu
177913b49c rustc: track the Span's of definitions across crates. 2016-11-30 04:48:56 +02:00
bors
8e373b4787 Auto merge of #37965 - Mark-Simulacrum:trait-obj-to-exis-predicate, r=eddyb
Refactor TraitObject to Slice<ExistentialPredicate>

For reference, the primary types changes in this PR are shown below. They may add in the understanding of what is discussed below, though they should not be required.

We change `TraitObject` into a list of `ExistentialPredicate`s to allow for a couple of things:
 - Principal (ExistentialPredicate::Trait) is now optional.
 - Region bounds are moved out of `TraitObject` into `TyDynamic`. This permits wrapping only the `ExistentialPredicate` list in `Binder`.
 - `BuiltinBounds` and `BuiltinBound` are removed entirely from the codebase, to permit future non-constrained auto traits. These are replaced with `ExistentialPredicate::AutoTrait`, which only requires a `DefId`. For the time being, only `Send` and `Sync` are supported; this constraint can be lifted in a future pull request.
 - Binder-related logic is extracted from `ExistentialPredicate` into the parent (`Binder<Slice<EP>>`), so `PolyX`s are inside `TraitObject` are replaced with `X`.

The code requires a sorting order for `ExistentialPredicate`s in the interned `Slice`. The sort order is asserted to be correct during interning, but the slices are not sorted at that point.

1. `ExistentialPredicate::Trait` are defined as always equal; **This may be wrong; should we be comparing them and sorting them in some way?**
1. `ExistentialPredicate::Projection`: Compared by `ExistentialProjection::sort_key`.
1. `ExistentialPredicate::AutoTrait`: Compared by `TraitDef.def_path_hash`.

Construction of `ExistentialPredicate`s is conducted through `TyCtxt::mk_existential_predicates`, which interns a passed iterator as a `Slice`. There are no convenience functions to construct from a set of separate iterators; callers must pass an iterator chain. The lack of convenience functions is primarily due to few uses and the relative difficulty in defining a nice API due to optional parts and difficulty in recognizing which argument goes where. It is also true that the current situation isn't significantly better than 4 arguments to a constructor function; but the extra work is deemed unnecessary as of this time.

```rust
// before this PR
struct TraitObject<'tcx> {
    pub principal: PolyExistentialTraitRef<'tcx>,
    pub region_bound: &'tcx ty::Region,
    pub builtin_bounds: BuiltinBounds,
    pub projection_bounds: Vec<PolyExistentialProjection<'tcx>>,
}

// after
pub enum ExistentialPredicate<'tcx> {
    // e.g. Iterator
    Trait(ExistentialTraitRef<'tcx>),
    // e.g. Iterator::Item = T
    Projection(ExistentialProjection<'tcx>),
    // e.g. Send
    AutoTrait(DefId),
}
```
2016-11-29 20:41:38 -06:00
Andrew Gallant
80ef1dbf2d Add new #[target_feature = "..."] attribute.
This commit adds a new attribute that instructs the compiler to emit
target specific code for a single function. For example, the following
function is permitted to use instructions that are part of SSE 4.2:

    #[target_feature = "+sse4.2"]
    fn foo() { ... }

In particular, use of this attribute does not require setting the
-C target-feature or -C target-cpu options on rustc.

This attribute does not have any protections built into it. For example,
nothing stops one from calling the above `foo` function on hosts without
SSE 4.2 support. Doing so may result in a SIGILL.

This commit also expands the target feature whitelist to include lzcnt,
popcnt and sse4a. Namely, lzcnt and popcnt have their own CPUID bits,
but were introduced with SSE4.
2016-11-29 20:32:14 -05:00
Eduard-Mihai Burtescu
07ff914be1 rustc: simplify AdtDef by removing the field types and ty::ivar. 2016-11-29 21:24:26 +02:00
Niko Matsakis
104125d5f7 revamp Visitor with a single method for controlling nested visits 2016-11-29 13:04:27 +01:00
Florian Diebold
f0ce5bb66b Split nested_visit_mode function off from nested_visit_map
... and make the latter mandatory to implement.
2016-11-29 13:04:27 +01:00
Florian Diebold
dd6a57ce2a rustc_trans: fix compilation 2016-11-29 13:04:27 +01:00
Florian Diebold
8f63b416af rustc_trans: fix compilation 2016-11-29 13:04:27 +01:00
Mark-Simulacrum
8b82fd7a94 Remove allocation in push_type_params 2016-11-28 18:09:15 -07:00
Mark-Simulacrum
bb35d50cad Refactor TyTrait to contain a interned ExistentialPredicate slice.
Renames TyTrait to TyDynamic.
2016-11-28 18:09:13 -07:00
Robin Kruppe
85dc08e525 Don't assume llvm::StringRef is null terminated
StringRefs have a length and their contents are not usually null-terminated.
The solution is to either copy the string data (in rustc_llvm::diagnostic) or take the size into account (in LLVMRustPrintPasses).
I couldn't trigger a bug caused by this (apparently all the strings returned in practice are actually null-terminated) but this is more correct and more future-proof.
2016-11-28 17:33:13 +01:00
Mark-Simulacrum
46c7a117f8 Privatize TraitObject.principal and add a method accessor, returning Option. 2016-11-28 06:37:08 -07:00
Eduard Burtescu
da47c2e2ac rustc_typeck: save the type cache for rustdoc and save-analysis. 2016-11-28 04:18:10 +02:00
bors
f3930aab46 Auto merge of #38023 - arielb1:constant-evil-x2, r=eddyb
don't double-apply variant padding to const enums

`build_const_struct` already returns the struct with padding - don't double-apply it in the `General` case.

This should hopefully be the last time we have this sort of bug.

Fixes #38002.

Beta-nominating because regression.

r? @eddyb
2016-11-26 21:49:41 -06:00
Ariel Ben-Yehuda
fcebf3beab don't double-apply variant padding to const enums
Fixes #38002.
2016-11-27 02:57:55 +02:00
bors
ebc0373909 Auto merge of #37982 - rkruppe:llvm-diagnostic-fwdcompat, r=alexcrichton
[LLVM 4.0] OptimizationDiagnostic FFI forward compatibility

- getMsg() changed to return std::string by-value. Fix: copy the data to a rust String during unpacking.
- getPassName() changed to return StringRef

cc #37609
2016-11-25 09:01:33 -06:00
Robin Kruppe
730400167a Support LLVM 4.0 in OptimizationDiagnostic FFI
- getMsg() changed to return std::string by-value. Fix: copy the data to a rust String during unpacking.
- getPassName() changed to return StringRef
2016-11-24 17:33:47 +01:00
Felix S. Klock II
70e5ca2ab4 Revisions from review comments, squashed.
Biggest change: Revised print-type-sizes output to include breakdown
of layout.

Includes info about field sizes (and alignment + padding when padding
is injected; the injected padding is derived from the offsets computed
by layout module).

Output format is illustrated in commit that has the ui tests.

Note: there exists (at least) one case of variant w/o name: empty
enums.  Namely, empty enums use anonymous univariant repr. So for such
cases, print the number of the variant instead of the name.

----

Also, eddyb suggested of reading from `layout_cache` post-trans.

(For casual readers: the compiler source often uses the word "cache"
for tables that are in fact not periodically purged, and thus are
useful as the basis for data like this.)

Some types that were previously not printed are now included in the
output. (See e.g. the tests `print_type_sizes/generics.rs` and
`print_type_sizes/variants.rs`)

----

Other review feedback:

switch to an exhaustive match when filtering in just structural types.
switch to hashset for layout info and move sort into print method.

----

Driveby change: Factored session::code_stats into its own module

----

incorporate njn feedback re output formatting.
2016-11-24 10:30:18 +01:00
bors
5196ca8518 Auto merge of #37681 - nrc:crate-metadata, r=@alexcrichton
add --crate-type metadata

r? @alexcrichton
2016-11-22 21:54:10 -06:00
Nick Cameron
af1b19555c Rebasing and review changes 2016-11-23 12:50:39 +13:00
bors
ebec55406b Auto merge of #37824 - jseyfried:symbols, r=eddyb
Clean up `ast::Attribute`, `ast::CrateConfig`, and string interning

This PR
 - removes `ast::Attribute_` (changing `Attribute` from `Spanned<Attribute_>` to a struct),
 - moves a `MetaItem`'s name from the `MetaItemKind` variants to a field of `MetaItem`,
 - avoids needlessly wrapping `ast::MetaItem` with `P`,
 - moves string interning into `syntax::symbol` (`ast::Name` is a reexport of `symbol::Symbol` for now),
 - replaces `InternedString` with `Symbol` in the AST, HIR, and various other places, and
 - refactors `ast::CrateConfig` from a `Vec` to a `HashSet`.

r? @eddyb
2016-11-21 08:08:47 -06:00
Jeffrey Seyfried
cc74068642 Remove Rc from the interner. 2016-11-21 09:00:56 +00:00
Jeffrey Seyfried
36c8f6b0d3 Cleanup InternedString. 2016-11-21 09:00:56 +00:00
Jeffrey Seyfried
e85a0d70b8 Use Symbol instead of InternedString in the AST, HIR, and various other places. 2016-11-21 09:00:55 +00:00
Jeffrey Seyfried
d2f8fb0a0a Move syntax::util::interner -> syntax::symbol, cleanup. 2016-11-20 23:40:20 +00:00
bors
4bc9290133 Auto merge of #37862 - shepmaster:llvm-4.0-always-set-eh-personality, r=eddyb
[LLVM 4.0] Set EH personality when resuming stack unwinding

To resume stack unwinding, the LLVM `resume` instruction must be used.

In order to use this instruction, the calling function must have an
exception handling personality set.

LLVM 4.0 adds a new IR validation check to ensure a personality is
always set in these cases.

This was introduced in [r277360](https://reviews.llvm.org/rL277360).
2016-11-20 13:50:47 -06:00
Nick Cameron
534556a445 Read in rmeta crates 2016-11-21 07:10:12 +13:00
Nick Cameron
b286a2f081 Add --crate-type metadata
With the same semantics as -Zno-trans
2016-11-21 07:08:35 +13:00
Jeffrey Seyfried
4b9b0d3474 Refactor CrateConfig. 2016-11-20 12:35:57 +00:00
bors
0bd2ce62b2 Auto merge of #37831 - rkruppe:llvm-attr-fwdcompat, r=eddyb
[LLVM 4.0] Use llvm::Attribute APIs instead of "raw value" APIs

The latter will be removed in LLVM 4.0 (see 4a6fc8bacf).

The librustc_llvm API remains mostly unchanged, except that llvm::Attribute is no longer a bitflag but represents only a *single* attribute.
The ability to store many attributes in a small number of bits and modify them without interacting with LLVM is only used in rustc_trans::abi and closely related modules, and only attributes for function arguments are considered there.
Thus rustc_trans::abi now has its own bit-packed representation of argument attributes, which are translated to rustc_llvm::Attribute when applying the attributes.

cc #37609
2016-11-19 16:39:25 -06:00
bors
fb025b483a Auto merge of #37814 - japaric:aapcs, r=alexcrichton
fix `extern "aapcs" fn`

to actually use the AAPCS calling convention

closes #37810

This is technically a [breaking-change] because it changes the ABI of
`extern "aapcs"` functions that (a) involve `f32`/`f64` arguments/return
values and (b) are compiled for arm-eabihf targets from
"aapcs-vfp" (wrong) to "aapcs" (correct).

Appendix:

What these ABIs mean?

- In the "aapcs-vfp" ABI or "hard float" calling convention: Floating
point values are passed/returned through FPU registers (s0, s1, d0, etc.)

- Whereas, in the "aapcs" ABI or "soft float" calling convention:
Floating point values are passed/returned through general purpose
registers (r0, r1, etc.)

Mixing these ABIs can cause problems if the caller assumes that the
routine is using one of these ABIs but it's actually using the other
one.

---

r? @alexcrichton We are going this `extern "aapcs" fn` thing to implement some intrinsics (floatundidf) for the eabihf targets in order to comply with LLVM's calling convention of intrinsics.

Oh, and the value of the enum came from [here](http://llvm.org/docs/doxygen/html/namespacellvm_1_1CallingConv.html).

cc @TimNN @parched
2016-11-19 04:58:48 -08:00
Dylan McKay
84415ea1f2 [LLVM 4.0] Set EH personality when resuming stack unwinding
To resume stack unwinding, the LLVM `resume` instruction must be used.

In order to use this instruction, the calling function must have an
exception handling personality set.

LLVM 4.0 adds a new IR validation check to ensure a personality is
always set in these cases.

This was introduced in [r277360](https://reviews.llvm.org/rL277360).
2016-11-18 11:24:19 -05:00
Ariel Ben-Yehuda
4fc02f6893 instantiate closures on demand
this should fix compilation with `-C codegen-units=4` - tested locally
with `RUSTFLAGS='-C codegen-units=4' ../x.py test`
2016-11-18 12:25:00 +02:00
bors
35e8924dc5 Auto merge of #37660 - nikomatsakis:incremental-36349, r=eddyb
Separate impl items from the parent impl

This change separates impl item bodies out of the impl itself. This gives incremental more resolution. In so doing, it refactors how the visitors work, and cleans up a bit of the collect/check logic (mostly by moving things out of collect that didn't really belong there, because they were just checking conditions).

However, this is not as effective as I expected, for a kind of frustrating reason. In particular, when invoking `foo.bar()` you still wind up with dependencies on private items. The problem is that the method resolution code scans that list for methods with the name `bar` -- and this winds up touching *all* the methods, even private ones.

I can imagine two obvious ways to fix this:

- separating fn bodies from fn sigs (#35078, currently being pursued by @flodiebold)
- a more aggressive model of incremental that @michaelwoerister has been advocating, in which we hash the intermediate results (e.g., the outputs of collect) so that we can see that the intermediate result hasn't changed, even if a particular impl item has changed.

So all in all I'm not quite sure whether to land this or not. =) It still seems like it has to be a win in some cases, but not with the test cases we have just now. I can try to gin up some test cases, but I'm not sure if they will be totally realistic. On the other hand, some of the early refactorings to the visitor trait seem worthwhile to me regardless.

cc #36349 -- well, this is basically a fix for that issue, I guess

r? @michaelwoerister

NB: Based atop of @eddyb's PR https://github.com/rust-lang/rust/pull/37402; don't land until that lands.
2016-11-17 17:31:01 -08:00
Robin Kruppe
30daedf603 Use llvm::Attribute API instead of "raw value" APIs, which will be removed in LLVM 4.0.
The librustc_llvm API remains mostly unchanged, except that llvm::Attribute is no longer a bitflag but represents only a *single* attribute.
The ability to store many attributes in a small number of bits and modify them without interacting with LLVM is only used in rustc_trans::abi and closely related modules, and only attributes for function arguments are considered there.
Thus rustc_trans::abi now has its own bit-packed representation of argument attributes, which are translated to rustc_llvm::Attribute when applying the attributes.
2016-11-17 21:12:26 +01:00
Niko Matsakis
b8116dabda fix oversight in closure translation
(Unrelated to this PR series)
2016-11-17 13:44:22 -05:00
Jorge Aparicio
456ceba137 fix extern "aapcs" fn
to actually use the AAPCS calling convention

closes #37810

This is technically a [breaking-change] because it changes the ABI of
`extern "aapcs"` functions that (a) involve `f32`/`f64` arguments/return
values and (b) are compiled for arm-eabihf targets from
"aapcs-vfp" (wrong) to "aapcs" (correct).

Appendix:

What these ABIs mean?

- In the "aapcs-vfp" ABI or "hard float" calling convention: Floating
point values are passed/returned through FPU registers (s0, s1, d0, etc.)

- Whereas, in the "aapcs" ABI or "soft float" calling convention:
Floating point values are passed/returned through general purpose
registers (r0, r1, etc.)

Mixing these ABIs can cause problems if the caller assumes that the
routine is using one of these ABIs but it's actually using the other
one.
2016-11-16 18:38:32 -05:00
Niko Matsakis
629f5ffb23 include a Name and Span for each item in the HIR of the impl 2016-11-16 13:57:47 -05:00