Created
June 24, 2016 10:38
-
-
Save xaxxon/a6db02c1c00b5f9ee417de1f39260af5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
How I build: | |
$HOME/Downloads/clang+llvm-3.8.0-x86_64-apple-darwin/bin/clang++ \ | |
-fno-rtti -O0 -g \ | |
-I/Users/xaxxon/Downloads/clang+llvm-3.8.0-x86_64-apple-darwin/include \ | |
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/ \ | |
-fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual \ | |
-Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -Wnon-virtual-dtor \ | |
-Wdelete-non-virtual-dtor -Werror=date-time -std=c++11 -O3 -DNDEBUG -fno-exceptions -fno-rtti \ | |
-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS \ | |
class_parser.cpp \ | |
`$HOME/Downloads/clang+llvm-3.8.0-x86_64-apple-darwin//bin/llvm-config --ldflags --libs --system-libs` \ | |
-dynamiclib -o class_parser.dylib\ | |
\ | |
\ | |
-l LLVMAArch64AsmParser \ | |
-l clangFrontend \ | |
-L/Users/xaxxon/Downloads/clang+llvm-3.8.0-x86_64-apple-darwin/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names \ | |
-lclangFrontend \ | |
-lLLVMLTO -lclangSerialization -lclangASTMatchers -lclangSema -lclangAnalysis -lclangRewriteFrontend -lclangEdit -lclangParse -lclangFrontend -lclangBasic -lclangDriver -lclangAST -lclangLex -lLLVMObjCARCOpts -lLLVMSymbolize -lLLVMDebugInfoPDB -lLLVMDebugInfoDWARF -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen -lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMXCoreAsmPrinter -lLLVMSystemZDisassembler -lLLVMSystemZCodeGen -lLLVMSystemZAsmParser -lLLVMSystemZDesc -lLLVMSystemZInfo -lLLVMSystemZAsmPrinter -lLLVMSparcDisassembler -lLLVMSparcCodeGen -lLLVMSparcAsmParser -lLLVMSparcDesc -lLLVMSparcInfo -lLLVMSparcAsmPrinter -lLLVMPowerPCDisassembler -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMPowerPCAsmPrinter -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMNVPTXAsmPrinter -lLLVMMSP430CodeGen -lLLVMMSP430Desc -lLLVMMSP430Info -lLLVMMSP430AsmPrinter -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter -lLLVMHexagonDisassembler -lLLVMHexagonCodeGen -lLLVMHexagonAsmParser -lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMBPFCodeGen -lLLVMBPFDesc -lLLVMBPFInfo -lLLVMBPFAsmPrinter -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMAMDGPUCodeGen -lLLVMAMDGPUAsmParser -lLLVMAMDGPUDesc -lLLVMAMDGPUUtils -lLLVMAMDGPUInfo -lLLVMAMDGPUAsmPrinter -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMMIRParser -lLLVMLibDriver -lLLVMOption -lLLVMTableGen -lLLVMLineEditor -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMPasses -lLLVMipo -lLLVMVectorize -lLLVMLinker -lLLVMIRReader -lLLVMAsmParser -lLLVMDebugInfoCodeView -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMInstrumentation -lLLVMProfileData -lLLVMBitWriter -lLLVMOrcJIT -lLLVMTransformUtils -lLLVMExecutionEngine -lLLVMTarget -lLLVMAnalysis -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMMC -lLLVMCore -lLLVMSupport \ | |
-lcurses -lpthread -lz -lm \ | |
how I run: | |
$HOME/Downloads/clang+llvm-3.8.0-x86_64-apple-darwin/bin/clang++ \ | |
-D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS \ | |
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D_GNU_SOURCE \ | |
-I$BD/tools/clang/include -Itools/clang/include -I$BD/include -Iinclude \ | |
sample.cpp \ | |
-fsyntax-only \ | |
-Xclang -load \ | |
-Xclang class_parser.dylib \ | |
-Xclang -plugin \ | |
-Xclang print-fns | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://github.com/eliben/llvm-clang-samples/blob/master/src_clang/matchers_rewriter.cpp | |
// http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html | |
// http://clang.llvm.org/docs/LibASTMatchersReference.html | |
#include "clang/Frontend/FrontendPluginRegistry.h" | |
#include "clang/AST/AST.h" | |
#include "clang/AST/ASTConsumer.h" | |
#include "clang/ASTMatchers/ASTMatchers.h" | |
#include "clang/ASTMatchers/ASTMatchFinder.h" | |
#include "clang/Frontend/CompilerInstance.h" | |
#include "clang/Frontend/FrontendActions.h" | |
#include "clang/Tooling/CommonOptionsParser.h" | |
#include "clang/Tooling/Tooling.h" | |
#include "clang/Rewrite/Core/Rewriter.h" | |
#include "llvm/Support/raw_ostream.h" | |
using namespace clang; | |
using namespace clang::ast_matchers; | |
using namespace clang::driver; | |
using namespace clang::tooling; | |
namespace { | |
class ClassHandler : public MatchFinder::MatchCallback { | |
public: | |
ClassHandler() = default; | |
virtual void run(const MatchFinder::MatchResult &Result) { | |
printf("HI\n"); | |
if (const CXXRecordDecl * klass = Result.Nodes.getNodeAs<clang::CXXRecordDecl>("class")) { | |
if (dyn_cast<NamedDecl>(klass)) { | |
auto named_class = dyn_cast<NamedDecl>(klass); | |
printf("It has a name: %s\n", named_class->getQualifiedNameAsString().c_str()); | |
} | |
printf("from the inside\n"); | |
} | |
} | |
}; | |
class MyASTConsumer : public ASTConsumer { | |
public: | |
MyASTConsumer() { | |
Matcher.addMatcher(cxxRecordDecl(isStruct()).bind("class"), | |
&HandlerForClass); | |
} | |
void HandleTranslationUnit(ASTContext &Context) override { | |
// Run the matchers when we have the whole TU parsed. | |
Matcher.matchAST(Context); | |
} | |
private: | |
ClassHandler HandlerForClass; | |
MatchFinder Matcher; | |
}; | |
// This is the class that is registered with LLVM. PluginASTAction is-a ASTFrontEndAction | |
class PrintFunctionNamesAction : public PluginASTAction { | |
protected: | |
// The value returned here is used internally to run checks against | |
std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, | |
llvm::StringRef) { | |
return llvm::make_unique<MyASTConsumer>(); | |
} | |
bool ParseArgs(const CompilerInstance &CI, | |
const std::vector<std::string> &args) { | |
for (unsigned i = 0, e = args.size(); i != e; ++i) { | |
llvm::errs() << "PrintFunctionNames arg = " << args[i] << "\n"; | |
// Example error handling. | |
if (args[i] == "-an-error") { | |
DiagnosticsEngine &D = CI.getDiagnostics(); | |
unsigned DiagID = D.getCustomDiagID(DiagnosticsEngine::Error, | |
"invalid argument '%0'"); | |
D.Report(DiagID) << args[i]; | |
return false; | |
} | |
} | |
if (args.size() && args[0] == "help") | |
PrintHelp(llvm::errs()); | |
return true; | |
} | |
void PrintHelp(llvm::raw_ostream &ros) { | |
ros << "Help for PrintFunctionNames plugin goes here\n"; | |
} | |
}; | |
} | |
static FrontendPluginRegistry::Add<PrintFunctionNamesAction> | |
X("print-fns", "print function names"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment