diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1314,6 +1314,10 @@ BitcodeEmbed = static_cast(Model); } + // Remove existing compilation database so that each job can append to it. + if (Arg *A = Args.getLastArg(options::OPT_MJ)) + llvm::sys::fs::remove(A->getValue()); + // Setting up the jobs for some precompile cases depends on whether we are // treating them as PCH, implicit modules or C++20 ones. // TODO: inferring the mode like this seems fragile (it meets the objective diff --git a/clang/test/Driver/compilation_database_multiarch.c b/clang/test/Driver/compilation_database_multiarch.c --- a/clang/test/Driver/compilation_database_multiarch.c +++ b/clang/test/Driver/compilation_database_multiarch.c @@ -2,7 +2,14 @@ // 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 + +// Let's run that again and verify we're not accumulating redundant entries in the same file. +// +// RUN: %clang -fdriver-only -o %t/out %s -mtargetos=macos12 -arch arm64 -arch x86_64 -MJ %t/compilation_database.json +// RUN: echo EOF >> %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"]}, +// CHECK-NEXT: EOF