Adding tests for branch/carry and logging disasm on test failure.

This commit is contained in:
Ben Vanik 2015-06-06 10:59:22 -07:00
parent 29c77a3087
commit 6b52f6715a
8 changed files with 80 additions and 3 deletions

View File

@ -71,5 +71,21 @@ SourceMapEntry* DebugInfo::LookupCodeOffset(uint32_t offset) {
return nullptr; return nullptr;
} }
void DebugInfo::Dump() {
if (source_disasm_) {
printf("PPC:\n%s\n", source_disasm_);
}
if (raw_hir_disasm_) {
printf("Unoptimized HIR:\n%s\n", raw_hir_disasm_);
}
if (hir_disasm_) {
printf("Optimized HIR:\n%s\n", hir_disasm_);
}
if (machine_code_disasm_) {
printf("Machine Code:\n%s\n", machine_code_disasm_);
}
fflush(stdout);
}
} // namespace cpu } // namespace cpu
} // namespace xe } // namespace xe

View File

@ -31,6 +31,10 @@ enum DebugInfoFlags {
kDebugInfoTraceFunctionCoverage = (1 << 7) | kDebugInfoTraceFunctions, kDebugInfoTraceFunctionCoverage = (1 << 7) | kDebugInfoTraceFunctions,
kDebugInfoTraceFunctionReferences = (1 << 8) | kDebugInfoTraceFunctions, kDebugInfoTraceFunctionReferences = (1 << 8) | kDebugInfoTraceFunctions,
kDebugInfoTraceFunctionData = (1 << 9) | kDebugInfoTraceFunctions, kDebugInfoTraceFunctionData = (1 << 9) | kDebugInfoTraceFunctions,
kDebugInfoAllTracing =
kDebugInfoTraceFunctions | kDebugInfoTraceFunctionCoverage |
kDebugInfoTraceFunctionReferences | kDebugInfoTraceFunctionData,
kDebugInfoAll = 0xFFFFFFFF, kDebugInfoAll = 0xFFFFFFFF,
}; };
@ -72,6 +76,8 @@ class DebugInfo {
SourceMapEntry* LookupHIROffset(uint32_t offset); SourceMapEntry* LookupHIROffset(uint32_t offset);
SourceMapEntry* LookupCodeOffset(uint32_t offset); SourceMapEntry* LookupCodeOffset(uint32_t offset);
void Dump();
private: private:
uint32_t address_reference_count_; uint32_t address_reference_count_;
uint32_t instruction_result_count_; uint32_t instruction_result_count_;

View File

@ -124,6 +124,11 @@ bool PPCTranslator::Translate(FunctionInfo* symbol_info,
return false; return false;
} }
auto debugger = frontend_->processor()->debugger();
if (!debugger) {
debug_info_flags &= ~DebugInfoFlags::kDebugInfoAllTracing;
}
// Setup trace data, if needed. // Setup trace data, if needed.
if (debug_info_flags & DebugInfoFlags::kDebugInfoTraceFunctions) { if (debug_info_flags & DebugInfoFlags::kDebugInfoTraceFunctions) {
// Base trace data. // Base trace data.
@ -133,9 +138,7 @@ bool PPCTranslator::Translate(FunctionInfo* symbol_info,
trace_data_size += debug::FunctionTraceData::SizeOfInstructionCounts( trace_data_size += debug::FunctionTraceData::SizeOfInstructionCounts(
symbol_info->address(), symbol_info->end_address()); symbol_info->address(), symbol_info->end_address());
} }
uint8_t* trace_data = uint8_t* trace_data = debugger->AllocateFunctionTraceData(trace_data_size);
frontend_->processor()->debugger()->AllocateFunctionTraceData(
trace_data_size);
if (trace_data) { if (trace_data) {
debug_info->trace_data().Reset(trace_data, trace_data_size, debug_info->trace_data().Reset(trace_data, trace_data_size,
symbol_info->address(), symbol_info->address(),

View File

@ -0,0 +1,41 @@
test_equiv_1:
#_ REGISTER_IN r11 0x9E2A83C1
lis r9, -0x61D6 # 0x9E2A83C1
ori r30, r9, 0x83C1 # 0x9E2A83C1
subf r8, r11, r30
addic r7, r8, -1
subfe. r31, r7, r8
beq .test_equiv_1_good
li r12, 0
blr
.test_equiv_1_good:
li r12, 1
blr
#_ REGISTER_OUT r7 0xfffffffeffffffff
#_ REGISTER_OUT r8 0xffffffff00000000
#_ REGISTER_OUT r9 0xffffffff9e2a0000
#_ REGISTER_OUT r30 0xffffffff9e2a83c1
#_ REGISTER_OUT r31 0
#_ REGISTER_OUT r11 0x000000009e2a83c1
#_ REGISTER_OUT r12 1
test_equiv_2:
#_ REGISTER_IN r11 0xffffffff9e2a83c1
lis r9, -0x61D6 # 0x9E2A83C1
ori r30, r9, 0x83C1 # 0x9E2A83C1
subf r8, r11, r30
addic r7, r8, -1
subfe. r31, r7, r8
beq .test_equiv_2_good
li r12, 0
blr
.test_equiv_2_good:
li r12, 1
blr
#_ REGISTER_OUT r7 0xffffffffffffffff
#_ REGISTER_OUT r8 0xffffffff00000000
#_ REGISTER_OUT r9 0xffffffff9e2a0000
#_ REGISTER_OUT r30 0xffffffff9e2a83c1
#_ REGISTER_OUT r31 0
#_ REGISTER_OUT r11 0xffffffff9e2a83c1
#_ REGISTER_OUT r12 1

View File

@ -177,6 +177,7 @@ class TestRunner {
processor.reset(new Processor(memory.get(), nullptr, nullptr)); processor.reset(new Processor(memory.get(), nullptr, nullptr));
processor->Setup(); processor->Setup();
processor->set_debug_info_flags(DebugInfoFlags::kDebugInfoAll);
} }
~TestRunner() { ~TestRunner() {
@ -228,6 +229,10 @@ class TestRunner {
// Assert test state expectations. // Assert test state expectations.
bool result = CheckTestResults(test_case); bool result = CheckTestResults(test_case);
if (!result) {
// Also dump all disasm/etc.
fn->debug_info()->Dump();
}
return result; return result;
} }

View File

@ -208,6 +208,7 @@
<None Include="instr_vupkd3d128.s" /> <None Include="instr_vupkd3d128.s" />
<None Include="instr_vupkhsh.s" /> <None Include="instr_vupkhsh.s" />
<None Include="instr_vupklsh.s" /> <None Include="instr_vupklsh.s" />
<None Include="sequence_branch_carry.s" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\..\base\main.h" /> <ClInclude Include="..\..\..\base\main.h" />

View File

@ -94,6 +94,7 @@
<None Include="instr_vupkd3d128.s" /> <None Include="instr_vupkd3d128.s" />
<None Include="instr_vupkhsh.s" /> <None Include="instr_vupkhsh.s" />
<None Include="instr_fnabs.s" /> <None Include="instr_fnabs.s" />
<None Include="sequence_branch_carry.s" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Filter Include="src"> <Filter Include="src">

View File

@ -51,6 +51,10 @@ class Processor {
bool Setup(); bool Setup();
void set_debug_info_flags(uint32_t debug_info_flags) {
debug_info_flags_ = debug_info_flags;
}
bool AddModule(std::unique_ptr<Module> module); bool AddModule(std::unique_ptr<Module> module);
Module* GetModule(const char* name); Module* GetModule(const char* name);
Module* GetModule(const std::string& name) { return GetModule(name.c_str()); } Module* GetModule(const std::string& name) { return GetModule(name.c_str()); }