Пример #1
0
LLVMBasicBlockRef JITImpl::getOrCreateMemoryCheckBailoutBlock(unsigned index)
{
  if (index == 0) {
    if (interpretOneBB) {
      return interpretOneBB;
    }
  } else if (endTraceBB) {
    return endTraceBB;
  }
  LLVMBasicBlockRef savedInsertPoint = LLVMGetInsertBlock(builder);
  LLVMBasicBlockRef bailoutBB = LLVMAppendBasicBlock(getCurrentFunction(), "");
  LLVMPositionBuilderAtEnd(builder, bailoutBB);
  if (index == 0) {
    LLVMValueRef args[] = {
      threadParam
    };
    LLVMValueRef call = emitCallToBeInlined(functions.jitInterpretOne, args, 1);
    LLVMBuildRet(builder, call);
    interpretOneBB = bailoutBB;
  } else {
    ensureEarlyReturnBB(LLVMGetReturnType(jitFunctionType));
    earlyReturnIncomingValues.push_back(
      LLVMConstInt(LLVMGetReturnType(jitFunctionType),
                   JIT_RETURN_END_TRACE, false));
    earlyReturnIncomingBlocks.push_back(LLVMGetInsertBlock(builder));
    LLVMBuildBr(builder, earlyReturnBB);
    endTraceBB = bailoutBB;
  }
  LLVMPositionBuilderAtEnd(builder, savedInsertPoint);
  return bailoutBB;
}
Пример #2
0
void SemanticsVisitor::visit(ReturningNode& rn) {
	if (rn.getReturnVal() != 0) { // NOTICE use errorType
		rn.getReturnVal()->accept(*this); // the same as visitChildren
		if (getCurrentFunction() == 0)
			errorLog() << "Return statement can only appear in a function.\n";
		else {
			if(!assignable(getCurrentFunction()->getReturnType()->getType(),
					rn.getReturnVal()->getType())) {
				errorLog() << "Illigal return type.\n";
			}
		}
	} else if (getCurrentFunction() != 0 &&
			!dynamic_cast<VoidTypeDescriptor*>(getCurrentFunction()->getReturnType()->getType()) // return type =/= void
			) {
		errorLog() << "A value must be returned.\n";
	}
}
Пример #3
0
static void listGlobalVariables(CardinalVM* vm) {
	ObjFn* fn = getCurrentFunction(vm);
	
	printf("Listing all global variables: \n");
	for(int i=0; i<fn->module->variables.count; i++) {
		printf("\t%.*s: ", fn->module->variableNames.data[i].length, fn->module->variableNames.data[i].buffer);
		cardinalPrintValue(fn->module->variables.data[i]);
		printf("\n");
	}
}
Пример #4
0
static void listLocalVariables(CardinalVM* vm) {
	ObjFn* fn = getCurrentFunction(vm);
	ObjFiber* fiber = vm->fiber;
	int top = fiber->stacktop - fiber->stack - 2;
	for(int ind = 0; ind < top; ind++) {
		printf("Variable '%.*s': ", fn->debug->locals.data[ind].length, fn->debug->locals.data[ind].buffer);
		cardinalPrintValue(fiber->stack[ind+1]);
		printf("\n");
	}
}
Пример #5
0
void JITImpl::emitCondBrToBlock(LLVMValueRef cond, LLVMBasicBlockRef trueBB)
{
  LLVMBasicBlockRef afterBB = LLVMAppendBasicBlock(getCurrentFunction(), "");
  LLVMBuildCondBr(builder, cond, trueBB, afterBB);
  LLVMPositionBuilderAtEnd(builder, afterBB);
}