int getReversedPolishExpressionSize(char* expression) {
	int count = 0;
	for(char* i = expression; *i != '\0'; i++)
		if(getCodeName(i) != 6 && getCodeName(i) != 7)
			count++;
	return count;
}
bool checkForValidMultiCharOperator(char* const position) {
	if(getCodeName(position) == 4 && *(position + 1) != '>') {
		printf("Invalid operator: -> cannot be found.\n");
		return false;
	}
	if(getCodeName(position) == 5 && *(position + 1) != '-' && *(position + 1) != '>') {
		printf("Invalid operator: <-> cannot be found.\n");
		return false;
	}
	return true;
}
 llvm::Type *StructAdapter::buildLLVMRawType( RC::Handle<Context> const &context ) const
 {
   std::vector<llvm::Type *> memberLLVMTypes;
   memberLLVMTypes.reserve( m_memberAdapters.size() );
   for ( size_t i=0; i<m_memberAdapters.size(); ++i )
     memberLLVMTypes.push_back( m_memberAdapters[i]->llvmRawType( context ) );
   return llvm::StructType::create( context->getLLVMContext(), memberLLVMTypes, getCodeName(), true );
 }
bool checkForValidBrackets(char* const expression) {
	int count = 0;

	for(char* i = expression; *i; i++) {
		if(getCodeName(i) == 6)
			count++;
		if(getCodeName(i) == 7)
			count--;
		if(count < 0) {
			printf("Invalid brackets: The brackets' orders are invalid.\n");
			return false;
		}
	}
	if(count != 0) {
		printf("Invalid brackets: The brackets' orders are invalid.\n");
		return false;
	}

	return true;
}
 llvm::Constant *ArrayProducerAdapter::llvmDefaultLValue( BasicBlockBuilder &basicBlockBuilder ) const
 {
   llvm::Constant *defaultValue = llvmDefaultValue( basicBlockBuilder );
   return new llvm::GlobalVariable(
     *basicBlockBuilder.getModuleBuilder(),
     defaultValue->getType(),
     true,
     llvm::GlobalValue::InternalLinkage,
     defaultValue,
     "__" + getCodeName() + "__DefaultValue"
     );
 }
 void StructAdapter::llvmDefaultAssign( BasicBlockBuilder &basicBlockBuilder, llvm::Value *dstLValue, llvm::Value *srcRValue ) const
 {
   if ( !m_isShallow )
   {
     InternalFunctionBuilder functionBuilder(
       basicBlockBuilder.getModuleBuilder(),
       0, "__" + getCodeName() + "__DefaultAssign",
       "dst", this, USAGE_LVALUE,
       "src", this, USAGE_RVALUE,
       0
       );
     basicBlockBuilder->CreateCall2( functionBuilder.getLLVMFunction(), dstLValue, srcRValue );
   }
   else basicBlockBuilder->CreateStore( basicBlockBuilder->CreateLoad( srcRValue ), dstLValue );
 }
