Q:

running multiple clang passes

I have been using Tool.run(ToolAction) to run a clang tool.  If I want to run multiple tools on the same input source, do I just create different ToolActions and call Tool.run one after another?  Or do I somehow chain the ASTFrontendActions together? 

A:

It depends on what you want to achieve. 
If you want to parse once, and then do multiple things with AST you should better implement multiple ASTConsumers. 
Then you can create aggregate ASTConsumer:
class AggregateASTConsumer : public clang::ASTConsumer {

public:
    void HandleTranslationUnit(clang::ASTContext& Ctx) override {
         for (auto consumer: consumers)
              consumer. HandleTranslationUnit(Ctx);

    }
    std::vector<ASTConsumer*> consumers;
}

But if you want to re-parse input source code with some different options then you should run tool multiple times.