[PATCH] D36589: Add support for remembering origins to ExternalASTMerger

2017-09-25 Thread Sean Callanan via Phabricator via cfe-commits
spyffe abandoned this revision.
spyffe marked 13 inline comments as done.
spyffe added a comment.

At @bruno 's request, abandoning this revision in favor of the updated 
https://reviews.llvm.org/D38208.
That revision has all the changes requested.


https://reviews.llvm.org/D36589



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


[PATCH] D36589: Add support for remembering origins to ExternalASTMerger

2017-09-25 Thread Bruno Cardoso Lopes via Phabricator via cfe-commits
bruno added a comment.

Thanks for the additional docs! More comments below.




Comment at: lib/AST/ExternalASTMerger.cpp:116
+if (auto *ToDC = dyn_cast(To)) {
+  logs() << "(ExternalASTMerger*)" << (void*)
+ << " imported (DeclContext*)" << (void*)ToDC

Can you conditionalize the logging?



Comment at: lib/AST/ExternalASTMerger.cpp:126
+  Parent.HasImporterForOrigin(*FromOrigins.at(FromDC).AST)) {
+logs() << "(ExternalASTMerger*)" << (void*)
+   << " forced origin (DeclContext*)"

Same here.



Comment at: lib/AST/ExternalASTMerger.cpp:134
+  } else {
+logs() << "(ExternalASTMerger*)" << (void*)
+   << " maybe recording origin (DeclContext*)" << (void*)FromDC

Same here.



Comment at: lib/AST/ExternalASTMerger.cpp:213
+if (!DidCallback)
+  logs() << "(ExternalASTMerger*)" << (void*)this
+ << " asserting for (DeclContext*)" << (void*)DC

Same here.



Comment at: lib/AST/ExternalASTMerger.cpp:286
+  if (!FoundFromDC || !IsSameDC(FoundFromDC.get(), Origin.DC)) {
+logs() << "(ExternalASTMerger*)" << (void*)this
+   << " decided to record origin (DeclContext*)" << (void*)Origin.DC

Ditto



Comment at: lib/AST/ExternalASTMerger.cpp:292
+  } else {
+logs() << "(ExternalASTMerger*)" << (void*)this
+   << " decided NOT to record origin (DeclContext*)" << 
(void*)Origin.DC

Ditto



Comment at: tools/clang-import-test/clang-import-test.cpp:232
+
+struct CIAndOrigins {
+  using OriginMap = clang::ExternalASTMerger::OriginMap;

Can you also add a brief documentation for this one? 



Comment at: tools/clang-import-test/clang-import-test.cpp:242
+  return static_cast(Source)->GetOrigins();
+else
+  return EmptyOriginMap;

No need for the `else` here.



Comment at: tools/clang-import-test/clang-import-test.cpp:256
+  llvm::SmallVector Sources;
+  for (CIAndOrigins  : Imports) {
+Sources.push_back(

No need for curly braces here.



Comment at: tools/clang-import-test/clang-import-test.cpp:326
 "Errors occured while parsing the expression.", std::error_code());
   } else {
 return std::move(CI);

No need for the `else` here.



Comment at: tools/clang-import-test/clang-import-test.cpp:333
+  llvm::SmallVector Sources;
+  for (CIAndOrigins  : Imports) {
+Sources.push_back(

No need for curly braces here.



Comment at: tools/clang-import-test/clang-import-test.cpp:354
   exit(-1);
 } else {
   ImportCIs.push_back(std::move(*ImportCI));

No need for the `else` here.



Comment at: tools/clang-import-test/clang-import-test.cpp:365
   }
-  llvm::Expected ExpressionCI =
-  Parse(Expression, Direct ? ImportCIs : IndirectCIs, DumpAST, DumpIR);
+  if (UseOrigins) {
+for (auto  : ImportCIs) {

No need for braces in this entire block



Comment at: tools/clang-import-test/clang-import-test.cpp:376
 exit(-1);
   } else {
+Forget(*ExpressionCI, (Direct && !UseOrigins) ? ImportCIs : IndirectCIs);

No need for the `else` here.


https://reviews.llvm.org/D36589



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


[PATCH] D36589: Add support for remembering origins to ExternalASTMerger

2017-09-25 Thread Sean Callanan via Phabricator via cfe-commits
spyffe updated this revision to Diff 116405.
spyffe marked 18 inline comments as done.
spyffe added a subscriber: cfe-commits.
spyffe added a comment.

Updated to reflect Bruno's suggestions.

- Commented `ExternalASTMerger.h` extensively.
- Refactored the log into a pluggable `raw_ostream` that defaults to 
`llvm::nulls()`.
- Added comments per Bruno's requests
- Fixed some indentation
- Fixed some variable names and auto [*&] s
- Removed some commented-out code
- Cleaned up some curly braces


https://reviews.llvm.org/D36589

Files:
  include/clang/AST/ExternalASTMerger.h
  lib/AST/ExternalASTMerger.cpp
  lib/Sema/SemaType.cpp
  test/Import/extern-c-function/Inputs/F.cpp
  test/Import/extern-c-function/test.cpp
  test/Import/forward-declared-objc-class/Inputs/S1.m
  test/Import/forward-declared-objc-class/Inputs/S2.m
  test/Import/forward-declared-objc-class/Inputs/S3.m
  test/Import/forward-declared-objc-class/test.m
  test/Import/forward-declared-struct/Inputs/S3.c
  test/Import/forward-declared-struct/test.c
  test/Import/local-struct-use-origins/Inputs/Callee.cpp
  test/Import/local-struct-use-origins/test.cpp
  test/Import/local-struct/test.cpp
  test/Import/objc-definitions-in-expression/Inputs/S.m
  test/Import/objc-definitions-in-expression/test.m
  test/Import/struct-and-var/Inputs/S1.cpp
  test/Import/struct-and-var/Inputs/S2.cpp
  test/Import/struct-and-var/test.cpp
  test/Import/template/Inputs/T.cpp
  test/Import/template/test.cpp
  tools/clang-import-test/clang-import-test.cpp

Index: tools/clang-import-test/clang-import-test.cpp
===
--- tools/clang-import-test/clang-import-test.cpp
+++ tools/clang-import-test/clang-import-test.cpp
@@ -48,8 +48,12 @@
 
 static llvm::cl::opt
 Direct("direct", llvm::cl::Optional,
- llvm::cl::desc("Use the parsed declarations without indirection"));
+   llvm::cl::desc("Use the parsed declarations without indirection"));
 
+static llvm::cl::opt
+UseOrigins("use-origins", llvm::cl::Optional,
+   llvm::cl::desc("Use DeclContext origin information for more accurate lookups"));  
+
 static llvm::cl::list
 ClangArgs("Xcc", llvm::cl::ZeroOrMore,
   llvm::cl::desc("Argument to pass to the CompilerInvocation"),
@@ -60,13 +64,11 @@
   llvm::cl::desc("The language to parse (default: c++)"),
   llvm::cl::init("c++"));
 
-static llvm::cl::opt
-DumpAST("dump-ast", llvm::cl::init(false),
-llvm::cl::desc("Dump combined AST"));
+static llvm::cl::opt DumpAST("dump-ast", llvm::cl::init(false),
+   llvm::cl::desc("Dump combined AST"));
 
-static llvm::cl::opt
-DumpIR("dump-ir", llvm::cl::init(false),
-llvm::cl::desc("Dump IR from final parse"));
+static llvm::cl::opt DumpIR("dump-ir", llvm::cl::init(false),
+  llvm::cl::desc("Dump IR from final parse"));
 
 namespace init_convenience {
 class TestDiagnosticConsumer : public DiagnosticConsumer {
@@ -154,8 +156,7 @@
   }
 };
 
-std::unique_ptr
-BuildCompilerInstance() {
+std::unique_ptr BuildCompilerInstance() {
   auto Ins = llvm::make_unique();
   auto DC = llvm::make_unique();
   const bool ShouldOwnClient = true;
@@ -227,29 +228,48 @@
 } // end namespace
 
 namespace {
- 
-void AddExternalSource(
-CompilerInstance ,
-llvm::ArrayRef Imports) {
-  ExternalASTMerger::ImporterEndpoint Target({CI.getASTContext(), CI.getFileManager()});
-  llvm::SmallVector Sources;
-  for (const std::unique_ptr  : Imports) {
-Sources.push_back({CI->getASTContext(), CI->getFileManager()});
+
+struct CIAndOrigins {
+  using OriginMap = clang::ExternalASTMerger::OriginMap;
+  std::unique_ptr CI;
+
+  ASTContext () { return CI->getASTContext(); }
+  FileManager () { return CI->getFileManager(); }
+  const OriginMap () {
+static const OriginMap EmptyOriginMap;
+if (ExternalASTSource *Source = CI->getASTContext().getExternalSource())
+  return static_cast(Source)->GetOrigins();
+else
+  return EmptyOriginMap;
   }
+  DiagnosticConsumer () {
+return CI->getDiagnosticClient();
+  }
+  CompilerInstance () { return *CI; }
+};
+
+void AddExternalSource(CIAndOrigins ,
+   llvm::MutableArrayRef Imports) {
+  ExternalASTMerger::ImporterTarget Target(
+  {CI.getASTContext(), CI.getFileManager()});
+  llvm::SmallVector Sources;
+  for (CIAndOrigins  : Imports) {
+Sources.push_back(
+{Import.getASTContext(), Import.getFileManager(), Import.getOriginMap()});
+  }
   auto ES = llvm::make_unique(Target, Sources);
   CI.getASTContext().setExternalSource(ES.release());
   CI.getASTContext().getTranslationUnitDecl()->setHasExternalVisibleStorage();
 }
 
-std::unique_ptr BuildIndirect(std::unique_ptr ) {
-  std::unique_ptr IndirectCI =
-  init_convenience::BuildCompilerInstance();
+CIAndOrigins