char* convertToReversedPolish(char* expression) {
	if(!isValidExpression(expression))
		return NULL;

	stack<char*> operators_stack;
	char* converted = new char[getReversedPolishExpressionSize(expression)];
	strcpy(converted, "");

	for(char* i = expression; *i; i++) {
		//ignore multi-chars operators' 2nd char onwards
		if(*i == '>' || (*i == '-' && *(i - 1) == '<'))
			continue;

		int code = getCodeName(i);

		if(code == 0) {
			strncat(converted, i, 1);
			continue;
		}
		if(code == 6) {
			pushCharToStack(i, operators_stack);
			continue;
		}
		if(code == 7) {
			while(*operators_stack.top() != '(') {
				popStackToResult(converted, operators_stack);
			}
			//pop the '(' char
			operators_stack.pop();
			continue;
		}
		if(operators_stack.empty()) {
			pushCharToStack(i, operators_stack);
			continue;
		}
		else if(*operators_stack.top() != '(')
			popStackToResult(converted, operators_stack);

		pushCharToStack(i, operators_stack);
	}

	while(!operators_stack.empty())
		popStackToResult(converted, operators_stack);
	
	return converted;
}
Beispiel #8
0
//=============================================================================
// METHOD: SPELLserverCif::notifyReturn
//=============================================================================
void SPELLserverCif::notifyReturn()
{
    DEBUG("[CIF] Procedure return");

    m_lnMessage.set( MessageField::FIELD_DATA_TYPE, MessageValue::DATA_TYPE_RETURN );
    m_lnMessage.setType(MSG_TYPE_NOTIFY);

    completeMessage( &m_lnMessage );
    m_lnMessage.set(MessageField::FIELD_MSG_SEQUENCE, ISTR(m_sequenceStack));
    m_sequenceStack++;
    m_lnMessage.set(MessageField::FIELD_CODE_NAME, getCodeName() );

    m_asRun->writeReturn( (m_sequence-1) );

    SPELLipcMessage* response = sendGUIRequest(&m_lnMessage, SPELL_CIF_NOTIFICATION_TIMEOUT_SEC);
    if (response) delete response;
}
 void *ArrayProducerAdapter::llvmResolveExternalFunction( std::string const &functionName ) const
 {
   if ( functionName == "__"+getCodeName()+"__Retain" )
     return (void *)&ArrayProducerAdapter::Retain;
   else if ( functionName == "__"+getCodeName()+"__Release" )
     return (void *)&ArrayProducerAdapter::Release;
   else if ( functionName == "__"+getCodeName()+"__DefaultAssign" )
     return (void *)&ArrayProducerAdapter::DefaultAssign;
   else if ( functionName == "__"+getCodeName()+"__GetCount" )
     return (void *)&ArrayProducerAdapter::GetCount;
   else if ( functionName == "__"+getCodeName()+"__Produce0" )
     return (void *)&ArrayProducerAdapter::Produce0;
   else if ( functionName == "__"+getCodeName()+"__Produce1" )
     return (void *)&ArrayProducerAdapter::Produce1;
   else if ( functionName == "__"+getCodeName()+"__Produce2" )
     return (void *)&ArrayProducerAdapter::Produce2;
   else if ( functionName == "__"+getCodeName()+"__Flush" )
     return (void *)&ArrayProducerAdapter::Flush;
   else return Adapter::llvmResolveExternalFunction( functionName );
 }
