本文整理汇总了C++中machinebasicblock::const_instr_iterator::isInlineAsm方法的典型用法代码示例。如果您正苦于以下问题:C++ const_instr_iterator::isInlineAsm方法的具体用法?C++ const_instr_iterator::isInlineAsm怎么用?C++ const_instr_iterator::isInlineAsm使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类machinebasicblock::const_instr_iterator
的用法示例。
在下文中一共展示了const_instr_iterator::isInlineAsm方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getCallees
bool PatmosInstrInfo::getCallees(const MachineInstr *MI,
SmallSet<const Function*,2> &Callees) const
{
if (MI->isBundle()) {
MachineBasicBlock::const_instr_iterator it = MI;
bool safe = true;
while ((++it)->isBundledWithPred()) {
if (!it->isCall() && !it->isInlineAsm()) continue;
safe = getCallees(it, Callees) && safe;
}
return safe;
}
if (MI->isCall()) {
const Function *F = getCallee(MI);
if (F) {
Callees.insert(F);
return true;
} else {
// Could be an indirect call..
return false;
}
}
else if (MI->isInlineAsm()) {
// We can skip the first operand as this should be the asm string.
for (unsigned int i = 1; i < MI->getNumOperands(); i++) {
const MachineOperand &MO(MI->getOperand(i));
const Function *F = NULL;
// try to find the target of the call
if (MO.isGlobal()) {
// is the global value a function?
F = dyn_cast_or_null<Function>(MO.getGlobal());
}
else if (MO.isSymbol()) {
// find the function in the current module
const Module &M =
*MI->getParent()->getParent()->getFunction()->getParent();
F = dyn_cast_or_null<Function>(M.getNamedValue(MO.getSymbolName()));
}
if (F) {
// We are assuming here that if inline-asm uses a function reference
// as operand, then it is probably used for a call.
Callees.insert(F);
}
}
// TODO for now we assume that inline asm does not contain CALLR and
// that all callees are passed as asm operands. We should do a check
// similar to hasCall() here.
return true;
}
else {
// No other instruction should do a call.
return true;
}
}