Add MCAsmParser interface.
[oota-llvm.git] / tools / bugpoint / Miscompilation.cpp
index c655e714271113b0016fed5bf1990c15033c4335..d7be3c909e17713de451e69a6d99adfb74dc5779 100644 (file)
@@ -56,13 +56,13 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
                                  std::vector<const PassInfo*> &Suffix) {
   // First, run the program with just the Suffix passes.  If it is still broken
   // with JUST the kept passes, discard the prefix passes.
-  std::cout << "Checking to see if '" << getPassesString(Suffix)
-            << "' compiles correctly: ";
+  outs() << "Checking to see if '" << getPassesString(Suffix)
+         << "' compiles correctly: ";
 
   std::string BitcodeResult;
   if (BD.runPasses(Suffix, BitcodeResult, false/*delete*/, true/*quiet*/)) {
-    std::cerr << " Error running this sequence of passes"
-              << " on the input program!\n";
+    errs() << " Error running this sequence of passes"
+           << " on the input program!\n";
     BD.setPassesToRun(Suffix);
     BD.EmitProgressBitcode("pass-error",  false);
     exit(BD.debugOptimizerCrash());
@@ -70,22 +70,22 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
   
   // Check to see if the finished program matches the reference output...
   if (BD.diffProgram(BitcodeResult, "", true /*delete bitcode*/)) {
-    std::cout << " nope.\n";
+    outs() << " nope.\n";
     if (Suffix.empty()) {
-      std::cerr << BD.getToolName() << ": I'm confused: the test fails when "
-                << "no passes are run, nondeterministic program?\n";
+      errs() << BD.getToolName() << ": I'm confused: the test fails when "
+             << "no passes are run, nondeterministic program?\n";
       exit(1);
     }
     return KeepSuffix;         // Miscompilation detected!
   }
-  std::cout << " yup.\n";      // No miscompilation!
+  outs() << " yup.\n";      // No miscompilation!
 
   if (Prefix.empty()) return NoFailure;
 
   // Next, see if the program is broken if we run the "prefix" passes first,
   // then separately run the "kept" passes.
-  std::cout << "Checking to see if '" << getPassesString(Prefix)
-            << "' compiles correctly: ";
+  outs() << "Checking to see if '" << getPassesString(Prefix)
+         << "' compiles correctly: ";
 
   // If it is not broken with the kept passes, it's possible that the prefix
   // passes must be run before the kept passes to break it.  If the program
@@ -94,8 +94,8 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
   // prefix passes, then discard the prefix passes.
   //
   if (BD.runPasses(Prefix, BitcodeResult, false/*delete*/, true/*quiet*/)) {
-    std::cerr << " Error running this sequence of passes"
-              << " on the input program!\n";
+    errs() << " Error running this sequence of passes"
+           << " on the input program!\n";
     BD.setPassesToRun(Prefix);
     BD.EmitProgressBitcode("pass-error",  false);
     exit(BD.debugOptimizerCrash());
@@ -103,19 +103,19 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
 
   // If the prefix maintains the predicate by itself, only keep the prefix!
   if (BD.diffProgram(BitcodeResult)) {
-    std::cout << " nope.\n";
+    outs() << " nope.\n";
     sys::Path(BitcodeResult).eraseFromDisk();
     return KeepPrefix;
   }
-  std::cout << " yup.\n";      // No miscompilation!
+  outs() << " yup.\n";      // No miscompilation!
 
   // Ok, so now we know that the prefix passes work, try running the suffix
   // passes on the result of the prefix passes.
   //
   Module *PrefixOutput = ParseInputFile(BitcodeResult, BD.getContext());
   if (PrefixOutput == 0) {
-    std::cerr << BD.getToolName() << ": Error reading bitcode file '"
-              << BitcodeResult << "'!\n";
+    errs() << BD.getToolName() << ": Error reading bitcode file '"
+           << BitcodeResult << "'!\n";
     exit(1);
   }
   sys::Path(BitcodeResult).eraseFromDisk();  // No longer need the file on disk
@@ -124,14 +124,14 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
   if (Suffix.empty())
     return NoFailure;
 
-  std::cout << "Checking to see if '" << getPassesString(Suffix)
+  outs() << "Checking to see if '" << getPassesString(Suffix)
             << "' passes compile correctly after the '"
             << getPassesString(Prefix) << "' passes: ";
 
   Module *OriginalInput = BD.swapProgramIn(PrefixOutput);
   if (BD.runPasses(Suffix, BitcodeResult, false/*delete*/, true/*quiet*/)) {
-    std::cerr << " Error running this sequence of passes"
-              << " on the input program!\n";
+    errs() << " Error running this sequence of passes"
+           << " on the input program!\n";
     BD.setPassesToRun(Suffix);
     BD.EmitProgressBitcode("pass-error",  false);
     exit(BD.debugOptimizerCrash());
@@ -139,13 +139,13 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
 
   // Run the result...
   if (BD.diffProgram(BitcodeResult, "", true/*delete bitcode*/)) {
-    std::cout << " nope.\n";
+    outs() << " nope.\n";
     delete OriginalInput;     // We pruned down the original input...
     return KeepSuffix;
   }
 
   // Otherwise, we must not be running the bad pass anymore.
-  std::cout << " yup.\n";      // No miscompilation!
+  outs() << " yup.\n";      // No miscompilation!
   delete BD.swapProgramIn(OriginalInput); // Restore orig program & free test
   return NoFailure;
 }
@@ -187,8 +187,8 @@ static bool TestMergedProgram(BugDriver &BD, Module *M1, Module *M2,
     M2 = CloneModule(M2);
   }
   if (Linker::LinkModules(M1, M2, &ErrorMsg)) {
-    std::cerr << BD.getToolName() << ": Error linking modules together:"
-              << ErrorMsg << '\n';
+    errs() << BD.getToolName() << ": Error linking modules together:"
+           << ErrorMsg << '\n';
     exit(1);
   }
   delete M2;   // We are done with this module.
@@ -212,12 +212,12 @@ static bool TestMergedProgram(BugDriver &BD, Module *M1, Module *M2,
 bool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*>&Funcs){
   // Test to see if the function is misoptimized if we ONLY run it on the
   // functions listed in Funcs.
-  std::cout << "Checking to see if the program is misoptimized when "
-            << (Funcs.size()==1 ? "this function is" : "these functions are")
-            << " run through the pass"
-            << (BD.getPassesToRun().size() == 1 ? "" : "es") << ":";
+  outs() << "Checking to see if the program is misoptimized when "
+         << (Funcs.size()==1 ? "this function is" : "these functions are")
+         << " run through the pass"
+         << (BD.getPassesToRun().size() == 1 ? "" : "es") << ":";
   PrintFunctionList(Funcs);
-  std::cout << '\n';
+  outs() << '\n';
 
   // Split the module into the two halves of the program we want.
   DenseMap<const Value*, Value*> ValueMap;
@@ -248,8 +248,9 @@ static void DisambiguateGlobalSymbols(Module *M) {
       I->setName(Mang.getMangledName(I));
   }
   for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) {
-    // Don't mangle asm names.
-    if (!I->hasName() || I->getName()[0] != 1)
+    // Don't mangle asm names or intrinsics.
+    if ((!I->hasName() || I->getName()[0] != 1) &&
+        I->getIntrinsicID() == 0)
       I->setName(Mang.getMangledName(I));
   }
 }
@@ -279,7 +280,7 @@ static bool ExtractLoops(BugDriver &BD,
       return MadeChange;
     }
 
-    std::cerr << "Extracted a loop from the breaking portion of the program.\n";
+    errs() << "Extracted a loop from the breaking portion of the program.\n";
 
     // Bugpoint is intentionally not very trusting of LLVM transformations.  In
     // particular, we're not going to assume that the loop extractor works, so
@@ -291,16 +292,16 @@ static bool ExtractLoops(BugDriver &BD,
       BD.switchToInterpreter(AI);
 
       // Merged program doesn't work anymore!
-      std::cerr << "  *** ERROR: Loop extraction broke the program. :("
-                << " Please report a bug!\n";
-      std::cerr << "      Continuing on with un-loop-extracted version.\n";
+      errs() << "  *** ERROR: Loop extraction broke the program. :("
+             << " Please report a bug!\n";
+      errs() << "      Continuing on with un-loop-extracted version.\n";
 
       BD.writeProgramToFile("bugpoint-loop-extract-fail-tno.bc", ToNotOptimize);
       BD.writeProgramToFile("bugpoint-loop-extract-fail-to.bc", ToOptimize);
       BD.writeProgramToFile("bugpoint-loop-extract-fail-to-le.bc",
                             ToOptimizeLoopExtracted);
 
-      std::cerr << "Please submit the bugpoint-loop-extract-fail-*.bc files.\n";
+      errs() << "Please submit the bugpoint-loop-extract-fail-*.bc files.\n";
       delete ToOptimize;
       delete ToNotOptimize;
       delete ToOptimizeLoopExtracted;
@@ -309,12 +310,12 @@ static bool ExtractLoops(BugDriver &BD,
     delete ToOptimize;
     BD.switchToInterpreter(AI);
 
-    std::cout << "  Testing after loop extraction:\n";
+    outs() << "  Testing after loop extraction:\n";
     // Clone modules, the tester function will free them.
     Module *TOLEBackup = CloneModule(ToOptimizeLoopExtracted);
     Module *TNOBackup  = CloneModule(ToNotOptimize);
     if (!TestFn(BD, ToOptimizeLoopExtracted, ToNotOptimize)) {
-      std::cout << "*** Loop extraction masked the problem.  Undoing.\n";
+      outs() << "*** Loop extraction masked the problem.  Undoing.\n";
       // If the program is not still broken, then loop extraction did something
       // that masked the error.  Stop loop extraction now.
       delete TOLEBackup;
@@ -324,7 +325,7 @@ static bool ExtractLoops(BugDriver &BD,
     ToOptimizeLoopExtracted = TOLEBackup;
     ToNotOptimize = TNOBackup;
 
-    std::cout << "*** Loop extraction successful!\n";
+    outs() << "*** Loop extraction successful!\n";
 
     std::vector<std::pair<std::string, const FunctionType*> > MisCompFunctions;
     for (Module::iterator I = ToOptimizeLoopExtracted->begin(),
@@ -339,8 +340,8 @@ static bool ExtractLoops(BugDriver &BD,
     // extract another loop.
     std::string ErrorMsg;
     if (Linker::LinkModules(ToNotOptimize, ToOptimizeLoopExtracted, &ErrorMsg)){
-      std::cerr << BD.getToolName() << ": Error linking modules together:"
-                << ErrorMsg << '\n';
+      errs() << BD.getToolName() << ": Error linking modules together:"
+             << ErrorMsg << '\n';
       exit(1);
     }
     delete ToOptimizeLoopExtracted;
@@ -393,16 +394,16 @@ namespace {
 bool ReduceMiscompiledBlocks::TestFuncs(const std::vector<BasicBlock*> &BBs) {
   // Test to see if the function is misoptimized if we ONLY run it on the
   // functions listed in Funcs.
-  std::cout << "Checking to see if the program is misoptimized when all ";
+  outs() << "Checking to see if the program is misoptimized when all ";
   if (!BBs.empty()) {
-    std::cout << "but these " << BBs.size() << " blocks are extracted: ";
+    outs() << "but these " << BBs.size() << " blocks are extracted: ";
     for (unsigned i = 0, e = BBs.size() < 10 ? BBs.size() : 10; i != e; ++i)
-      std::cout << BBs[i]->getName() << " ";
-    if (BBs.size() > 10) std::cout << "...";
+      outs() << BBs[i]->getName() << " ";
+    if (BBs.size() > 10) outs() << "...";
   } else {
-    std::cout << "blocks are extracted.";
+    outs() << "blocks are extracted.";
   }
-  std::cout << '\n';
+  outs() << '\n';
 
   // Split the module into the two halves of the program we want.
   DenseMap<const Value*, Value*> ValueMap;
@@ -462,7 +463,7 @@ static bool ExtractBlocks(BugDriver &BD,
   Module *Extracted = BD.ExtractMappedBlocksFromModule(Blocks, ToExtract);
   if (Extracted == 0) {
     // Weird, extraction should have worked.
-    std::cerr << "Nondeterministic problem extracting blocks??\n";
+    errs() << "Nondeterministic problem extracting blocks??\n";
     delete ProgClone;
     delete ToExtract;
     return false;
@@ -481,8 +482,8 @@ static bool ExtractBlocks(BugDriver &BD,
 
   std::string ErrorMsg;
   if (Linker::LinkModules(ProgClone, Extracted, &ErrorMsg)) {
-    std::cerr << BD.getToolName() << ": Error linking modules together:"
-              << ErrorMsg << '\n';
+    errs() << BD.getToolName() << ": Error linking modules together:"
+           << ErrorMsg << '\n';
     exit(1);
   }
   delete Extracted;
@@ -525,11 +526,11 @@ DebugAMiscompilation(BugDriver &BD,
   if (!BugpointIsInterrupted)
     ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions);
 
-  std::cout << "\n*** The following function"
-            << (MiscompiledFunctions.size() == 1 ? " is" : "s are")
-            << " being miscompiled: ";
+  outs() << "\n*** The following function"
+         << (MiscompiledFunctions.size() == 1 ? " is" : "s are")
+         << " being miscompiled: ";
   PrintFunctionList(MiscompiledFunctions);
-  std::cout << '\n';
+  outs() << '\n';
 
   // See if we can rip any loops out of the miscompiled functions and still
   // trigger the problem.
@@ -548,11 +549,11 @@ DebugAMiscompilation(BugDriver &BD,
     if (!BugpointIsInterrupted)
       ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions);
 
-    std::cout << "\n*** The following function"
-              << (MiscompiledFunctions.size() == 1 ? " is" : "s are")
-              << " being miscompiled: ";
+    outs() << "\n*** The following function"
+           << (MiscompiledFunctions.size() == 1 ? " is" : "s are")
+           << " being miscompiled: ";
     PrintFunctionList(MiscompiledFunctions);
-    std::cout << '\n';
+    outs() << '\n';
   }
 
   if (!BugpointIsInterrupted &&
@@ -568,11 +569,11 @@ DebugAMiscompilation(BugDriver &BD,
     // Do the reduction...
     ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions);
 
-    std::cout << "\n*** The following function"
-              << (MiscompiledFunctions.size() == 1 ? " is" : "s are")
-              << " being miscompiled: ";
+    outs() << "\n*** The following function"
+           << (MiscompiledFunctions.size() == 1 ? " is" : "s are")
+           << " being miscompiled: ";
     PrintFunctionList(MiscompiledFunctions);
-    std::cout << '\n';
+    outs() << '\n';
   }
 
   return MiscompiledFunctions;
@@ -585,15 +586,15 @@ DebugAMiscompilation(BugDriver &BD,
 static bool TestOptimizer(BugDriver &BD, Module *Test, Module *Safe) {
   // Run the optimization passes on ToOptimize, producing a transformed version
   // of the functions being tested.
-  std::cout << "  Optimizing functions being tested: ";
+  outs() << "  Optimizing functions being tested: ";
   Module *Optimized = BD.runPassesOn(Test, BD.getPassesToRun(),
                                      /*AutoDebugCrashes*/true);
-  std::cout << "done.\n";
+  outs() << "done.\n";
   delete Test;
 
-  std::cout << "  Checking to see if the merged program executes correctly: ";
+  outs() << "  Checking to see if the merged program executes correctly: ";
   bool Broken = TestMergedProgram(BD, Optimized, Safe, true);
-  std::cout << (Broken ? " nope.\n" : " yup.\n");
+  outs() << (Broken ? " nope.\n" : " yup.\n");
   return Broken;
 }
 
@@ -606,33 +607,33 @@ bool BugDriver::debugMiscompilation() {
   // Make sure something was miscompiled...
   if (!BugpointIsInterrupted)
     if (!ReduceMiscompilingPasses(*this).reduceList(PassesToRun)) {
-      std::cerr << "*** Optimized program matches reference output!  No problem"
-                << " detected...\nbugpoint can't help you with your problem!\n";
+      errs() << "*** Optimized program matches reference output!  No problem"
+             << " detected...\nbugpoint can't help you with your problem!\n";
       return false;
     }
 
-  std::cout << "\n*** Found miscompiling pass"
-            << (getPassesToRun().size() == 1 ? "" : "es") << ": "
-            << getPassesString(getPassesToRun()) << '\n';
+  outs() << "\n*** Found miscompiling pass"
+         << (getPassesToRun().size() == 1 ? "" : "es") << ": "
+         << getPassesString(getPassesToRun()) << '\n';
   EmitProgressBitcode("passinput");
 
   std::vector<Function*> MiscompiledFunctions =
     DebugAMiscompilation(*this, TestOptimizer);
 
   // Output a bunch of bitcode files for the user...
-  std::cout << "Outputting reduced bitcode files which expose the problem:\n";
+  outs() << "Outputting reduced bitcode files which expose the problem:\n";
   DenseMap<const Value*, Value*> ValueMap;
   Module *ToNotOptimize = CloneModule(getProgram(), ValueMap);
   Module *ToOptimize = SplitFunctionsOutOfModule(ToNotOptimize,
                                                  MiscompiledFunctions,
                                                  ValueMap);
 
-  std::cout << "  Non-optimized portion: ";
+  outs() << "  Non-optimized portion: ";
   ToNotOptimize = swapProgramIn(ToNotOptimize);
   EmitProgressBitcode("tonotoptimize", true);
   setNewProgram(ToNotOptimize);   // Delete hacked module.
 
-  std::cout << "  Portion that is input to optimizer: ";
+  outs() << "  Portion that is input to optimizer: ";
   ToOptimize = swapProgramIn(ToOptimize);
   EmitProgressBitcode("tooptimize");
   setNewProgram(ToOptimize);      // Delete hacked module.
@@ -796,7 +797,7 @@ static void CleanupAndPrepareModules(BugDriver &BD, Module *&Test,
   }
 
   if (verifyModule(*Test) || verifyModule(*Safe)) {
-    std::cerr << "Bugpoint has a bug, which corrupted a module!!\n";
+    errs() << "Bugpoint has a bug, which corrupted a module!!\n";
     abort();
   }
 }
@@ -813,12 +814,12 @@ static bool TestCodeGenerator(BugDriver &BD, Module *Test, Module *Safe) {
   sys::Path TestModuleBC("bugpoint.test.bc");
   std::string ErrMsg;
   if (TestModuleBC.makeUnique(true, &ErrMsg)) {
-    std::cerr << BD.getToolName() << "Error making unique filename: "
-              << ErrMsg << "\n";
+    errs() << BD.getToolName() << "Error making unique filename: "
+           << ErrMsg << "\n";
     exit(1);
   }
   if (BD.writeProgramToFile(TestModuleBC.toString(), Test)) {
-    std::cerr << "Error writing bitcode to `" << TestModuleBC << "'\nExiting.";
+    errs() << "Error writing bitcode to `" << TestModuleBC << "'\nExiting.";
     exit(1);
   }
   delete Test;
@@ -826,13 +827,13 @@ static bool TestCodeGenerator(BugDriver &BD, Module *Test, Module *Safe) {
   // Make the shared library
   sys::Path SafeModuleBC("bugpoint.safe.bc");
   if (SafeModuleBC.makeUnique(true, &ErrMsg)) {
-    std::cerr << BD.getToolName() << "Error making unique filename: "
-              << ErrMsg << "\n";
+    errs() << BD.getToolName() << "Error making unique filename: "
+           << ErrMsg << "\n";
     exit(1);
   }
 
   if (BD.writeProgramToFile(SafeModuleBC.toString(), Safe)) {
-    std::cerr << "Error writing bitcode to `" << SafeModuleBC << "'\nExiting.";
+    errs() << "Error writing bitcode to `" << SafeModuleBC << "'\nExiting.";
     exit(1);
   }
   std::string SharedObject = BD.compileSharedObject(SafeModuleBC.toString());
@@ -843,9 +844,9 @@ static bool TestCodeGenerator(BugDriver &BD, Module *Test, Module *Safe) {
   int Result = BD.diffProgram(TestModuleBC.toString(), SharedObject, false);
 
   if (Result)
-    std::cerr << ": still failing!\n";
+    errs() << ": still failing!\n";
   else
-    std::cerr << ": didn't fail.\n";
+    errs() << ": didn't fail.\n";
   TestModuleBC.eraseFromDisk();
   SafeModuleBC.eraseFromDisk();
   sys::Path(SharedObject).eraseFromDisk();
@@ -859,14 +860,14 @@ static bool TestCodeGenerator(BugDriver &BD, Module *Test, Module *Safe) {
 bool BugDriver::debugCodeGenerator() {
   if ((void*)SafeInterpreter == (void*)Interpreter) {
     std::string Result = executeProgramSafely("bugpoint.safe.out");
-    std::cout << "\n*** The \"safe\" i.e. 'known good' backend cannot match "
-              << "the reference diff.  This may be due to a\n    front-end "
-              << "bug or a bug in the original program, but this can also "
-              << "happen if bugpoint isn't running the program with the "
-              << "right flags or input.\n    I left the result of executing "
-              << "the program with the \"safe\" backend in this file for "
-              << "you: '"
-              << Result << "'.\n";
+    outs() << "\n*** The \"safe\" i.e. 'known good' backend cannot match "
+           << "the reference diff.  This may be due to a\n    front-end "
+           << "bug or a bug in the original program, but this can also "
+           << "happen if bugpoint isn't running the program with the "
+           << "right flags or input.\n    I left the result of executing "
+           << "the program with the \"safe\" backend in this file for "
+           << "you: '"
+           << Result << "'.\n";
     return true;
   }
 
@@ -885,13 +886,13 @@ bool BugDriver::debugCodeGenerator() {
   sys::Path TestModuleBC("bugpoint.test.bc");
   std::string ErrMsg;
   if (TestModuleBC.makeUnique(true, &ErrMsg)) {
-    std::cerr << getToolName() << "Error making unique filename: "
-              << ErrMsg << "\n";
+    errs() << getToolName() << "Error making unique filename: "
+           << ErrMsg << "\n";
     exit(1);
   }
 
   if (writeProgramToFile(TestModuleBC.toString(), ToCodeGen)) {
-    std::cerr << "Error writing bitcode to `" << TestModuleBC << "'\nExiting.";
+    errs() << "Error writing bitcode to `" << TestModuleBC << "'\nExiting.";
     exit(1);
   }
   delete ToCodeGen;
@@ -899,43 +900,43 @@ bool BugDriver::debugCodeGenerator() {
   // Make the shared library
   sys::Path SafeModuleBC("bugpoint.safe.bc");
   if (SafeModuleBC.makeUnique(true, &ErrMsg)) {
-    std::cerr << getToolName() << "Error making unique filename: "
-              << ErrMsg << "\n";
+    errs() << getToolName() << "Error making unique filename: "
+           << ErrMsg << "\n";
     exit(1);
   }
 
   if (writeProgramToFile(SafeModuleBC.toString(), ToNotCodeGen)) {
-    std::cerr << "Error writing bitcode to `" << SafeModuleBC << "'\nExiting.";
+    errs() << "Error writing bitcode to `" << SafeModuleBC << "'\nExiting.";
     exit(1);
   }
   std::string SharedObject = compileSharedObject(SafeModuleBC.toString());
   delete ToNotCodeGen;
 
-  std::cout << "You can reproduce the problem with the command line: \n";
+  outs() << "You can reproduce the problem with the command line: \n";
   if (isExecutingJIT()) {
-    std::cout << "  lli -load " << SharedObject << " " << TestModuleBC;
+    outs() << "  lli -load " << SharedObject << " " << TestModuleBC;
   } else {
-    std::cout << "  llc -f " << TestModuleBC << " -o " << TestModuleBC<< ".s\n";
-    std::cout << "  gcc " << SharedObject << " " << TestModuleBC
+    outs() << "  llc -f " << TestModuleBC << " -o " << TestModuleBC<< ".s\n";
+    outs() << "  gcc " << SharedObject << " " << TestModuleBC
               << ".s -o " << TestModuleBC << ".exe";
 #if defined (HAVE_LINK_R)
-    std::cout << " -Wl,-R.";
+    outs() << " -Wl,-R.";
 #endif
-    std::cout << "\n";
-    std::cout << "  " << TestModuleBC << ".exe";
+    outs() << "\n";
+    outs() << "  " << TestModuleBC << ".exe";
   }
   for (unsigned i=0, e = InputArgv.size(); i != e; ++i)
-    std::cout << " " << InputArgv[i];
-  std::cout << '\n';
-  std::cout << "The shared object was created with:\n  llc -march=c "
-            << SafeModuleBC << " -o temporary.c\n"
-            << "  gcc -xc temporary.c -O2 -o " << SharedObject
+    outs() << " " << InputArgv[i];
+  outs() << '\n';
+  outs() << "The shared object was created with:\n  llc -march=c "
+         << SafeModuleBC << " -o temporary.c\n"
+         << "  gcc -xc temporary.c -O2 -o " << SharedObject
 #if defined(sparc) || defined(__sparc__) || defined(__sparcv9)
-            << " -G"            // Compile a shared library, `-G' for Sparc
+         << " -G"            // Compile a shared library, `-G' for Sparc
 #else
-            << " -fPIC -shared"       // `-shared' for Linux/X86, maybe others
+         << " -fPIC -shared"       // `-shared' for Linux/X86, maybe others
 #endif
-            << " -fno-strict-aliasing\n";
+         << " -fno-strict-aliasing\n";
 
   return false;
 }