Beispiel #10
0
//=============================================================================
// METHOD: SPELLserverCif::notifyLine
//=============================================================================
void SPELLserverCif::notifyLine()
{
    std::string stack = getStack();

    if (m_lastStack == stack) return;
    m_lastStack = stack;

    std::string stage = getStage();

    DEBUG("[CIF] Procedure line: " + stack + "(" + stage + ")");

    m_lnMessage.set( MessageField::FIELD_DATA_TYPE, MessageValue::DATA_TYPE_LINE );
    m_lnMessage.setType(MSG_TYPE_NOTIFY_ASYNC);

    completeMessage( &m_lnMessage );
    m_lnMessage.set(MessageField::FIELD_MSG_SEQUENCE, ISTR(m_sequenceStack));
    m_sequenceStack++;
    m_lnMessage.set(MessageField::FIELD_CODE_NAME, getCodeName() );

    if (stage.find(":") != std::string::npos)
    {
        std::vector<std::string> stage_title = tokenize(stage,":");
        if (stage_title.size()==2)
        {
            m_lnMessage.set(MessageField::FIELD_STAGE_ID,stage_title[0]);
            m_lnMessage.set(MessageField::FIELD_STAGE_TL,stage_title[1]);
        }
        else
        {
            m_lnMessage.set(MessageField::FIELD_STAGE_ID,"(none)");
            m_lnMessage.set(MessageField::FIELD_STAGE_TL,"(none)");
        }
    }
    else
    {
        m_lnMessage.set(MessageField::FIELD_STAGE_ID,stage);
        m_lnMessage.set(MessageField::FIELD_STAGE_TL,stage);
    }

    m_asRun->writeLine( stack, (m_sequence-1) );

    sendGUIMessage(&m_lnMessage);
}
Beispiel #11
0
//=============================================================================
// METHOD: SPELLserverCif::notifyCall
//=============================================================================
void SPELLserverCif::notifyCall()
{
    std::string stack = getStack();

    DEBUG("[CIF] Procedure call: " + stack );

    m_lnMessage.set( MessageField::FIELD_DATA_TYPE, MessageValue::DATA_TYPE_CALL );
    m_lnMessage.setType(MSG_TYPE_NOTIFY);

    completeMessage( &m_lnMessage );
    m_lnMessage.set(MessageField::FIELD_MSG_SEQUENCE, ISTR(m_sequenceStack));
    m_sequenceStack++;
    m_lnMessage.set(MessageField::FIELD_CODE_NAME, getCodeName() );

    m_asRun->writeCall( stack, (m_sequence-1) );

    SPELLipcMessage* response = sendGUIRequest(&m_lnMessage, SPELL_CIF_NOTIFICATION_TIMEOUT_SEC);
    if (response) delete response;
}
Beispiel #12
0
void dumpBuf (const uint32_t* buf) {
    printf("\n##########start to dump buf##########\n");

    printf("key: %x  code: %s\n", ntohl(buf[0]), getCodeName(getCode(buf)));

    int loop_num = 0;

    if (getCode(buf) == TURN_START) {
        loop_num = COMPANY_NUM;
    } else {
        // loop_num = 1;
        loop_num = COMPANY_NUM;
    }

    for (int i = 0; i < loop_num; i++) {
        printf("id: %d  value: %d\n", getID(i, buf), getValue(i, buf));
    }
    printf("##########    end dump     ##########\n\n");
}
    void ArrayProducerAdapter::llvmCompileToModule( ModuleBuilder &moduleBuilder ) const
    {
      if ( moduleBuilder.haveCompiledToModule( getCodeName() ) )
        return;
        
      RC::Handle<Context> context = moduleBuilder.getContext();
      
      m_elementAdapter->llvmCompileToModule( moduleBuilder );
      m_elementVariableArrayAdapter->llvmCompileToModule( moduleBuilder );
      RC::ConstHandle<BooleanAdapter> booleanAdapter = getManager()->getBooleanAdapter();
      booleanAdapter->llvmCompileToModule( moduleBuilder );
      RC::ConstHandle<SizeAdapter> sizeAdapter = getManager()->getSizeAdapter();
      sizeAdapter->llvmCompileToModule( moduleBuilder );
      RC::ConstHandle<StringAdapter> stringAdapter = getManager()->getStringAdapter();
      stringAdapter->llvmCompileToModule( moduleBuilder );
      RC::ConstHandle<ConstStringAdapter> constStringAdapter = getManager()->getConstStringAdapter();
      constStringAdapter->llvmCompileToModule( moduleBuilder );      
            
      static const bool buildFunctions = true;
      
      {
        ConstructorBuilder functionBuilder( moduleBuilder, stringAdapter, this, ConstructorBuilder::HighCost );
        if ( buildFunctions )
        {
          llvm::Value *stringLValue = functionBuilder[0];
          BasicBlockBuilder basicBlockBuilder( functionBuilder );
          
          basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
          std::string name = getUserName();
          ExprValue exprValue( constStringAdapter, USAGE_RVALUE, context, constStringAdapter->llvmConst( basicBlockBuilder, name.data(), name.length() ) );
          llvm::Value *stringRValue = stringAdapter->llvmCast( basicBlockBuilder, exprValue );
          stringAdapter->llvmAssign( basicBlockBuilder, stringLValue, stringRValue );
          stringAdapter->llvmDispose( basicBlockBuilder, stringRValue );
          basicBlockBuilder->CreateRetVoid();
        }
      }
   
      {
        ConstructorBuilder functionBuilder( moduleBuilder, booleanAdapter, this, ConstructorBuilder::HighCost );
        if ( buildFunctions )
        {
          llvm::Value *booleanLValue = functionBuilder[0];
          llvm::Value *rValue = functionBuilder[1];
          BasicBlockBuilder basicBlockBuilder( functionBuilder );
          basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
          llvm::Value *arrayProducerRValue = basicBlockBuilder->CreateLoad( rValue );
          basicBlockBuilder->CreateStore(
            basicBlockBuilder->CreateIsNotNull( arrayProducerRValue ),
            booleanLValue
            );
          basicBlockBuilder->CreateRetVoid();
        }
      }

      {
        MethodBuilder functionBuilder( moduleBuilder, sizeAdapter, this, USAGE_RVALUE, "getCount" );
        if ( buildFunctions )
        {
          BasicBlockBuilder basicBlockBuilder( functionBuilder );

          llvm::Value *rValue = functionBuilder[0];

          llvm::BasicBlock *entryBB = basicBlockBuilder.getFunctionBuilder().createBasicBlock( "entry" );
          
          basicBlockBuilder->SetInsertPoint( entryBB );
          basicBlockBuilder->CreateRet(
            llvmGetCount( basicBlockBuilder, rValue )
            );
        }
      }

      {
        MethodBuilder functionBuilder(
          moduleBuilder,
          m_elementVariableArrayAdapter,
          this, USAGE_RVALUE,
          "produce"
          );
        if ( buildFunctions )
        {
          BasicBlockBuilder basicBlockBuilder( functionBuilder );

          llvm::Value *rValue = functionBuilder[0];

          llvm::BasicBlock *entryBB = basicBlockBuilder.getFunctionBuilder().createBasicBlock( "entry" );
          
          basicBlockBuilder->SetInsertPoint( entryBB );
          llvmProduce0( basicBlockBuilder, rValue, functionBuilder.getScope().llvmGetReturnLValue() );
          basicBlockBuilder->CreateRetVoid();
        }
      }

      {
        MethodBuilder functionBuilder(
          moduleBuilder, m_elementAdapter,
          this, USAGE_RVALUE,
          "produce",
          "index", sizeAdapter, USAGE_RVALUE
          );
        if ( buildFunctions )
        {
          BasicBlockBuilder basicBlockBuilder( functionBuilder );

          llvm::Value *rValue = functionBuilder[0];
          llvm::Value *indexRValue = functionBuilder[1];

          llvm::BasicBlock *entryBB = basicBlockBuilder.getFunctionBuilder().createBasicBlock( "entry" );
          
          basicBlockBuilder->SetInsertPoint( entryBB );
          CG::FunctionScope &functionScope = functionBuilder.getScope();
          functionScope.llvmPrepareReturnLValue( basicBlockBuilder );
          llvmProduce1( basicBlockBuilder, rValue, indexRValue, functionScope.llvmGetReturnLValue() );
          if ( functionScope.getReturnInfo().usesReturnLValue() )
            basicBlockBuilder->CreateRetVoid();
          else
            basicBlockBuilder->CreateRet( basicBlockBuilder->CreateLoad( functionScope.llvmGetReturnLValue() ) );
        }
      }

      {
        MethodBuilder functionBuilder(
          moduleBuilder, m_elementVariableArrayAdapter,
          this, USAGE_RVALUE,
          "produce",
          "index", sizeAdapter, USAGE_RVALUE,
          "count", sizeAdapter, USAGE_RVALUE
          );
        if ( buildFunctions )
        {
          BasicBlockBuilder basicBlockBuilder( functionBuilder );

          llvm::Value *rValue = functionBuilder[0];
          llvm::Value *indexRValue = functionBuilder[1];
          llvm::Value *countRValue = functionBuilder[2];

          llvm::BasicBlock *entryBB = basicBlockBuilder.getFunctionBuilder().createBasicBlock( "entry" );
          
          basicBlockBuilder->SetInsertPoint( entryBB );
          llvmProduce2( basicBlockBuilder, rValue, indexRValue, countRValue, functionBuilder.getScope().llvmGetReturnLValue() );
          basicBlockBuilder->CreateRetVoid();
        }
      }
      
      {
        MethodBuilder functionBuilder( moduleBuilder, 0, this, USAGE_RVALUE, "flush" );
        if ( buildFunctions )
        {
          BasicBlockBuilder basicBlockBuilder( functionBuilder );

          llvm::Value *rValue = functionBuilder[0];

          llvm::BasicBlock *entryBB = basicBlockBuilder.getFunctionBuilder().createBasicBlock( "entry" );
          
          basicBlockBuilder->SetInsertPoint( entryBB );

          llvmFlush( basicBlockBuilder, rValue );
          basicBlockBuilder->CreateRetVoid();
        }
      }
    }
