@@ -18,6 +18,8 @@ use lib;
18
18
use middle:: trans:: build:: * ;
19
19
use middle:: trans:: callee;
20
20
use middle:: trans:: common:: * ;
21
+ use middle:: trans:: expr:: * ;
22
+ use middle:: trans:: type_of:: * ;
21
23
use middle:: ty;
22
24
23
25
use middle:: trans:: type_:: Type ;
@@ -30,34 +32,15 @@ pub fn trans_inline_asm(bcx: @mut Block, ia: &ast::inline_asm) -> @mut Block {
30
32
let mut bcx = bcx;
31
33
let mut constraints = ~[ ] ;
32
34
let mut cleanups = ~[ ] ;
33
- let mut aoutputs = ~[ ] ;
35
+ let mut output_types = ~[ ] ;
34
36
35
37
// Prepare the output operands
36
38
let outputs = do ia. outputs . map |& ( c, out) | {
37
39
constraints. push ( c) ;
38
40
39
- aoutputs. push ( unpack_result ! ( bcx, {
40
- callee:: trans_arg_expr( bcx,
41
- expr_ty( bcx, out) ,
42
- ty:: ByCopy ,
43
- out,
44
- & mut cleanups,
45
- callee:: DontAutorefArg )
46
- } ) ) ;
47
-
48
- let e = match out. node {
49
- ast:: ExprAddrOf ( _, e) => e,
50
- _ => fail2 ! ( "Expression must be addr of" )
51
- } ;
52
-
53
- unpack_result ! ( bcx, {
54
- callee:: trans_arg_expr( bcx,
55
- expr_ty( bcx, e) ,
56
- ty:: ByCopy ,
57
- e,
58
- & mut cleanups,
59
- callee:: DontAutorefArg )
60
- } )
41
+ let out_datum = unpack_datum ! ( bcx, trans_to_datum( bcx, out) ) ;
42
+ output_types. push ( type_of ( bcx. ccx ( ) , out_datum. ty ) ) ;
43
+ out_datum. val
61
44
62
45
} ;
63
46
@@ -92,7 +75,7 @@ pub fn trans_inline_asm(bcx: @mut Block, ia: &ast::inline_asm) -> @mut Block {
92
75
clobbers = format ! ( "{},{}" , ia. clobbers, clobbers) ;
93
76
} else {
94
77
clobbers. push_str ( ia. clobbers ) ;
95
- } ;
78
+ }
96
79
97
80
// Add the clobbers to our constraints list
98
81
if clobbers. len ( ) != 0 && constraints. len ( ) != 0 {
@@ -107,12 +90,12 @@ pub fn trans_inline_asm(bcx: @mut Block, ia: &ast::inline_asm) -> @mut Block {
107
90
let numOutputs = outputs. len ( ) ;
108
91
109
92
// Depending on how many outputs we have, the return type is different
110
- let output = if numOutputs == 0 {
93
+ let output_type = if numOutputs == 0 {
111
94
Type :: void ( )
112
95
} else if numOutputs == 1 {
113
- val_ty ( outputs [ 0 ] )
96
+ output_types [ 0 ]
114
97
} else {
115
- Type :: struct_ ( outputs . map ( |o| val_ty ( * o ) ) , false )
98
+ Type :: struct_ ( output_types , false )
116
99
} ;
117
100
118
101
let dialect = match ia. dialect {
@@ -122,19 +105,17 @@ pub fn trans_inline_asm(bcx: @mut Block, ia: &ast::inline_asm) -> @mut Block {
122
105
123
106
let r = do ia. asm . with_c_str |a| {
124
107
do constraints. with_c_str |c| {
125
- InlineAsmCall ( bcx, a, c, inputs, output , ia. volatile , ia. alignstack , dialect)
108
+ InlineAsmCall ( bcx, a, c, inputs, output_type , ia. volatile , ia. alignstack , dialect)
126
109
}
127
110
} ;
128
111
129
112
// Again, based on how many outputs we have
130
113
if numOutputs == 1 {
131
- let op = PointerCast ( bcx, aoutputs[ 0 ] , val_ty ( outputs[ 0 ] ) . ptr_to ( ) ) ;
132
- Store ( bcx, r, op) ;
114
+ Store ( bcx, r, outputs[ 0 ] ) ;
133
115
} else {
134
- for ( i, o) in aoutputs . iter ( ) . enumerate ( ) {
116
+ for ( i, o) in outputs . iter ( ) . enumerate ( ) {
135
117
let v = ExtractValue ( bcx, r, i) ;
136
- let op = PointerCast ( bcx, * o, val_ty ( outputs[ i] ) . ptr_to ( ) ) ;
137
- Store ( bcx, v, op) ;
118
+ Store ( bcx, v, * o) ;
138
119
}
139
120
}
140
121
0 commit comments