Skip to content

Commit 53c7a02

Browse files
LLVM Docker
1 parent 86c0a32 commit 53c7a02

19 files changed

+1847
-20
lines changed

ClangAST/src/astVisitor.cpp

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@ class FindNamedClassVisitor
1717
public:
1818
explicit FindNamedClassVisitor(ASTContext *Context) : Context(Context) {}
1919

20-
// bool VisitIfStmt(IfStmt *S) {
21-
// llvm::outs() << "If Condition : ";
22-
// if (S)
23-
// VisitDecl(S->getConditionVariable());
24-
// return true;
25-
// }
20+
bool VisitIfStmt(IfStmt *S) {
21+
llvm::outs() << "If Condition : ";
22+
if (S)
23+
VisitDecl(S->getConditionVariable());
24+
return true;
25+
}
2626

27-
// bool VisitWhileStmt(WhileStmt *S) {
28-
// llvm::outs() << "While Condition : ";
29-
// if (S)
30-
// VisitDecl(S->getConditionVariable());
31-
// return true;
32-
// }
27+
bool VisitWhileStmt(WhileStmt *S) {
28+
llvm::outs() << "While Condition : ";
29+
if (S)
30+
VisitDecl(S->getConditionVariable());
31+
return true;
32+
}
3333

3434
// Declaration Visitor
3535
bool VisitDecl(clang::Decl *Declaration) {
@@ -38,14 +38,14 @@ class FindNamedClassVisitor
3838
}
3939

4040
// Statement Visitor
41-
// bool VisitStmt(Stmt *s) {
42-
// s->dump();
43-
// for (Stmt::child_iterator C = s->child_begin(), CEnd = s->child_end();
44-
// C != CEnd; ++C)
45-
// if (*C)
46-
// VisitStmt(*C);
47-
// return true;
48-
// }
41+
bool VisitStmt(Stmt *s) {
42+
s->dump();
43+
for (Stmt::child_iterator C = s->child_begin(), CEnd = s->child_end();
44+
C != CEnd; ++C)
45+
if (*C)
46+
VisitStmt(*C);
47+
return true;
48+
}
4949