bool checkForOverlap(char* const position) {
	if(*(position + 1) == '\0')
		return true;

	switch(getCodeName(position)) {
	case 1:
		if(getCodeName(position + 1) <= 5 && getCodeName(position + 1) > 0) {
			printf("Invalid expression: Overlapped.\n");
			return false;
		}
		break;
	case 2:
		if(getCodeName(position + 1) <= 5 && getCodeName(position + 1) > 0) {
			printf("Invalid expression: Overlapped.\n");
			return false;
		}
		break;
	case 3:
		if(getCodeName(position + 1) <= 5 && getCodeName(position + 1) > 0) {
			printf("Invalid expression: Overlapped.\n");
			return false;
		}
		break;
	case 4:
		if(getCodeName(position + 2) <= 5 && getCodeName(position + 2) > 0) {
			printf("Invalid expression: The operator -> has been overlapped.\n");
			return false;
		}
		break;
	case 5:
		if(getCodeName(position + 3) <= 5 && getCodeName(position + 3) > 0) {
			printf("Invalid expression: The operator <-> has been overlapped.\n");
			return false;
		}
		break;
	case 6:
		return true;
		break;
	case 7:
		return true;
		break;
	default:
		if(getCodeName(position) == getCodeName(position + 1)) {
			printf("Invalid expression: The variables must be a single character.\n");
			return false;
		}
		break;
	}

	return true;
}
 void ArrayProducerAdapter::llvmDefaultAssign( BasicBlockBuilder &basicBlockBuilder, llvm::Value *dstLValue, llvm::Value *srcRValue ) const
 {
   RC::Handle<Context> context = basicBlockBuilder.getContext();
   std::vector<llvm::Type *> argTypes;
   argTypes.push_back( llvmRType( context ) );
   argTypes.push_back( llvmLType( context ) );
   llvm::FunctionType *funcType = llvm::FunctionType::get( llvm::Type::getVoidTy( context->getLLVMContext() ), argTypes, false );
   llvm::Constant *func = basicBlockBuilder.getModuleBuilder()->getOrInsertFunction( "__"+getCodeName()+"__DefaultAssign", funcType ); 
   basicBlockBuilder->CreateCall2( func, srcRValue, dstLValue );
 }
 void ArrayProducerAdapter::llvmProduce2(
   CG::BasicBlockBuilder &basicBlockBuilder,
   llvm::Value *arrayProducerRValue,
   llvm::Value *indexRValue,
   llvm::Value *countRValue,
   llvm::Value *dstLValue
   ) const
 {    
   RC::Handle<Context> context = basicBlockBuilder.getContext();
   std::vector<llvm::Type *> argTypes;
   argTypes.push_back( basicBlockBuilder->getInt8PtrTy() );
   argTypes.push_back( llvmRType( context ) );
   argTypes.push_back( llvmSizeType( context ) );
   argTypes.push_back( llvmSizeType( context ) );
   argTypes.push_back( m_elementVariableArrayAdapter->llvmLType( context ) );
   llvm::FunctionType *funcType = llvm::FunctionType::get( llvm::Type::getVoidTy( context->getLLVMContext() ), argTypes, false );
   llvm::Constant *func = basicBlockBuilder.getModuleBuilder()->getOrInsertFunction( "__"+getCodeName()+"__Produce2", funcType ); 
   basicBlockBuilder->CreateCall5( func, llvmAdapterPtr( basicBlockBuilder ), arrayProducerRValue, indexRValue, countRValue, dstLValue );
 }
