本文整理汇总了C++中Place::getAddr方法的典型用法代码示例。如果您正苦于以下问题:C++ Place::getAddr方法的具体用法?C++ Place::getAddr怎么用?C++ Place::getAddr使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Place
的用法示例。
在下文中一共展示了Place::getAddr方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: emitCall
void TypeNodeCodeGen::emitCall(MemberFctCall* call, Place* self)
{
Values args;
MemberFct* fct = call->getMemberFct();
call->exprList_->accept(this);
TypeList& out = fct->sig_.outTypes_;
/*
* prepare arguments
*/
if (self)
args.push_back( self->getAddr(builder_) );
Values perRefRetValues;
// append return-value arguments
for (size_t i = 0; i < out.size(); ++i)
{
const Type* type = out[i];
if ( type->perRef() )
{
int simdLength = call->simd_ ? 4 : 0; // HACK
const llvm::Type* llvmType = type->getRawLLVMType(ctxt_->module_, simdLength);
// do return value optimization or create temporary
Place* place = 0;
if ( call->initPlaces_ && (*call->initPlaces_)[i] )
place = (*call->initPlaces_)[i];
Value* arg = place
? place->getAddr(builder_)
: createEntryAlloca(builder_, llvmType);
args.push_back(arg);
perRefRetValues.push_back(arg);
}
}
// append regular arguments
call->exprList_->getArgs(builder_, args);
llvm::Function* llvmFct = call->simd_ ? fct->simdFct_ : fct->llvmFct_;
swiftAssert(llvmFct, "must exist");
// create actual call
llvm::CallInst* callInst = llvm::CallInst::Create(
llvmFct, args.begin(), args.end() );
callInst->setCallingConv(llvm::CallingConv::Fast);
Value* retValue = builder_.Insert(callInst);
/*
* write results back
*/
swiftAssert( call->numResults() == out.size(), "sizes must match" );
size_t idxRetType = 0;
size_t idxPerRef = 0;
for (size_t i = 0; i < out.size(); ++i)
{
call->set(i).place_ = out[i]->perRef()
? (Place*) new Addr( perRefRetValues[idxPerRef++] )
: (Place*) new Scalar( builder_.CreateExtractValue(retValue, idxRetType++) );
}
}