diff --git a/libevmjit/Compiler.cpp b/libevmjit/Compiler.cpp index 25f5932df..92a2b0e0c 100644 --- a/libevmjit/Compiler.cpp +++ b/libevmjit/Compiler.cpp @@ -455,7 +455,7 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, RuntimeManager& _runti auto word = stack.pop(); auto k32_ = m_builder.CreateTrunc(idx, m_builder.getIntNTy(5), "k_32"); - auto k32 = m_builder.CreateZExt(k32_, Type::lowPrecision); + auto k32 = m_builder.CreateZExt(k32_, Type::Size); auto k32x8 = m_builder.CreateMul(k32, m_builder.getInt64(8), "kx8"); // test for word >> (k * 8 + 7) @@ -492,11 +492,7 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, RuntimeManager& _runti case Instruction::POP: { - auto val = stack.pop(); - static_cast(val); - // Generate a dummy use of val to make sure that a get(0) will be emitted at this point, - // so that StackUnderflow will be thrown - // m_builder.CreateICmpEQ(val, val, "dummy"); + stack.pop(); break; } @@ -653,7 +649,6 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, RuntimeManager& _runti } case Instruction::CODESIZE: - // TODO: Use constant stack.push(_runtimeManager.getCodeSize()); break; diff --git a/libevmjit/CompilerHelper.h b/libevmjit/CompilerHelper.h index cd6d09a58..5eeae9a6e 100644 --- a/libevmjit/CompilerHelper.h +++ b/libevmjit/CompilerHelper.h @@ -37,7 +37,6 @@ protected: friend class RuntimeHelper; }; - /// Compiler helper that depends on runtime data class RuntimeHelper : public CompilerHelper { @@ -50,29 +49,7 @@ private: RuntimeManager& m_runtimeManager; }; - -/// Saves the insert point of the IR builder and restores it when destructed -struct InsertPointGuard -{ - InsertPointGuard(llvm::IRBuilder<>& _builder) : - m_builder(_builder), - m_insertBB(m_builder.GetInsertBlock()), - m_insertPt(m_builder.GetInsertPoint()) - {} - - InsertPointGuard(const InsertPointGuard&) = delete; - void operator=(InsertPointGuard) = delete; - - ~InsertPointGuard() - { - m_builder.SetInsertPoint(m_insertBB, m_insertPt); - } - -private: - llvm::IRBuilder<>& m_builder; - llvm::BasicBlock* m_insertBB; - llvm::BasicBlock::iterator m_insertPt; -}; +using InsertPointGuard = llvm::IRBuilderBase::InsertPointGuard; } } diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index 79a82a8ae..6d5b72024 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -191,8 +191,7 @@ llvm::Value* Memory::getSize() llvm::Value* Memory::getBytePtr(llvm::Value* _index) { - auto idx = m_builder.CreateTrunc(_index, Type::Size, "idx"); // Never allow memory index be a type bigger than i64 - return m_builder.CreateGEP(getData(), idx, "ptr"); + return m_builder.CreateGEP(getData(), _index, "ptr"); } void Memory::require(llvm::Value* _offset, llvm::Value* _size) @@ -235,7 +234,7 @@ void Memory::copyBytes(llvm::Value* _srcPtr, llvm::Value* _srcSize, llvm::Value* auto bytesToZero = m_builder.CreateNUWSub(reqBytes, bytesToCopy, "bytesToZero"); auto src = m_builder.CreateGEP(_srcPtr, idx64, "src"); - auto dstIdx = m_builder.CreateTrunc(_destMemIdx, Type::Size, "dstIdx"); // Never allow memory index be a type bigger than i64 + auto dstIdx = m_builder.CreateTrunc(_destMemIdx, Type::Size, "dstIdx"); auto padIdx = m_builder.CreateNUWAdd(dstIdx, bytesToCopy, "padIdx"); auto dst = m_memory.getPtr(getRuntimeManager().getMem(), dstIdx); auto pad = m_memory.getPtr(getRuntimeManager().getMem(), padIdx); diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index 5c66a5a21..8d000f4c8 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -194,8 +194,7 @@ void RuntimeManager::registerReturnData(llvm::Value* _offset, llvm::Value* _size { auto memPtr = m_builder.CreateBitCast(getMem(), Type::BytePtr->getPointerTo()); auto mem = getBuilder().CreateLoad(memPtr, "memory"); - auto idx = m_builder.CreateTrunc(_offset, Type::Size, "idx"); // Never allow memory index be a type bigger than i64 // TODO: Report bug & fix to LLVM - auto returnDataPtr = getBuilder().CreateGEP(mem, idx); + auto returnDataPtr = getBuilder().CreateGEP(mem, _offset); set(RuntimeData::ReturnData, returnDataPtr); auto size64 = getBuilder().CreateTrunc(_size, Type::Size); diff --git a/libevmjit/Type.cpp b/libevmjit/Type.cpp index 00a143dea..6ac9a6467 100644 --- a/libevmjit/Type.cpp +++ b/libevmjit/Type.cpp @@ -13,7 +13,6 @@ namespace jit llvm::IntegerType* Type::Word; llvm::PointerType* Type::WordPtr; -llvm::IntegerType* Type::lowPrecision; llvm::IntegerType* Type::Bool; llvm::IntegerType* Type::Size; llvm::IntegerType* Type::Gas; @@ -34,8 +33,6 @@ void Type::init(llvm::LLVMContext& _context) { Word = llvm::Type::getIntNTy(_context, 256); WordPtr = Word->getPointerTo(); - lowPrecision = llvm::Type::getInt64Ty(_context); - // TODO: Size should be architecture-dependent Bool = llvm::Type::getInt1Ty(_context); Size = llvm::Type::getInt64Ty(_context); Gas = Size; diff --git a/libevmjit/Type.h b/libevmjit/Type.h index fcca98d74..ba9181f6b 100644 --- a/libevmjit/Type.h +++ b/libevmjit/Type.h @@ -20,10 +20,6 @@ struct Type static llvm::IntegerType* Word; static llvm::PointerType* WordPtr; - /// Type for doing low precision arithmetics where 256-bit precision is not supported by native target - /// @TODO: Use 64-bit for now. In 128-bit compiler-rt library functions are required - static llvm::IntegerType* lowPrecision; - static llvm::IntegerType* Bool; static llvm::IntegerType* Size; static llvm::IntegerType* Gas;