Ugh. Replacing the fancy templates with hand coded sequences for now.

This commit is contained in:
Ben Vanik
2014-01-02 00:00:14 -08:00
parent 3e4f93a6a9
commit 125e7278c6
22 changed files with 784 additions and 771 deletions

View File

@@ -11,6 +11,7 @@
#include <alloy/backend/x64/tracing.h>
#include <alloy/backend/x64/x64_backend.h>
#include <alloy/backend/x64/x64_emitter.h>
#include <alloy/backend/x64/x64_function.h>
#include <alloy/backend/x64/lir/lir_builder.h>
#include <alloy/backend/x64/lowering/lowering_table.h>
@@ -20,6 +21,10 @@
#include <alloy/hir/label.h>
#include <alloy/runtime/runtime.h>
namespace BE {
#include <beaengine/BeaEngine.h>
}
using namespace alloy;
using namespace alloy::backend;
using namespace alloy::backend::x64;
@@ -31,8 +36,9 @@ using namespace alloy::runtime;
X64Assembler::X64Assembler(X64Backend* backend) :
x64_backend_(backend),
optimizer_(0),
builder_(0),
optimizer_(0),
emitter_(0),
Assembler(backend) {
}
@@ -40,6 +46,7 @@ X64Assembler::~X64Assembler() {
alloy::tracing::WriteEvent(EventType::AssemblerDeinit({
}));
delete emitter_;
delete optimizer_;
delete builder_;
}
@@ -50,10 +57,12 @@ int X64Assembler::Initialize() {
return result;
}
builder_ = new LIRBuilder(x64_backend_);
optimizer_ = new Optimizer(backend_->runtime());
optimizer_->AddPass(new passes::RedundantMovPass());
builder_ = new LIRBuilder(x64_backend_);
emitter_ = new X64Emitter(x64_backend_);
alloy::tracing::WriteEvent(EventType::AssemblerInit({
}));
@@ -64,6 +73,7 @@ int X64Assembler::Initialize() {
void X64Assembler::Reset() {
builder_->Reset();
optimizer_->Reset();
emitter_->Reset();
string_buffer_.Reset();
Assembler::Reset();
}
@@ -103,7 +113,7 @@ int X64Assembler::Assemble(
// Stash generated machine code.
if (debug_info) {
//emitter_->Dump(&string_buffer_);
DumpMachineCode(&string_buffer_);
debug_info->set_machine_code_disasm(string_buffer_.ToString());
string_buffer_.Reset();
}
@@ -121,3 +131,20 @@ XECLEANUP:
Reset();
return result;
}
void X64Assembler::DumpMachineCode(StringBuffer* str) {
BE::DISASM disasm;
xe_zero_struct(&disasm, sizeof(disasm));
disasm.Archi = 64;
disasm.Options = BE::Tabulation + BE::MasmSyntax + BE::PrefixedNumeral;
disasm.EIP = 0;// (BE::UIntPtr)assembler_.getCode();
BE::UIntPtr eip_end = 0;// assembler_.getCode() + assembler_.getCodeSize();
while (disasm.EIP < eip_end) {
size_t len = BE::Disasm(&disasm);
if (len == BE::UNKNOWN_OPCODE) {
break;
}
str->Append("%p %s", disasm.EIP, disasm.CompleteInstr);
disasm.EIP += len;
}
}