diff --git a/clang/test/ClangScanDeps/Inputs/target-filename-cdb.json b/clang/test/ClangScanDeps/Inputs/target-filename-cdb.json new file mode 100644 --- /dev/null +++ b/clang/test/ClangScanDeps/Inputs/target-filename-cdb.json @@ -0,0 +1,22 @@ +[ +{ + "directory": "DIR", + "command": "clang -E DIR/target-filename_input.cpp", + "file": "DIR/target-filename_input.cpp" +}, +{ + "directory": "DIR", + "command": "clang -E DIR/target-filename_input.cpp -o a.o", + "file": "DIR/target-filename_input.cpp" +}, +{ + "directory": "DIR", + "command": "clang -E DIR/target-filename_input.cpp -ob.o", + "file": "DIR/target-filename_input.cpp" +}, +{ + "directory": "DIR", + "command": "clang -E DIR/target-filename_input.cpp -o first.o -o last.o", + "file": "DIR/target-filename_input.cpp" +} +] diff --git a/clang/test/ClangScanDeps/target-filename.cpp b/clang/test/ClangScanDeps/target-filename.cpp new file mode 100644 --- /dev/null +++ b/clang/test/ClangScanDeps/target-filename.cpp @@ -0,0 +1,20 @@ +// RUN: rm -rf %t.dir +// RUN: rm -rf %t.cdb +// RUN: mkdir -p %t.dir +// RUN: cp %s %t.dir/target-filename_input.cpp +// RUN: mkdir %t.dir/Inputs +// RUN: cp %S/Inputs/header.h %t.dir/Inputs/header.h +// RUN: sed -e "s|DIR|%/t.dir|g" %S/Inputs/target-filename-cdb.json > %t.cdb +// RUN: clang-scan-deps -compilation-database %t.cdb -j 1 | FileCheck %s + +// CHECK: target-filename_input.o: +// CHECK-NEXT: target-filename_input.cpp + +// CHECK-NEXT: a.o: +// CHECK-NEXT: target-filename_input.cpp + +// CHECK-NEXT: b.o: +// CHECK-NEXT: target-filename_input.cpp + +// CHECK-NEXT: last.o: +// CHECK-NEXT: target-filename_input.cpp diff --git a/clang/tools/clang-scan-deps/ClangScanDeps.cpp b/clang/tools/clang-scan-deps/ClangScanDeps.cpp --- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp +++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp @@ -425,18 +425,21 @@ if (!Args.empty()) { std::size_t Idx = Args.size() - 1; for (auto It = Args.rbegin(); It != Args.rend(); ++It) { - if (It != Args.rbegin()) { - if (Args[Idx] == "-o") + StringRef Arg = Args[Idx]; + if (LastO.empty()) { + if (Arg == "-o" && It != Args.rbegin()) LastO = Args[Idx + 1]; - if (Args[Idx] == "-MT") - HasMT = true; - if (Args[Idx] == "-MQ") - HasMQ = true; - if (Args[Idx] == "-MD") - HasMD = true; - if (Args[Idx] == "-resource-dir") - HasResourceDir = true; + else if (Arg.startswith("-o")) + LastO = Arg.drop_front(2).str(); } + if (Arg == "-MT") + HasMT = true; + if (Arg == "-MQ") + HasMQ = true; + if (Arg == "-MD") + HasMD = true; + if (Arg == "-resource-dir") + HasResourceDir = true; --Idx; } }