aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Frontend/CompilerInstance.cpp3
-rw-r--r--clang/lib/Frontend/FrontendAction.cpp3
-rw-r--r--clang/test/Modules/ftime-trace.cppm13
-rw-r--r--clang/tools/driver/cc1_main.cpp13
4 files changed, 32 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index ecc1c4c..9c79e85 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -851,6 +851,9 @@ CompilerInstance::createOutputFileImpl(StringRef OutputPath, bool Binary,
// relative to that.
std::optional<SmallString<128>> AbsPath;
if (OutputPath != "-" && !llvm::sys::path::is_absolute(OutputPath)) {
+ assert(hasFileManager() &&
+ "File Manager is required to fix up relative path.\n");
+
AbsPath.emplace(OutputPath);
FileMgr->FixupRelativePath(*AbsPath);
OutputPath = *AbsPath;
diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp
index 1e27664..3551967 100644
--- a/clang/lib/Frontend/FrontendAction.cpp
+++ b/clang/lib/Frontend/FrontendAction.cpp
@@ -1117,6 +1117,9 @@ void FrontendAction::EndSourceFile() {
// FrontendAction.
CI.clearOutputFiles(/*EraseFiles=*/shouldEraseOutputFiles());
+ // The resources are owned by AST when the current file is AST.
+ // So we reset the resources here to avoid users accessing it
+ // accidently.
if (isCurrentFileAST()) {
if (DisableFree) {
CI.resetAndLeakPreprocessor();
diff --git a/clang/test/Modules/ftime-trace.cppm b/clang/test/Modules/ftime-trace.cppm
new file mode 100644
index 0000000..48cd411
--- /dev/null
+++ b/clang/test/Modules/ftime-trace.cppm
@@ -0,0 +1,13 @@
+// Tests that we can use modules and ftime-trace together.
+// Address https://github.com/llvm/llvm-project/issues/60544
+//
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm
+// RUN: %clang_cc1 -std=c++20 %t/a.pcm -ftime-trace=%t/a.json -o -
+// RUN: ls %t | grep "a.json"
+
+//--- a.cppm
+export module a;
diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp
index c79306b..cb33692 100644
--- a/clang/tools/driver/cc1_main.cpp
+++ b/clang/tools/driver/cc1_main.cpp
@@ -266,6 +266,19 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
llvm::sys::path::append(TracePath, llvm::sys::path::filename(Path));
Path.assign(TracePath);
}
+
+ // It is possible that the compiler instance doesn't own a file manager here
+ // if we're compiling a module unit. Since the file manager are owned by AST
+ // when we're compiling a module unit. So the file manager may be invalid
+ // here.
+ //
+ // It should be fine to create file manager here since the file system
+ // options are stored in the compiler invocation and we can recreate the VFS
+ // from the compiler invocation.
+ if (!Clang->hasFileManager())
+ Clang->createFileManager(createVFSFromCompilerInvocation(
+ Clang->getInvocation(), Clang->getDiagnostics()));
+
if (auto profilerOutput = Clang->createOutputFile(
Path.str(), /*Binary=*/false, /*RemoveFileOnSignal=*/false,
/*useTemporary=*/false)) {