|
14 | 14 |
|
15 | 15 | use abi::call::{FnType, ArgType, Reg, RegKind, Uniform};
|
16 | 16 | use abi::{Align, Endian, HasDataLayout, LayoutOf, TyLayout, TyLayoutMethods};
|
| 17 | +use spec::HasTargetSpec; |
17 | 18 |
|
18 | 19 | #[derive(Debug, Clone, Copy, PartialEq)]
|
19 | 20 | enum ABI {
|
20 | 21 | ELFv1, // original ABI used for powerpc64 (big-endian)
|
21 |
| - ELFv2, // newer ABI used for powerpc64le |
| 22 | + ELFv2, // newer ABI used for powerpc64le and musl (both endians) |
22 | 23 | }
|
23 | 24 | use self::ABI::*;
|
24 | 25 |
|
@@ -131,11 +132,15 @@ fn classify_arg_ty<'a, Ty, C>(cx: &C, arg: &mut ArgType<'a, Ty>, abi: ABI)
|
131 | 132 |
|
132 | 133 | pub fn compute_abi_info<'a, Ty, C>(cx: &C, fty: &mut FnType<'a, Ty>)
|
133 | 134 | where Ty: TyLayoutMethods<'a, C> + Copy,
|
134 |
| - C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout |
| 135 | + C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout + HasTargetSpec |
135 | 136 | {
|
136 |
| - let abi = match cx.data_layout().endian { |
137 |
| - Endian::Big => ELFv1, |
138 |
| - Endian::Little => ELFv2, |
| 137 | + let abi = if cx.target_spec().target_env == "musl" { |
| 138 | + ELFv2 |
| 139 | + } else { |
| 140 | + match cx.data_layout().endian { |
| 141 | + Endian::Big => ELFv1, |
| 142 | + Endian::Little => ELFv2 |
| 143 | + } |
139 | 144 | };
|
140 | 145 |
|
141 | 146 | if !fty.ret.is_ignore() {
|
|
0 commit comments