Kaydet (Commit) b39e627b authored tarafından Pranav Kant's avatar Pranav Kant Kaydeden (comit) pranavk

Allow compiler plugins for online

Change-Id: I8e45936ef5675d531be71496e8894b90eaf2f6e2
Reviewed-on: https://gerrit.libreoffice.org/46769Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarpranavk <pranavk@collabora.co.uk>
üst ed29dc6b
......@@ -18,6 +18,8 @@
#include <clang/Basic/FileManager.h>
#include <clang/Lex/Lexer.h>
#include <llvm/Support/Path.h>
#include "pluginhandler.hxx"
/*
......@@ -618,10 +620,20 @@ bool hasPathnamePrefix(StringRef pathname, StringRef prefix)
[](StringRef p, StringRef a) { return p.startswith(a); });
}
std::string getAbsolutePath(StringRef path)
{
llvm::SmallString<1024> absPath(path);
llvm::sys::fs::make_absolute(absPath);
llvm::sys::path::remove_dots(absPath, true);
return absPath.str().str();
}
bool isSamePathname(StringRef pathname, StringRef other)
{
std::string absPathname = getAbsolutePath(pathname);
std::string absOther = getAbsolutePath(other);
return checkPathname(
pathname, other, [](StringRef p, StringRef a) { return p == a; });
absPathname, absOther, [](StringRef p, StringRef a) { return p == a; });
}
} // namespace
......
......@@ -79,6 +79,7 @@ protected:
bool isInUnoIncludeFile(const FunctionDecl*) const;
bool isDebugMode() const { return handler.isDebugMode(); }
bool isLOOLMode() const { return handler.isLOOLMode(); }
static bool isUnitTestMode();
......@@ -228,6 +229,9 @@ void normalizeDotDotInFilePath(std::string&);
// prefix may also contain backslashes:
bool hasPathnamePrefix(StringRef pathname, StringRef prefix);
// get the absolute path for a given path
std::string getAbsolutePath(StringRef path);
// Same as pathname == other, except on Windows, where pathname and other may
// also contain backslashes:
bool isSamePathname(StringRef pathname, StringRef other);
......
......@@ -18,6 +18,7 @@
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/FrontendPluginRegistry.h>
#include <clang/Lex/PPCallbacks.h>
#include <stdio.h>
#if defined _WIN32
......@@ -116,6 +117,8 @@ void PluginHandler::handleOption( const std::string& option )
unitTestMode = true;
else if (option == "debug")
debugMode = true;
else if ( option.substr(0, 15) == "lool-base-path=" )
loolBasePath = option.substr(15);
else
report( DiagnosticsEngine::Fatal, "unknown option %0" ) << option;
}
......@@ -193,7 +196,7 @@ bool PluginHandler::checkIgnoreLocation(SourceLocation loc)
if( compiler.getSourceManager().isInSystemHeader( expansionLoc ))
return true;
const char* bufferName = compiler.getSourceManager().getPresumedLoc( expansionLoc ).getFilename();
if (bufferName == NULL
if (bufferName == nullptr
|| hasPathnamePrefix(bufferName, SRCDIR "/external/")
|| isSamePathname(bufferName, SRCDIR "/sdext/source/pdfimport/wrapper/keyword_list") )
// workdir/CustomTarget/sdext/pdfimport/hash.cxx is generated from
......@@ -222,6 +225,11 @@ bool PluginHandler::checkIgnoreLocation(SourceLocation loc)
if (hasPathnamePrefix(s, WORKDIR))
return true;
}
if ( isLOOLMode() ) {
std::string absPath = getAbsolutePath(bufferName);
if ( StringRef(absPath).startswith(loolBasePath) )
return false;
}
if( hasPathnamePrefix(bufferName, BUILDDIR)
|| hasPathnamePrefix(bufferName, SRCDIR) )
return false; // ok
......@@ -277,6 +285,12 @@ void PluginHandler::HandleTranslationUnit( ASTContext& context )
pathWarning = "modified source in build dir : %0";
else if( name.startswith(SRCDIR "/") )
; // ok
else if ( isLOOLMode() )
{
std::string absPath = getAbsolutePath(name);
if ( !StringRef(absPath).startswith(loolBasePath) )
bSkip = true;
}
else
{
pathWarning = "modified source in unknown location, not modifying : %0";
......
......@@ -56,6 +56,7 @@ public:
bool ignoreLocation(SourceLocation loc);
bool addRemoval( SourceLocation loc );
bool isDebugMode() const { return debugMode; }
bool isLOOLMode() const { return !loolBasePath.empty(); }
static bool isUnitTestMode();
private:
void handleOption( const std::string& option );
......@@ -69,6 +70,7 @@ private:
std::set< SourceLocation > removals;
std::string scope;
std::string warningsOnly;
std::string loolBasePath;
bool warningsAsErrors;
bool debugMode = false;
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment