Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 32 additions & 7 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6517,6 +6517,38 @@ void Clang::ConstructJob(Compilation &C, const JobAction &Job,

Args.AddLastArg(CmdArgs, options::OPT_working_directory);

if (const char *IdxStorePath = ::getenv("CLANG_PROJECT_INDEX_PATH")) {
CmdArgs.push_back("-index-store-path");
CmdArgs.push_back(IdxStorePath);
if (const char *IdxStoreOptionsEnv =
::getenv("CLANG_PROJECT_INDEX_OPTIONS")) {
std::string IdxStoreOptions = IdxStoreOptionsEnv;
size_t Start = 0;
size_t End = IdxStoreOptions.find(" ");
while (true) {
// Only allow the application of index arguments through
// `CLANG_PROJECT_INDEX_OPTIONS`. Disallow forwarding of arbitrary
// arguments.
auto option = IdxStoreOptions.substr(Start, End);
if (option == "-index-ignore-system-symbols" ||
option == "-index-record-codegen-name" ||
option == "-index-unit-output-path" ||
option == "-index-ignore-macros" ||
option == "-index-ignore-pcms" ||
option == "-index-store-compress") {
CmdArgs.push_back(Args.MakeArgString(option));
} else {
D.Diag(diag::err_drv_unknown_argument) << option;
}
if (End == std::string::npos) {
break;
}
Start = End + 1;
End = IdxStoreOptions.find(" ", Start);
}
}
}

if (Args.hasArg(options::OPT_index_store_path)) {
Args.AddLastArg(CmdArgs, options::OPT_index_store_path);
Args.AddLastArg(CmdArgs, options::OPT_index_ignore_system_symbols);
Expand All @@ -6533,13 +6565,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &Job,
}
}

if (const char *IdxStorePath = ::getenv("CLANG_PROJECT_INDEX_PATH")) {
CmdArgs.push_back("-index-store-path");
CmdArgs.push_back(IdxStorePath);
CmdArgs.push_back("-index-ignore-system-symbols");
CmdArgs.push_back("-index-record-codegen-name");
}

// Add preprocessing options like -I, -D, etc. if we are using the
// preprocessor.
//
Expand Down
6 changes: 3 additions & 3 deletions clang/test/Index/Store/json.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// RUN: rm -rf %t.idx
// RUN: mkdir -p %t.o
// RUN: env CLANG_PROJECT_INDEX_PATH=%t.idx %clang -target x86_64-apple-macosx10.7 -arch x86_64 -mmacosx-version-min=10.7 -c %S/Inputs/test1.c -o %t.o/test1.o
// RUN: env CLANG_PROJECT_INDEX_PATH=%t.idx %clang -target x86_64-apple-macosx10.7 -arch x86_64 -mmacosx-version-min=10.7 -c %S/Inputs/test2.c -o %t.o/test2.o
// RUN: env CLANG_PROJECT_INDEX_PATH=%t.idx %clang -target x86_64-apple-macosx10.7 -arch x86_64 -mmacosx-version-min=10.7 -c %S/Inputs/test3.cpp -o %t.o/test3.o
// RUN: env CLANG_PROJECT_INDEX_PATH=%t.idx CLANG_PROJECT_INDEX_OPTIONS='-index-record-codegen-name' %clang -target x86_64-apple-macosx10.7 -arch x86_64 -mmacosx-version-min=10.7 -c %S/Inputs/test1.c -o %t.o/test1.o
// RUN: env CLANG_PROJECT_INDEX_PATH=%t.idx CLANG_PROJECT_INDEX_OPTIONS='-index-record-codegen-name' %clang -target x86_64-apple-macosx10.7 -arch x86_64 -mmacosx-version-min=10.7 -c %S/Inputs/test2.c -o %t.o/test2.o
// RUN: env CLANG_PROJECT_INDEX_PATH=%t.idx CLANG_PROJECT_INDEX_OPTIONS='-index-record-codegen-name' %clang -target x86_64-apple-macosx10.7 -arch x86_64 -mmacosx-version-min=10.7 -c %S/Inputs/test3.cpp -o %t.o/test3.o
// RUN: c-index-test core -aggregate-json %t.idx -o %t.json
// RUN: sed -e "s:%S::g" -e "s:%t.o::g" %t.json > %t.final.json
// RUN: diff -u %S/Inputs/json.c.json %t.final.json
Expand Down