[PATCH] D87989: [Flang][Driver] Add infrastructure for basic frontend actions and file I/O

Andrzej Warzynski via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 1 12:33:49 PDT 2020


awarzynski added a comment.

@CarolineConcatto thank you again for working on this! The structure is good, but IMHO this patch could be polished a bit more. Overall:

- could you make sure that this patch does not change the output from `clang -help`?
- doxygen comments are consistent
- unittests are a bit better documentated (what and why is tested?)
- use `llvm/Support/FileSystem.h`  instead of `<filesystem>`

More comments inline. Otherwise, I think that this is almost ready :)



================
Comment at: clang/include/clang/Driver/Options.td:2795
 def object : Flag<["-"], "object">;
-def o : JoinedOrSeparate<["-"], "o">, Flags<[DriverOption, RenderAsInput, CC1Option, CC1AsOption]>,
+def o : JoinedOrSeparate<["-"], "o">, Flags<[DriverOption, RenderAsInput, CC1Option, CC1AsOption, FC1Option]>,
   HelpText<"Write output to <file>">, MetaVarName<"<file>">;
----------------
What about FlangOption?


================
Comment at: clang/lib/Driver/Driver.cpp:1576-1579
+  } else {
+    ExcludedFlagsBitmask |= options::FlangOption;
+    ExcludedFlagsBitmask |= options::FC1Option;
+  }
----------------
With this, the following is empty:
```
$ bin/clang --help | grep help
```

This is what I'd expect instead (i.e. the behavior shouldn't change):
```
$ bin/clang --help | grep help
  --help-hidden           Display help for hidden options
  -help                   Display available options
```

This needs a bit more polishing.


================
Comment at: clang/test/Driver/immediate-options.c:5
 // HELP-NOT: driver-mode
+// HEKP-NOT: test-io
 
----------------
HELP instead of HEKP

Could add a comment why this particular test is here?


================
Comment at: flang/include/flang/Frontend/CompilerInstance.h:58
+
+  /// }
+  /// @name Compiler Invocation
----------------
I can't see a matching `/// }` for this. DELETEME


================
Comment at: flang/include/flang/Frontend/CompilerInstance.h:85
+  /// CompilerInvocation object.
+  /// Note that this routine may write output to 'stderr'.
+  /// \param act - The action to execute.
----------------
>From what I can see, this is not the case. Could you update?


================
Comment at: flang/include/flang/Frontend/FrontendAction.h:23
+protected:
+  /// @}
+  /// @name Implementation Action Interface
----------------
DELETEME (missing matching `/// {`)


================
Comment at: flang/include/flang/Frontend/FrontendAction.h:42
+
+  /// @}
+  /// @name Compiler Instance Access
----------------
I think that this should be on line 38.


================
Comment at: flang/include/flang/Frontend/FrontendOptions.h:16
 #include <string>
 namespace Fortran::frontend {
 
----------------
[nit] Empty line


================
Comment at: flang/include/flang/Frontend/FrontendOptions.h:19
+enum ActionKind {
+  // This is temporary solution
+  // Avoids Action = InputOutputTest as option 0
----------------
Temporary solution to what?


================
Comment at: flang/include/flang/Frontend/FrontendOptions.h:56-59
+  Fortran77,
+  Fortran90,
+  Fortran95,
+  FortranF18
----------------
Could we defer adding this to later? This patch is already rather larger.


================
Comment at: flang/lib/Frontend/CompilerInvocation.cpp:72
     dashX = llvm::StringSwitch<InputKind>(XValue)
-                .Case("f90", Language::Fortran)
+                .Case("f90", Language::Fortran90)
                 .Default(Language::Unknown);
----------------
Please, could we defer this to later?


================
Comment at: flang/lib/Frontend/FrontendOptions.cpp:18-23
+      .Cases("ff", "fpp", "FPP", "cuf", "CUF", "fir", "FOR", "for",
+             Language::Fortran)
+      .Cases("f", "F", "f77", Language::Fortran77)
+      .Cases("f90", "F90", ".ff90", Language::Fortran90)
+      .Cases("f95", "F95", "ff95", Language::Fortran95)
+      .Cases("f18", "F18", Language::FortranF18)
----------------
Could you reduce it to `Language::Fortran` only? We can deal with various variants in a separate patch when it becomes relevant.


================
Comment at: flang/test/Flang-Driver/driver-help.f90:14
+
 ! REQUIRES: new-flang-driver
 
----------------
Probably should be at the top (for consistency with driver-help-hidden.f90)


================
Comment at: flang/test/Flang-Driver/driver-help.f90:22
+! CHECK-FLANG-NEXT:OPTIONS:
+! CHECK-FLANG-NEXT: -help     Display available options
+! CHECK-FLANG-NEXT: --version Print version information
----------------
What about `-o`?


================
Comment at: flang/test/Flang-Driver/emit-obj.f90:2
 ! RUN: not %flang-new  %s 2>&1 | FileCheck %s --check-prefix=ERROR-IMPLICIT
-! RUN: not %flang-new  -emit-obj %s 2>&1 | FileCheck %s --check-prefix=ERROR-EXPLICIT
 ! RUN: not %flang-new  -fc1 -emit-obj %s 2>&1 | FileCheck %s --check-prefix=ERROR-FC1
----------------
CarolineConcatto wrote:
> awarzynski wrote:
> > Why is this line deleted? `flang-new -emit-obj` should still fail, right?
> I remove this because the text does not apply any more
> ! ERROR-IMPLICIT: error: unknown argument: '-o'
`flang-new -emit-obj` is still failing (which is expected) and we should have a test for it. Please revert this.


================
Comment at: flang/unittests/Frontend/CompilerInstanceTest.cpp:18
 using namespace Fortran::frontend;
+#include <filesystem>
 
----------------
Please use "llvm/Support/FileSystem.h" instead.


================
Comment at: flang/unittests/Frontend/CompilerInstanceTest.cpp:33
+  if (ec)
+    llvm::errs() << "Fail to create the file need by the test";
+  *(os) << inputSource;
----------------
Please use FAIL() instead: https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#explicit-success-and-failure


================
Comment at: flang/unittests/Frontend/CompilerInstanceTest.cpp:43
+  CompilerInstance compInst;
+  Fortran::parser::AllSources &allSources{compInst.GetAllSources()};
+  const Fortran::parser::SourceFile *sf;
----------------
[nit] `allSources` is only used in one place - this variable is not needed


================
Comment at: flang/unittests/Frontend/CompilerInstanceTest.cpp:55
+  // 4. Delete file
+  llvm::sys::fs::remove(inputFilename);
+}
----------------
Forgot to test check the error code.


================
Comment at: flang/unittests/Frontend/InputOutputTest.cpp:18
+using namespace Fortran::frontend;
+#include <filesystem>
+
----------------
Please, use `"llvm/Support/FileSystem.h"` instead.


================
Comment at: flang/unittests/Frontend/InputOutputTest.cpp:22
+
+TEST(FrontendOutputTests, TestInputOutputStreamOwned) {
+  // 1. Prepare the input file to be used by IO
----------------
[nit] This is a test for `InputOutputTestAction`, perhaps:
```
TEST(FrontendAction, TestInputOutputStreamOwned)
```
?


================
Comment at: llvm/lib/Option/OptTable.cpp:642
     unsigned Flags = getInfo(Id).Flags;
+
     if (FlagsToInclude && !(Flags & FlagsToInclude))
----------------
Revert


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87989/new/

https://reviews.llvm.org/D87989



More information about the cfe-commits mailing list