Beispiel #17
0
int main(int argc, char const *argv[])
{
    int fd; // ファイルディスクリプタ。サーバーとの接続
    uint32_t r_buf[DATA_NUM];

    const char *host = argv[1]; // 第一引数 ex) localhost
    const char *service = argv[2]; // 第二引数 ex) 1111

    /* サーバーとの接続 */
    fd = get_stream(host, service);
    if (fd == -1)
    {
        printf("get_stream error!!\n");
        exit(-1);
    }

    /* 一回目のデータ取得 */
    int len = -1;

    len = getData(fd, r_buf);
    printf("finish read\n");
    printf("len: %d\n", len);
    // dumpBuf(r_buf);

    /* ゲームに必要なデータの初期化 */
    struct Company companies[COMPANY_NUM];
    struct Tickets* tickets = InitTickets();
    uint32_t key, tmp_key, tmp_code;
    int money = 10000;
    int state = 0;

    key = InitCompanies(r_buf, companies);

    PrintCompanies(companies);

    /* メインルーチン。ターン数分実行される */
    for (int t = 0; t < TURNS; t++) {

        printf("\n\n------------------------%d th turn  money: %d------------------------\n", t, money);
        PrintCompanies(companies);

        /* strategy部分 */

        if (t == 0) {
            InitStrategy(fd, key, tickets, companies);
        } else if (t % 2 == 1) {
            SecondStrategy(fd, key, tickets, companies);
        } else if (t % 2 == 0) {
            ThirdBuyStrategy(fd, key, money, tickets, companies);
        } else {
            printf("bug!!!\n");
        }


        /* ターン内で投げたリクエストに対する反応を取得する */
        state = 0;
        // stateでゲームの進行状況を管理
        // state 0: 同一ターン内
        // state 1: 次のターンに進行
        // state 2: ゲーム終了。結果の出力へ
        while (state == 0) {

            getData(fd, r_buf);

            dumpBuf(r_buf);

            tmp_code = 0;
            tmp_key = 0;
            tmp_key = getKey(r_buf);
            if (key != tmp_key) {
                state = 1;
                printf("next turn\n");
            }
            tmp_code = getCode(r_buf);
            if (tmp_code == REQ_ACCEPT) {
                int accepted_idx = isContain(MakeTicketFromBuf(r_buf), tickets);
                printf("%d th ticket accepted!!\n", accepted_idx);
                if (accepted_idx != -1) {
                    money += ApplyTicket(accepted_idx, tickets, companies);
                }
            } else if (tmp_code == UNKOWN_CODE || tmp_code == INVALID_KEY ||
                       tmp_code == TOO_MUCH_REQ || tmp_code == ID_NOT_EXIST ||
                       tmp_code == TOO_MUCH_BUY || tmp_code == TOO_MUCH_SELL) {
                printf("code error type: %s\n", getCodeName(tmp_code));
                int rejected_idx = isContain(MakeTicketFromBuf(r_buf), tickets);
                printf("rejected ticket: %d\n", rejected_idx);
                if (rejected_idx != -1) {
                    DeleteTicket(rejected_idx, tickets);
                }
            } else if (tmp_code == TURN_START) {
                key = Parse(r_buf, companies);
                state = 1;
            } else if (tmp_code == GAME_END) {
                state = 2;
            } else {
                printf("something wrong in code\n");
            }
        }

        if (state == 2) {
            break;
        }

    }

    printf("\n\n\n");
    printf("##################################\n");
    printf("##############RESULT##############\n");
    printf("##################################\n\n");

    printf("your rank: %d\n", getID(0, r_buf));
    printf("your budget: %u\n", getValue(0, r_buf));

    close(fd);

    return 0;
}
const char* MtpDebug::getFormatCodeName(MtpObjectFormat code) {
	if (code == 0)
		return "NONE";
	return getCodeName(code, sFormatCodes);
}
Beispiel #19
0
 void OpaqueAdapter::llvmCompileToModule( ModuleBuilder &moduleBuilder ) const
 {
   if ( moduleBuilder.haveCompiledToModule( getCodeName() ) )
     return;
   
   RC::Handle<Context> context = moduleBuilder.getContext();
   
   RC::ConstHandle<BooleanAdapter> booleanAdapter = getManager()->getBooleanAdapter();
   booleanAdapter->llvmCompileToModule( moduleBuilder );
   RC::ConstHandle<SizeAdapter> sizeAdapter = getManager()->getSizeAdapter();
   sizeAdapter->llvmCompileToModule( moduleBuilder );
   RC::ConstHandle<StringAdapter> stringAdapter = getManager()->getStringAdapter();
   stringAdapter->llvmCompileToModule( moduleBuilder );
   RC::ConstHandle<OpaqueAdapter> dataAdapter = getManager()->getDataAdapter();
   dataAdapter->llvmCompileToModule( moduleBuilder );
   
   static const bool buildFunctions = true;
   
   {
     ConstructorBuilder functionBuilder( moduleBuilder, booleanAdapter, this, ConstructorBuilder::HighCost );
     if ( buildFunctions )
     {
       llvm::Value *booleanLValue = functionBuilder[0];
       llvm::Value *opaqueRValue = functionBuilder[1];
       BasicBlockBuilder basicBlockBuilder( functionBuilder );
       basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
       llvm::Value *booleanRValue = basicBlockBuilder->CreateIsNotNull( opaqueRValue );
       booleanAdapter->llvmAssign( basicBlockBuilder, booleanLValue, booleanRValue );
       basicBlockBuilder->CreateRetVoid();
     }
   }
   
   {
     ConstructorBuilder functionBuilder( moduleBuilder, stringAdapter, this, ConstructorBuilder::HighCost );
     if ( buildFunctions )
     {
       llvm::Value *stringLValue = functionBuilder[0];
       llvm::Value *opaqueRValue = functionBuilder[1];
       BasicBlockBuilder basicBlockBuilder( functionBuilder );
       basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
       llvm::Value *opaqueLValue = llvmRValueToLValue( basicBlockBuilder, opaqueRValue );
       stringAdapter->llvmCallCast( basicBlockBuilder, this, opaqueLValue, stringLValue );
       basicBlockBuilder->CreateRetVoid();
     }
   }
   
   {
     MethodBuilder functionBuilder(
       moduleBuilder,
       sizeAdapter,
       this, USAGE_RVALUE,
       "dataSize"
       );
     if ( buildFunctions )
     {
       BasicBlockBuilder basicBlockBuilder( functionBuilder );
       basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
       llvm::Value *dataSizeRValue = sizeAdapter->llvmConst( context, getDesc()->getAllocSize() );
       basicBlockBuilder->CreateRet( dataSizeRValue );
     }
   }
   
   {
     MethodBuilder functionBuilder(
       moduleBuilder,
       dataAdapter,
       this, USAGE_LVALUE,
       "data"
       );
     if ( buildFunctions )
     {
       llvm::Value *thisLValue = functionBuilder[0];
       BasicBlockBuilder basicBlockBuilder( functionBuilder );
       basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
       basicBlockBuilder->CreateRet( basicBlockBuilder->CreatePointerCast( thisLValue, dataAdapter->llvmRType( context ) ) );
     }
   }
 }
