@@ -558,12 +558,51 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block {
558558 return trans_rvalue_stmt_unadjusted ( bcx, a) ;
559559 }
560560 ast:: expr_inline_asm( asm, ref ins, ref outs,
561- cons, volatile, alignstack) => {
562- // XXX: cons doesn't actual contain ALL the stuff we should
563- // be passing since the constraints for in/outputs aren't included
561+ clobs, volatile, alignstack) => {
562+ let mut constraints = ~[ ] ;
563+ let mut cleanups = ~[ ] ;
564+
565+ // TODO: Handle outputs
566+
567+ let inputs = do ins. map |& ( c, in) | {
568+
569+ constraints. push ( copy * c) ;
570+
571+ let inty = ty:: arg {
572+ mode : ast:: expl ( ast:: by_val) ,
573+ ty : expr_ty ( bcx, in)
574+ } ;
575+
576+
577+ unpack_result ! ( bcx, {
578+ callee:: trans_arg_expr( bcx, inty, in, & mut cleanups,
579+ None , callee:: DontAutorefArg )
580+ } )
581+
582+ } ;
583+
584+ for cleanups. each |c| {
585+ revoke_clean ( bcx, * c) ;
586+ }
587+
588+ let mut constraints = str:: connect ( constraints, "," ) ;
589+
590+ // Add the clobbers
591+ if * clobs != ~"" {
592+ if constraints == ~"" {
593+ constraints += * clobs;
594+ } else {
595+ constraints += ~", " + * clobs;
596+ }
597+ } else {
598+ constraints += * clobs;
599+ }
600+
601+ io:: println ( fmt ! ( "Inputs: %?\n Constraints: %?\n " , ins, constraints) ) ;
602+
564603 do str:: as_c_str ( * asm) |a| {
565- do str:: as_c_str ( * cons ) |c| {
566- InlineAsmCall ( bcx, a, c, volatile, alignstack,
604+ do str:: as_c_str ( constraints ) |c| {
605+ InlineAsmCall ( bcx, a, c, inputs , volatile, alignstack,
567606 lib:: llvm:: AD_ATT ) ;
568607 }
569608 }
0 commit comments