[PATCH] D43341: [clang-doc] Implement reducer portion of the frontend framework

Eric Liu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri May 25 03:42:54 PDT 2018


ioeric added a comment.

The reduce logic seems to be in a good shape. Some nits and questions inlined.



================
Comment at: clang-doc/Reducer.cpp:19
+
+#define REDUCE(INFO)                                                           \
+  {                                                                            \
----------------
It seems that you could use a template function? 


================
Comment at: clang-doc/Reducer.cpp:24
+    for (auto &I : Values) {                                                   \
+      if (!Tmp->merge(std::move(*static_cast<INFO *>(I.get()))))               \
+        return nullptr;                                                        \
----------------
Do we really want to give up all infos when one bad info/merge is present?


================
Comment at: clang-doc/Representation.h:138
+  SymbolID USR =
+      SymbolID(); // Unique identifier for the decl described by this Info.
+  const InfoType IT = InfoType::IT_default; // InfoType of this particular Info.
----------------
Shouldn't USR be `SymbolID()` by default?


================
Comment at: clang-doc/Representation.h:146
+protected:
+  bool mergeBase(Info &&I);
 };
----------------
It's a bit awkward that users have to dispatch from info types to the corresponding `merge` function (as in `Reducer.cpp`). I think it would make users' life easier if the library handles the dispatching.

I wonder if something like the following would be better:
```
struct Info {
    std::unique_ptr<Info> merge(const Indo& LHS, const Info& RHS);
};
// A standalone function.
std::unique_ptr<Info> mergeInfo(const Info &LHS, const Info& RHS) {
  // merge base info.
  ...
  // merge subclass infos.
  assert(LHS.IT == RHS.IT); // or return nullptr
  switch (LHS.IT) {
   ... 
    return Namespace::merge(LHS, RHS);
  } 
}

struct NamespaceInfo : public Info {
  std::unique_ptr<Info> merge(LHS, RHS);
};

```

The unhandled switch case warning in compiler would help you catch unimplemented `merge` when new info types are added.


================
Comment at: clang-doc/tool/ClangDocMain.cpp:60
 
+static llvm::cl::opt<bool>
+    DumpResult("dump",
----------------
If this only dumps the intermediate results, should we call it something like `dump-intermediate` instead, to avoid confusion with final results?


================
Comment at: clang-doc/tool/ClangDocMain.cpp:148
+        });
+    return Err;
+  }
----------------
Print an error message on error?


================
Comment at: clang-doc/tool/ClangDocMain.cpp:154
+  llvm::StringMap<std::vector<std::unique_ptr<doc::Info>>> MapOutput;
+  Exec->get()->getToolResults()->forEachResult([&](StringRef Key,
+                                                   StringRef Value) {
----------------
Could you add a brief comment explaining what key and value are?


================
Comment at: clang-doc/tool/ClangDocMain.cpp:161
+    for (auto &I : Infos) {
+      llvm::errs() << "COLLECT: " << llvm::toHex(llvm::toStringRef(I->USR))
+                   << ": " << I->Name << "\n";
----------------
nit: remove debug logging?


================
Comment at: clang-doc/tool/ClangDocMain.cpp:170
+  // Reducing phase
+  llvm::outs() << "Reducing infos...\n";
+  for (auto &Group : MapOutput) {
----------------
nit: maybe also output the number of entries collected in the map?


================
Comment at: clang-doc/tool/ClangDocMain.cpp:181
+        doc::writeInfo(I.get(), Buffer);
+      if (DumpResultToFile("bc", Group.getKey() + ".bc", Buffer))
+        return 1;
----------------
(Sorry that I might be missing context here.)

Could you please explain the incentive for dumping each info group to one bc file? If the key identifies a symbol (e.g. USR), wouldn't this result in a bitcode file being created for each symbol? This doesn't seem very scalable.  


https://reviews.llvm.org/D43341





More information about the cfe-commits mailing list