Skip to content

Commit

Permalink
Adjust FrontendOpts.Inputs[0] for inferred files
Browse files Browse the repository at this point in the history
  • Loading branch information
MaskRay committed Dec 24, 2018
1 parent fcee736 commit 3b2b3f0
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 56 deletions.
5 changes: 4 additions & 1 deletion src/clang_tu.cc
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ Range FromTokenRangeDefaulted(const SourceManager &SM, const LangOptions &Lang,
}

std::unique_ptr<CompilerInvocation>
BuildCompilerInvocation(std::vector<const char *> args,
BuildCompilerInvocation(const std::string &main, std::vector<const char *> args,
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS) {
std::string save = "-resource-dir=" + g_config->clang.resourceDir;
args.push_back(save.c_str());
Expand All @@ -106,6 +106,9 @@ BuildCompilerInvocation(std::vector<const char *> args,
CI->getDiagnosticOpts().IgnoreWarnings = true;
CI->getFrontendOpts().DisableFree = false;
CI->getLangOpts()->SpellChecking = false;
auto &IS = CI->getFrontendOpts().Inputs;
if (IS.size())
IS[0] = FrontendInputFile(main, IS[0].getKind(), IS[0].isSystem());
}
return CI;
}
Expand Down
3 changes: 2 additions & 1 deletion src/clang_tu.hh
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ Range FromTokenRangeDefaulted(const clang::SourceManager &SM,
Range range);

std::unique_ptr<clang::CompilerInvocation>
BuildCompilerInvocation(std::vector<const char *> args,
BuildCompilerInvocation(const std::string &main,
std::vector<const char *> args,
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS);

const char *ClangBuiltinTypeName(int);
Expand Down
53 changes: 16 additions & 37 deletions src/indexer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1230,14 +1230,15 @@ void Init() {

std::vector<std::unique_ptr<IndexFile>>
Index(SemaManager *manager, WorkingFiles *wfiles, VFS *vfs,
const std::string &opt_wdir, const std::string &file,
const std::string &opt_wdir, const std::string &main,
const std::vector<const char *> &args,
const std::vector<std::pair<std::string, std::string>> &remapped,
bool &ok) {
ok = true;
auto PCH = std::make_shared<PCHContainerOperations>();
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS = llvm::vfs::getRealFileSystem();
std::shared_ptr<CompilerInvocation> CI = BuildCompilerInvocation(args, FS);
std::shared_ptr<CompilerInvocation> CI =
BuildCompilerInvocation(main, args, FS);
// e.g. .s
if (!CI)
return {};
Expand All @@ -1257,35 +1258,13 @@ Index(SemaManager *manager, WorkingFiles *wfiles, VFS *vfs,
// HSOpts.UseBuiltinIncludes)
// HSOpts.ResourceDir = g_config->clang.resourceDir;
}
std::string buf = wfiles->GetContent(file);
std::string buf = wfiles->GetContent(main);
std::vector<std::unique_ptr<llvm::MemoryBuffer>> Bufs;
if (buf.size()) {
// If there is a completion session, reuse its preamble if exists.
bool done_remap = false;
#if 0
std::shared_ptr<CompletionSession> session =
manager->TryGetSession(file, false, false);
if (session)
if (auto preamble = session->GetPreamble()) {
Bufs.push_back(llvm::MemoryBuffer::getMemBuffer(buf));
auto Bounds = ComputePreambleBounds(*CI->getLangOpts(), Bufs.back().get(), 0);
if (preamble->Preamble.CanReuse(*CI, Bufs.back().get(), Bounds,
FS.get())) {
preamble->Preamble.AddImplicitPreamble(*CI, FS, Bufs.back().get());
done_remap = true;
}
}
#endif
if (buf.size())
for (auto &[filename, content] : remapped) {
if (filename == file && done_remap)
continue;
Bufs.push_back(llvm::MemoryBuffer::getMemBuffer(content));
CI->getPreprocessorOpts().addRemappedFile(
filename == file ? CI->getFrontendOpts().Inputs[0].getFile()
: StringRef(filename),
Bufs.back().get());
CI->getPreprocessorOpts().addRemappedFile(filename, Bufs.back().get());
}
}

DiagnosticConsumer DC;
auto Clang = std::make_unique<CompilerInstance>(PCH);
Expand Down Expand Up @@ -1314,20 +1293,20 @@ Index(SemaManager *manager, WorkingFiles *wfiles, VFS *vfs,
{
llvm::CrashRecoveryContext CRC;
auto parse = [&]() {
if (!Action->BeginSourceFile(*Clang, Clang->getFrontendOpts().Inputs[0]))
return;
if (!Action->Execute())
return;
Action->EndSourceFile();
ok = true;
};
if (!Action->BeginSourceFile(*Clang, Clang->getFrontendOpts().Inputs[0]))
return;
if (!Action->Execute())
return;
Action->EndSourceFile();
ok = true;
};
if (!CRC.RunSafely(parse)) {
LOG_S(ERROR) << "clang crashed for " << file;
LOG_S(ERROR) << "clang crashed for " << main;
return {};
}
}
if (!ok) {
LOG_S(ERROR) << "failed to index " << file;
LOG_S(ERROR) << "failed to index " << main;
return {};
}
for (auto &Buf : Bufs)
Expand All @@ -1338,7 +1317,7 @@ Index(SemaManager *manager, WorkingFiles *wfiles, VFS *vfs,
if (!it.second.db)
continue;
std::unique_ptr<IndexFile> &entry = it.second.db;
entry->import_file = file;
entry->import_file = main;
entry->args = args;
for (auto &[_, it] : entry->uid2lid_and_path)
entry->lid2path.emplace_back(it.first, std::move(it.second));
Expand Down
5 changes: 4 additions & 1 deletion src/pipeline.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ limitations under the License.
#include <rapidjson/document.h>
#include <rapidjson/writer.h>

#include <llvm/Support/Path.h>
#include <llvm/Support/Process.h>
#include <llvm/Support/Threading.h>
using namespace llvm;
Expand Down Expand Up @@ -122,9 +123,11 @@ bool CacheInvalid(VFS *vfs, IndexFile *prev, const std::string &path,
}
}

// For inferred files, allow -o a a.cc -> -o b b.cc
std::string stem = sys::path::stem(path);
bool changed = prev->args.size() != args.size();
for (size_t i = 0; !changed && i < args.size(); i++)
if (strcmp(prev->args[i], args[i]))
if (strcmp(prev->args[i], args[i]) && sys::path::stem(args[i]) != stem)
changed = true;
if (changed)
LOG_S(INFO) << "args changed for " << path
Expand Down
17 changes: 4 additions & 13 deletions src/project.cc
Original file line number Diff line number Diff line change
Expand Up @@ -426,12 +426,11 @@ Project::Entry Project::FindEntry(const std::string &path,
bool must_exist) {
std::shared_lock lock(mtx);
for (auto &[root, folder] : root2folder) {
// The entry may have different filename but it doesn't matter when building
// CompilerInvocation. The main filename is specified separately.
auto it = folder.path2entry_index.find(path);
if (it != folder.path2entry_index.end()) {
Project::Entry &entry = folder.entries[it->second];
if (!must_exist || entry.filename == path)
return entry;
}
if (it != folder.path2entry_index.end())
return folder.entries[it->second];
}

std::string dir;
Expand Down Expand Up @@ -490,14 +489,6 @@ Project::Entry Project::FindEntry(const std::string &path,
ret.root = best->root;
ret.directory = best->directory;
ret.args = best->args;
std::string base_name = sys::path::filename(best->filename);
for (const char *&arg : ret.args) {
try {
if (arg == best->filename || sys::path::filename(arg) == base_name)
arg = Intern(path);
} catch (...) {
}
}
ret.args.resize(best->compdb_size);
if (extra && extra->size())
ret.args.insert(ret.args.end(), extra->begin() + 1, extra->end());
Expand Down
6 changes: 3 additions & 3 deletions src/sema_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ void *PreambleMain(void *manager_) {
IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS =
stat_cache->Producer(session->FS);
if (std::unique_ptr<CompilerInvocation> CI =
BuildCompilerInvocation(session->file.args, FS))
BuildCompilerInvocation(task.path, session->file.args, FS))
BuildPreamble(*session, *CI, FS, task, std::move(stat_cache));

if (task.from_diag) {
Expand Down Expand Up @@ -460,7 +460,7 @@ void *CompletionMain(void *manager_) {
IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS =
preamble ? preamble->stat_cache->Consumer(session->FS) : session->FS;
std::unique_ptr<CompilerInvocation> CI =
BuildCompilerInvocation(session->file.args, FS);
BuildCompilerInvocation(task->path, session->file.args, FS);
if (!CI)
continue;
auto &FOpts = CI->getFrontendOpts();
Expand Down Expand Up @@ -562,7 +562,7 @@ void *DiagnosticMain(void *manager_) {
}

std::unique_ptr<CompilerInvocation> CI =
BuildCompilerInvocation(session->file.args, FS);
BuildCompilerInvocation(task.path, session->file.args, FS);
if (!CI)
continue;
// If main file is a header, add -Wno-unused-function
Expand Down

0 comments on commit 3b2b3f0

Please sign in to comment.