New bitsets (experimental)

This commit is contained in:
Nekotekina 2016-08-07 22:01:27 +03:00
parent 71441819e5
commit 46735d6b3d
20 changed files with 802 additions and 361 deletions

View file

@ -11,9 +11,30 @@ const ppu_decoder<ppu_itype> s_ppu_itype;
const ppu_decoder<ppu_iname> s_ppu_iname;
template<>
void fmt_class_string<bitset_t<ppu_attr>::raw_type>::format(std::string& out, u64 arg)
void fmt_class_string<ppu_attr>::format(std::string& out, u64 arg)
{
out += "[UNIMPLEMENTED]";
format_enum(out, arg, [](ppu_attr value)
{
switch (value)
{
case ppu_attr::known_addr: return "known_addr";
case ppu_attr::known_size: return "known_size";
case ppu_attr::no_return: return "no_return";
case ppu_attr::no_size: return "no_size";
case ppu_attr::uses_r0: return "uses_r0";
case ppu_attr::entry_point: return "entry_point";
case ppu_attr::complex_stack: return "complex_stack";
case ppu_attr::__bitset_enum_max: break;
}
return unknown;
});
}
template<>
void fmt_class_string<bs_t<ppu_attr>>::format(std::string& out, u64 arg)
{
format_bitset(out, arg, "[", ",", "]", &fmt_class_string<ppu_attr>::format);
}
void ppu_validate(const std::string& fname, const std::vector<ppu_function>& funcs, u32 reloc)
@ -377,7 +398,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
{
for (auto it = funcs.lower_bound(addr), end = funcs.end(); it != end; it++)
{
if (it->second.attr & ppu_attr::known_addr)
if (test(it->second.attr, ppu_attr::known_addr))
{
return it->first;
}
@ -682,7 +703,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
}
// Get function limit
const u32 func_end = std::min<u32>(get_limit(func.addr + 1), func.attr & ppu_attr::known_size ? func.addr + func.size : end);
const u32 func_end = std::min<u32>(get_limit(func.addr + 1), test(func.attr, ppu_attr::known_size) ? func.addr + func.size : end);
// Block analysis workload
std::vector<std::reference_wrapper<std::pair<const u32, u32>>> block_queue;
@ -715,7 +736,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
}
// TODO: lower priority?
if (func.attr & ppu_attr::no_size)
if (test(func.attr, ppu_attr::no_size))
{
// Get next function
const auto _next = funcs.lower_bound(func.blocks.crbegin()->first + 1);
@ -777,12 +798,12 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
}
// Add next block if necessary
if ((is_call && !pfunc->attr.test(ppu_attr::no_return)) || (type == ppu_itype::BC && (op.bo & 0x14) != 0x14))
if ((is_call && !test(pfunc->attr, ppu_attr::no_return)) || (type == ppu_itype::BC && (op.bo & 0x14) != 0x14))
{
add_block(_ptr.addr());
}
if (op.lk && (target == iaddr || pfunc->attr.test(ppu_attr::no_return)))
if (op.lk && (target == iaddr || test(pfunc->attr, ppu_attr::no_return)))
{
// Nothing
}
@ -843,11 +864,12 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
if (jt_addr != jt_end && _ptr.addr() == jt_addr)
{
// Acknowledge jumptable detection failure
if (!func.attr.test_and_set(ppu_attr::no_size))
if (!test(func.attr, ppu_attr::no_size))
{
LOG_WARNING(PPU, "[0x%x] Jump table not found! 0x%x-0x%x", func.addr, jt_addr, jt_end);
}
func.attr += ppu_attr::no_size;
add_block(iaddr);
block_queue.clear();
}
@ -871,7 +893,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
}
// Finalization: determine function size
if (!func.attr.test(ppu_attr::known_size))
if (!test(func.attr, ppu_attr::known_size))
{
const auto last = func.blocks.crbegin();
@ -937,7 +959,7 @@ std::vector<ppu_function> ppu_analyse(const std::vector<std::pair<u32, u32>>& se
}
// Finalization: decrease known function size (TODO)
if (func.attr & ppu_attr::known_size)
if (test(func.attr, ppu_attr::known_size))
{
const auto last = func.blocks.crbegin();