initial support for clang compiler plugins
The plugin is intentionally built using a custom Makefile, because it's used by gbuild, so I don't want to build the plugin using gbuild too. It is also intentionally not placed under workdir/, as that is cleaned by 'make clean', the plugin is cleaned only by 'make distclean', so that cleaning it doesn't cause ccache misses. No actual functionality in the plugin itself yet. Change-Id: Ic05eba8d6260eec123c9e699eb5385abfe1b832f
This commit is contained in:
68
compilerplugins/clang/compileplugin.cxx
Normal file
68
compilerplugins/clang/compileplugin.cxx
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* Based on LLVM/Clang.
|
||||
*
|
||||
* This file is distributed under the University of Illinois Open Source
|
||||
* License. See LICENSE.TXT for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "compileplugin.hxx"
|
||||
|
||||
#include <clang/AST/ASTConsumer.h>
|
||||
#include <clang/AST/ASTContext.h>
|
||||
#include <clang/Frontend/CompilerInstance.h>
|
||||
#include <clang/Frontend/FrontendAction.h>
|
||||
#include <clang/Frontend/FrontendPluginRegistry.h>
|
||||
#include <clang/Rewrite/Rewriter.h>
|
||||
|
||||
using namespace clang;
|
||||
|
||||
namespace loplugin
|
||||
{
|
||||
|
||||
/**
|
||||
Class that manages all LO modules.
|
||||
*/
|
||||
class PluginHandler
|
||||
: public ASTConsumer
|
||||
{
|
||||
public:
|
||||
explicit PluginHandler( ASTContext& context )
|
||||
: rewriter( context.getSourceManager(), context.getLangOpts())
|
||||
{
|
||||
}
|
||||
virtual void HandleTranslationUnit( ASTContext& context )
|
||||
{
|
||||
if( context.getDiagnostics().hasErrorOccurred())
|
||||
return;
|
||||
// TODO also LO header files? or a subdir?
|
||||
if( const RewriteBuffer* buf = rewriter.getRewriteBufferFor( context.getSourceManager().getMainFileID()))
|
||||
buf->write( llvm::outs());
|
||||
// TODO else write out the original file?
|
||||
}
|
||||
private:
|
||||
Rewriter rewriter;
|
||||
};
|
||||
|
||||
/**
|
||||
The Clang plugin class, just forwards to PluginHandler.
|
||||
*/
|
||||
class LibreOfficeAction
|
||||
: public PluginASTAction
|
||||
{
|
||||
public:
|
||||
virtual ASTConsumer* CreateASTConsumer( CompilerInstance& Compiler, StringRef InFile )
|
||||
{
|
||||
return new PluginHandler( Compiler.getASTContext());
|
||||
}
|
||||
virtual bool ParseArgs( const CompilerInstance& CI, const std::vector< std::string >& args )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
static FrontendPluginRegistry::Add< loplugin::LibreOfficeAction > X( "loplugin", "LibreOffice compile check plugin" );
|
14
compilerplugins/clang/compileplugin.hxx
Normal file
14
compilerplugins/clang/compileplugin.hxx
Normal file
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* Based on LLVM/Clang.
|
||||
*
|
||||
* This file is distributed under the University of Illinois Open Source
|
||||
* License. See LICENSE.TXT for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef COMPILEPLUGIN_H
|
||||
#define COMPILEPLUGIN_H
|
||||
|
||||
#endif // COMPILEPLUGIN_H
|
Reference in New Issue
Block a user