[PATCH] D137058: [Driver] [Modules] Support -fmodule-output (1/2)
Chuanqi Xu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 14 19:49:24 PST 2022
ChuanqiXu updated this revision to Diff 483074.
ChuanqiXu added a comment.
Address comments:
- Reuse the logic to compute object file for module file when `-o` is not specified.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D137058/new/
https://reviews.llvm.org/D137058
Files:
clang/include/clang/Driver/Options.td
clang/lib/Driver/Driver.cpp
clang/test/Driver/lit.local.cfg
clang/test/Driver/module-output.cppm
Index: clang/test/Driver/module-output.cppm
===================================================================
--- /dev/null
+++ clang/test/Driver/module-output.cppm
@@ -0,0 +1,9 @@
+// Tests that the .pcm file will be generated in the same direcotry with the specified
+// output and the name of the .pcm file should be the same with the output file.
+// RUN: %clang -std=c++20 %s -fmodule-output -c -o %t/output/Hello.o \
+// RUN: -### 2>&1 | FileCheck %s
+
+export module Hello;
+
+// CHECK: "-emit-module-interface" {{.*}}"-main-file-name" "module-output.cppm" {{.*}}"-o" "{{.*}}/Hello.pcm" "-x" "c++" "{{.*}}/module-output.cppm"
+// CHECK: "-emit-obj" {{.*}}"-main-file-name" "module-output.cppm" {{.*}}"-o" "{{.*}}/Hello.o" "-x" "pcm" "{{.*}}/Hello.pcm"
Index: clang/test/Driver/lit.local.cfg
===================================================================
--- clang/test/Driver/lit.local.cfg
+++ clang/test/Driver/lit.local.cfg
@@ -1,6 +1,6 @@
from lit.llvm import llvm_config
-config.suffixes = ['.c', '.cpp', '.h', '.m', '.mm', '.S', '.s', '.f90', '.F90', '.f95',
+config.suffixes = ['.c', '.cpp', '.cppm', '.h', '.m', '.mm', '.S', '.s', '.f90', '.F90', '.f95',
'.cu', '.rs', '.cl', '.clcpp', '.hip', '.hlsl']
config.substitutions = list(config.substitutions)
config.substitutions.insert(0,
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -5540,6 +5540,23 @@
return "-";
}
+ // If `-fmodule-output` is specfied, then:
+ // - If `-o` is specified, the module file is written to the same path
+ // with the output filename in module file's suffix.
+ // - If `-o` is not specified, the module file is written to the working
+ // direcotry with the input filename in module file's suffix. The logic
+ // falls out to reuse the logic to compute the path of the object files.
+ if (!AtTopLevel && isa<PrecompileJobAction>(JA) &&
+ JA.getType() == types::TY_ModuleFile &&
+ C.getArgs().hasArg(options::OPT_fmodule_output) &&
+ C.getArgs().hasArg(options::OPT_o)) {
+ SmallString<128> TempPath;
+ TempPath = C.getArgs().getLastArg(options::OPT_o)->getValue();
+ const char *Extension = types::getTypeTempSuffix(JA.getType());
+ llvm::sys::path::replace_extension(TempPath, Extension);
+ return C.addResultFile(C.getArgs().MakeArgString(TempPath.c_str()), &JA);
+ }
+
if (IsDXCMode() && !C.getArgs().hasArg(options::OPT_o))
return "-";
@@ -5556,8 +5573,14 @@
}
// Output to a temporary file?
- if ((!AtTopLevel && !isSaveTempsEnabled() &&
- !C.getArgs().hasArg(options::OPT__SLASH_Fo)) ||
+ if ((!AtTopLevel &&
+ !isSaveTempsEnabled() &&
+ !C.getArgs().hasArg(options::OPT__SLASH_Fo) &&
+ // We don't generate module file to temporary file if
+ // we specified `-fmodule-output`
+ (!isa<PrecompileJobAction>(JA) ||
+ JA.getType() != types::TY_ModuleFile ||
+ !C.getArgs().hasArg(options::OPT_fmodule_output))) ||
CCGenDiagnostics) {
StringRef Name = llvm::sys::path::filename(BaseInput);
std::pair<StringRef, StringRef> Split = Name.split('.');
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -2285,6 +2285,9 @@
PosFlag<SetTrue, [], "Look up implicit modules in the prebuilt module path">,
NegFlag<SetFalse>, BothFlags<[NoXarchOption, CC1Option]>>;
+def fmodule_output : Flag<["-"], "fmodule-output">, Flags<[NoXarchOption, CC1Option]>,
+ HelpText<"Save intermediate module file results when compiling a standard C++ module unit.">;
+
def fmodules_prune_interval : Joined<["-"], "fmodules-prune-interval=">, Group<i_Group>,
Flags<[CC1Option]>, MetaVarName<"<seconds>">,
HelpText<"Specify the interval (in seconds) between attempts to prune the module cache">,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137058.483074.patch
Type: text/x-patch
Size: 4027 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221215/73e87ac0/attachment.bin>
More information about the cfe-commits
mailing list