Skip to content

Commit 451dcb5

Browse files
committed
---
yaml --- r: 94051 b: refs/heads/try c: acc5e32 h: refs/heads/master i: 94049: 23f365b 94047: f0903aa v: v3
1 parent 771f807 commit 451dcb5

File tree

119 files changed

+956
-1800
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

119 files changed

+956
-1800
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
refs/heads/master: 0da105a8b7b6b1e0568e8ff20f6ff4b13cc7ecc2
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: a6d3e57dca68fde4effdda3e4ae2887aa535fcd6
5-
refs/heads/try: 69186efc199d48afca9427e448363212b0a59454
5+
refs/heads/try: acc5e32e53d313a890a07cb0b693ce8df5bc94ce
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c

branches/try/Makefile.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ endif
134134
# static copies of libstd and libextra. We also generate dynamic versions of all
135135
# libraries, so in the interest of space, prefer dynamic linking throughout the
136136
# compilation process.
137+
RUSTFLAGS_STAGE0 += -Z prefer-dynamic
137138
RUSTFLAGS_STAGE1 += -Z prefer-dynamic
138139
RUSTFLAGS_STAGE2 += -Z prefer-dynamic
139140
RUSTFLAGS_STAGE3 += -Z prefer-dynamic

branches/try/configure

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ CFG_PREFIX=${CFG_PREFIX%/}
607607
CFG_MANDIR=${CFG_MANDIR%/}
608608
CFG_HOST="$(echo $CFG_HOST | tr ',' ' ')"
609609
CFG_TARGET="$(echo $CFG_TARGET | tr ',' ' ')"
610-
CFG_SUPPORTED_TARGET="$(grep ^CC_*=* ${CFG_SRC_DIR}mk/platform.mk | sed -e 's/^CC_//' -e 's/\([^=]*\).*/\1/' | xargs)"
610+
CFG_SUPPORTED_TARGET="$(grep ^CC_*=* $CFG_SRC_DIR/mk/platform.mk | sed -e 's/^CC_//' -e 's/\([^=]*\).*/\1/' | xargs)"
611611

612612
# copy host-triples to target-triples so that hosts are a subset of targets
613613
V_TEMP=""
@@ -893,11 +893,11 @@ do
893893
LLVM_CC_64="ccache clang -Qunused-arguments"
894894
;;
895895
("clang")
896-
LLVM_CXX_32="clang++ -m32 -Qunused-arguments"
897-
LLVM_CC_32="clang -m32 -Qunused-arguments"
896+
LLVM_CXX_32="clang++ -m32"
897+
LLVM_CC_32="clang -m32"
898898

899-
LLVM_CXX_64="clang++ -Qunused-arguments"
900-
LLVM_CC_64="clang -Qunused-arguments"
899+
LLVM_CXX_64="clang++"
900+
LLVM_CC_64="clang"
901901
;;
902902
("ccache gcc")
903903
LLVM_CXX_32="ccache g++ -m32"

branches/try/doc/rust.md

Lines changed: 0 additions & 165 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,38 +2070,6 @@ The currently implemented features of the compiler are:
20702070
closure as `once` is unlikely to be supported going forward. So
20712071
they are hidden behind this feature until they are to be removed.
20722072

2073-
* `managed_boxes` - Usage of `@` pointers is gated due to many
2074-
planned changes to this feature. In the past, this has meant
2075-
"a GC pointer", but the current implementation uses
2076-
reference counting and will likely change drastically over
2077-
time. Additionally, the `@` syntax will no longer be used to
2078-
create GC boxes.
2079-
2080-
* `asm` - The `asm!` macro provides a means for inline assembly. This is often
2081-
useful, but the exact syntax for this feature along with its semantics
2082-
are likely to change, so this macro usage must be opted into.
2083-
2084-
* `non_ascii_idents` - The compiler supports the use of non-ascii identifiers,
2085-
but the implementation is a little rough around the
2086-
edges, so this can be seen as an experimental feature for
2087-
now until the specification of identifiers is fully
2088-
fleshed out.
2089-
2090-
* `thread_local` - The usage of the `#[thread_local]` attribute is experimental
2091-
and should be seen as unstable. This attribute is used to
2092-
declare a `static` as being unique per-thread leveraging
2093-
LLVM's implementation which works in concert with the kernel
2094-
loader and dynamic linker. This is not necessarily available
2095-
on all platforms, and usage of it is discouraged (rust
2096-
focuses more on task-local data instead of thread-local
2097-
data).
2098-
2099-
* `link_args` - This attribute is used to specify custom flags to the linker,
2100-
but usage is strongly discouraged. The compiler's usage of the
2101-
system linker is not guaranteed to continue in the future, and
2102-
if the system linker is not used then specifying custom flags
2103-
doesn't have much meaning.
2104-
21052073
If a feature is promoted to a language feature, then all existing programs will
21062074
start to receive compilation warnings about #[feature] directives which enabled
21072075
the new feature (because the directive is no longer necessary). However, if
@@ -3225,32 +3193,6 @@ let bo: Binop = add;
32253193
x = bo(5,7);
32263194
~~~~
32273195

