Exemplo n.º 1
0
IndexedAbstractHeap::IndexedAbstractHeap(LContext context, AbstractHeap* parent, const char* heapName, ptrdiff_t offset, size_t elementSize)
    : m_heapForAnyIndex(parent, heapName)
    , m_heapNameLength(strlen(heapName))
    , m_offset(offset)
    , m_elementSize(elementSize)
    , m_scaleTerm(0)
    , m_canShift(false)
{
#if FTL_USES_B3
    UNUSED_PARAM(context);
#else
    // See if there is a common shift amount we could use instead of multiplying. Don't
    // try too hard. This is just a speculative optimization to reduce load on LLVM.
    for (unsigned i = 0; i < 4; ++i) {
        if (1U << i == m_elementSize) {
            if (i)
                m_scaleTerm = constInt(intPtrType(context), i, ZeroExtend);
            m_canShift = true;
            break;
        }
    }
    
    if (!m_canShift)
        m_scaleTerm = constInt(intPtrType(context), m_elementSize, ZeroExtend);
#endif
}
Exemplo n.º 2
0
llvm::MDNode * localVariableInfo(llvm::LLVMContext & ctx,
                                 llvm::MDNode * context,
                                 const char * name,
                                 llvm::MDNode * file,
                                 int lineNumber,
                                 llvm::MDNode * type) {
    
    std::vector<llvm::Value *> values;
    values.push_back(constInt(ctx, llvm::LLVMDebugVersion + llvm::dwarf::DW_TAG_auto_variable)); // Tag
    values.push_back(context);
    values.push_back(llvm::MDString::get(ctx, name));
    values.push_back(file);
    values.push_back(constInt(ctx, lineNumber));
    values.push_back(type);

    return  llvm::MDNode::get(ctx, values);
}
Exemplo n.º 3
0
TEST_F(OneSubOptimizerTests,
EqOpAndXorOpSecOpOfXorIsTenNotOptimized) {
	// return (a == b) ^ 10;
	//
	// Not optimized.
	//
	ShPtr<Variable> varA(Variable::create("a", IntType::create(16, true)));
	ShPtr<Variable> varB(Variable::create("b", IntType::create(16, true)));
	ShPtr<ConstInt> constInt(ConstInt::create(10, 64));
	ShPtr<EqOpExpr> eqOpExpr(
		EqOpExpr::create(
			varA,
			varB
	));
	ShPtr<BitXorOpExpr> returnExpr(
		BitXorOpExpr::create(
			eqOpExpr,
			constInt
	));
	ShPtr<ReturnStmt> returnStmt(ReturnStmt::create(returnExpr));

	optimizer->tryOptimize(returnStmt->getRetVal());

	ShPtr<BitXorOpExpr> outBitXorOpExpr(cast<BitXorOpExpr>(returnStmt->getRetVal()));
	ASSERT_TRUE(outBitXorOpExpr) <<
		"expected `BitXorOpExpr`, "
		"got `" << returnStmt->getRetVal() << "`";
	ShPtr<EqOpExpr> outEqOpExpr(cast<EqOpExpr>(outBitXorOpExpr->getFirstOperand()));
	ASSERT_TRUE(outEqOpExpr) <<
		"expected `EqOpExpr`, "
		"got `" << outBitXorOpExpr->getFirstOperand() << "`";
	ShPtr<Variable> outOp1(cast<Variable>(outEqOpExpr->getFirstOperand()));
	ASSERT_TRUE(outOp1) <<
		"expected `Variable`, "
		"got `" << outEqOpExpr->getFirstOperand() << "`";
	EXPECT_EQ(varA, outOp1) <<
		"expected `" << varA << "`, "
		"got `" << outOp1 << "`";
	ShPtr<Variable> outOp2(cast<Variable>(outEqOpExpr->getSecondOperand()));
	ASSERT_TRUE(outOp2) <<
		"expected `Variable`, "
		"got `" << outEqOpExpr->getSecondOperand() << "`";
	EXPECT_EQ(varB, outOp2) <<
		"expected `" << varB << "`, "
		"got `" << outOp2 << "`";
	ShPtr<ConstInt> outConstInt(cast<ConstInt>(outBitXorOpExpr->getSecondOperand()));
	ASSERT_TRUE(outConstInt) <<
		"expected `ConstInt`, "
		"got `" << outBitXorOpExpr->getSecondOperand() << "`";
	EXPECT_EQ(constInt, outConstInt) <<
		"expected `" << constInt << "`, "
		"got `" << outConstInt << "`";
}
Exemplo n.º 4
0
llvm::MDNode * fileInfo(llvm::LLVMContext & ctx,
                        const char * fileName,
                        const char * fileDirectory,
                        llvm::MDNode * compilationUnit) {
    
    std::vector<llvm::Value *> values;
    values.push_back(constInt(ctx, llvm::LLVMDebugVersion + llvm::dwarf::DW_TAG_file_type)); // Tag
    values.push_back(llvm::MDString::get(ctx, fileName));
    values.push_back(llvm::MDString::get(ctx, fileDirectory));
    values.push_back(compilationUnit);

    return  llvm::MDNode::get(ctx, values);
}
Exemplo n.º 5
0
llvm::MDNode * subprogramInfo(llvm::LLVMContext & ctx,
                              llvm::MDNode * context,
                              const char * name,
                              const char * displayName,
                              const char * MIPSLinkName,
                              llvm::MDNode * file,
                              int lineNumber,
                              llvm::MDNode * type,
                              bool isStatic,
                              bool notExtern,
                              int virtuality,
                              int virtualIndex,
                              llvm::MDNode * vtableType,
                              bool artificial,
                              bool optimized,
                              llvm::Function * const function) {
    
    std::vector<llvm::Value *> values;
    values.push_back(constInt(ctx, llvm::LLVMDebugVersion + llvm::dwarf::DW_TAG_subprogram)); // Tag   
    values.push_back(constInt(ctx, 0)); // Unused
    values.push_back(context);
    values.push_back(llvm::MDString::get(ctx, name));
    values.push_back(llvm::MDString::get(ctx, displayName));
    values.push_back(llvm::MDString::get(ctx, MIPSLinkName));
    values.push_back(file);
    values.push_back(constInt(ctx, lineNumber));
    values.push_back(type);
    values.push_back(constBit(ctx, isStatic));
    values.push_back(constBit(ctx, notExtern));
    values.push_back(constInt(ctx, virtuality));
    values.push_back(constInt(ctx, virtualIndex));
    values.push_back(vtableType);
    values.push_back(constBit(ctx, artificial));
    values.push_back(constBit(ctx, optimized));
    values.push_back((llvm::Value *)function);

    return  llvm::MDNode::get(ctx, values);
}
Exemplo n.º 6
0
llvm::MDNode * compilationUnitInfo(llvm::LLVMContext & ctx,
                               int languageId,
                               const char * sourceName,
                               const char * sourceDirectory,
                               const char * producer,
                               bool mainCompileUnit,
                               bool optimized,
                               const char * flags,
                               int runtimeVersion) {
    
    std::vector<llvm::Value *> values;
    values.push_back(constInt(ctx, llvm::LLVMDebugVersion + llvm::dwarf::DW_TAG_compile_unit)); // Tag
    values.push_back(constInt(ctx, 0)); // Unused
    values.push_back(constInt(ctx, languageId));
    values.push_back(llvm::MDString::get(ctx, sourceName));
    values.push_back(llvm::MDString::get(ctx, sourceDirectory));
    values.push_back(llvm::MDString::get(ctx, producer));
    values.push_back(constBit(ctx, mainCompileUnit));
    values.push_back(constBit(ctx, optimized));
    values.push_back(llvm::MDString::get(ctx, flags));
    values.push_back(constInt(ctx, runtimeVersion));

    return  llvm::MDNode::get(ctx, values);
}
Exemplo n.º 7
0
CommonValues::CommonValues(LContext context)
    : voidType(FTL::voidType(context))
    , boolean(int1Type(context))
    , int8(int8Type(context))
    , int16(int16Type(context))
    , int32(int32Type(context))
    , int64(int64Type(context))
    , intPtr(intPtrType(context))
    , floatType(FTL::floatType(context))
    , doubleType(FTL::doubleType(context))
    , ref8(pointerType(int8))
    , ref16(pointerType(int16))
    , ref32(pointerType(int32))
    , ref64(pointerType(int64))
    , refPtr(pointerType(intPtr))
    , refFloat(pointerType(floatType))
    , refDouble(pointerType(doubleType))
    , booleanTrue(constInt(boolean, true, ZeroExtend))
    , booleanFalse(constInt(boolean, false, ZeroExtend))
    , int8Zero(constInt(int8, 0, SignExtend))
    , int32Zero(constInt(int32, 0, SignExtend))
    , int32One(constInt(int32, 1, SignExtend))
    , int64Zero(constInt(int64, 0, SignExtend))
    , intPtrZero(constInt(intPtr, 0, SignExtend))
    , intPtrOne(constInt(intPtr, 1, SignExtend))
    , intPtrTwo(constInt(intPtr, 2, SignExtend))
    , intPtrThree(constInt(intPtr, 3, SignExtend))
    , intPtrFour(constInt(intPtr, 4, SignExtend))
    , intPtrEight(constInt(intPtr, 8, SignExtend))
    , intPtrPtr(constInt(intPtr, sizeof(void*), SignExtend))
    , doubleZero(constReal(doubleType, 0))
    , rangeKind(mdKindID(context, "range"))
    , profKind(mdKindID(context, "prof"))
    , branchWeights(mdString(context, "branch_weights"))
    , nonNegativeInt32(constInt(int32, 0, SignExtend), constInt(int32, 1ll << 31, SignExtend))
    , m_context(context)
    , m_module(0)
{
}