Skip to content

Commit

Permalink
Introduce MachineAssemblyObject
Browse files Browse the repository at this point in the history
  • Loading branch information
axic authored and chriseth committed Jun 9, 2017
1 parent fe3b465 commit f0d213e
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 6 deletions.
14 changes: 10 additions & 4 deletions libsolidity/interface/AssemblyStack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ bool AssemblyStack::analyzeParsed()
return m_analysisSuccessful;
}

eth::LinkerObject AssemblyStack::assemble(Machine _machine) const
MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const
{
solAssert(m_analysisSuccessful, "");
solAssert(m_parserResult, "");
Expand All @@ -87,21 +87,27 @@ eth::LinkerObject AssemblyStack::assemble(Machine _machine) const
{
case Machine::EVM:
{
MachineAssemblyObject object;
eth::Assembly assembly;
assembly::CodeGenerator::assemble(*m_parserResult, *m_analysisInfo, assembly);
return assembly.assemble();
object.bytecode = make_shared<eth::LinkerObject>(assembly.assemble());
/// TODO: fill out text representation
return object;
}
case Machine::EVM15:
{
MachineAssemblyObject object;
julia::EVMAssembly assembly(true);
julia::CodeTransform(assembly, *m_analysisInfo, true).run(*m_parserResult);
return assembly.finalize();
object.bytecode = make_shared<eth::LinkerObject>(assembly.finalize());
/// TOOD: fill out text representation
return object;
}
case Machine::eWasm:
solUnimplemented("eWasm backend is not yet implemented.");
}
// unreachable
return eth::LinkerObject();
return MachineAssemblyObject();
}

string AssemblyStack::print() const
Expand Down
8 changes: 7 additions & 1 deletion libsolidity/interface/AssemblyStack.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ struct AsmAnalysisInfo;
struct Block;
}

struct MachineAssemblyObject
{
std::shared_ptr<eth::LinkerObject> bytecode;
std::string assembly;
};

/*
* Full assembly stack that can support EVM-assembly and JULIA as input and EVM, EVM1.5 and
* eWasm as output.
Expand All @@ -64,7 +70,7 @@ class AssemblyStack
bool analyze(assembly::Block const& _block, Scanner const* _scanner = nullptr);

/// Run the assembly step (should only be called after parseAndAnalyze).
eth::LinkerObject assemble(Machine _machine) const;
MachineAssemblyObject assemble(Machine _machine) const;

/// @returns the errors generated during parsing, analysis (and potentially assembly).
ErrorList const& errors() const { return m_errors; }
Expand Down
7 changes: 6 additions & 1 deletion solc/CommandLineInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1082,9 +1082,10 @@ bool CommandLineInterface::assemble(
"eWasm";
cout << endl << "======= " << src.first << " (" << machine << ") =======" << endl;
AssemblyStack& stack = assemblyStacks[src.first];
MachineAssemblyObject object;
try
{
cout << stack.assemble(_targetMachine).toHex() << endl;
object = stack.assemble(_targetMachine);
}
catch (Exception const& _exception)
{
Expand All @@ -1096,6 +1097,10 @@ bool CommandLineInterface::assemble(
cerr << "Unknown exception while assembling." << endl;
return false;
}
if (object.bytecode)
cout << object.bytecode->toHex() << endl;
else
cerr << "No binary representation found." << endl;
cout << stack.print() << endl;
}

Expand Down

0 comments on commit f0d213e

Please sign in to comment.