5050
private:
5151
ASTContext *Context;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
\begin{Verbatim}[commandchars=\\\{\}]
2+
\PYG{k}{class} \PYG{n+nc}{ClassVisitor}
3+
\PYG{o}{:} \PYG{k}{public} \PYG{n}{RecursiveASTVisitor}\PYG{o}{\PYGZlt{}}\PYG{n}{ClassVisitor}\PYG{o}{\PYGZgt{}} \PYG{p}{\PYGZob{}}
4+
\PYG{k}{public}\PYG{o}{:}
5+
\PYG{k}{explicit} \PYG{n}{FindNamedClassVisitor}\PYG{p}{(}\PYG{n}{ASTContext} \PYG{o}{*}\PYG{n}{Context}\PYG{p}{)}
6+
\PYG{o}{:} \PYG{n}{Context}\PYG{p}{(}\PYG{n}{Context}\PYG{p}{)} \PYG{p}{\PYGZob{}\PYGZcb{}}
7+
8+
\PYG{k+kt}{bool} \PYG{n}{VisitWhileStmt}\PYG{p}{(}\PYG{n}{WhileStmt} \PYG{o}{*}\PYG{n}{S}\PYG{p}{)} \PYG{p}{\PYGZob{}}
9+
\PYG{n}{llvm}\PYG{o}{::}\PYG{n}{outs}\PYG{p}{()} \PYG{o}{\PYGZlt{}\PYGZlt{}} \PYG{l+s}{\PYGZdq{}While Condition : \PYGZdq{}}\PYG{p}{;}
10+
\PYG{k}{if} \PYG{p}{(}\PYG{n}{S}\PYG{p}{)}
11+
\PYG{n}{VisitDecl}\PYG{p}{(}\PYG{n}{S}\PYG{o}{\PYGZhy{}\PYGZgt{}}\PYG{n}{getConditionVariable}\PYG{p}{());}
12+
\PYG{k}{return} \PYG{n+nb}{true}\PYG{p}{;}
13+
\PYG{p}{\PYGZcb{}}
14+
\PYG{c+cp}{\PYGZsh{} ... More Visit Logic.}
15+
\PYG{k+kt}{bool} \PYG{n}{VisitDecl}\PYG{p}{(}\PYG{n}{clang}\PYG{o}{::}\PYG{n}{Decl} \PYG{o}{*}\PYG{n}{Declaration}\PYG{p}{)} \PYG{p}{\PYGZob{}}
16+
\PYG{n}{Declaration}\PYG{o}{\PYGZhy{}\PYGZgt{}}\PYG{n}{dump}\PYG{p}{();}
17+
\PYG{k}{return} \PYG{n+nb}{true}\PYG{p}{;}
18+
\PYG{p}{\PYGZcb{}}
19+
20+
\PYG{k}{private}\PYG{o}{:}
21+
\PYG{n}{ASTContext} \PYG{o}{*}\PYG{n}{Context}\PYG{p}{;}
22+
\PYG{p}{\PYGZcb{};}
23+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
\begin{Verbatim}[commandchars=\\\{\}]
2+
\PYG{k}{class} \PYG{n+nc}{ClassAction} \PYG{o}{:} \PYG{k}{public} \PYG{n}{clang}\PYG{o}{::}\PYG{n}{ASTFrontendAction} \PYG{p}{\PYGZob{}}
3+
\PYG{k}{public}\PYG{o}{:}
4+
\PYG{c+cp}{\PYGZsh{} returns a uniq ptr to your consumer.}
5+
\PYG{k}{virtual} \PYG{n}{std}\PYG{o}{::}\PYG{n}{unique\PYGZus{}ptr}\PYG{o}{\PYGZlt{}}\PYG{n}{clang}\PYG{o}{::}\PYG{n}{ASTConsumer}\PYG{o}{\PYGZgt{}}
6+
\PYG{n}{CreateASTConsumer}\PYG{p}{(}\PYG{n}{clang}\PYG{o}{::}\PYG{n}{CompilerInstance} \PYG{o}{\PYGZam{}}\PYG{n}{Compiler}\PYG{p}{,}
7+
\PYG{n}{llvm}\PYG{o}{::}\PYG{n}{StringRef} \PYG{n}{InFile}\PYG{p}{)} \PYG{p}{\PYGZob{}}
8+
\PYG{k}{return}
9+
\PYG{c+cp}{\PYGZsh{} Instantiate your consumer.}
10+
\PYG{n}{std}\PYG{o}{::}\PYG{n}{make\PYGZus{}unique}\PYG{o}{\PYGZlt{}}\PYG{n}{ClassConsumer}\PYG{o}{\PYGZgt{}}\PYG{p}{(}
11+
\PYG{o}{\PYGZam{}}\PYG{n}{Compiler}\PYG{p}{.}\PYG{n}{getASTContext}\PYG{p}{()}
12+
\PYG{p}{);}
13+
\PYG{p}{\PYGZcb{}}
14+
\PYG{p}{\PYGZcb{};}
15+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
\begin{Verbatim}[commandchars=\\\{\}]
2+
\PYG{k+kt}{int} \PYG{n+nf}{retsum}\PYG{p}{(}\PYG{k+kt}{int} \PYG{n}{a}\PYG{p}{,} \PYG{k+kt}{int} \PYG{n}{b}\PYG{p}{)} \PYG{p}{\PYGZob{}}
3+
\PYG{k}{return} \PYG{n}{a} \PYG{o}{+} \PYG{n}{b}\PYG{p}{;}
4+
\PYG{p}{\PYGZcb{}}
5+
\PYG{c+cp}{\PYGZsh{} clang \PYGZhy{}S \PYGZhy{}emit\PYGZhy{}llvm code.cpp \PYGZhy{}O0 \PYGZhy{}o code.ll}
6+
\PYG{p}{;} \PYG{n}{ModuleID} \PYG{o}{=} \PYG{err}{\PYGZsq{}}\PYG{n}{test}\PYG{p}{.}\PYG{n}{cc}\PYG{err}{\PYGZsq{}}
7+
\PYG{n}{source\PYGZus{}filename} \PYG{o}{=} \PYG{l+s}{\PYGZdq{}test.cc\PYGZdq{}}
8+
\PYG{n}{target} \PYG{n}{datalayout} \PYG{o}{=} \PYG{l+s}{\PYGZdq{}e\PYGZhy{}m:e\PYGZhy{}p270:32:32\PYGZhy{}p271:32:32\PYGZhy{}p272:64:64\PYGZhy{}i64:...\PYGZdq{}}
9+
\PYG{n}{target} \PYG{n}{triple} \PYG{o}{=} \PYG{l+s}{\PYGZdq{}x86\PYGZus{}64\PYGZhy{}unknown\PYGZhy{}linux\PYGZhy{}gnu\PYGZdq{}}
10+
11+
\PYG{p}{;} \PYG{n}{Function} \PYG{n+nl}{Attrs}\PYG{p}{:} \PYG{n}{mustprogress} \PYG{n}{noinline} \PYG{n}{nounwind} \PYG{n}{optnone} \PYG{n}{uwtable}
12+
\PYG{n}{define} \PYG{n}{dso\PYGZus{}local} \PYG{n}{i32} \PYG{err}{@}\PYG{n}{\PYGZus{}Z6retsumii}\PYG{p}{(}\PYG{n}{i32} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{0}\PYG{p}{,} \PYG{n}{i32} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{1}\PYG{p}{)} \PYG{err}{\PYGZsh{}}\PYG{l+m+mi}{0} \PYG{p}{\PYGZob{}}
13+
\PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{3} \PYG{o}{=} \PYG{n}{alloca} \PYG{n}{i32}\PYG{p}{,} \PYG{n}{align} \PYG{l+m+mi}{4}
14+
\PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{4} \PYG{o}{=} \PYG{n}{alloca} \PYG{n}{i32}\PYG{p}{,} \PYG{n}{align} \PYG{l+m+mi}{4}
15+
\PYG{n}{store} \PYG{n}{i32} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{0}\PYG{p}{,} \PYG{n}{i32}\PYG{o}{*} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{3}\PYG{p}{,} \PYG{n}{align} \PYG{l+m+mi}{4}
16+
\PYG{n}{store} \PYG{n}{i32} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{1}\PYG{p}{,} \PYG{n}{i32}\PYG{o}{*} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{4}\PYG{p}{,} \PYG{n}{align} \PYG{l+m+mi}{4}
17+
\PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{5} \PYG{o}{=} \PYG{n}{load} \PYG{n}{i32}\PYG{p}{,} \PYG{n}{i32}\PYG{o}{*} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{3}\PYG{p}{,} \PYG{n}{align} \PYG{l+m+mi}{4}
18+
\PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{6} \PYG{o}{=} \PYG{n}{load} \PYG{n}{i32}\PYG{p}{,} \PYG{n}{i32}\PYG{o}{*} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{4}\PYG{p}{,} \PYG{n}{align} \PYG{l+m+mi}{4}
19+
\PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{7} \PYG{o}{=} \PYG{n}{add} \PYG{n}{nsw} \PYG{n}{i32} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{5}\PYG{p}{,} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{6}
20+
\PYG{n}{ret} \PYG{n}{i32} \PYG{o}{\PYGZpc{}}\PYG{l+m+mi}{7}
21+
\PYG{p}{\PYGZcb{}}
22+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
\begin{Verbatim}[commandchars=\\\{\}]
2+
\PYG{k}{class} \PYG{n+nc}{ClassConsumer} \PYG{o}{:} \PYG{k}{public} \PYG{n}{clang}\PYG{o}{::}\PYG{n}{ASTConsumer} \PYG{p}{\PYGZob{}}
3+
\PYG{k}{public}\PYG{o}{:}
4+
\PYG{k}{explicit} \PYG{n}{ClassConsumer}\PYG{p}{(}\PYG{n}{ASTContext} \PYG{o}{*}\PYG{n}{Context}\PYG{p}{)}
5+
\PYG{o}{:} \PYG{n}{Visitor}\PYG{p}{(}\PYG{n}{Context}\PYG{p}{)} \PYG{p}{\PYGZob{}\PYGZcb{}}
6+
\PYG{k}{virtual} \PYG{k+kt}{void} \PYG{n}{HandleTranslationUnit}\PYG{p}{(}\PYG{n}{clang}\PYG{o}{::}\PYG{n}{ASTContext} \PYG{o}{\PYGZam{}}\PYG{n}{Context}\PYG{p}{)} \PYG{p}{\PYGZob{}}
7+
\PYG{c+cp}{\PYGZsh{} Called on each TranslationDeclUnit}
8+
\PYG{n}{Visitor}\PYG{p}{.}\PYG{n}{TraverseDecl}\PYG{p}{(}\PYG{n}{Context}\PYG{p}{.}\PYG{n}{getTranslationUnitDecl}\PYG{p}{());}
9+
\PYG{p}{\PYGZcb{}}
10+
\PYG{k}{private}\PYG{o}{:}
11+
\PYG{c+cp}{\PYGZsh{} Implements the actual recursive visit strategy.}
12+
\PYG{n}{ClassVisitor} \PYG{n}{Visitor}\PYG{p}{;}
13+
\PYG{p}{\PYGZcb{};}
14+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
\begin{Verbatim}[commandchars=\\\{\}]
2+
\PYG{k+kt}{int} \PYG{n+nf}{retsum}\PYG{p}{(}\PYG{k+kt}{int} \PYG{n}{a}\PYG{p}{,} \PYG{k+kt}{int} \PYG{n}{b}\PYG{p}{)} \PYG{p}{\PYGZob{}}
3+
\PYG{k}{return} \PYG{n}{a} \PYG{o}{+} \PYG{n}{b}\PYG{p}{;}
4+
\PYG{p}{\PYGZcb{}}
5+
\PYG{c+cp}{\PYGZsh{} clang \PYGZhy{}Xclang \PYGZhy{}ast\PYGZhy{}dump \PYGZhy{}fsyntax\PYGZhy{}only code.cpp}
6+
\PYG{err}{`}\PYG{o}{\PYGZhy{}}\PYG{n}{FunctionDecl} \PYG{o}{\PYGZlt{}}\PYG{n}{test}\PYG{p}{.}\PYG{n+nl}{cc}\PYG{p}{:}\PYG{l+m+mi}{1}\PYG{o}{:}\PYG{l+m+mi}{1}\PYG{p}{,} \PYG{n+nl}{line}\PYG{p}{:}\PYG{l+m+mi}{3}\PYG{o}{:}\PYG{l+m+mi}{1}\PYG{o}{\PYGZgt{}} \PYG{n}{retsum} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int} \PYG{p}{(}\PYG{k+kt}{int}\PYG{p}{,} \PYG{k+kt}{int}\PYG{p}{)}\PYG{err}{\PYGZsq{}}
7+
\PYG{o}{|\PYGZhy{}}\PYG{n}{ParmVarDecl} \PYG{o}{\PYGZlt{}}\PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{12}\PYG{p}{,} \PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{16}\PYG{o}{\PYGZgt{}} \PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{16} \PYG{n}{used} \PYG{n}{a} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int}\PYG{err}{\PYGZsq{}}
8+
\PYG{o}{|\PYGZhy{}}\PYG{n}{ParmVarDecl} \PYG{o}{\PYGZlt{}}\PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{19}\PYG{p}{,} \PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{23}\PYG{o}{\PYGZgt{}} \PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{23} \PYG{n}{used} \PYG{n}{b} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int}\PYG{err}{\PYGZsq{}}
9+
\PYG{err}{`}\PYG{o}{\PYGZhy{}}\PYG{n}{CompoundStmt} \PYG{o}{\PYGZlt{}}\PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{26}\PYG{p}{,} \PYG{n+nl}{line}\PYG{p}{:}\PYG{l+m+mi}{3}\PYG{o}{:}\PYG{l+m+mi}{1}\PYG{o}{\PYGZgt{}}
10+
\PYG{err}{`}\PYG{o}{\PYGZhy{}}\PYG{n}{ReturnStmt} \PYG{o}{\PYGZlt{}}\PYG{n+nl}{line}\PYG{p}{:}\PYG{l+m+mi}{2}\PYG{o}{:}\PYG{l+m+mi}{3}\PYG{p}{,} \PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{14}\PYG{o}{\PYGZgt{}}
11+
\PYG{err}{`}\PYG{o}{\PYGZhy{}}\PYG{n}{BinaryOperator} \PYG{o}{\PYGZlt{}}\PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{10}\PYG{p}{,} \PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{14}\PYG{o}{\PYGZgt{}} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int}\PYG{l+s+sc}{\PYGZsq{} \PYGZsq{}}\PYG{o}{+}\PYG{err}{\PYGZsq{}}
12+
\PYG{o}{|\PYGZhy{}}\PYG{n}{ImplicitCastExpr} \PYG{o}{\PYGZlt{}}\PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{10}\PYG{o}{\PYGZgt{}} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int}\PYG{err}{\PYGZsq{}} \PYG{o}{\PYGZlt{}}\PYG{n}{LValueToRValue}\PYG{o}{\PYGZgt{}}
13+
\PYG{o}{|} \PYG{err}{`}\PYG{o}{\PYGZhy{}}\PYG{n}{DeclRefExpr} \PYG{o}{\PYGZlt{}}\PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{10}\PYG{o}{\PYGZgt{}} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int}\PYG{err}{\PYGZsq{}} \PYG{n}{lvalue} \PYG{n}{ParmVar} \PYG{l+s+sc}{\PYGZsq{}a\PYGZsq{}} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int}\PYG{err}{\PYGZsq{}}
14+
\PYG{err}{`}\PYG{o}{\PYGZhy{}}\PYG{n}{ImplicitCastExpr} \PYG{o}{\PYGZlt{}}\PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{14}\PYG{o}{\PYGZgt{}} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int}\PYG{err}{\PYGZsq{}} \PYG{o}{\PYGZlt{}}\PYG{n}{LValueToRValue}\PYG{o}{\PYGZgt{}}
15+
\PYG{err}{`}\PYG{o}{\PYGZhy{}}\PYG{n}{DeclRefExpr} \PYG{o}{\PYGZlt{}}\PYG{n+nl}{col}\PYG{p}{:}\PYG{l+m+mi}{14}\PYG{o}{\PYGZgt{}} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int}\PYG{err}{\PYGZsq{}} \PYG{n}{lvalue} \PYG{n}{ParmVar} \PYG{l+s+sc}{\PYGZsq{}b\PYGZsq{}} \PYG{err}{\PYGZsq{}}\PYG{k+kt}{int}\PYG{err}{\PYGZsq{}}
16+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
\begin{Verbatim}[commandchars=\\\{\}]
2+
\PYG{k}{struct} \PYG{n+nl}{MyPass} \PYG{p}{:} \PYG{k}{public} \PYG{n}{PassInfoMixin}\PYG{o}{\PYGZlt{}}\PYG{n}{MyPass}\PYG{o}{\PYGZgt{}} \PYG{p}{\PYGZob{}}
3+
\PYG{n}{PreservedAnalyses} \PYG{n}{run}\PYG{p}{(}\PYG{n}{Module} \PYG{err}{\PYGZbs{}}\PYG{o}{\PYGZam{}}\PYG{n}{T}\PYG{p}{,} \PYG{n}{ModuleAnalysisManager} \PYG{err}{\PYGZbs{}}\PYG{o}{\PYGZam{}}\PYG{n}{M}\PYG{p}{)\PYGZob{}}
4+
\PYG{c+cp}{\PYGZsh{} Your code logic }
5+
\PYG{p}{...}
6+
\PYG{k}{return} \PYG{n}{PreservedAnalyses}\PYG{o}{::}\PYG{n}{all}\PYG{p}{();}
7+
\PYG{p}{\PYGZcb{}}
8+
\PYG{p}{...}
9+
\PYG{p}{\PYGZcb{};}
10+
\PYG{k}{extern} \PYG{l+s}{\PYGZdq{}C\PYGZdq{}} \PYG{o}{::}\PYG{n}{llvm}\PYG{o}{::}\PYG{n}{PassPluginLibraryInfo} \PYG{n}{LLVM\PYGZus{}ATTRIBUTE\PYGZus{}WEAK}
11+
\PYG{n}{llvmGetPassPluginInfo}\PYG{p}{()} \PYG{p}{\PYGZob{}}
12+
\PYG{k}{return} \PYG{p}{\PYGZob{}}\PYG{n}{LLVM\PYGZus{}PLUGIN\PYGZus{}API\PYGZus{}VERSION}\PYG{p}{,} \PYG{l+s}{\PYGZdq{}MyPass\PYGZdq{}}\PYG{p}{,} \PYG{l+s}{\PYGZdq{}v0.1\PYGZdq{}}\PYG{p}{,}
13+
\PYG{p}{[](}\PYG{n}{PassBuilder} \PYG{o}{\PYGZam{}}\PYG{n}{PB}\PYG{p}{)} \PYG{p}{\PYGZob{}}
14+
\PYG{n}{PB}\PYG{p}{.}\PYG{n}{registerPipelineParsingCallback}\PYG{p}{(}
15+
\PYG{p}{[](}\PYG{n}{StringRef} \PYG{n}{Name}\PYG{p}{,} \PYG{n}{ModulePassManager} \PYG{o}{\PYGZam{}}\PYG{n}{MPM}\PYG{p}{,}
16+
\PYG{n}{ArrayRef}\PYG{o}{\PYGZlt{}}\PYG{n}{PassBuilder}\PYG{o}{::}\PYG{n}{PipelineElement}\PYG{o}{\PYGZgt{}}\PYG{p}{)} \PYG{p}{\PYGZob{}}
17+
\PYG{k}{if} \PYG{p}{(}\PYG{n}{Name} \PYG{o}{==} \PYG{l+s}{\PYGZdq{}mypass\PYGZdq{}}\PYG{p}{)} \PYG{p}{\PYGZob{}}
18+
\PYG{n}{MPM}\PYG{p}{.}\PYG{n}{addPass}\PYG{p}{(}\PYG{n}{ModifyBuildCFG}\PYG{p}{());}
19+
\PYG{k}{return} \PYG{n+nb}{true}\PYG{p}{;}
20+
\PYG{p}{\PYGZcb{}}
21+
\PYG{k}{return} \PYG{n+nb}{false}\PYG{p}{;} \PYG{p}{\PYGZcb{});} \PYG{p}{\PYGZcb{}\PYGZcb{};}
22+
\PYG{p}{\PYGZcb{}}
23+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
\begin{Verbatim}[commandchars=\\\{\}]
2+
\PYG{k}{struct} \PYG{n+nl}{MyPass} \PYG{p}{:} \PYG{k}{public} \PYG{n}{PassInfoMixin}\PYG{o}{\PYGZlt{}}\PYG{n}{MyPass}\PYG{o}{\PYGZgt{}} \PYG{p}{\PYGZob{}}
3+
\PYG{n}{PreservedAnalyses} \PYG{n}{run}\PYG{p}{(}\PYG{n}{Function} \PYG{err}{\PYGZbs{}}\PYG{o}{\PYGZam{}}\PYG{n}{F}\PYG{p}{,} \PYG{n}{FunctionAnalysisManager} \PYG{err}{\PYGZbs{}}\PYG{o}{\PYGZam{}}\PYG{n}{FM}\PYG{p}{)\PYGZob{}}
4+
\PYG{c+cp}{\PYGZsh{} Your code logic }
5+
\PYG{p}{...}
6+
\PYG{k}{return} \PYG{n}{PreservedAnalyses}\PYG{o}{::}\PYG{n}{all}\PYG{p}{();}
7+
\PYG{p}{\PYGZcb{}}
8+
\PYG{p}{...}
9+
\PYG{p}{\PYGZcb{};}
10+
\PYG{k}{extern} \PYG{l+s}{\PYGZdq{}C\PYGZdq{}} \PYG{o}{::}\PYG{n}{llvm}\PYG{o}{::}\PYG{n}{PassPluginLibraryInfo} \PYG{n}{LLVM\PYGZus{}ATTRIBUTE\PYGZus{}WEAK}
11+
\PYG{n}{llvmGetPassPluginInfo}\PYG{p}{()} \PYG{p}{\PYGZob{}}
12+
\PYG{k}{return} \PYG{p}{\PYGZob{}}\PYG{n}{LLVM\PYGZus{}PLUGIN\PYGZus{}API\PYGZus{}VERSION}\PYG{p}{,} \PYG{l+s}{\PYGZdq{}MyPass\PYGZdq{}}\PYG{p}{,} \PYG{l+s}{\PYGZdq{}v0.1\PYGZdq{}}\PYG{p}{,}
13+
\PYG{p}{[](}\PYG{n}{PassBuilder} \PYG{o}{\PYGZam{}}\PYG{n}{PB}\PYG{p}{)} \PYG{p}{\PYGZob{}}
14+
\PYG{n}{PB}\PYG{p}{.}\PYG{n}{registerPipelineParsingCallback}\PYG{p}{(}
15+
\PYG{p}{[](}\PYG{n}{StringRef} \PYG{n}{Name}\PYG{p}{,} \PYG{n}{FunctionPassManager} \PYG{o}{\PYGZam{}}\PYG{n}{FPM}\PYG{p}{,}
16+
\PYG{n}{ArrayRef}\PYG{o}{\PYGZlt{}}\PYG{n}{PassBuilder}\PYG{o}{::}\PYG{n}{PipelineElement}\PYG{o}{\PYGZgt{}}\PYG{p}{)} \PYG{p}{\PYGZob{}}
17+
\PYG{k}{if} \PYG{p}{(}\PYG{n}{Name} \PYG{o}{==} \PYG{l+s}{\PYGZdq{}mypass\PYGZdq{}}\PYG{p}{)} \PYG{p}{\PYGZob{}}
18+
\PYG{n}{FPM}\PYG{p}{.}\PYG{n}{addPass}\PYG{p}{(}\PYG{n}{ModifyBuildCFG}\PYG{p}{());}
19+
\PYG{k}{return} \PYG{n+nb}{true}\PYG{p}{;}
20+
\PYG{p}{\PYGZcb{}}
21+
\PYG{k}{return} \PYG{n+nb}{false}\PYG{p}{;} \PYG{p}{\PYGZcb{});} \PYG{p}{\PYGZcb{}\PYGZcb{};}
22+
\PYG{p}{\PYGZcb{}}
23+
\end{Verbatim}

0 commit comments

Comments
 (0)