Commit Graph

84 Commits

Author SHA1 Message Date
Ariel Ben-Yehuda
e1f3c67cb4 translate closure shims using MIR 2017-03-18 02:53:07 +02:00
Ariel Ben-Yehuda
65a4266f1f refactor away callee::Callee and translate virtual calls through a MIR shim
These changes are in the same commit to avoid needing to adapt
meth::trans_object_shim to the new scheme.

One codegen-units test is broken because we instantiate the shims even
when they are not needed. This will be fixed in the next PR.
2017-03-18 02:53:07 +02:00
Ariel Ben-Yehuda
ffee9566bb move Instance to rustc and use it in the collector 2017-03-18 02:53:04 +02:00
Simonas Kazlauskas
21c61336bb Remove the TypedConstVal
Replace it with ConstUsize instead, which is more appropriate; we are not using the rest of the
TypedConstVal anyway
2017-02-28 17:12:56 +02:00
Simonas Kazlauskas
3a14e9e745 Make Rvalue::ty infallible 2017-02-28 17:12:55 +02:00
Eduard-Mihai Burtescu
3146ee8672 rustc: simplify tcx.closure_type(...) as it can copy the cached values. 2017-02-25 18:35:25 +02:00
Eduard-Mihai Burtescu
91374f8fe4 rustc: combine BareFnTy and ClosureTy into FnSig. 2017-02-25 17:47:15 +02:00
Eduard-Mihai Burtescu
e96a171453 rustc: move the actual values of enum discriminants into a map. 2017-02-25 17:07:59 +02:00
est31
77f131da1a Review changes
* use more convenient mk_substs function
	* remove type annotations
	* use map_bound one level farther outside
	* style improvements
2017-02-24 00:32:21 +01:00
est31
1b9b322883 Implement non-capturing closure to fn coercion 2017-02-23 22:32:22 +01:00
Simonas Kazlauskas
4a3c66ad2f [MIR] Make InlineAsm a Statement
Previously InlineAsm was an Rvalue, but its semantics doesn’t really match the semantics of an
Rvalue – rather it behaves more like a Statement.
2017-02-15 21:21:36 +02:00
Simonas Kazlauskas
f3bd723101 Fix intcast, use it where appropriate 2017-02-10 19:47:09 +02:00
Simonas Kazlauskas
a8b7b62185 Revert use of layout code in typeck::collect 2017-02-10 19:45:53 +02:00
Simonas Kazlauskas
c9939863ca Fix the IntTypeExt::to_ty() lifetime bounds 2017-02-10 19:43:57 +02:00
Simonas Kazlauskas
779c6b6cb8 Add Rvalue::Discriminant to retrieve discriminant 2017-02-10 19:31:37 +02:00
Ariel Ben-Yehuda
d71988a1d4 pacify tidy 2017-02-08 22:23:21 +01:00
Ariel Ben-Yehuda
09825de61b emit "align 1" metadata on loads/stores of packed structs
According to the LLVM reference:
> A value of 0 or an omitted align argument means that the operation has
the ABI alignment for the target.

So loads/stores of fields of packed structs need to have their align set
to 1. Implement that by tracking the alignment of `LvalueRef`s.

Fixes #39376.
2017-02-08 22:23:21 +01:00
Andrew Cann
2cc84df44c Add warning for () to ! switch 2017-02-03 18:48:15 +08:00
Mark Simulacrum
e393046380 Simplify code since CEnum is always immediate now. 2017-01-10 19:42:37 -07:00
Mark Simulacrum
426c558c5a Move trans_field_ptr and struct_field_ptr to mir/lvalue 2017-01-04 11:38:09 -07:00
Mark Simulacrum
ea0ebe41c7 Change trans_field_ptr to utilize LvalueTy to determine discriminant. 2017-01-04 11:37:42 -07:00
Mark Simulacrum
8038489357 Use LvalueRef instead of MaybeSizedValue 2017-01-04 11:35:33 -07:00
Mark Simulacrum
37dd9f6c7b Add Builder::sess and Builder::tcx methods 2017-01-04 11:34:26 -07:00
Mark Simulacrum
1be170b01a Replace BlockAndBuilder with Builder. 2017-01-04 11:33:31 -07:00
bors
d40d01bd0e Auto merge of #38670 - dotdash:transmute_align, r=eddyb
Fix transmute::<T, U> where T requires a bigger alignment than U

For transmute::<T, U> we simply pointercast the destination from a U
pointer to a T pointer, without providing any alignment information,
thus LLVM assumes that the destination is aligned to hold a value of
type T, which is not necessarily true. This can lead to LLVM emitting
machine instructions that assume said alignment, and thus cause aborts.

To fix this, we need to provide the actual alignment to store_operand()
and in turn to store() so they can set the proper alignment information
on the stores and LLVM can emit the proper machine instructions.

Fixes #32947
2017-01-04 14:26:17 +00:00
Björn Steinbrink
71a11a0b10 Fix transmute::<T, U> where T requires a bigger alignment than U
For transmute::<T, U> we simply pointercast the destination from a U
pointer to a T pointer, without providing any alignment information,
thus LLVM assumes that the destination is aligned to hold a value of
type T, which is not necessarily true. This can lead to LLVM emitting
machine instructions that assume said alignment, and thus cause aborts.

To fix this, we need to provide the actual alignment to store_operand()
and in turn to store() so they can set the proper alignment information
on the stores and LLVM can emit the proper machine instructions.

