当前位置: 首页>>代码示例>>C++>>正文


C++ Place::getAddr方法代码示例

本文整理汇总了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++) );
    }
}
开发者ID:BackupTheBerlios,项目名称:swiftc-svn,代码行数:69,代码来源:typenodecodegen.cpp


注:本文中的Place::getAddr方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。