Browse Source

Remove VLAs in htif/memif (-Wvla)

I don't think these are actually performance-critical, but if they prove
to be, there are obvious optimizations.
pull/1963/head
Andrew Waterman 12 months ago
parent
commit
c75bf6f48f
  1. 9
      fesvr/htif.cc
  2. 28
      fesvr/memif.cc

9
fesvr/htif.cc

@ -65,14 +65,14 @@ htif_t::htif_t(int argc, char** argv) : htif_t()
htif_t::htif_t(const std::vector<std::string>& args) : htif_t()
{
int argc = args.size() + 1;
char * argv[argc];
std::vector<char*>argv(argc);
argv[0] = (char *) "htif";
for (unsigned int i = 0; i < args.size(); i++) {
argv[i+1] = (char *) args[i].c_str();
}
//Set line size as 16 by default.
line_size = 16;
parse_arguments(argc, argv);
parse_arguments(argc, &argv[0]);
register_devices();
}
@ -253,11 +253,10 @@ void htif_t::stop()
void htif_t::clear_chunk(addr_t taddr, size_t len)
{
char zeros[chunk_max_size()];
memset(zeros, 0, chunk_max_size());
std::vector<uint8_t> zeros(chunk_max_size(), 0);
for (size_t pos = 0; pos < len; pos += chunk_max_size())
write_chunk(taddr + pos, std::min(len - pos, chunk_max_size()), zeros);
write_chunk(taddr + pos, std::min(len - pos, chunk_max_size()), &zeros[0]);
}
int htif_t::run()

28
fesvr/memif.cc

@ -12,10 +12,10 @@ void memif_t::read(addr_t addr, size_t len, void* bytes)
if (len && (addr & (align-1)))
{
size_t this_len = std::min(len, align - size_t(addr & (align-1)));
uint8_t chunk[align];
std::vector<uint8_t> chunk(align);
cmemif->read_chunk(addr & ~(align-1), align, chunk);
memcpy(bytes, chunk + (addr & (align-1)), this_len);
cmemif->read_chunk(addr & ~(align-1), align, &chunk[0]);
memcpy(bytes, &chunk[addr & (align-1)], this_len);
bytes = (char*)bytes + this_len;
addr += this_len;
@ -26,10 +26,10 @@ void memif_t::read(addr_t addr, size_t len, void* bytes)
{
size_t this_len = len & (align-1);
size_t start = len - this_len;
uint8_t chunk[align];
std::vector<uint8_t> chunk(align);
cmemif->read_chunk(addr + start, align, chunk);
memcpy((char*)bytes + start, chunk, this_len);
cmemif->read_chunk(addr + start, align, &chunk[0]);
memcpy((char*)bytes + start, &chunk[0], this_len);
len -= this_len;
}
@ -45,11 +45,11 @@ void memif_t::write(addr_t addr, size_t len, const void* bytes)
if (len && (addr & (align-1)))
{
size_t this_len = std::min(len, align - size_t(addr & (align-1)));
uint8_t chunk[align];
std::vector<uint8_t> chunk(align);
cmemif->read_chunk(addr & ~(align-1), align, chunk);
memcpy(chunk + (addr & (align-1)), bytes, this_len);
cmemif->write_chunk(addr & ~(align-1), align, chunk);
cmemif->read_chunk(addr & ~(align-1), align, &chunk[0]);
memcpy(&chunk[addr & (align-1)], bytes, this_len);
cmemif->write_chunk(addr & ~(align-1), align, &chunk[0]);
bytes = (char*)bytes + this_len;
addr += this_len;
@ -60,11 +60,11 @@ void memif_t::write(addr_t addr, size_t len, const void* bytes)
{
size_t this_len = len & (align-1);
size_t start = len - this_len;
uint8_t chunk[align];
std::vector<uint8_t> chunk(align);
cmemif->read_chunk(addr + start, align, chunk);
memcpy(chunk, (char*)bytes + start, this_len);
cmemif->write_chunk(addr + start, align, chunk);
cmemif->read_chunk(addr + start, align, &chunk[0]);
memcpy(&chunk[0], (char*)bytes + start, this_len);
cmemif->write_chunk(addr + start, align, &chunk[0]);
len -= this_len;
}

Loading…
Cancel
Save