Fixes #32947
2016-12-31 13:13:30 +01:00
Simonas Kazlauskas
b0e55a83a8 Such large. Very 128. Much bits.
This commit introduces 128-bit integers. Stage 2 builds and produces a working compiler which
understands and supports 128-bit integers throughout.

The general strategy used is to have rustc_i128 module which provides aliases for iu128, equal to
iu64 in stage9 and iu128 later. Since nowhere in rustc we rely on large numbers being supported,
this strategy is good enough to get past the first bootstrap stages to end up with a fully working
128-bit capable compiler.

In order for this strategy to work, number of locations had to be changed to use associated
max_value/min_value instead of MAX/MIN constants as well as the min_value (or was it max_value?)
had to be changed to use xor instead of shift so both 64-bit and 128-bit based consteval works
(former not necessarily producing the right results in stage1).

This commit includes manual merge conflict resolution changes from a rebase by @est31.
2016-12-30 15:15:44 +01:00
Mark Simulacrum
15b9b27bb0 slice_for_each gives a reference already 2016-12-20 20:04:44 -07:00
Mark Simulacrum
295ea0d6c3 Reduce coerce_unsized_into to one call
We cannot inline due to it being recursive.
2016-12-20 20:04:44 -07:00
Mark Simulacrum
88202c5b83 Replace bcx.ccx() with bcx.ccx 2016-12-20 20:04:41 -07:00
Mark Simulacrum
5301d380b6 Remove unused bcx from LocalAnalyzer. 2016-12-20 20:03:35 -07:00
Mark Simulacrum
e10695f161 Move param_substs onto MirContext 2016-12-20 20:03:32 -07:00
Mark Simulacrum
a42a3429fe Move param_env onto SharedCrateContext, and move functions which need the ParamEnv onto it. 2016-12-20 20:03:32 -07:00
Mark Simulacrum
b48e74b5b0 Rename 'blk and 'bcx to 'a 2016-12-20 20:03:31 -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
31691692a2 Deduplicate store_operand_direct and store_operand 2016-12-20 20:02:51 -07:00
Mark-Simulacrum
51dfba1185 Refactor Vec<CleanupScope> into Option<CleanupScope>. 2016-12-20 20:02:50 -07:00
Mark-Simulacrum
8f3d824cc7 Remove common::Block. 2016-12-20 20:02:46 -07:00
Mark-Simulacrum
ad0a901d37 Remove *_builder 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
bf7d4534a7 Refactor Block into BlockAndBuilder 2016-12-20 20:01:40 -07: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
bors
c8867f8b46 Auto merge of #37672 - japaric:msp430, r=alexcrichton
enable the MSP430 LLVM backend

to let people experiment with this target out of tree.

The MSP430 architecture is used in 16-bit microcontrollers commonly used
in Digital Signal Processing applications.

---

How this was tested:

Declaring a custom target with the following specification:

``` json
{
  "arch": "msp430",
  "data-layout": "e-m:e-p:16:16-i32:16:32-a:16-n8:16",
  "executables": true,
  "linker": "msp430-gcc",
  "llvm-target": "msp430",
  "max-atomic-width": 0,
  "no-integrated-as": true,
  "os": "none",
  "panic-strategy": "abort",
  "relocation-model": "static",
  "target-endian": "little",
  "target-pointer-width": "16"
}
```

And this minimal file:

``` rust

pub fn start() -> ! {
    loop {}
}

trait Copy {}

trait Sized {}
```

Produces the following object files:

```
$ rustc --target=msp430 --emit=obj foo.rs

$ msp430-objdump -Cd foo.o

foo.o:     file format elf32-msp430

Disassembly of section .text.start:

00000000 <start>:
   0:   21 83           decd    r1
   2:   00 3c           jmp     $+2             ;abs 0x4
   4:   00 3c           jmp     $+2             ;abs 0x6
   6:   ff 3f           jmp     $+0             ;abs 0x6

$ rustc --target=msp430 --emit=obj foo.rs -O

$ msp430-objdump -Cd foo.o

foo.o:     file format elf32-msp430

Disassembly of section .text.start:

00000000 <start>:
   0:   ff 3f           jmp     $+0             ;abs 0x0
```

---

r? @alexcrichton
~~TODO get this working with Makefiles so nightly releases include this backend~~
~~TODO measure the increase in binary size~~ +187KiB (+0.47%)
~~FIXME --emit=obj produces empty object files~~
2016-11-15 01:27:47 -08:00
Jorge Aparicio
30e5667607 fix #37673 2016-11-12 17:33:35 -05:00
Ariel Ben-Yehuda
57950982b2 rustc_trans: translate closures using the collector
Translate closures like normal functions, using the trans::collector
interface.
2016-11-12 20:08:03 +02:00
Eduard Burtescu
36340ba994 rustc: move mir::repr::* to mir. 2016-10-28 10:37:24 +03:00
Mark-Simulacrum
982a48575b Utilize AccumulateVec to avoid heap allocations in mk_{substs, type_list, tup} calls. 2016-10-25 20:06:17 -06:00
Mark-Simulacrum
83b198249f Use TypedArena::alloc_slice in rustc. 2016-10-19 07:53:56 -06:00
Ariel Ben-Yehuda
45fe3a1a2a emit an assume that cast-from enums are in range
Fixes #36955.
2016-10-05 14:12:30 +03:00