diff --git a/src/IceConverter.cpp b/src/IceConverter.cpp
index 5a85034..9ba1fea 100644
--- a/src/IceConverter.cpp
+++ b/src/IceConverter.cpp
@@ -20,6 +20,7 @@
 #include "IceGlobalContext.h"
 #include "IceInst.h"
 #include "IceOperand.h"
+#include "IceTargetLowering.h"
 #include "IceTypes.h"
 
 #include "llvm/IR/Constant.h"
@@ -657,14 +658,63 @@
 
 } // end of anonymous namespace.
 
-int Ice::Converter::convertToIce(llvm::Module *Mod) {
+namespace Ice {
+
+void Converter::convertToIce(Module *Mod) {
+  convertGlobals(Mod);
+  convertFunctions(Mod);
+}
+
+void Converter::convertGlobals(Module *Mod) {
+  OwningPtr<TargetGlobalInitLowering> GlobalLowering(
+      TargetGlobalInitLowering::createLowering(Ctx->getTargetArch(), Ctx));
+  for (Module::const_global_iterator I = Mod->global_begin(),
+                                     E = Mod->global_end();
+       I != E; ++I) {
+    if (!I->hasInitializer())
+      continue;
+    const llvm::Constant *Initializer = I->getInitializer();
+    IceString Name = I->getName();
+    unsigned Align = I->getAlignment();
+    uint64_t NumElements = 0;
+    const char *Data = NULL;
+    bool IsInternal = I->hasInternalLinkage();
+    bool IsConst = I->isConstant();
+    bool IsZeroInitializer = false;
+
+    if (const ConstantDataArray *CDA =
+            dyn_cast<ConstantDataArray>(Initializer)) {
+      NumElements = CDA->getNumElements();
+      assert(isa<IntegerType>(CDA->getElementType()) &&
+             cast<IntegerType>(CDA->getElementType())->getBitWidth() == 8);
+      Data = CDA->getRawDataValues().data();
+    } else if (isa<ConstantAggregateZero>(Initializer)) {
+      if (const ArrayType *AT = dyn_cast<ArrayType>(Initializer->getType())) {
+        assert(isa<IntegerType>(AT->getElementType()) &&
+               cast<IntegerType>(AT->getElementType())->getBitWidth() == 8);
+        NumElements = AT->getNumElements();
+        IsZeroInitializer = true;
+      } else {
+        llvm_unreachable("Unhandled constant aggregate zero type");
+      }
+    } else {
+      llvm_unreachable("Unhandled global initializer");
+    }
+
+    GlobalLowering->lower(Name, Align, IsInternal, IsConst, IsZeroInitializer,
+                          NumElements, Data, Flags.DisableTranslation);
+  }
+  GlobalLowering.reset();
+}
+
+void Converter::convertFunctions(Module *Mod) {
   for (Module::const_iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) {
     if (I->empty())
       continue;
     LLVM2ICEConverter FunctionConverter(Ctx);
 
-    Ice::Timer TConvert;
-    Ice::Cfg *Fcn = FunctionConverter.convertFunction(I);
+    Timer TConvert;
+    Cfg *Fcn = FunctionConverter.convertFunction(I);
     if (Flags.SubzeroTimingEnabled) {
       std::cerr << "[Subzero timing] Convert function "
                 << Fcn->getFunctionName() << ": " << TConvert.getElapsedSec()
@@ -674,5 +724,6 @@
   }
 
   emitConstants();
-  return ExitStatus;
 }
+
+} // end of Ice namespace.
diff --git a/src/IceConverter.h b/src/IceConverter.h
index dc18e7a..30d3b60 100644
--- a/src/IceConverter.h
+++ b/src/IceConverter.h
@@ -25,11 +25,15 @@
 class Converter : public Translator {
 public:
   Converter(GlobalContext *Ctx, Ice::ClFlags &Flags) : Translator(Ctx, Flags) {}
-  /// Converts the LLVM Module to ICE. Returns exit status 0 if successful,
-  /// Nonzero otherwise.
-  int convertToIce(llvm::Module *Mod);
+  /// Converts the LLVM Module to ICE. Sets exit status to false if successful,
+  /// true otherwise.
+  void convertToIce(llvm::Module *Mod);
 
 private:
+  // Converts globals to ICE, and then machine code.
+  void convertGlobals(llvm::Module *Mod);
+  // Converts functions to ICE, and then machine code.
+  void convertFunctions(llvm::Module *Mod);
   Converter(const Converter &) LLVM_DELETED_FUNCTION;
   Converter &operator=(const Converter &) LLVM_DELETED_FUNCTION;
 };
diff --git a/src/IceTranslator.cpp b/src/IceTranslator.cpp
index 7eb0fc0..4b84688 100644
--- a/src/IceTranslator.cpp
+++ b/src/IceTranslator.cpp
@@ -40,7 +40,7 @@
     }
     if (Func->hasError()) {
       std::cerr << "ICE translation error: " << Func->getError() << "\n";
-      ExitStatus = 1;
+      ErrorStatus = true;
     }
 
     Ice::Timer TEmit;
diff --git a/src/IceTranslator.h b/src/IceTranslator.h
index 648faea..1189951 100644
--- a/src/IceTranslator.h
+++ b/src/IceTranslator.h
@@ -30,17 +30,17 @@
 class Translator {
 public:
   Translator(GlobalContext *Ctx, ClFlags &Flags)
-      : Ctx(Ctx), Flags(Flags), ExitStatus(0) {}
+      : Ctx(Ctx), Flags(Flags), ErrorStatus(0) {}
 
   ~Translator();
-  int getExitStatus() const { return ExitStatus; }
+  bool getErrorStatus() const { return ErrorStatus; }
 
 protected:
   GlobalContext *Ctx;
   ClFlags &Flags;
-  // The exit status of the translation. 0 is successful. Nonzero
+  // The exit status of the translation. False is successful. True
   // otherwise.
-  int ExitStatus;
+  bool ErrorStatus;
   // Ideally, Func would be inside the methods that converts IR to
   // functions.  However, emitting the constant pool requires a valid
   // Cfg object, so we need to defer deleting the last non-empty Cfg
diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp
index 82ef5ac..7f9c514 100644
--- a/src/PNaClTranslator.cpp
+++ b/src/PNaClTranslator.cpp
@@ -40,10 +40,10 @@
 
 public:
   TopLevelParser(const std::string &InputName, NaClBitcodeHeader &Header,
-                 NaClBitstreamCursor &Cursor, int &ExitStatusFlag)
+                 NaClBitstreamCursor &Cursor, bool &ErrorStatus)
       : NaClBitcodeParser(Cursor),
         Mod(new Module(InputName, getGlobalContext())), Header(Header),
-        ExitStatusFlag(ExitStatusFlag), NumErrors(0), NumFunctionIds(0),
+        ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0),
         GlobalVarPlaceHolderType(Type::getInt8Ty(getLLVMContext())) {
     Mod->setDataLayout(PNaClDataLayout);
   }
