[opt] Fix sanitizer complaints about r254774
authorKeno Fischer <kfischer@college.harvard.edu>
Sat, 5 Dec 2015 00:06:37 +0000 (00:06 +0000)
committerKeno Fischer <kfischer@college.harvard.edu>
Sat, 5 Dec 2015 00:06:37 +0000 (00:06 +0000)
`Out` can be null if no output is requested, so move any access
to it inside the conditional. Thanks to Justin Bogner for finding
this.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254804 91177308-0d34-0410-b5e6-96231b3b80d8

tools/opt/opt.cpp

index c1510a7..fc31beb 100644 (file)
@@ -595,14 +595,16 @@ int main(int argc, char **argv) {
   SmallVector<char, 0> Buffer;
   SmallVector<char, 0> CompileTwiceBuffer;
   std::unique_ptr<raw_svector_ostream> BOS;
-  raw_ostream *OS = &Out->os();
-  if (RunTwice) {
-    BOS = make_unique<raw_svector_ostream>(Buffer);
-    OS = BOS.get();
-  }
+  raw_ostream *OS = nullptr;
 
   // Write bitcode or assembly to the output as the last step...
   if (!NoOutput && !AnalyzeOnly) {
+    assert(Out);
+    OS = &Out->os();
+    if (RunTwice) {
+      BOS = make_unique<raw_svector_ostream>(Buffer);
+      OS = BOS.get();
+    }
     if (OutputAssembly)
       Passes.add(createPrintModulePass(*OS, "", PreserveAssemblyUseListOrder));
     else
@@ -618,6 +620,7 @@ int main(int argc, char **argv) {
   // If requested, run all passes again with the same pass manager to catch
   // bugs caused by persistent state in the passes
   if (RunTwice) {
+    assert(Out);
     CompileTwiceBuffer = Buffer;
     Buffer.clear();
     std::unique_ptr<Module> M2(CloneModule(M.get()));