Fix some warnings/suggestions from clang-tidy.

@DirtyHairy, hope you don't mind.
This commit is contained in:
Stephen Anthony 2024-07-15 13:21:26 -02:30
parent 3f5c331024
commit 1e964828b4
7 changed files with 87 additions and 93 deletions

View File

@ -35,32 +35,32 @@ namespace {
#ifdef DUMP_ELF
void dumpElf(const ElfFile& elf)
{
cout << std::endl << "ELF sections:" << std::endl << std::endl;
cout << "\nELF sections:\n\n";
size_t i = 0;
for (auto& section: elf.getSections()) {
if (section.type != 0x00) cout << i << " " << section << std::endl;
for (const auto& section: elf.getSections()) {
if (section.type != 0x00) cout << i << " " << section << '\n';
i++;
}
auto symbols = elf.getSymbols();
cout << std::endl << "ELF symbols:" << std::endl << std::endl;
if (symbols.size() > 0) {
cout << "\nELF symbols:\n\n";
if (!symbols.empty()) {
i = 0;
for (auto& symbol: symbols)
cout << (i++) << " " << symbol << std::endl;
cout << (i++) << " " << symbol << '\n';
}
i = 0;
for (auto& section: elf.getSections()) {
for (const auto& section: elf.getSections()) {
auto rels = elf.getRelocations(i++);
if (!rels) continue;
cout
<< std::endl << "ELF relocations for section "
<< section.name << ":" << std::endl << std::endl;
<< "\nELF relocations for section "
<< section.name << ":\n\n";
for (auto& rel: *rels) cout << rel << std::endl;
for (auto& rel: *rels) cout << rel << '\n';
}
}
@ -69,15 +69,12 @@ namespace {
cout << std::hex << std::setfill('0');
cout
<< std::endl
<< "text segment size: 0x" << std::setw(8) << linker.getSegmentSize(ElfLinker::SegmentType::text)
<< std::endl
<< "data segment size: 0x" << std::setw(8) << linker.getSegmentSize(ElfLinker::SegmentType::data)
<< std::endl
<< "rodata segment size: 0x" << std::setw(8) << linker.getSegmentSize(ElfLinker::SegmentType::rodata)
<< std::endl;
<< "\ntext segment size: 0x" << std::setw(8) << linker.getSegmentSize(ElfLinker::SegmentType::text)
<< "\ndata segment size: 0x" << std::setw(8) << linker.getSegmentSize(ElfLinker::SegmentType::data)
<< "\nrodata segment size: 0x" << std::setw(8) << linker.getSegmentSize(ElfLinker::SegmentType::rodata)
<< '\n';
cout << std::endl << "relocated sections:" << std::endl << std::endl;
cout << "\nrelocated sections:\n\n";
const auto& sections = parser.getSections();
const auto& relocatedSections = linker.getRelocatedSections();
@ -89,10 +86,10 @@ namespace {
<< sections[i].name
<< " @ 0x"<< std::setw(8)
<< (relocatedSections[i]->offset + linker.getSegmentBase(relocatedSections[i]->segment))
<< " size 0x" << std::setw(8) << sections[i].size << std::endl;
<< " size 0x" << std::setw(8) << sections[i].size << '\n';
}
cout << std::endl << "relocated symbols:" << std::endl << std::endl;
cout << "\nrelocated symbols:\n\n";
const auto& symbols = parser.getSymbols();
const auto& relocatedSymbols = linker.getRelocatedSymbols();
@ -122,30 +119,30 @@ namespace {
cout << " (abs)";
}
cout << std::endl;
cout << '\n';
}
const auto& initArray = linker.getInitArray();
const auto& preinitArray = linker.getPreinitArray();
if (initArray.size()) {
cout << std::endl << "init array:" << std::endl << std::endl;
if (!initArray.empty()) {
cout << "\ninit array:\n\n";
for (uInt32 address: initArray)
cout << " * 0x" << std::setw(8) << address << std::endl;
for (const uInt32 address: initArray)
cout << " * 0x" << std::setw(8) << address << '\n';
}
if (preinitArray.size()) {
cout << std::endl << "preinit array:" << std::endl << std::endl;
if (!preinitArray.empty()) {
cout << "\npreinit array:\n\n";
for (uInt32 address: preinitArray)
cout << " * 0x" << std::setw(8) << address << std::endl;
for (const uInt32 address: preinitArray)
cout << " * 0x" << std::setw(8) << address << '\n';
}
cout << std::dec;
}
#endif
}
} // namespace
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CartridgeELF::CartridgeELF(const ByteBuffer& image, size_t size, string_view md5,
@ -189,16 +186,15 @@ CartridgeELF::CartridgeELF(const ByteBuffer& image, size_t size, string_view md5
dumpLinkage(elfParser, elfLinker);
cout
<< std::endl
<< "ARM entrypoint: 0x"
<< "\nARM entrypoint: 0x"
<< std::hex << std::setw(8) << std::setfill('0') << myArmEntrypoint << std::dec
<< std::endl;
<< '\n';
#endif
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CartridgeELF::~CartridgeELF() {}
CartridgeELF::~CartridgeELF() = default;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CartridgeELF::reset()
@ -221,7 +217,7 @@ void CartridgeELF::install(System& system)
{
mySystem = &system;
for (size_t addr = 0; addr < 0x1000; addr += System::PAGE_SIZE) {
for (uInt16 addr = 0; addr < 0x1000; addr += System::PAGE_SIZE) {
System::PageAccess access(this, System::PageAccessType::READ);
access.romPeekCounter = &myRomAccessCounter[addr];
access.romPokeCounter = &myRomAccessCounter[addr];
@ -308,7 +304,7 @@ void CartridgeELF::vcsWrite5(uInt8 zpAddress, uInt8 value)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CartridgeELF::vcsCopyOverblankToRiotRam()
{
for (size_t i = 0; i < OVERBLANK_PROGRAM_SIZE; i++)
for (uInt8 i = 0; i < OVERBLANK_PROGRAM_SIZE; i++)
vcsWrite5(0x80 + i, OVERBLANK_PROGRAM[i]);
}
@ -337,13 +333,13 @@ CartridgeELF::BusTransaction CartridgeELF::BusTransaction::transactionDrive(uInt
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CartridgeELF::BusTransaction::setBusState(bool& drive, uInt8& value)
void CartridgeELF::BusTransaction::setBusState(bool& bs_drive, uInt8& bs_value) const
{
if (yield) {
drive = false;
bs_drive = false;
} else {
drive = true;
value = this->value;
bs_drive = true;
bs_value = this->value;
}
}

View File

@ -70,7 +70,7 @@ class CartridgeELF: public Cartridge {
static BusTransaction transactionYield(uInt16 address);
static BusTransaction transactionDrive(uInt16 address, uInt8 value);
void setBusState(bool& drive, uInt8& value);
void setBusState(bool& drive, uInt8& value) const;
uInt16 address;
uInt8 value;

View File

@ -43,10 +43,10 @@ namespace {
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool checkSegmentOverlap(uInt32 segmentBase1, uInt32 segmentSize1, uInt32 segmentBase2, uInt32 segmentSize2) {
constexpr bool checkSegmentOverlap(uInt32 segmentBase1, uInt32 segmentSize1, uInt32 segmentBase2, uInt32 segmentSize2) {
return !(segmentBase1 + segmentSize1 <= segmentBase2 || segmentBase2 + segmentSize2 <= segmentBase1);
}
}
} // namespace
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ElfLinker::ElfLinker(uInt32 textBase, uInt32 dataBase, uInt32 rodataBase, const ElfFile& elf)
@ -212,7 +212,7 @@ unique_ptr<uInt8[]>& ElfLinker::getSegmentDataRef(SegmentType type)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ElfLinker::relocateSections()
{
auto& sections = myElf.getSections();
const auto& sections = myElf.getSections();
myRelocatedSections.resize(sections.size(), std::nullopt);
// relocate everything that is not .bss
@ -253,7 +253,7 @@ void ElfLinker::relocateSections()
ElfLinkError::raise("segments overlap");
// allocate segment data
for (SegmentType segmentType: {SegmentType::text, SegmentType::data, SegmentType::rodata}) {
for (const SegmentType segmentType: {SegmentType::text, SegmentType::data, SegmentType::rodata}) {
const uInt32 segmentSize = getSegmentSize(segmentType);
if (segmentSize == 0) continue;
@ -293,7 +293,7 @@ void ElfLinker::relocateInitArrays()
std::unordered_map<uInt32, uInt32> relocatedPreinitArrays;
// Relocate init arrays
for (size_t i = 0; i < sections.size(); i++) {
for (uInt32 i = 0; i < sections.size(); i++) {
const auto& section = sections[i];
switch (section.type) {
@ -312,6 +312,9 @@ void ElfLinker::relocateInitArrays()
preinitArraySize += section.size;
break;
default:
break;
}
}
@ -369,7 +372,7 @@ void ElfLinker::relocateSymbols(const vector<ExternalSymbol>& externalSymbols)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ElfLinker::applyRelocationsToSections()
{
auto& sections = myElf.getSections();
const auto& sections = myElf.getSections();
// apply relocations
for (size_t iSection = 0; iSection < sections.size(); iSection++) {
@ -383,7 +386,7 @@ void ElfLinker::applyRelocationsToSections()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ElfLinker::copyInitArrays(vector<uInt32>& initArray, std::unordered_map<uInt32, uInt32> relocatedInitArrays)
void ElfLinker::copyInitArrays(vector<uInt32>& initArray, const std::unordered_map<uInt32, uInt32>& relocatedInitArrays)
{
const uInt8* elfData = myElf.getData();
const auto& sections = myElf.getSections();
@ -436,7 +439,7 @@ void ElfLinker::applyRelocationToSection(const ElfFile::Relocation& relocation,
{
const uInt32 op = read32(target);
Int32 offset = relocatedSymbol->value + relocation.addend.value_or(elfUtil::decode_B_BL(op)) -
const Int32 offset = relocatedSymbol->value + relocation.addend.value_or(elfUtil::decode_B_BL(op)) -
getSegmentBase(targetSectionRelocated.segment) -
targetSectionRelocated.offset -
relocation.offset - 4;
@ -446,6 +449,9 @@ void ElfLinker::applyRelocationToSection(const ElfFile::Relocation& relocation,
write32(target, elfUtil::encode_B_BL(offset, relocation.type == ElfFile::R_ARM_THM_CALL));
}
default:
break;
}
}
@ -456,7 +462,7 @@ void ElfLinker::applyRelocationsToInitArrays(uInt8 initArrayType, vector<uInt32>
const auto& symbols = myElf.getSymbols();
const auto& sections = myElf.getSections();
for (size_t iSection = 0; iSection < sections.size(); iSection++) {
for (uInt32 iSection = 0; iSection < sections.size(); iSection++) {
const auto& section = sections[iSection];
if (section.type != initArrayType) continue;
@ -485,23 +491,3 @@ void ElfLinker::applyRelocationsToInitArrays(uInt8 initArrayType, vector<uInt32>
}
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt32 ElfLinker::read32(const uInt8* address)
{
uInt32 value = *(address++);
value |= *(address++) << 8;
value |= *(address++) << 16;
value |= *(address++) << 24;
return value;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ElfLinker::write32(uInt8* address, uInt32 value)
{
*(address++) = value;
*(address++) = value >> 8;
*(address++) = value >> 16;
*(address++) = value >> 24;
}

View File

@ -101,14 +101,26 @@ class ElfLinker {
void relocateInitArrays();
void relocateSymbols(const vector<ExternalSymbol>& externalSymbols);
void applyRelocationsToSections();
void copyInitArrays(vector<uInt32>& initArray, std::unordered_map<uInt32, uInt32> relocatedInitArrays);
void copyInitArrays(vector<uInt32>& initArray, const std::unordered_map<uInt32, uInt32>& relocatedInitArrays);
void applyRelocationToSection(const ElfFile::Relocation& relocation, size_t iSection);
void applyRelocationsToInitArrays(uInt8 initArrayType, vector<uInt32>& initArray,
const std::unordered_map<uInt32, uInt32>& relocatedInitArrays);
uInt32 read32(const uInt8* address);
void write32(uInt8* address, uInt32 value);
static constexpr uInt32 read32(const uInt8* address) {
uInt32 value = *(address++);
value |= *(address++) << 8;
value |= *(address++) << 16;
value |= *(address++) << 24;
return value;
}
static constexpr void write32(uInt8* address, uInt32 value) {
*(address++) = value;
*(address++) = value >> 8;
*(address++) = value >> 16;
*(address++) = value >> 24;
}
private:
std::optional<uInt32> undefinedSymbolDefault;

View File

@ -263,7 +263,7 @@ const char* ElfParser::getName(const Section& section, uInt32 offset) const
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const ElfParser::Section* ElfParser::getSymtab() const
{
for (auto& section: mySections)
for (const auto& section: mySections)
if (section.type == SHT_SYMTAB) return &section;
return nullptr;
@ -312,7 +312,7 @@ ostream& operator<<(ostream& os, const ElfParser::Section& section)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ostream& operator<<(ostream& os, const ElfParser::Symbol symbol)
ostream& operator<<(ostream& os, const ElfParser::Symbol& symbol)
{
std::ios reset(nullptr);
reset.copyfmt(os);
@ -324,8 +324,8 @@ ostream& operator<<(ostream& os, const ElfParser::Symbol symbol)
<< " value=0x" << std::setw(8) << symbol.value
<< " size=0x" << std::setw(8) << symbol.size
<< std::setw(1)
<< " bind=0x" << std::setw(2) << (int)symbol.bind
<< " type=0x" << std::setw(2) << (int)symbol.type;
<< " bind=0x" << std::setw(2) << static_cast<int>(symbol.bind)
<< " type=0x" << std::setw(2) << static_cast<int>(symbol.type);
os.copyfmt(reset);
@ -335,7 +335,7 @@ ostream& operator<<(ostream& os, const ElfParser::Symbol symbol)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ostream& operator<<(ostream& os, const ElfParser::Relocation rel)
ostream& operator<<(ostream& os, const ElfParser::Relocation& rel)
{
std::ios reset(nullptr);
reset.copyfmt(os);
@ -345,14 +345,14 @@ ostream& operator<<(ostream& os, const ElfParser::Relocation rel)
<< std::hex << std::setfill('0')
<< " offset=0x" << std::setw(8) << rel.offset
<< " info=0x" << std::setw(8) << rel.info
<< " type=0x" << std::setw(2) << (int)rel.type;
<< " type=0x" << std::setw(2) << static_cast<int>(rel.type);
if (rel.addend.has_value())
os << " addend=0x" << std::setw(8) << *rel.addend;
os.copyfmt(reset);
os << " symbol=" << (int)rel.symbol;
os << " symbol=" << static_cast<int>(rel.symbol);
return os;
}

View File

@ -98,7 +98,7 @@ class ElfParser : public ElfFile {
};
ostream& operator<<(ostream& os, const ElfParser::Section& section);
ostream& operator<<(ostream& os, const ElfParser::Symbol symbol);
ostream& operator<<(ostream& os, const ElfParser::Relocation relocation);
ostream& operator<<(ostream& os, const ElfParser::Symbol& symbol);
ostream& operator<<(ostream& os, const ElfParser::Relocation& relocation);
#endif // ELF_PARSER

View File

@ -21,8 +21,8 @@ Int32 elfUtil::decode_B_BL(uInt32 opcode)
{
// nomenclature follows Thumb32 BL / B.W encoding in Arm Architecture Reference
uInt16 hw1 = opcode;
uInt16 hw2 = opcode >> 16;
const uInt16 hw1 = opcode;
const uInt16 hw2 = opcode >> 16;
const uInt8 s = (hw1 >> 10) & 0x01;
const uInt8 i1 = ~((hw2 >> 13) ^ s) & 0x01;
@ -44,13 +44,13 @@ uInt32 elfUtil::encode_B_BL(Int32 offset, bool link)
offset >>= 1;
uInt8 s = (offset >> 23) & 0x01;
uInt8 j2 = ((~offset >> 21) ^ s) & 0x01;
uInt8 j1 = ((~offset >> 22) ^ s) & 0x01;
uInt32 imm11 = offset & 0x7ff;
uInt32 imm10 = (offset >> 11) & 0x3ff;
const uInt8 s = (offset >> 23) & 0x01;
const uInt8 j2 = ((~offset >> 21) ^ s) & 0x01;
const uInt8 j1 = ((~offset >> 22) ^ s) & 0x01;
const uInt32 imm11 = offset & 0x7ff;
const uInt32 imm10 = (offset >> 11) & 0x3ff;
uInt16 hw1 = 0xf000 | (s << 10) | imm10;
const uInt16 hw1 = 0xf000 | (s << 10) | imm10;
uInt16 hw2 = 0x9000 | (j1 << 13) | (j2 << 11) | imm11;
if (link) hw2 |= 0x4000;