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">,
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">,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits