summaryrefslogtreecommitdiff
path: root/src/librustc_trans/trans/cabi_x86_win64.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/librustc_trans/trans/cabi_x86_win64.rs')
-rw-r--r--src/librustc_trans/trans/cabi_x86_win64.rs61
1 files changed, 18 insertions, 43 deletions
diff --git a/src/librustc_trans/trans/cabi_x86_win64.rs b/src/librustc_trans/trans/cabi_x86_win64.rs
index 120c8dc0384..43f72c454cf 100644
--- a/src/librustc_trans/trans/cabi_x86_win64.rs
+++ b/src/librustc_trans/trans/cabi_x86_win64.rs
@@ -11,54 +11,29 @@
use llvm::*;
use super::common::*;
use super::machine::*;
-use trans::cabi::{ArgType, FnType};
+use trans::abi::{ArgType, FnType};
use trans::type_::Type;
// Win64 ABI: http://msdn.microsoft.com/en-us/library/zthk2dkh.aspx
-pub fn compute_abi_info(ccx: &CrateContext,
- atys: &[Type],
- rty: Type,
- ret_def: bool) -> FnType {
- let mut arg_tys = Vec::new();
+pub fn compute_abi_info(ccx: &CrateContext, fty: &mut FnType) {
+ let fixup = |a: &mut ArgType| {
+ if a.ty.kind() == Struct {
+ match llsize_of_alloc(ccx, a.ty) {
+ 1 => a.cast = Some(Type::i8(ccx)),
+ 2 => a.cast = Some(Type::i16(ccx)),
+ 4 => a.cast = Some(Type::i32(ccx)),
+ 8 => a.cast = Some(Type::i64(ccx)),
+ _ => a.make_indirect(ccx)
+ }
+ }
+ };
- let ret_ty;
- if !ret_def {
- ret_ty = ArgType::direct(Type::void(ccx), None, None, None);
- } else if rty.kind() == Struct {
- ret_ty = match llsize_of_alloc(ccx, rty) {
- 1 => ArgType::direct(rty, Some(Type::i8(ccx)), None, None),
- 2 => ArgType::direct(rty, Some(Type::i16(ccx)), None, None),
- 4 => ArgType::direct(rty, Some(Type::i32(ccx)), None, None),
- 8 => ArgType::direct(rty, Some(Type::i64(ccx)), None, None),
- _ => ArgType::indirect(rty, Some(Attribute::StructRet))
- };
- } else {
- let attr = if rty == Type::i1(ccx) { Some(Attribute::ZExt) } else { None };
- ret_ty = ArgType::direct(rty, None, None, attr);
+ if !fty.ret.is_ignore() {
+ fixup(&mut fty.ret);
}
-
- for &t in atys {
- let ty = match t.kind() {
- Struct => {
- match llsize_of_alloc(ccx, t) {
- 1 => ArgType::direct(t, Some(Type::i8(ccx)), None, None),
- 2 => ArgType::direct(t, Some(Type::i16(ccx)), None, None),
- 4 => ArgType::direct(t, Some(Type::i32(ccx)), None, None),
- 8 => ArgType::direct(t, Some(Type::i64(ccx)), None, None),
- _ => ArgType::indirect(t, None)
- }
- }
- _ => {
- let attr = if t == Type::i1(ccx) { Some(Attribute::ZExt) } else { None };
- ArgType::direct(t, None, None, attr)
- }
- };
- arg_tys.push(ty);
+ for arg in &mut fty.args {
+ if arg.is_ignore() { continue; }
+ fixup(arg);
}
-
- return FnType {
- arg_tys: arg_tys,
- ret_ty: ret_ty,
- };
}