3228-
### Closure types
3229-
3230-
The type of a closure mapping an input of type `A` to an output of type `B` is `|A| -> B`. A closure with no arguments or return values has type `||`.
3231-
3232-
3233-
An example of creating and calling a closure:
3234-
3235-
```rust
3236-
let captured_var = 10;
3237-
3238-
let closure_no_args = || println!("captured_var={}", captured_var);
3239-
3240-
let closure_args = |arg: int| -> int {
3241-
println!("captured_var={}, arg={}", captured_var, arg);
3242-
arg // Note lack of semicolon after 'arg'
3243-
};
3244-
3245-
fn call_closure(c1: ||, c2: |int| -> int) {
3246-
c1();
3247-
c2(2);
3248-
}
3249-
3250-
call_closure(closure_no_args, closure_args);
3251-
3252-
```
3253-
32543196
### Object types
32553197

32563198
Every trait item (see [traits](#traits)) defines a type with the same name as the trait.
@@ -3669,111 +3611,6 @@ queues, as well as code to copy values between queues and their recipients and
36693611
to serialize values for transmission over operating-system inter-process
36703612
communication facilities.
36713613

3672-
### Linkage
3673-
3674-
The Rust compiler supports various methods to link crates together both
3675-
statically and dynamically. This section will explore the various methods to
3676-
link Rust crates together, and more information about native libraries can be
3677-
found in the [ffi tutorial][ffi].
3678-
3679-
In one session of compilation, the compiler can generate multiple artifacts
3680-
through the usage of command line flags and the `crate_type` attribute.
3681-
3682-
* `--bin`, `#[crate_type = "bin"]` - A runnable executable will be produced.
3683-
This requires that there is a `main` function in the crate which will be run
3684-
when the program begins executing. This will link in all Rust and native
3685-
dependencies, producing a distributable binary.
3686-
3687-
* `--lib`, `#[crate_type = "lib"]` - A Rust library will be produced. This is
3688-
an ambiguous concept as to what exactly is produced because a library can
3689-
manifest itself in several forms. The purpose of this generic `lib` option is
3690-
to generate the "compiler recommended" style of library. The output library
3691-
will always be usable by rustc, but the actual type of library may change
3692-
from time-to-time. The remaining output types are all different flavors of
3693-
libraries, and the `lib` type can be seen as an alias for one of them (but
3694-
the actual one is compiler-defined).
3695-
3696-
* `--dylib`, `#[crate_type = "dylib"]` - A dynamic Rust library will be
3697-
produced. This is different from the `lib` output type in that this forces
3698-
dynamic library generation. The resulting dynamic library can be used as a
3699-
dependency for other libraries and/or executables. This output type will
3700-
create `*.so` files on linux, `*.dylib` files on osx, and `*.dll` files on
3701-
windows.
3702-
3703-
* `--staticlib`, `#[crate_type = "staticlib"]` - A static system library will
3704-
be produced. This is different from other library outputs in that the Rust
3705-
compiler will never attempt to link to `staticlib` outputs. The purpose of
3706-
this output type is to create a static library containing all of the local
3707-
crate's code along with all upstream dependencies. The static library is
3708-
actually a `*.a` archive on linux and osx and a `*.lib` file on windows. This
3709-
format is recommended for use in situtations such as linking Rust code into an
3710-
existing non-Rust application because it will not have dynamic dependencies on
3711-
other Rust code.
3712-
3713-
* `--rlib`, `#[crate_type = "rlib"]` - A "Rust library" file will be produced.
3714-
This is used as an intermediate artifact and can be thought of as a "static
3715-
Rust library". These `rlib` files, unlike `staticlib` files, are interpreted
3716-
by the Rust compiler in future linkage. This essentially means that `rustc`
3717-
will look for metadata in `rlib` files like it looks for metadata in dynamic
3718-
libraries. This form of output is used to produce statically linked
3719-
executables as well as `staticlib` outputs.
3720-
3721-
Note that these outputs are stackable in the sense that if multiple are
3722-
specified, then the compiler will produce each form of output at once without
3723-
having to recompile.
3724-
3725-
With all these different kinds of outputs, if crate A depends on crate B, then
3726-
the compiler could find B in various different forms throughout the system. The
3727-
only forms looked for by the compiler, however, are the `rlib` format and the
3728-
dynamic library format. With these two options for a dependent library, the
3729-
compiler must at some point make a choice between these two formats. With this
3730-
in mind, the compiler follows these rules when determining what format of
3731-
dependencies will be used:
3732-
3733-
1. If a dynamic library is being produced, then it is required for all upstream
3734-
Rust dependencies to also be dynamic. This is a limitation of the current
3735-
implementation of the linkage model. The reason behind this limitation is to
3736-
prevent multiple copies of the same upstream library from showing up, and in
3737-
the future it is planned to support a mixture of dynamic and static linking.
3738-
3739-
When producing a dynamic library, the compiler will generate an error if an
3740-
upstream dependency could not be found, and also if an upstream dependency
3741-
could only be found in an `rlib` format. Remember that `staticlib` formats
3742-
are always ignored by `rustc` for crate-linking purposes.
3743-
3744-
2. If a static library is being produced, all upstream dependecies are
3745-
required to be available in `rlib` formats. This requirement stems from the
3746-
same reasons that a dynamic library must have all dynamic dependencies.
3747-
3748-
Note that it is impossible to link in native dynamic dependencies to a static
3749-
library, and in this case warnings will be printed about all unlinked native
3750-
dynamic dependencies.
3751-
3752-
3. If an `rlib` file is being produced, then there are no restrictions on what
3753-
format the upstream dependencies are available in. It is simply required that
3754-
all upstream dependencies be available for reading metadata from.
3755-
3756-
The reason for this is that `rlib` files do not contain any of their upstream
3757-
dependencies. It wouldn't be very efficient for all `rlib` files to contain a
3758-
copy of `libstd.rlib`!
3759-
3760-
4. If an executable is being produced, then things get a little interesting. As
3761-
with the above limitations in dynamic and static libraries, it is required
3762-
for all upstream dependencies to be in the same format. The next question is
3763-
whether to prefer a dynamic or a static format. The compiler currently favors
3764-
static linking over dynamic linking, but this can be inverted with the `-Z
3765-
prefer-dynamic` flag to the compiler.
3766-
3767-
What this means is that first the compiler will attempt to find all upstream
3768-
dependencies as `rlib` files, and if successful, it will create a statically
3769-
linked executable. If an upstream dependency is missing as an `rlib` file,
3770-
then the compiler will force all dependencies to be dynamic and will generate
3771-
errors if dynamic versions could not be found.
3772-
3773-
In general, `--bin` or `--lib` should be sufficient for all compilation needs,
3774-
and the other options are just available if more fine-grained control is desired
3775-
over the output format of a Rust crate.
3776-
37773614
### Logging system
37783615

37793616
The runtime contains a system for directing [logging
@@ -3925,5 +3762,3 @@ Additional specific influences can be seen from the following languages:
39253762
* The typeclass system of Haskell.
39263763
* The lexical identifier rule of Python.
39273764
* The block syntax of Ruby.
3928-
3929-
[ffi]: tutorial-ffi.html

branches/try/doc/tutorial-ffi.md

Lines changed: 19 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ foreign code. Rust is currently unable to call directly into a C++ library, but
88
snappy includes a C interface (documented in
99
[`snappy-c.h`](https://code.google.com/p/snappy/source/browse/trunk/snappy-c.h)).
1010

11-
The following is a minimal example of calling a foreign function which will
12-
compile if snappy is installed:
11+
The following is a minimal example of calling a foreign function which will compile if snappy is
12+
installed:
1313

1414
~~~~ {.xfail-test}
1515
use std::libc::size_t;
1616
17-
#[link(name = "snappy")]
17+
#[link_args = "-lsnappy"]
1818
extern {
1919
fn snappy_max_compressed_length(source_length: size_t) -> size_t;
2020
}
@@ -25,28 +25,26 @@ fn main() {
2525
}
2626
~~~~
2727

28-
The `extern` block is a list of function signatures in a foreign library, in
29-
this case with the platform's C ABI. The `#[link(...)]` attribute is used to
30-
instruct the linker to link against the snappy library so the symbols are
31-
resolved.
28+
The `extern` block is a list of function signatures in a foreign library, in this case with the
29+
platform's C ABI. The `#[link_args]` attribute is used to instruct the linker to link against the
30+
snappy library so the symbols are resolved.
3231

33-
Foreign functions are assumed to be unsafe so calls to them need to be wrapped
34-
with `unsafe {}` as a promise to the compiler that everything contained within
35-
truly is safe. C libraries often expose interfaces that aren't thread-safe, and
36-
almost any function that takes a pointer argument isn't valid for all possible
37-
inputs since the pointer could be dangling, and raw pointers fall outside of
32+
Foreign functions are assumed to be unsafe so calls to them need to be wrapped with `unsafe {}` as a
33+
promise to the compiler that everything contained within truly is safe. C libraries often expose
34+
interfaces that aren't thread-safe, and almost any function that takes a pointer argument isn't
35+
valid for all possible inputs since the pointer could be dangling, and raw pointers fall outside of
3836
Rust's safe memory model.
3937

40-
When declaring the argument types to a foreign function, the Rust compiler can
41-
not check if the declaration is correct, so specifying it correctly is part of
42-
keeping the binding correct at runtime.
38+
When declaring the argument types to a foreign function, the Rust compiler will not check if the
39+
declaration is correct, so specifying it correctly is part of keeping the binding correct at
40+
runtime.
4341

4442
The `extern` block can be extended to cover the entire snappy API:
4543

4644
~~~~ {.xfail-test}
4745
use std::libc::{c_int, size_t};
4846
49-
#[link(name = "snappy")]
47+
#[link_args = "-lsnappy"]
5048
extern {
5149
fn snappy_compress(input: *u8,
5250
input_length: size_t,
@@ -234,72 +232,9 @@ fn main() {
234232

235233
# Linking
236234

237-
The `link` attribute on `extern` blocks provides the basic building block for
238-
instructing rustc how it will link to native libraries. There are two accepted
239-
forms of the link attribute today:
240-
241-
* `#[link(name = "foo")]`
242-
* `#[link(name = "foo", kind = "bar")]`
243-
244-
In both of these cases, `foo` is the name of the native library that we're
245-
linking to, and in the second case `bar` is the type of native library that the
246-
compiler is linking to. There are currently three known types of native
247-
libraries:
248-
249-
* Dynamic - `#[link(name = "readline")]
250-
* Static - `#[link(name = "my_build_dependency", kind = "static")]
251-
* Frameworks - `#[link(name = "CoreFoundation", kind = "framework")]
252-
253-
Note that frameworks are only available on OSX targets.
254-
255-
The different `kind` values are meant to differentiate how the native library
256-
participates in linkage. From a linkage perspective, the rust compiler creates
257-
two flavors of artifacts: partial (rlib/staticlib) and final (dylib/binary).
258-
Native dynamic libraries and frameworks are propagated to the final artifact
259-
boundary, while static libraries are not propagated at all.
260-
261-
A few examples of how this model can be used are:
262-
263-
* A native build dependency. Sometimes some C/C++ glue is needed when writing
264-
some rust code, but distribution of the C/C++ code in a library format is just
265-
a burden. In this case, the code will be archived into `libfoo.a` and then the
266-
rust crate would declare a dependency via `#[link(name = "foo", kind =
267-
"static")]`.
268-
269-
Regardless of the flavor of output for the crate, the native static library
270-
will be included in the output, meaning that distribution of the native static
271-
library is not necessary.
272-
273-
* A normal dynamic dependency. Common system libraries (like `readline`) are
274-
available on a large number of systems, and often a static copy of these
275-
libraries cannot be found. When this dependency is included in a rust crate,
276-
partial targets (like rlibs) will not link to the library, but when the rlib
277-
is included in a final target (like a binary), the native library will be
278-
linked in.
279-
280-
On OSX, frameworks behave with the same semantics as a dynamic library.
281-
282-
## The `link_args` attribute
283-
284-
There is one other way to tell rustc how to customize linking, and that is via
285-
the `link_args` attribute. This attribute is applied to `extern` blocks and
286-
specifies raw flags which need to get passed to the linker when producing an
287-
artifact. An example usage would be:
288-
289-
~~~ {.xfail-test}
290-
#[link_args = "-foo -bar -baz"]
291-
extern {}
292-
~~~
293-
294-
Note that this feature is currently hidden behind the `feature(link_args)` gate
295-
because this is not a sanctioned way of performing linking. Right now rustc
296-
shells out to the system linker, so it makes sense to provide extra command line
297-
arguments, but this will not always be the case. In the future rustc may use
298-
LLVM directly to link native libraries in which case `link_args` will have no
299-
meaning.
300-
301-
It is highly recommended to *not* use this attribute, and rather use the more
302-
formal `#[link(...)]` attribute on `extern` blocks instead.
235+
In addition to the `#[link_args]` attribute for explicitly passing arguments to the linker, an
236+
`extern mod` block will pass `-lmodname` to the linker by default unless it has a `#[nolink]`
237+
attribute applied.
303238

304239
# Unsafe blocks
305240

@@ -325,7 +260,7 @@ blocks with the `static` keyword:
325260
~~~{.xfail-test}
326261
use std::libc;
327262
328-
#[link(name = "readline")]
263+
#[link_args = "-lreadline"]
329264
extern {
330265
static rl_readline_version: libc::c_int;
331266
}
@@ -344,7 +279,7 @@ them.
344279
use std::libc;
345280
use std::ptr;
346281
347-
#[link(name = "readline")]
282+
#[link_args = "-lreadline"]
348283
extern {
349284
static mut rl_prompt: *libc::c_char;
350285
}

0 commit comments

Comments
 (0)