]> git.proxmox.com Git - rustc.git/blame - src/librustc_target/abi/call/asmjs.rs
New upstream version 1.33.0+dfsg1
[rustc.git] / src / librustc_target / abi / call / asmjs.rs
CommitLineData
83c7162d
XL
1use abi::call::{FnType, ArgType, Uniform};
2use abi::{HasDataLayout, LayoutOf, TyLayout, TyLayoutMethods};
54a0048b
SL
3
4// Data layout: e-p:32:32-i64:64-v128:32:128-n32-S128
5
6// See the https://github.com/kripken/emscripten-fastcomp-clang repository.
7// The class `EmscriptenABIInfo` in `/lib/CodeGen/TargetInfo.cpp` contains the ABI definitions.
8
a1dfa0c6 9fn classify_ret_ty<'a, Ty, C>(cx: &C, ret: &mut ArgType<'a, Ty>)
83c7162d
XL
10 where Ty: TyLayoutMethods<'a, C> + Copy,
11 C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
12{
cc61c64b 13 if ret.layout.is_aggregate() {
2c00a5a8 14 if let Some(unit) = ret.layout.homogeneous_aggregate(cx) {
ff7c6d11 15 let size = ret.layout.size;
cc61c64b 16 if unit.size == size {
ff7c6d11 17 ret.cast_to(Uniform {
cc61c64b
XL
18 unit,
19 total: size
20 });
21 return;
54a0048b
SL
22 }
23 }
cc61c64b 24
ff7c6d11 25 ret.make_indirect();
54a0048b
SL
26 }
27}
28
83c7162d 29fn classify_arg_ty<Ty>(arg: &mut ArgType<Ty>) {
cc61c64b 30 if arg.layout.is_aggregate() {
ff7c6d11 31 arg.make_indirect_byval();
54a0048b
SL
32 }
33}
34
a1dfa0c6 35pub fn compute_abi_info<'a, Ty, C>(cx: &C, fty: &mut FnType<'a, Ty>)
83c7162d
XL
36 where Ty: TyLayoutMethods<'a, C> + Copy,
37 C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
38{
54a0048b 39 if !fty.ret.is_ignore() {
2c00a5a8 40 classify_ret_ty(cx, &mut fty.ret);
54a0048b
SL
41 }
42
43 for arg in &mut fty.args {
44 if arg.is_ignore() { continue; }
ff7c6d11 45 classify_arg_ty(arg);
54a0048b
SL
46 }
47}