Author: Jan Svoboda
Date: 2022-06-13T13:30:57+02:00
New Revision: a85670001ba2487988839656299771915ebc7633

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

LOG: [clang][driver] Fix compilation database dump with multiple architectures

Command lines with multiple `-arch` arguments expand into multiple entries in 
the compilation database. However, the file writes are not appending, meaning 
subsequent writes end up overwriting the previous ones, resulting in garbled 
output.

This patch fixes that by always appending to the file.

rdar://90165004

Reviewed By: dexonsmith

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

Added: 
    clang/test/Driver/compilation_database_multiarch.c

Modified: 
    clang/lib/Driver/ToolChains/Clang.cpp
    clang/test/Driver/compilation_database.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 62e891ce38c49..5aa172edc362d 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -2406,7 +2406,8 @@ void Clang::DumpCompilationDatabase(Compilation &C, 
StringRef Filename,
   if (!CompilationDatabase) {
     std::error_code EC;
     auto File = std::make_unique<llvm::raw_fd_ostream>(
-        Filename, EC, llvm::sys::fs::OF_TextWithCRLF);
+        Filename, EC,
+        llvm::sys::fs::OF_TextWithCRLF | llvm::sys::fs::OF_Append);
     if (EC) {
       D.Diag(clang::diag::err_drv_compilationdatabase) << Filename
                                                        << EC.message();
@@ -2432,6 +2433,7 @@ void Clang::DumpCompilationDatabase(Compilation &C, 
StringRef Filename,
     CDB << ", \"" << escape(Buf) << "\"";
   }
   CDB << ", \"" << escape(Input.getFilename()) << "\"";
+  CDB << ", \"-o\", \"" << escape(Output.getFilename()) << "\"";
   for (auto &A: Args) {
     auto &O = A->getOption();
     // Skip language selection, which is positional.
@@ -2445,6 +2447,9 @@ void Clang::DumpCompilationDatabase(Compilation &C, 
StringRef Filename,
     // Skip inputs.
     if (O.getKind() == Option::InputClass)
       continue;
+    // Skip output.
+    if (O.getID() == options::OPT_o)
+      continue;
     // All other arguments are quoted and appended.
     ArgStringList ASL;
     A->render(Args, ASL);

diff  --git a/clang/test/Driver/compilation_database.c 
b/clang/test/Driver/compilation_database.c
index 19224d22de044..879c67c59c883 100644
--- a/clang/test/Driver/compilation_database.c
+++ b/clang/test/Driver/compilation_database.c
@@ -2,8 +2,8 @@
 // RUN: %clang -no-canonical-prefixes -fintegrated-as -MD -MP 
--sysroot=somewhere -c -x c %s -xc++ %s -Wall -MJ - 2>&1 | FileCheck %s
 // RUN: not %clang -no-canonical-prefixes -c -x c %s -MJ %s/non-existant 2>&1 
| FileCheck --check-prefix=ERROR %s
 
-// CHECK: { "directory": "{{[^"]*}}workdir",  "file": 
"[[SRC:[^"]+[/|\\]compilation_database.c]]", "output": 
"compilation_database.o", "arguments": ["{{[^"]*}}clang{{[^"]*}}", "-xc", 
"[[SRC]]", "-no-canonical-prefixes", "-fintegrated-as", "--sysroot=somewhere", 
"-c", "-Wall",{{.*}} "--target={{[^"]+}}"]},
-// CHECK: { "directory": "{{.*}}",  "file": 
"[[SRC:[^"]+[/|\\]compilation_database.c]]", "output": 
"compilation_database.o", "arguments": ["{{[^"]*}}clang{{[^"]*}}", "-xc++", 
"[[SRC]]", "-no-canonical-prefixes", "-fintegrated-as", "--sysroot=somewhere", 
"-c", "-Wall",{{.*}} "--target={{[^"]+}}"]},
+// CHECK: { "directory": "{{[^"]*}}workdir",  "file": 
"[[SRC:[^"]+[/|\\]compilation_database.c]]", "output": 
"compilation_database.o", "arguments": ["{{[^"]*}}clang{{[^"]*}}", "-xc", 
"[[SRC]]", "-o", "compilation_database.o", "-no-canonical-prefixes", 
"-fintegrated-as", "--sysroot=somewhere", "-c", "-Wall",{{.*}} 
"--target={{[^"]+}}"]},
+// CHECK: { "directory": "{{.*}}",  "file": 
"[[SRC:[^"]+[/|\\]compilation_database.c]]", "output": 
"compilation_database.o", "arguments": ["{{[^"]*}}clang{{[^"]*}}", "-xc++", 
"[[SRC]]", "-o", "compilation_database.o", "-no-canonical-prefixes", 
"-fintegrated-as", "--sysroot=somewhere", "-c", "-Wall",{{.*}} 
"--target={{[^"]+}}"]},
 // ERROR: error: compilation database '{{.*}}/non-existant' could not be 
opened:
 
 int main(void) {

diff  --git a/clang/test/Driver/compilation_database_multiarch.c 
b/clang/test/Driver/compilation_database_multiarch.c
new file mode 100644
index 0000000000000..b64e0265a3ff8
--- /dev/null
+++ b/clang/test/Driver/compilation_database_multiarch.c
@@ -0,0 +1,6 @@
+// RUN: rm -rf %t && mkdir -p %t
+// RUN: %clang -fdriver-only -o %t/out %s -mtargetos=macos12 -arch arm64 -arch 
x86_64 -MJ %t/compilation_database.json
+// RUN: FileCheck --input-file=%t/compilation_database.json %s
+
+// CHECK:      { "directory": "{{.*}}", "file": "{{.*}}", "output": 
"[[OUTPUT_X86_64:.*]]", "arguments": [{{.*}}, "-o", "[[OUTPUT_X86_64]]", {{.*}} 
"--target=x86_64-apple-macosx12.0.0"]},
+// CHECK-NEXT: { "directory": "{{.*}}", "file": "{{.*}}", "output": 
"[[OUTPUT_ARM64:.*]]", "arguments": [{{.*}}, "-o", "[[OUTPUT_ARM64]]", {{.*}} 
"--target=arm64-apple-macosx12.0.0"]},


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to