[flang-commits] [flang] 18e9482 - [flang][msvc] Use platform-independent primitives in temporary f18 driver.

Michael Kruse via flang-commits flang-commits at lists.llvm.org
Thu Aug 13 00:17:17 PDT 2020


Author: Michael Kruse
Date: 2020-08-13T02:08:14-05:00
New Revision: 18e9482e44ed2b59008a8a3b05c6c49ef0243b6d

URL: https://github.com/llvm/llvm-project/commit/18e9482e44ed2b59008a8a3b05c6c49ef0243b6d
DIFF: https://github.com/llvm/llvm-project/commit/18e9482e44ed2b59008a8a3b05c6c49ef0243b6d.diff

LOG: [flang][msvc] Use platform-independent primitives in temporary f18 driver.

Use functions for process launching, temporary file creation and file deletion from LLVM support library instead of POSIX-specific ones.

This patch is part of the series to [[ http://lists.llvm.org/pipermail/flang-dev/2020-July/000448.html | make flang compilable with MS Visual Studio ]].

Reviewed By: DavidTruby

Differential Revision: https://reviews.llvm.org/D85660

Added: 
    

Modified: 
    flang/tools/f18-parse-demo/f18-parse-demo.cpp
    flang/tools/f18/f18.cpp

Removed: 
    


################################################################################
diff  --git a/flang/tools/f18-parse-demo/f18-parse-demo.cpp b/flang/tools/f18-parse-demo/f18-parse-demo.cpp
index fd577e2fd350..6116fafe7e9d 100644
--- a/flang/tools/f18-parse-demo/f18-parse-demo.cpp
+++ b/flang/tools/f18-parse-demo/f18-parse-demo.cpp
@@ -33,6 +33,7 @@
 #include "flang/Parser/unparse.h"
 #include "llvm/Support/Errno.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Program.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cstdio>
 #include <cstring>
@@ -42,9 +43,7 @@
 #include <optional>
 #include <stdlib.h>
 #include <string>
-#include <sys/wait.h>
 #include <time.h>
-#include <unistd.h>
 #include <vector>
 
 static std::list<std::string> argList(int argc, char *const argv[]) {
@@ -98,36 +97,29 @@ struct DriverOptions {
   const char *prefix{nullptr};
 };
 
-bool ParentProcess() {
-  if (fork() == 0) {
-    return false; // in child process
-  }
-  int childStat{0};
-  wait(&childStat);
-  if (!WIFEXITED(childStat) || WEXITSTATUS(childStat) != 0) {
-    exit(EXIT_FAILURE);
-  }
-  return true;
-}
-
-void Exec(std::vector<char *> &argv, bool verbose = false) {
+void Exec(std::vector<llvm::StringRef> &argv, bool verbose = false) {
   if (verbose) {
     for (size_t j{0}; j < argv.size(); ++j) {
       llvm::errs() << (j > 0 ? " " : "") << argv[j];
     }
     llvm::errs() << '\n';
   }
-  argv.push_back(nullptr);
-  execvp(argv[0], &argv[0]);
-  llvm::errs() << "execvp(" << argv[0]
-               << ") failed: " << llvm::sys::StrError(errno) << '\n';
-  exit(EXIT_FAILURE);
+  std::string ErrMsg;
+  llvm::ErrorOr<std::string> Program = llvm::sys::findProgramByName(argv[0]);
+  if (!Program)
+    ErrMsg = Program.getError().message();
+  if (!Program ||
+      llvm::sys::ExecuteAndWait(
+          Program.get(), argv, llvm::None, {}, 0, 0, &ErrMsg)) {
+    llvm::errs() << "execvp(" << argv[0] << ") failed: " << ErrMsg << '\n';
+    exit(EXIT_FAILURE);
+  }
 }
 
 void RunOtherCompiler(DriverOptions &driver, char *source, char *relo) {
-  std::vector<char *> argv;
+  std::vector<llvm::StringRef> argv;
   for (size_t j{0}; j < driver.fcArgs.size(); ++j) {
-    argv.push_back(driver.fcArgs[j].data());
+    argv.push_back(driver.fcArgs[j]);
   }
   char dashC[3] = "-c", dashO[3] = "-o";
   argv.push_back(dashC);
@@ -230,60 +222,52 @@ std::string CompileFortran(
 
   std::string relo{RelocatableName(driver, path)};
 
-  char tmpSourcePath[32];
-  std::snprintf(tmpSourcePath, sizeof tmpSourcePath, "/tmp/f18-%lx.f90",
-      static_cast<unsigned long>(getpid()));
+  llvm::SmallString<32> tmpSourcePath;
   {
-    std::error_code EC;
-    llvm::raw_fd_ostream tmpSource(tmpSourcePath, EC, llvm::sys::fs::F_None);
+    int fd;
+    std::error_code EC =
+        llvm::sys::fs::createUniqueFile("f18-%%%%.f90", fd, tmpSourcePath);
     if (EC) {
-      llvm::errs() << EC.message();
+      llvm::errs() << EC.message() << "\n";
       std::exit(EXIT_FAILURE);
     }
+    llvm::raw_fd_ostream tmpSource(fd, /*shouldClose*/ true);
     Unparse(tmpSource, parseTree, driver.encoding, true /*capitalize*/,
         options.features.IsEnabled(
             Fortran::common::LanguageFeature::BackslashEscapes));
   }
 
-  if (ParentProcess()) {
-    filesToDelete.push_back(tmpSourcePath);
-    if (!driver.compileOnly && driver.outputPath.empty()) {
-      filesToDelete.push_back(relo);
-    }
-    return relo;
+  RunOtherCompiler(driver, tmpSourcePath.data(), relo.data());
+  filesToDelete.emplace_back(tmpSourcePath);
+  if (!driver.compileOnly && driver.outputPath.empty()) {
+    filesToDelete.push_back(relo);
   }
-  RunOtherCompiler(driver, tmpSourcePath, relo.data());
-  return {};
+  return relo;
 }
 
 std::string CompileOtherLanguage(std::string path, DriverOptions &driver) {
   std::string relo{RelocatableName(driver, path)};
-  if (ParentProcess()) {
-    if (!driver.compileOnly && driver.outputPath.empty()) {
-      filesToDelete.push_back(relo);
-    }
-    return relo;
-  }
   RunOtherCompiler(driver, path.data(), relo.data());
-  return {};
+  if (!driver.compileOnly && driver.outputPath.empty()) {
+    filesToDelete.push_back(relo);
+  }
+  return relo;
 }
 
 void Link(std::vector<std::string> &relocatables, DriverOptions &driver) {
-  if (!ParentProcess()) {
-    std::vector<char *> argv;
-    for (size_t j{0}; j < driver.fcArgs.size(); ++j) {
-      argv.push_back(driver.fcArgs[j].data());
-    }
-    for (auto &relo : relocatables) {
-      argv.push_back(relo.data());
-    }
-    if (!driver.outputPath.empty()) {
-      char dashO[3] = "-o";
-      argv.push_back(dashO);
-      argv.push_back(driver.outputPath.data());
-    }
-    Exec(argv, driver.verbose);
+  std::vector<llvm::StringRef> argv;
+  for (size_t j{0}; j < driver.fcArgs.size(); ++j) {
+    argv.push_back(driver.fcArgs[j].data());
+  }
+  for (auto &relo : relocatables) {
+    argv.push_back(relo.data());
   }
+  if (!driver.outputPath.empty()) {
+    char dashO[3] = "-o";
+    argv.push_back(dashO);
+    argv.push_back(driver.outputPath.data());
+  }
+  Exec(argv, driver.verbose);
 }
 
 int main(int argc, char *const argv[]) {

diff  --git a/flang/tools/f18/f18.cpp b/flang/tools/f18/f18.cpp
index 33c7b6f6ce9e..732dc07202aa 100644
--- a/flang/tools/f18/f18.cpp
+++ b/flang/tools/f18/f18.cpp
@@ -25,6 +25,7 @@
 #include "flang/Semantics/unparse-with-symbols.h"
 #include "llvm/Support/Errno.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Program.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cstdio>
 #include <cstring>
@@ -34,8 +35,6 @@
 #include <optional>
 #include <stdlib.h>
 #include <string>
-#include <sys/wait.h>
-#include <unistd.h>
 #include <vector>
 
 static std::list<std::string> argList(int argc, char *const argv[]) {
@@ -68,7 +67,7 @@ std::vector<std::string> filesToDelete;
 void CleanUpAtExit() {
   for (const auto &path : filesToDelete) {
     if (!path.empty()) {
-      unlink(path.data());
+      llvm::sys::fs::remove(path);
     }
   }
 }
@@ -110,36 +109,29 @@ struct DriverOptions {
   bool getSymbolsSources{false};
 };
 
-bool ParentProcess() {
-  if (fork() == 0) {
-    return false; // in child process
-  }
-  int childStat{0};
-  wait(&childStat);
-  if (!WIFEXITED(childStat) || WEXITSTATUS(childStat) != 0) {
-    exit(EXIT_FAILURE);
-  }
-  return true;
-}
-
-void Exec(std::vector<char *> &argv, bool verbose = false) {
+void Exec(std::vector<llvm::StringRef> &argv, bool verbose = false) {
   if (verbose) {
     for (size_t j{0}; j < argv.size(); ++j) {
       llvm::errs() << (j > 0 ? " " : "") << argv[j];
     }
     llvm::errs() << '\n';
   }
-  argv.push_back(nullptr);
-  execvp(argv[0], &argv[0]);
-  llvm::errs() << "execvp(" << argv[0]
-               << ") failed: " << llvm::sys::StrError(errno) << '\n';
-  exit(EXIT_FAILURE);
+  std::string ErrMsg;
+  llvm::ErrorOr<std::string> Program = llvm::sys::findProgramByName(argv[0]);
+  if (!Program)
+    ErrMsg = Program.getError().message();
+  if (!Program ||
+      llvm::sys::ExecuteAndWait(
+          Program.get(), argv, llvm::None, {}, 0, 0, &ErrMsg)) {
+    llvm::errs() << "execvp(" << argv[0] << ") failed: " << ErrMsg << '\n';
+    exit(EXIT_FAILURE);
+  }
 }
 
 void RunOtherCompiler(DriverOptions &driver, char *source, char *relo) {
-  std::vector<char *> argv;
+  std::vector<llvm::StringRef> argv;
   for (size_t j{0}; j < driver.F18_FCArgs.size(); ++j) {
-    argv.push_back(driver.F18_FCArgs[j].data());
+    argv.push_back(driver.F18_FCArgs[j]);
   }
   char dashC[3] = "-c", dashO[3] = "-o";
   argv.push_back(dashC);
@@ -329,16 +321,16 @@ std::string CompileFortran(std::string path, Fortran::parser::Options options,
 
   std::string relo{RelocatableName(driver, path)};
 
-  char tmpSourcePath[32];
-  std::snprintf(tmpSourcePath, sizeof tmpSourcePath, "/tmp/f18-%lx.f90",
-      static_cast<unsigned long>(getpid()));
+  llvm::SmallString<32> tmpSourcePath;
   {
-    std::error_code EC;
-    llvm::raw_fd_ostream tmpSource(tmpSourcePath, EC, llvm::sys::fs::F_None);
+    int fd;
+    std::error_code EC =
+        llvm::sys::fs::createUniqueFile("f18-%%%%.f90", fd, tmpSourcePath);
     if (EC) {
       llvm::errs() << EC.message() << "\n";
       std::exit(EXIT_FAILURE);
     }
+    llvm::raw_fd_ostream tmpSource(fd, /*shouldClose*/ true);
     Unparse(tmpSource, parseTree, driver.encoding, true /*capitalize*/,
         options.features.IsEnabled(
             Fortran::common::LanguageFeature::BackslashEscapes),
@@ -346,49 +338,41 @@ std::string CompileFortran(std::string path, Fortran::parser::Options options,
         driver.unparseTypedExprsToF18_FC ? &asFortran : nullptr);
   }
 
-  if (ParentProcess()) {
-    filesToDelete.push_back(tmpSourcePath);
-    if (!driver.compileOnly && driver.outputPath.empty()) {
-      filesToDelete.push_back(relo);
-    }
-    return relo;
+  RunOtherCompiler(driver, tmpSourcePath.data(), relo.data());
+  filesToDelete.emplace_back(tmpSourcePath);
+  if (!driver.compileOnly && driver.outputPath.empty()) {
+    filesToDelete.push_back(relo);
   }
-  RunOtherCompiler(driver, tmpSourcePath, relo.data());
-  return {};
+  return relo;
 }
 
 std::string CompileOtherLanguage(std::string path, DriverOptions &driver) {
   std::string relo{RelocatableName(driver, path)};
-  if (ParentProcess()) {
-    if (!driver.compileOnly && driver.outputPath.empty()) {
-      filesToDelete.push_back(relo);
-    }
-    return relo;
-  }
   RunOtherCompiler(driver, path.data(), relo.data());
-  return {};
+  if (!driver.compileOnly && driver.outputPath.empty()) {
+    filesToDelete.push_back(relo);
+  }
+  return relo;
 }
 
 void Link(std::vector<std::string> &liblist, std::vector<std::string> &objects,
     DriverOptions &driver) {
-  if (!ParentProcess()) {
-    std::vector<char *> argv;
-    for (size_t j{0}; j < driver.F18_FCArgs.size(); ++j) {
-      argv.push_back(driver.F18_FCArgs[j].data());
-    }
-    for (auto &obj : objects) {
-      argv.push_back(obj.data());
-    }
-    if (!driver.outputPath.empty()) {
-      char dashO[3] = "-o";
-      argv.push_back(dashO);
-      argv.push_back(driver.outputPath.data());
-    }
-    for (auto &lib : liblist) {
-      argv.push_back(lib.data());
-    }
-    Exec(argv, driver.verbose);
+  std::vector<llvm::StringRef> argv;
+  for (size_t j{0}; j < driver.F18_FCArgs.size(); ++j) {
+    argv.push_back(driver.F18_FCArgs[j].data());
+  }
+  for (auto &obj : objects) {
+    argv.push_back(obj.data());
   }
+  if (!driver.outputPath.empty()) {
+    char dashO[3] = "-o";
+    argv.push_back(dashO);
+    argv.push_back(driver.outputPath.data());
+  }
+  for (auto &lib : liblist) {
+    argv.push_back(lib.data());
+  }
+  Exec(argv, driver.verbose);
 }
 
 int main(int argc, char *const argv[]) {


        


More information about the flang-commits mailing list