Beispiel #20
0
 void StructAdapter::llvmCompileToModule( ModuleBuilder &moduleBuilder ) const
 {
   if ( moduleBuilder.haveCompiledToModule( getCodeName() ) )
     return;
     
   RC::Handle<Context> context = moduleBuilder.getContext();
   
   RC::ConstHandle<StringAdapter> stringAdapter = getManager()->getStringAdapter();
   stringAdapter->llvmCompileToModule( moduleBuilder );
   RC::ConstHandle<SizeAdapter> sizeAdapter = getManager()->getSizeAdapter();
   sizeAdapter->llvmCompileToModule( moduleBuilder );
   RC::ConstHandle<OpaqueAdapter> dataAdapter = getManager()->getDataAdapter();
   dataAdapter->llvmCompileToModule( moduleBuilder );
   for ( MemberAdaptorVector::const_iterator it=m_memberAdapters.begin(); it!=m_memberAdapters.end(); ++it )
     (*it)->llvmCompileToModule( moduleBuilder );
   
   static const bool buildFunctions = true;
   
   if ( !m_isShallow )
   {
     {
       InternalFunctionBuilder functionBuilder(
         moduleBuilder,
         0, "__" + getCodeName() + "__DefaultAssign",
         "dst", this, USAGE_LVALUE,
         "src", this, USAGE_RVALUE,
         0
         );
       if ( buildFunctions )
       {
         llvm::Value *dstLValue = functionBuilder[0];
         llvm::Value *srcRValue = functionBuilder[1];
         BasicBlockBuilder basicBlockBuilder( functionBuilder );
         basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
         for ( size_t i=0; i<getNumMembers(); ++i )
         {
           RC::ConstHandle<Adapter> const &memberAdapter = m_memberAdapters[i];
           llvm::Value *dstMemberLValue = basicBlockBuilder->CreateConstGEP2_32( dstLValue, 0, i );
           llvm::Value *srcMemberLValue = basicBlockBuilder->CreateConstGEP2_32( srcRValue, 0, i );
           llvm::Value *srcMemberRValue = memberAdapter->llvmLValueToRValue( basicBlockBuilder, srcMemberLValue );
           memberAdapter->llvmAssign( basicBlockBuilder, dstMemberLValue, srcMemberRValue );
         }
         basicBlockBuilder->CreateRetVoid();
       }
     }
   }
   
   {
     ConstructorBuilder functionBuilder( moduleBuilder, stringAdapter, this, ConstructorBuilder::HighCost );
     if ( buildFunctions )
     {
       llvm::Value *stringLValue = functionBuilder[0];
       llvm::Value *structRValue = functionBuilder[1];
       BasicBlockBuilder basicBlockBuilder( functionBuilder );
       basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
       llvm::Value *structLValue = llvmRValueToLValue( basicBlockBuilder, structRValue );
       stringAdapter->llvmCallCast( basicBlockBuilder, this, structLValue, stringLValue );
       basicBlockBuilder->CreateRetVoid();
     }
   }
   
   if ( getDesc()->isShallow() )
   {
     {
       MethodBuilder functionBuilder(
         moduleBuilder,
         sizeAdapter,
         this, USAGE_RVALUE,
         "dataSize"
         );
       if ( buildFunctions )
       {
         BasicBlockBuilder basicBlockBuilder( functionBuilder );
         basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
         llvm::Value *dataSizeRValue = llvm::ConstantInt::get( sizeAdapter->llvmRType( context ), getDesc()->getAllocSize() );
         basicBlockBuilder->CreateRet( dataSizeRValue );
       }
     }
     
     {
       MethodBuilder functionBuilder(
         moduleBuilder,
         dataAdapter,
         this, USAGE_LVALUE,
         "data"
         );
       if ( buildFunctions )
       {
         llvm::Value *thisLValue = functionBuilder[0];
         BasicBlockBuilder basicBlockBuilder( functionBuilder );
         basicBlockBuilder->SetInsertPoint( functionBuilder.createBasicBlock( "entry" ) );
         basicBlockBuilder->CreateRet( basicBlockBuilder->CreatePointerCast( thisLValue, dataAdapter->llvmRType( context ) ) );
       }
     }
   }
 }
