diff --git a/cmake/ProjectLLVM.cmake b/cmake/ProjectLLVM.cmake index 5feee1ab..9405f424 100644 --- a/cmake/ProjectLLVM.cmake +++ b/cmake/ProjectLLVM.cmake @@ -60,8 +60,8 @@ function(configure_llvm_project) include(ExternalProject) ExternalProject_Add(llvm PREFIX ${CMAKE_SOURCE_DIR}/deps - URL http://llvm.org/releases/5.0.0/llvm-5.0.0.src.tar.xz - URL_HASH SHA256=e35dcbae6084adcf4abb32514127c5eabd7d63b733852ccdb31e06f1373136da + URL http://llvm.org/releases/8.0.0/llvm-8.0.0.src.tar.xz + URL_HASH SHA256=8872be1b12c61450cacc82b3d153eab02be2546ef34fa3580ed14137bb26224c DOWNLOAD_NO_PROGRESS TRUE BINARY_DIR ${CMAKE_SOURCE_DIR}/deps # Build directly to install dir to avoid copy. CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release diff --git a/libevmjit/Cache.cpp b/libevmjit/Cache.cpp index 0a80f4ec..24484bd8 100644 --- a/libevmjit/Cache.cpp +++ b/libevmjit/Cache.cpp @@ -36,8 +36,7 @@ namespace std::string getVersionedCacheDir() { llvm::SmallString<256> path; - llvm::sys::path::user_cache_directory(path, "ethereum", "evmjit", - std::to_string(c_internalABIVersion)); + userCacheDirectory(path, "ethereum", "evmjit", std::to_string(c_internalABIVersion)); return path.str(); } diff --git a/libevmjit/Ext.cpp b/libevmjit/Ext.cpp index 81b6b6af..3de97a60 100644 --- a/libevmjit/Ext.cpp +++ b/libevmjit/Ext.cpp @@ -432,7 +432,7 @@ llvm::Value* Ext::calldataload(llvm::Value* _idx) auto copySize = m_builder.CreateNUWSub(end, idx); auto padSize = m_builder.CreateNUWSub(m_builder.getInt64(32), copySize); auto dataBegin = m_builder.CreateGEP(Type::Byte, getRuntimeManager().getCallData(), idx); - m_builder.CreateMemCpy(result, dataBegin, copySize, 1); + m_builder.CreateMemCpy(result, /*DstAlign*/ 1, dataBegin, /*SrcAlign*/ 1, copySize); auto pad = m_builder.CreateGEP(Type::Byte, result, copySize); m_builder.CreateMemSet(pad, m_builder.getInt8(0), padSize, 1); @@ -531,7 +531,7 @@ void Ext::log(llvm::Value* _memIdx, llvm::Value* _numBytes, llvm::ArrayRefgetContext(), {}, func)); - + auto iter = func->arg_begin(); llvm::Argument* mem = &(*iter++); mem->setName("mem"); @@ -240,7 +240,7 @@ void Memory::copyBytes(llvm::Value* _srcPtr, llvm::Value* _srcSize, llvm::Value* auto padIdx = m_builder.CreateNUWAdd(dstIdx, bytesToCopy, "padIdx"); auto dst = m_memory.getPtr(getRuntimeManager().getMem(), dstIdx); auto pad = m_memory.getPtr(getRuntimeManager().getMem(), padIdx); - m_builder.CreateMemCpy(dst, src, bytesToCopy, 0); + m_builder.CreateMemCpy(dst, /*DstAlign*/ 0, src, /*SrcAlign*/ 0, bytesToCopy); m_builder.CreateMemSet(pad, m_builder.getInt8(0), bytesToZero, 0); } @@ -267,7 +267,7 @@ void Memory::copyBytesNoPadding(llvm::Value* _srcPtr, llvm::Value* _srcSize, llv auto src = m_builder.CreateGEP(_srcPtr, srcIdx, "src"); auto dstIdx = m_builder.CreateTrunc(_destMemIdx, Type::Size, "dstIdx"); auto dst = m_memory.getPtr(getRuntimeManager().getMem(), dstIdx); - m_builder.CreateMemCpy(dst, src, reqBytes, 0); + m_builder.CreateMemCpy(dst, /*DstAlign*/ 0, src, /*SrcAlign*/ 0, reqBytes); } } diff --git a/libevmjit/Optimizer.cpp b/libevmjit/Optimizer.cpp index b640fd65..844e1d2e 100644 --- a/libevmjit/Optimizer.cpp +++ b/libevmjit/Optimizer.cpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include "preprocessor/llvm_includes_end.h" diff --git a/libevmjit/Utils.cpp b/libevmjit/Utils.cpp index ae2b7035..31508e04 100644 --- a/libevmjit/Utils.cpp +++ b/libevmjit/Utils.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "BuildInfo.gen.h" @@ -180,5 +181,67 @@ void keccak(uint8_t const* _data, uint64_t _size, uint8_t* o_hash) keccak_256(o_hash, 32, _data, _size); } +namespace +{ + +bool getDarwinConfDir(bool _tempDir, llvm::SmallVectorImpl &_result) { +#if defined(_CS_DARWIN_USER_TEMP_DIR) && defined(_CS_DARWIN_USER_CACHE_DIR) + // On Darwin, use DARWIN_USER_TEMP_DIR or DARWIN_USER_CACHE_DIR. + // macros defined in on darwin >= 9 + int ConfName = _tempDir ? _CS_DARWIN_USER_TEMP_DIR + : _CS_DARWIN_USER_CACHE_DIR; + size_t ConfLen = confstr(ConfName, nullptr, 0); + if (ConfLen > 0) { + do { + _result.resize(ConfLen); + ConfLen = confstr(ConfName, _result.data(), _result.size()); + } while (ConfLen > 0 && ConfLen != _result.size()); + + if (ConfLen > 0) { + assert(_result.back() == 0); + _result.pop_back(); + return true; + } + + _result.clear(); + } +#endif + return false; +} + +bool getUserCacheDir(llvm::SmallVectorImpl &_result) +{ + // First try using XDS_CACHE_HOME env variable, + // as specified in XDG Base Directory Specification at + // http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + if (const char *XdsCacheDir = std::getenv("XDS_CACHE_HOME")) { + _result.clear(); + _result.append(XdsCacheDir, XdsCacheDir + strlen(XdsCacheDir)); + return true; + } + + // Try Darwin configuration query + if (getDarwinConfDir(false, _result)) + return true; + + // Use "$HOME/.cache" if $HOME is available + if (llvm::sys::path::home_directory(_result)) { + llvm::sys::path::append(_result, ".cache"); + return true; + } + + return false; +} +} + +bool userCacheDirectory(llvm::SmallVectorImpl &_result, const llvm::Twine &_path1, const llvm::Twine &_path2, const llvm::Twine &_path3) +{ + if (getUserCacheDir(_result)) { + llvm::sys::path::append(_result, _path1, _path2, _path3); + return true; + } + return false; +} + } } diff --git a/libevmjit/Utils.h b/libevmjit/Utils.h index 862d45f7..29a1ab59 100644 --- a/libevmjit/Utils.h +++ b/libevmjit/Utils.h @@ -2,11 +2,18 @@ #include #include +#include +#include namespace dev { namespace evmjit { void keccak(uint8_t const *_data, uint64_t _size, uint8_t *o_hash); +bool userCacheDirectory(llvm::SmallVectorImpl &_result, + const llvm::Twine &_path1, + const llvm::Twine &Path2 = "", + const llvm::Twine &Path3 = ""); + // The same as assert, but expression is always evaluated and result returned #define CHECK(expr) (assert(expr), expr)