summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2017-09-27 16:08:59 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2017-09-29 10:37:47 +0200
commita599eeab786ecbe1b5b6509e3c792e5c1ba31248 (patch)
tree73e530ebe30d10eb61856b7c7986ce87eb9705e3 /compilerplugins
parent26c82bd286e2331188db853d41f7a575d906b62c (diff)
check for unnecessary DLLPUBLIC annotations
on classes which are fully defined in a header file Rename the dllprivate plugin to dllmacro and add the functionality there. Change-Id: I4581d551c46a8f61213d95973f323359d08278d8
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/dllmacro.cxx111
-rw-r--r--compilerplugins/clang/dllprivate.cxx79
2 files changed, 111 insertions, 79 deletions
diff --git a/compilerplugins/clang/dllmacro.cxx b/compilerplugins/clang/dllmacro.cxx
new file mode 100644
index 000000000000..538203f88942
--- /dev/null
+++ b/compilerplugins/clang/dllmacro.cxx
@@ -0,0 +1,111 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "plugin.hxx"
+#include <iostream>
+#include <fstream>
+
+/**
+ Check the usage of the various DLL visibility macros.
+ */
+class DllMacro final:
+ public RecursiveASTVisitor<DllMacro>, public loplugin::Plugin
+{
+public:
+ explicit DllMacro(InstantiationData const & data): Plugin(data) {}
+
+ bool VisitNamedDecl(NamedDecl const * decl);
+
+private:
+ void run() override {
+ // DISABLE_DYNLOADING makes SAL_DLLPUBLIC_{EXPORT,IMPORT,TEMPLATE} expand
+ // to visibility("hidden") attributes, which would cause bogus warnings
+ // here (e.g., in UBSan builds that explicitly define DISABLE_DYNLOADING
+ // in jurt/source/pipe/staticsalhack.cxx); alternatively, change
+ // include/sal/types.h to make those SAL_DLLPUBLIC_* expand to nothing
+ // for DISABLE_DYNLOADING:
+ if (!compiler.getPreprocessor().getIdentifierInfo("DISABLE_DYNLOADING")
+ ->hasMacroDefinition())
+ {
+ TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+ }
+ }
+};
+
+bool DllMacro::VisitNamedDecl(NamedDecl const * decl) {
+ if (!decl->getLocation().isInvalid() && ignoreLocation(decl)) {
+ return true;
+ }
+ auto a = decl->getAttr<VisibilityAttr>();
+ if (a == nullptr) {
+ return true;
+ }
+ if (compiler.getSourceManager().isMacroBodyExpansion(
+ decl->getLocation())
+ && (Lexer::getImmediateMacroName(
+ decl->getLocation(), compiler.getSourceManager(),
+ compiler.getLangOpts())
+ == "Q_OBJECT")) // from /usr/include/QtCore/qobjectdefs.h
+ {
+ return true;
+ }
+ if (a->getVisibility() == VisibilityAttr::Hidden) {
+ auto p = dyn_cast<RecordDecl>(decl->getDeclContext());
+ if (p == nullptr) {
+ report(
+ DiagnosticsEngine::Warning,
+ "top-level declaration redundantly marked as DLLPRIVATE",
+ a->getLocation())
+ << decl->getSourceRange();
+ } else if (p->getVisibility() == HiddenVisibility) {
+ report(
+ DiagnosticsEngine::Warning,
+ ("declaration nested in DLLPRIVATE declaration redundantly"
+ " marked as DLLPRIVATE"),
+ a->getLocation())
+ << decl->getSourceRange();
+ report(
+ DiagnosticsEngine::Note, "parent declaration is here",
+ p->getLocation())
+ << p->getSourceRange();
+ }
+ }
+ else if (a->getVisibility() == VisibilityAttr::Default) {
+ auto p = dyn_cast<CXXRecordDecl>(decl);
+ if (p && p->isCompleteDefinition() && !p->getDescribedClassTemplate()) {
+ // don't know what these macros mean, leave them alone
+ auto macroLoc = a->getLocation();
+ while (compiler.getSourceManager().isMacroBodyExpansion(macroLoc)) {
+ auto macroName = Lexer::getImmediateMacroName(
+ macroLoc, compiler.getSourceManager(),
+ compiler.getLangOpts());
+ if (macroName == "SAL_EXCEPTION_DLLPUBLIC_EXPORT")
+ return true;
+ if (macroName == "VCL_PLUGIN_PUBLIC")
+ return true;
+ macroLoc = compiler.getSourceManager().getImmediateMacroCallerLoc(macroLoc);
+ }
+ for (auto it = p->method_begin(); it != p->method_end(); ++it) {
+ if (!it->hasInlineBody()) {
+ return true;
+ }
+ }
+ report(
+ DiagnosticsEngine::Warning,
+ "unnecessary *DLLPUBLIC declaration for class completely defined in header file",
+ a->getLocation())
+ << decl->getSourceRange();
+ }
+ }
+ return true;
+}
+
+static loplugin::Plugin::Registration<DllMacro> reg("dllmacro");
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/compilerplugins/clang/dllprivate.cxx b/compilerplugins/clang/dllprivate.cxx
deleted file mode 100644
index 05cf26d7d5d2..000000000000
--- a/compilerplugins/clang/dllprivate.cxx
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#include "plugin.hxx"
-
-namespace {
-
-class Visitor final:
- public RecursiveASTVisitor<Visitor>, public loplugin::Plugin
-{
-public:
- explicit Visitor(InstantiationData const & data): Plugin(data) {}
-
- bool VisitNamedDecl(NamedDecl const * decl) {
- if (!decl->getLocation().isInvalid()&&ignoreLocation(decl)) {
- return true;
- }
- auto a = decl->getAttr<VisibilityAttr>();
- if (a == nullptr || a->getVisibility() != VisibilityAttr::Hidden) {
- return true;
- }
- if (compiler.getSourceManager().isMacroBodyExpansion(
- decl->getLocation())
- && (Lexer::getImmediateMacroName(
- decl->getLocation(), compiler.getSourceManager(),
- compiler.getLangOpts())
- == "Q_OBJECT")) // from /usr/include/QtCore/qobjectdefs.h
- {
- return true;
- }
- auto p = dyn_cast<RecordDecl>(decl->getDeclContext());
- if (p == nullptr) {
- report(
- DiagnosticsEngine::Warning,
- "top-level declaration redundantly marked as DLLPRIVATE",
- a->getLocation())
- << decl->getSourceRange();
- } else if (p->getVisibility() == HiddenVisibility) {
- report(
- DiagnosticsEngine::Warning,
- ("declaration nested in DLLPRIVATE declaration redundantly"
- " marked as DLLPRIVATE"),
- a->getLocation())
- << decl->getSourceRange();
- report(
- DiagnosticsEngine::Note, "parent declaration is here",
- p->getLocation())
- << p->getSourceRange();
- }
- return true;
- }
-
-private:
- void run() override {
- // DISABLE_DYNLOADING makes SAL_DLLPUBLIC_{EXPORT,IMPORT,TEMPLATE} expand
- // to visibility("hidden") attributes, which would cause bogus warnings
- // here (e.g., in UBSan builds that explicitly define DISABLE_DYNLOADING
- // in jurt/source/pipe/staticsalhack.cxx); alternatively, change
- // include/sal/types.h to make those SAL_DLLPUBLIC_* expand to nothing
- // for DISABLE_DYNLOADING:
- if (!compiler.getPreprocessor().getIdentifierInfo("DISABLE_DYNLOADING")
- ->hasMacroDefinition())
- {
- TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
- }
- }
-};
-
-static loplugin::Plugin::Registration<Visitor> reg("dllprivate");
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */