采用 ninja 构建
检查
brew list | grep ^ninja
安装
brew install ninja
重复过程
- 产生代码
cd /Users/jzd/Movies/A_B/llvm-projectX
cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi"
- 项目编译
cd /Users/jzd/Movies/A_B/llvm-projectX/build
ninja clang
➜ build git:(main) ninja clang
[3345/3345] Creating executable symlink bin/clang
/Users/jzd/Movies/A_B/llvm-projectX/clang/lib/Sema/SemaStmt.cpp
里面
StmtResult Sema::ActOnIfStmt(SourceLocation IfLoc, bool IsConstexpr,
SourceLocation LParenLoc, Stmt *InitStmt,
ConditionResult Cond, SourceLocation RParenLoc,
Stmt *thenStmt, SourceLocation ElseLoc,
Stmt *elseStmt) {
//...
llvm:: dbgs() << "处于 ActOnIfStmt, 发现了 if 条件判断 \n";
CondExpr->dump();
return BuildIfStmt(IfLoc, IsConstexpr, LParenLoc, InitStmt, Cond, RParenLoc,
thenStmt, ElseLoc, elseStmt);
}
效果一:
- 查看例子
➜ build git:(main) ✗ cat /Users/jzd/Movies/A_a/Clang/proj/collect/999998/999998/test.cpp
代码很简单
void test(int a, int b){
if (a > 0 && b > 0){
}
}
- 命令
➜ build git:(main) ✗ /Users/jzd/Movies/A_B/llvm-projectX/build/bin/clang -c /Users/jzd/Movies/A_a/Clang/proj/collect/999998/999998/test.cpp
dump 到的信息
处于 ActOnIfStmt, 发现了 if 条件判断
BinaryOperator 0x7fe8e9075ea0 '_Bool' '&&'
|-BinaryOperator 0x7fe8e9075e08 '_Bool' '>'
| |-ImplicitCastExpr 0x7fe8e9075df0 'int' <LValueToRValue>
| | `-DeclRefExpr 0x7fe8e9075db0 'int' lvalue ParmVar 0x7fe8e9075b68 'a' 'int'
| `-IntegerLiteral 0x7fe8e9075dd0 'int' 0
`-BinaryOperator 0x7fe8e9075e80 '_Bool' '>'
|-ImplicitCastExpr 0x7fe8e9075e68 'int' <LValueToRValue>
| `-DeclRefExpr 0x7fe8e9075e28 'int' lvalue ParmVar 0x7fe8e9075be8 'b' 'int'
`-IntegerLiteral 0x7fe8e9075e48 'int' 0