rust/src
bors 4af28c98fa auto merge of #12296 : dotdash/rust/byval_noalias, r=cmr
Function parameters that are to be passed by value but don't fit into a
single register are currently passed by creating a copy on the stack and
passing a pointer to that copy to the callee. Since the copy is made
just for the function call, there are no aliases.

For example, this sometimes allows LLVM to eliminate unnecessary calls
to drop glue. Given

````rust
struct Foo {
    a: int,
    b: Option<~str>,
}

extern {
    fn eat(eat: Option<~str>);
}

pub fn foo(v: Foo) {
    match v {
        Foo { a: _, b } => unsafe { eat(b) }
    }
}
````

LLVM currently can't eliminate the drop call for the string, because it
only sees a _pointer_ to Foo, for which it has to expect an alias. So we
get:

````llvm
; Function Attrs: uwtable
define void @_ZN3foo20h9f32c90ae7201edbxaa4v0.0E(%struct.Foo* nocapture) unnamed_addr #0 {
"_ZN34std..option..Option$LT$$UP$str$GT$9glue_drop17hc39b3015f3b9c69dE.exit":
  %1 = getelementptr inbounds %struct.Foo* %0, i64 0, i32 1, i32 0
  %2 = load { i64, i64, [0 x i8] }** %1, align 8
  store { i64, i64, [0 x i8] }* null, { i64, i64, [0 x i8] }** %1, align 8
  %3 = ptrtoint { i64, i64, [0 x i8] }* %2 to i64
  %.fca.0.insert = insertvalue { i64 } undef, i64 %3, 0
  tail call void @eat({ i64 } %.fca.0.insert)
  %4 = load { i64, i64, [0 x i8] }** %1, align 8
  %5 = icmp eq { i64, i64, [0 x i8] }* %4, null
  br i1 %5, label %_ZN3Foo9glue_drop17hf611996539d3036fE.exit, label %"_ZN8_$UP$str9glue_drop17h15dbdbe2b8897a98E.exit.i.i"

"_ZN8_$UP$str9glue_drop17h15dbdbe2b8897a98E.exit.i.i": ; preds = %"_ZN34std..option..Option$LT$$UP$str$GT$9glue_drop17hc39b3015f3b9c69dE.exit"
  %6 = bitcast { i64, i64, [0 x i8] }* %4 to i8*
  tail call void @free(i8* %6) #1
  br label %_ZN3Foo9glue_drop17hf611996539d3036fE.exit

_ZN3Foo9glue_drop17hf611996539d3036fE.exit:       ; preds = %"_ZN34std..option..Option$LT$$UP$str$GT$9glue_drop17hc39b3015f3b9c69dE.exit", %"_ZN8_$UP$str9glue_drop17h15dbdbe2b8897a98E.exit.i.i"
  ret void
}
````

But with the `noalias` attribute, it can safely optimize that to:

