bool DatabaseAdapter_DataBlock::Reader::load( const Index& elemno, DataBlock& blk) { m_dbkey.resize( m_domainKeySize); m_dbkey.addElem( elemno); std::string blkstr; if (!m_database->readValue( m_dbkey.ptr(), m_dbkey.size(), blkstr, DatabaseOptions())) return false; blk.init( elemno, blkstr.c_str(), blkstr.size(), blkstr.size()); return true; }
bool DatabaseAdapter_DataBlock::Cursor::getBlock( const DatabaseCursorInterface::Slice& key, DataBlock& blk) { if (!key.defined()) return false; char const* ki = key.ptr()+m_domainKeySize; char const* ke = ki + key.size()-m_domainKeySize; Index elemno = unpackIndex( ki, ke); DatabaseCursorInterface::Slice blkslice = m_cursor->value(); blk.init( elemno, blkslice.ptr(), blkslice.size()); return true; }
template<class T> uint64_t test_const(T val) { using testfunc = double (*)(); static const Abi test_abi = { .gpUnreserved = RegSet{}, .gpReserved = x64::abi().gp(), .simdUnreserved = RegSet{xmm0}, .simdReserved = x64::abi().simd() - RegSet{xmm0}, .calleeSaved = x64::abi().calleeSaved, .sf = x64::abi().sf }; static uint8_t code[1000]; // None of these tests should use any data. static uint8_t data_buffer[0]; CodeBlock main; main.init(code, sizeof(code), "test"); DataBlock data; data.init(data_buffer, sizeof(data), "data"); Vunit unit; Vasm vasm{unit}; Vtext text { main, data }; auto& v = vasm.main(); unit.entry = v; v << copy{v.cns(val), Vreg{xmm0}}; v << ret{RegSet{xmm0}}; optimizeX64(vasm.unit(), test_abi, true /* regalloc */); CGMeta fixups; LeaseHolder writer{Translator::WriteLease()}; EXPECT_TRUE(writer.canWrite()); emitX64(unit, text, fixups, nullptr); // The above code might use fixups.literals but shouldn't use anything else. fixups.literals.clear(); EXPECT_TRUE(fixups.empty()); union { double d; uint64_t c; } u; u.d = ((testfunc)code)(); return u.c; }