本文整理汇总了C++中function::iterator::empty方法的典型用法代码示例。如果您正苦于以下问题:C++ iterator::empty方法的具体用法?C++ iterator::empty怎么用?C++ iterator::empty使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类function::iterator
的用法示例。
在下文中一共展示了iterator::empty方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: decompileFunction
Function* Decompiler::decompileFunction(unsigned Address) {
// Check that Address is inside the current section.
// TODO: Find a better way to do this check. What we really care about is
// avoiding reads to library calls and areas of memory we can't "see".
const object::SectionRef Sect = Dis->getCurrentSection();
uint64_t SectStart, SectEnd;
Sect.getAddress(SectStart);
Sect.getSize(SectEnd);
SectEnd += SectStart;
if (Address < SectStart || Address > SectEnd) {
errs() << "Address out of bounds for section (is this a library call?): "
<< format("%1" PRIx64, Address) << "\n";
return NULL;
}
MachineFunction *MF = Dis->disassemble(Address);
// Get Function Name
// TODO: Determine Function Type
FunctionType *FType = FunctionType::get(Type::getPrimitiveType(*Context,
Type::VoidTyID), false);
Function *F =
cast<Function>(Mod->getOrInsertFunction(MF->getName(), FType));
if (!F->empty()) {
return F;
}
// Create a basic block to hold entry point (alloca) information
BasicBlock *entry = getOrCreateBasicBlock("entry", F);
// For each basic block
MachineFunction::iterator BI = MF->begin(), BE = MF->end();
while (BI != BE) {
// Add branch from "entry"
if (BI == MF->begin()) {
entry->getInstList().push_back(
BranchInst::Create(getOrCreateBasicBlock(BI->getName(), F)));
} else {
getOrCreateBasicBlock(BI->getName(), F);
}
++BI;
}
BI = MF->begin();
while (BI != BE) {
if (decompileBasicBlock(BI, F) == NULL) {
printError("Unable to decompile basic block!");
}
++BI;
}
// During Decompilation, did any "in-between" basic blocks get created?
// Nothing ever splits the entry block, so we skip it.
for (Function::iterator I = ++F->begin(), E = F->end(); I != E; ++I) {
if (!(I->empty())) {
continue;
}
// Right now, the only way to get the right offset is to parse its name
// it sucks, but it works.
StringRef Name = I->getName();
if (Name == "end" || Name == "entry") continue; // these can be empty
size_t Off = F->getName().size() + 1;
size_t Size = Name.size() - Off;
StringRef BBAddrStr = Name.substr(Off, Size);
unsigned long long BBAddr;
getAsUnsignedInteger(BBAddrStr, 10, BBAddr);
BBAddr += Address;
DEBUG(errs() << "Split Target: " << Name << "\t Address: "
<< BBAddr << "\n");
// split Block at AddrStr
Function::iterator SB; // Split basic block
BasicBlock::iterator SI, SE; // Split instruction
// Note the ++, nothing ever splits the entry block.
for (SB = ++F->begin(); SB != E; ++SB) {
DEBUG(outs() << "SB: " << SB->getName()
<< "\tRange: " << Dis->getDebugOffset(SB->begin()->getDebugLoc())
<< " " << Dis->getDebugOffset(SB->getTerminator()->getDebugLoc())
<< "\n");
if (SB->empty() || BBAddr < getBasicBlockAddress(SB)
|| BBAddr > Dis->getDebugOffset(SB->getTerminator()->getDebugLoc())) {
continue;
}
// Reorder instructions based on Debug Location
sortBasicBlock(SB);
DEBUG(errs() << "Found Split Block: " << SB->getName() << "\n");
// Find iterator to split on.
for (SI = SB->begin(), SE = SB->end(); SI != SE; ++SI) {
// outs() << "SI: " << SI->getDebugLoc().getLine() << "\n";
if (Dis->getDebugOffset(SI->getDebugLoc()) == BBAddr) break;
if (Dis->getDebugOffset(SI->getDebugLoc()) > BBAddr) {
errs() << "Could not find address inside basic block!\n"
<< "SI: " << Dis->getDebugOffset(SI->getDebugLoc()) << "\n"
<< "BBAddr: " << BBAddr << "\n";
break;
}
}
break;
}
//.........这里部分代码省略.........
示例2: compile_builder
void Compiler::compile_builder(jit::Context& ctx, LLVMState* ls, JITMethodInfo& info,
jit::Builder& work)
{
llvm::Function* func = info.function();
if(!work.generate_body()) {
function_ = NULL;
// This is too noisy to report
// llvm::outs() << "not supported yet.\n";
return;
}
// Hook up the return pad and return phi.
work.generate_hard_return();
if(ls->jit_dump_code() & cSimple) {
llvm::outs() << "[[[ LLVM Simple IR ]]]\n";
llvm::outs() << *func << "\n";
}
std::vector<BasicBlock*> to_remove;
bool Broken = false;
for(Function::iterator I = func->begin(), E = func->end(); I != E; ++I) {
if(I->empty()) {
BasicBlock& bb = *I;
// No one jumps to it....
if(llvm::pred_begin(&bb) == llvm::pred_end(&bb)) {
to_remove.push_back(&bb);
} else {
llvm::outs() << "Basic Block is empty and used!\n";
}
} else if(!I->back().isTerminator()) {
llvm::errs() << "Basic Block does not have terminator!\n";
llvm::errs() << *I << "\n";
llvm::errs() << "\n";
Broken = true;
}
}
for(std::vector<BasicBlock*>::iterator i = to_remove.begin();
i != to_remove.end();
++i) {
(*i)->eraseFromParent();
}
if(Broken or llvm::verifyFunction(*func, PrintMessageAction)) {
llvm::outs() << "ERROR: complication error detected.\n";
llvm::outs() << "ERROR: Please report the above message and the\n";
llvm::outs() << " code below to http://github.com/rubinius/rubinius/issues\n";
llvm::outs() << *func << "\n";
function_ = NULL;
return;
}
ls->passes()->run(*func);
if(ls->jit_dump_code() & cOptimized) {
llvm::outs() << "[[[ LLVM Optimized IR: "
<< ls->symbol_cstr(info.method()->name()) << " ]]]\n";
llvm::outs() << *func << "\n";
}
function_ = func;
generate_function(ls);
// Inject the RuntimeData objects used into the original CompiledMethod
// Do this way after we've validated the IR so things are consistent.
ctx.runtime_data_holder()->set_function(func, mci_->address(), mci_->size());
info.method()->set_jit_data(ctx.runtime_data_holder());
ls->shared().om->add_code_resource(ctx.runtime_data_holder());
}