#include #include #include struct OutputFilenames { std::string host; std::string guest; }; class AnalyzeDataLayoutActionFactory : public clang::tooling::FrontendActionFactory { std::unique_ptr abi; public: AnalyzeDataLayoutActionFactory(); ~AnalyzeDataLayoutActionFactory(); std::unique_ptr create() override; const ABI& GetDataLayout() { return *abi; } std::unique_ptr TakeDataLayout() { return std::move(abi); } }; class DataLayoutCompareActionFactory : public clang::tooling::FrontendActionFactory { const ABI& abi; public: DataLayoutCompareActionFactory(const ABI&); ~DataLayoutCompareActionFactory(); std::unique_ptr create() override; }; class GenerateThunkLibsActionFactory : public clang::tooling::ToolAction { public: GenerateThunkLibsActionFactory(std::string_view libname_, OutputFilenames output_filenames_, const ABI& abi_) : libname(std::move(libname_)) , output_filenames(std::move(output_filenames_)) , abi(abi_) {} bool runInvocation(std::shared_ptr Invocation, clang::FileManager* Files, std::shared_ptr PCHContainerOps, clang::DiagnosticConsumer* DiagConsumer) override; private: std::string libname; OutputFilenames output_filenames; const ABI& abi; };