]>
Commit | Line | Data |
---|---|---|
83c7162d XL |
1 | use abi::call::{FnType, ArgType, Uniform}; |
2 | use 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 | 9 | fn 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 | 29 | fn 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 | 35 | pub 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 | } |