@@ -52,7 +52,7 @@
   LLVM_OVERRIDE;
 
   virtual bool Error(const std::string &Message) LLVM_OVERRIDE {
-    ExitStatusFlag = 1;
+    ErrorStatus = true;
     ++NumErrors;
     return NaClBitcodeParser::Error(Message);
   }
@@ -167,8 +167,8 @@
   OwningPtr<Module> Mod;
   // The bitcode header.
   NaClBitcodeHeader &Header;
-  // The exit status flag that should be set to 1 if an error occurs.
-  int &ExitStatusFlag;
+  // The exit status that should be set to true if an error occurs.
+  bool &ErrorStatus;
   // The number of errors reported.
   unsigned NumErrors;
   // The types associated with each type ID.
@@ -810,14 +810,14 @@
   if (error_code ec =
           MemoryBuffer::getFileOrSTDIN(IRFilename.c_str(), MemBuf)) {
     errs() << "Error reading '" << IRFilename << "': " << ec.message() << "\n";
-    ExitStatus = 1;
+    ErrorStatus = true;
     return;
   }
 
   if (MemBuf->getBufferSize() % 4 != 0) {
     errs() << IRFilename
            << ": Bitcode stream should be a multiple of 4 bytes in length.\n";
-    ExitStatus = 1;
+    ErrorStatus = true;
     return;
   }
 
@@ -828,7 +828,7 @@
   NaClBitcodeHeader Header;
   if (Header.Read(BufPtr, EndBufPtr) || !Header.IsSupported()) {
     errs() << "Invalid PNaCl bitcode header.\n";
-    ExitStatus = 1;
+    ErrorStatus = true;
     return;
   }
 
