1

visit* メソッドをオーバーライドするときに、ステートメントの基本ブロック ID (blockID) を取得するにはどうすればよいですか?

たとえば、以下に示す基本ブロックの場合、VisitIfStmt() が訪問されたとき、この訪問メソッド内で blockID を取得する方法は?
[B4]
1: x == 0
T: if [B4.1]
Preds (1): B6
Succs (2): B3 B2

4

2 に答える 2

1

古い質問ですが、最近同じことに答えなければなりませんでした。CFGStmtMapを使用して、ステートメントの BBL を照会できます。

const FunctionDecl* FD = ...;
const CFG* cfg = ...;
std::unique_ptr<ParentMap> PM = llvm::make_unique<ParentMap>(FD->getBody());
std::unique_ptr<CFGStmtMap> CM = llvm::make_unique<CFGStmtMap>(cfg, PM.get());
// do your traversal and for a given Stmt `stmt` you can get
// its containing block:
CFGBlock* stmt_block = CM->getBlock(stmt);
const unsigned int block_id = stmt_block->getBlockID();
于 2015-12-21T09:56:49.247 に答える
0

llvm::PHINode::getBasicBlockIndex ( const BasicBlock *BB) を使用してみることができます。

于 2012-12-18T10:10:57.587 に答える