diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake
index fc8ed67fe3d..857a5908358 100644
--- a/cmake/modules/HandleLLVMOptions.cmake
+++ b/cmake/modules/HandleLLVMOptions.cmake
@@ -400,6 +400,9 @@ if( MSVC )
     endif()
   endif()
 
+  if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
+    append("/bigobj" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+  endif()
 elseif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
   if (LLVM_ENABLE_WARNINGS)
     append("-Wall -W -Wno-unused-parameter -Wwrite-strings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
diff --git a/lib/CodeGen/LiveDebugValues.cpp b/lib/CodeGen/LiveDebugValues.cpp
index 3decf001f63..704a7367d05 100644
--- a/lib/CodeGen/LiveDebugValues.cpp
+++ b/lib/CodeGen/LiveDebugValues.cpp
@@ -156,7 +156,11 @@ private:
     /// dominates MBB.
     bool dominates(MachineBasicBlock &MBB) const { return UVS.dominates(&MBB); }
 
+#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
     void dump() const { MI.dump(); }
+#else
+    void dump() const;
+#endif
 
     bool operator==(const VarLoc &Other) const {
       return Var == Other.Var && Loc.Hash == Other.Loc.Hash;
@@ -312,8 +316,10 @@ void LiveDebugValues::printVarLocInMBB(const MachineFunction &MF,
     for (unsigned VLL : L) {
       const VarLoc &VL = VarLocIDs[VLL];
       Out << " Var: " << VL.Var.getVar()->getName();
+#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
       Out << " MI: ";
       VL.dump();
+#endif
     }
   }
   Out << "\n";
@@ -582,7 +588,11 @@ bool LiveDebugValues::join(MachineBasicBlock &MBB, VarLocInMBB &OutLocs,
                 DMI->getDebugVariable(), DMI->getDebugExpression());
     if (DMI->isIndirectDebugValue())
       MI->getOperand(1).setImm(DMI->getOperand(1).getImm());
+#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
     DEBUG(dbgs() << "Inserted: "; MI->dump(););
+#else
+    DEBUG(dbgs() << "Inserted: ";);
+#endif
     ILS.set(ID);
     ++NumInserted;
     Changed = true;
diff --git a/lib/TableGen/TGParser.cpp b/lib/TableGen/TGParser.cpp
index 59b837f4187..96015b06d79 100644
--- a/lib/TableGen/TGParser.cpp
+++ b/lib/TableGen/TGParser.cpp
@@ -54,6 +54,7 @@ struct SubMultiClassReference {
   void dump() const;
 };
 
+#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
 LLVM_DUMP_METHOD void SubMultiClassReference::dump() const {
   errs() << "Multiclass:\n";
 
@@ -63,6 +64,7 @@ LLVM_DUMP_METHOD void SubMultiClassReference::dump() const {
   for (Init *TA : TemplateArgs)
     TA->dump();
 }
+#endif
 
 } // end namespace llvm
 
diff --git a/lib/Transforms/IPO/MergeFunctions.cpp b/lib/Transforms/IPO/MergeFunctions.cpp
index e0bb0eb42b5..5751a86655a 100644
--- a/lib/Transforms/IPO/MergeFunctions.cpp
+++ b/lib/Transforms/IPO/MergeFunctions.cpp
@@ -269,8 +269,10 @@ bool MergeFunctions::doSanityCheck(std::vector<WeakVH> &Worklist) {
         if (Res1 != -Res2) {
           dbgs() << "MERGEFUNC-SANITY: Non-symmetric; triple: " << TripleNumber
                  << "\n";
+#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
           F1->dump();
           F2->dump();
+#endif
           Valid = false;
         }
 
@@ -305,9 +307,11 @@ bool MergeFunctions::doSanityCheck(std::vector<WeakVH> &Worklist) {
                    << TripleNumber << "\n";
             dbgs() << "Res1, Res3, Res4: " << Res1 << ", " << Res3 << ", "
                    << Res4 << "\n";
+#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
             F1->dump();
             F2->dump();
             F3->dump();
+#endif
             Valid = false;
           }
         }
diff --git a/utils/TableGen/SubtargetFeatureInfo.cpp b/utils/TableGen/SubtargetFeatureInfo.cpp
index 7db8813050f..1e31d3cbf81 100644
--- a/utils/TableGen/SubtargetFeatureInfo.cpp
+++ b/utils/TableGen/SubtargetFeatureInfo.cpp
@@ -16,10 +16,12 @@
 
 using namespace llvm;
 
+#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
 void SubtargetFeatureInfo::dump() const {
   errs() << getEnumName() << " " << Index << "\n";
   TheDef->dump();
 }
+#endif
 
 std::vector<std::pair<Record *, SubtargetFeatureInfo>>
 SubtargetFeatureInfo::getAll(const RecordKeeper &Records) {