const char* MtpDebug::getOperationCodeName(MtpOperationCode code) {
	return getCodeName(code, sOperationCodes);
}
 void ArrayProducerAdapter::llvmRelease( CG::BasicBlockBuilder &basicBlockBuilder, llvm::Value *rValue ) const
 {    
   RC::Handle<Context> context = basicBlockBuilder.getContext();
   std::vector<llvm::Type *> argTypes;
   argTypes.push_back( llvmRType( context ) );
   llvm::FunctionType *funcType = llvm::FunctionType::get( llvm::Type::getVoidTy( context->getLLVMContext() ), argTypes, false );
   llvm::Constant *func = basicBlockBuilder.getModuleBuilder()->getOrInsertFunction( "__"+getCodeName()+"__Release", funcType ); 
   basicBlockBuilder->CreateCall( func, rValue );
 }
const char* MtpDebug::getDevicePropCodeName(MtpPropertyCode code) {
	if (code == 0)
		return "NONE";
	return getCodeName(code, sDevicePropCodes);
}
 llvm::Value *ArrayProducerAdapter::llvmGetCount(
   CG::BasicBlockBuilder &basicBlockBuilder,
   llvm::Value *arrayProducerRValue
   ) const
 {    
   RC::Handle<Context> context = basicBlockBuilder.getContext();
   std::vector<llvm::Type *> argTypes;
   argTypes.push_back( llvmRType( context ) );
   llvm::FunctionType *funcType = llvm::FunctionType::get( llvmSizeType( context ), argTypes, false );
   llvm::Constant *func = basicBlockBuilder.getModuleBuilder()->getOrInsertFunction( "__"+getCodeName()+"__GetCount", funcType ); 
   return basicBlockBuilder->CreateCall( func, arrayProducerRValue );
 }