````llvm
define void @_ZN3foo20hd28431f929f0d6c4xaa4v0.0E(%struct.Foo* noalias nocapture) unnamed_addr #0 {
_ZN3Foo9glue_drop17he9afbc09d4e9c851E.exit:
  %1 = getelementptr inbounds %struct.Foo* %0, i64 0, i32 1, i32 0
  %2 = load { i64, i64, [0 x i8] }** %1, align 8
  store { i64, i64, [0 x i8] }* null, { i64, i64, [0 x i8] }** %1, align 8
  %3 = ptrtoint { i64, i64, [0 x i8] }* %2 to i64
  %.fca.0.insert = insertvalue { i64 } undef, i64 %3, 0
  tail call void @eat({ i64 } %.fca.0.insert)
  ret void
}
````
2014-02-15 12:46:23 -08:00
..
compiler-rt@d4606f1818 Added compiler-rt submodule. 2014-02-11 13:58:25 -08:00
compiletest extra: Capture stdout/stderr of tests by default 2014-02-14 07:46:29 -08:00
doc auto merge of #12282 : cmr/rust/cleanup-ptr, r=huonw 2014-02-15 09:36:26 -08:00
driver Remove rustpkg. 2014-02-02 03:08:56 -05:00
etc Add crate keyword to gedit language spec 2014-02-14 15:37:22 -08:00
gyp@1e46da1000 Update bundled gyp 2013-12-28 10:42:25 -08:00
libarena Removed num::Orderable 2014-02-13 20:12:59 -05:00
libcollections std: clean up ptr a bit 2014-02-15 12:11:41 -05:00
libextra Add function doc comments for extra::url::* 2014-02-14 07:47:17 -08:00
libflate Remove Times trait 2014-01-30 14:52:25 +11:00
libfourcc Refactored ast_map and friends, mainly to have Paths without storing them. 2014-02-14 08:43:29 +02:00
libgetopts libgetopts -- fix unsafe sharing in closures 2014-02-11 16:55:24 -05:00
libglob Removed num::Orderable 2014-02-13 20:12:59 -05:00
libgreen auto merge of #12186 : alexcrichton/rust/no-sleep-2, r=brson 2014-02-14 00:26:47 -08:00
libnative Don't require an allocation for on_exit messages 2014-02-13 20:29:47 -08:00
libnum Removed num::Orderable 2014-02-13 20:12:59 -05:00
librustc Declare by-value on-stack parameters to be noalias 2014-02-15 21:34:11 +01:00
librustdoc auto merge of #12277 : alexcrichton/rust/fix-rustdoc-render, r=huonw 2014-02-14 17:51:29 -08:00
librustuv Test fixes and rebase conflicts from rollups 2014-02-14 10:59:22 -08:00
libsemver auto merge of #12109 : omasanori/rust/small-fixes, r=sfackler 2014-02-08 10:31:33 -08:00
libserialize remove duplicate function from std::ptr (is_null, is_not_null, offset, mut_offset) 2014-02-13 12:54:17 -08:00
libstd auto merge of #12282 : cmr/rust/cleanup-ptr, r=huonw 2014-02-15 09:36:26 -08:00
libsync Rewrite channels yet again for upgradeability 2014-02-11 16:32:00 -08:00
libsyntax Removed the obsolete ast::CallSugar (previously used by do). 2014-02-14 07:48:13 -08:00
libterm Move replace and swap to std::mem. Get rid of std::util 2014-02-11 05:21:35 +08:00
libuuid std: Move byteswap functions to mem 2014-02-09 00:17:41 -08:00
libuv@fd5308383c Attempt to fix the segfaulting osx bots 2013-12-21 20:17:23 -08:00
llvm@f5f1ffea20 Upgrade LLVM 2014-02-14 07:22:49 -08:00
rt Remove two allocations from spawning a green task 2014-02-13 20:31:17 -08:00
rustllvm Upgrade LLVM 2014-02-14 07:22:49 -08:00
test auto merge of #12270 : bstrie/rust/pnoise, r=huonw 2014-02-15 10:51:26 -08:00
README.md Remove rustpkg. 2014-02-02 03:08:56 -05:00
snapshots.txt Register new snapshots 2014-02-13 12:54:17 -08:00

This is a preliminary version of the Rust compiler, libraries and tools.

Source layout:

Path Description
librustc/ The self-hosted compiler
libstd/ The standard library (imported and linked by default)
libextra/ The "extras" library (slightly more peripheral code)
libgreen/ The M:N runtime library
libnative/ The 1:1 runtime library
libsyntax/ The Rust parser and pretty-printer
------------------- ---------------------------------------------------------
rt/ The runtime system
rt/rust_*.c - Some of the runtime services
rt/vg - Valgrind headers
rt/msvc - MSVC support
rt/sundown - The Markdown library used by rustdoc
------------------- ---------------------------------------------------------
compiletest/ The test runner
test/ Testsuite
test/codegen - Tests for the LLVM IR infrastructure
test/compile-fail - Tests that should fail to compile
test/debug-info - Tests for the debuginfo tool
test/run-fail - Tests that should compile, run and fail
test/run-make - Tests that depend on a Makefile infrastructure
test/run-pass - Tests that should compile, run and succeed
test/bench - Benchmarks and miscellaneous
test/pretty - Pretty-printer tests
test/auxiliary - Dependencies of tests
------------------- ---------------------------------------------------------
librustdoc/ The Rust API documentation tool
libuv/ The libuv submodule
------------------- ---------------------------------------------------------
llvm/ The LLVM submodule
rustllvm/ LLVM support code
------------------- ---------------------------------------------------------
etc/ Scripts, editors support, misc