Add LLVM-pass plugin support to LDC. Commandline flag: -plugin=.... (#2554)

This adds functionality to load plugins such as the AFL llvm-mode plugin: https://github.com/mirrorer/afl/blob/master/llvm_mode/afl-llvm-pass.so.cc
Note that such plugins developed for Clang should also work for LDC !
This commit is contained in:
Johan Engelen 2018-02-13 20:22:48 +01:00 committed by GitHub
parent b22d8cccf3
commit 16ecb3e79f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 196 additions and 0 deletions

48
driver/plugins.cpp Normal file
View file

@ -0,0 +1,48 @@
//===-- driver/plugins.cpp -------------------------------------*- C++ -*-===//
//
// LDC the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
//
// Implements functionality related to plugins (`-plugin=...`).
//
//===----------------------------------------------------------------------===//
#include "driver/plugins.h"
#if LDC_ENABLE_PLUGINS
#include "errors.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/DynamicLibrary.h"
namespace {
namespace cl = llvm::cl;
cl::list<std::string>
pluginFiles("plugin", cl::CommaSeparated, cl::desc("Plugins to load."),
cl::value_desc("<dynamic_library.so, lib2.so>"));
} // anonymous namespace
/// Loads all plugins. The static constructor of each plugin should take care of
/// the plugins registering themself with the rest of LDC/LLVM.
void loadAllPlugins() {
for (auto &filename : pluginFiles) {
std::string errorString;
if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(filename.c_str(),
&errorString)) {
error(Loc(), "Error loading plugin '%s': %s", filename.c_str(),
errorString.c_str());
}
}
}
#else // #if LDC_ENABLE_PLUGINS
void loadAllPlugins() {}
#endif // LDC_ENABLE_PLUGINS