@@ -837,11 +837,11 @@
   NaClBitstreamCursor InputStream(InputStreamFile);
 
   TopLevelParser Parser(MemBuf->getBufferIdentifier(), Header, InputStream,
-                        ExitStatus);
+                        ErrorStatus);
   int TopLevelBlocks = 0;
   while (!InputStream.AtEndOfStream()) {
     if (Parser.Parse()) {
-      ExitStatus = 1;
+      ErrorStatus = true;
       return;
     }
     ++TopLevelBlocks;
@@ -851,7 +851,7 @@
     errs() << IRFilename
            << ": Contains more than one module. Found: " << TopLevelBlocks
            << "\n";
-    ExitStatus = 1;
+    ErrorStatus = true;
   }
   return;
 }
diff --git a/src/PNaClTranslator.h b/src/PNaClTranslator.h
index a0316d7..a8ca06a 100644
--- a/src/PNaClTranslator.h
+++ b/src/PNaClTranslator.h
@@ -25,7 +25,7 @@
   PNaClTranslator(GlobalContext *Ctx, ClFlags &Flags)
       : Translator(Ctx, Flags) {}
   // Reads the PNaCl bitcode file and translates to ICE, which is then
-  // converted to machine code. Sets ExitStatus to non-zero if any
+  // converted to machine code. Sets ErrorStatus to true if any
   // errors occurred.
   void translate(const std::string &IRFilename);
 
diff --git a/src/llvm2ice.cpp b/src/llvm2ice.cpp
index 822a0ce..bf7de31 100644
--- a/src/llvm2ice.cpp
+++ b/src/llvm2ice.cpp
@@ -16,14 +16,9 @@
 #include "IceCfg.h"
 #include "IceClFlags.h"
 #include "IceConverter.h"
-#include "IceDefs.h"
-#include "IceTargetLowering.h"
-#include "IceTypes.h"
 #include "PNaClTranslator.h"
 
-#include "llvm/IR/Constants.h"
 #include "llvm/IR/LLVMContext.h"
-#include "llvm/IR/Module.h"
 #include "llvm/IRReader/IRReader.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/raw_os_ostream.h"
@@ -137,7 +132,7 @@
   if (BuildOnRead) {
     Ice::PNaClTranslator Translator(&Ctx, Flags);
     Translator.translate(IRFilename);
-    return Translator.getExitStatus();
+    return Translator.getErrorStatus();
   } else {
     // Parse the input LLVM IR file into a module.
     SMDiagnostic Err;
@@ -155,48 +150,8 @@
       return 1;
     }
 
-    // TODO(stichnot): Move this into IceConverter.cpp.
-    OwningPtr<Ice::TargetGlobalInitLowering> GlobalLowering(
-        Ice::TargetGlobalInitLowering::createLowering(TargetArch, &Ctx));
-    for (Module::const_global_iterator I = Mod->global_begin(),
-                                       E = Mod->global_end();
-         I != E; ++I) {
-      if (!I->hasInitializer())
-        continue;
-      const Constant *Initializer = I->getInitializer();
-      Ice::IceString Name = I->getName();
-      unsigned Align = I->getAlignment();
-      uint64_t NumElements = 0;
-      const char *Data = NULL;
-      bool IsInternal = I->hasInternalLinkage();
-      bool IsConst = I->isConstant();
-      bool IsZeroInitializer = false;
-
-      if (const ConstantDataArray *CDA =
-              dyn_cast<ConstantDataArray>(Initializer)) {
-        NumElements = CDA->getNumElements();
-        assert(isa<IntegerType>(CDA->getElementType()) &&
-               cast<IntegerType>(CDA->getElementType())->getBitWidth() == 8);
-        Data = CDA->getRawDataValues().data();
-      } else if (isa<ConstantAggregateZero>(Initializer)) {
-        if (const ArrayType *AT = dyn_cast<ArrayType>(Initializer->getType())) {
-          assert(isa<IntegerType>(AT->getElementType()) &&
-                 cast<IntegerType>(AT->getElementType())->getBitWidth() == 8);
-          NumElements = AT->getNumElements();
-          IsZeroInitializer = true;
-        } else {
-          llvm_unreachable("Unhandled constant aggregate zero type");
-        }
-      } else {
-        llvm_unreachable("Unhandled global initializer");
-      }
-
-      GlobalLowering->lower(Name, Align, IsInternal, IsConst, IsZeroInitializer,
-                            NumElements, Data, DisableTranslation);
-    }
-    GlobalLowering.reset();
-
     Ice::Converter Converter(&Ctx, Flags);
-    return Converter.convertToIce(Mod);
+    Converter.convertToIce(Mod);
+    return Converter.getErrorStatus();
   }
 }
