# HG changeset patch # User Frits van Bommel # Date 1234825016 -3600 # Node ID fe2d9bb7078d54c7f793cc61f4659df467124780 # Parent a9feaed801d788320681a581203ef6dca6391c44 Add some extra debug output that's useful in diagnosing inline assembler bugs. diff -r a9feaed801d7 -r fe2d9bb7078d gen/asmstmt.cpp --- a/gen/asmstmt.cpp Mon Feb 16 19:31:10 2009 +0100 +++ b/gen/asmstmt.cpp Mon Feb 16 23:56:56 2009 +0100 @@ -346,7 +346,34 @@ ++p; } - Logger::println("final asm: %.*s", code->insnTemplateLen, code->insnTemplate); + if (Logger::enabled()) { + Logger::println("final asm: %.*s", code->insnTemplateLen, code->insnTemplate); + std::ostringstream ss; + + ss << "GCC-style output constraints: {"; + typedef std::deque::iterator It; + for (It i = output_constraints.begin(), e = output_constraints.end(); i != e; ++i) { + ss << " " << *i; + } + ss << " }"; + Logger::println("%s", ss.str().c_str()); + + ss.str(""); + ss << "GCC-style input constraints: {"; + for (It i = input_constraints.begin(), e = input_constraints.end(); i != e; ++i) { + ss << " " << *i; + } + ss << " }"; + Logger::println("%s", ss.str().c_str()); + + ss.str(""); + ss << "GCC-style clobbers: {"; + for (It i = clobbers.begin(), e = clobbers.end(); i != e; ++i) { + ss << " " << *i; + } + ss << " }"; + Logger::println("%s", ss.str().c_str()); + } std::string insnt(code->insnTemplate, code->insnTemplateLen); @@ -665,14 +692,27 @@ llvm::FunctionType* fty = llvm::FunctionType::get(retty, types, false); if (Logger::enabled()) Logger::cout() << "function type = " << *fty << '\n'; - llvm::InlineAsm* ia = llvm::InlineAsm::get(fty, code, out_c, true); std::vector args; args.insert(args.end(), outargs.begin(), outargs.end()); args.insert(args.end(), inargs.begin(), inargs.end()); + + if (Logger::enabled()) { + Logger::cout() << "Arguments:" << '\n'; + Logger::indent(); + for (std::vector::iterator b = args.begin(), i = b, e = args.end(); i != e; ++i) + Logger::cout() << '$' << (i - b) << " ==> " << **i; + Logger::undent(); + } + + llvm::InlineAsm* ia = llvm::InlineAsm::get(fty, code, out_c, true); + llvm::CallInst* call = p->ir->CreateCall(ia, args.begin(), args.end(), retty == LLType::VoidTy ? "" : "asm"); + if (Logger::enabled()) + Logger::cout() << "Complete asm statement: " << *call << '\n'; + // capture abi return value if (useabiret) {