aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDimitry <winsvega@mail.ru>2016-03-22 02:38:51 +0800
committerDimitry <winsvega@mail.ru>2016-03-22 02:38:51 +0800
commit0e856a96eb2a5843e32c445cf0109cc467d941ac (patch)
treed26546390a80066f5e4592160508addbeb7c7997
parentb899933947f25f99548bbe983d411ad077f97868 (diff)
parentbad14f428b3fa8f2769af7e6b7f2eb23d67476c8 (diff)
downloaddexon-solidity-0e856a96eb2a5843e32c445cf0109cc467d941ac.tar.gz
dexon-solidity-0e856a96eb2a5843e32c445cf0109cc467d941ac.tar.zst
dexon-solidity-0e856a96eb2a5843e32c445cf0109cc467d941ac.zip
Merge branch 'movelllc' into movelibevmasm
-rw-r--r--CMakeLists.txt3
-rw-r--r--lllc/CMakeLists.txt11
-rw-r--r--lllc/main.cpp124
3 files changed, 138 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4b3d6071..10b83aad 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,5 +33,8 @@ if (NOT EMSCRIPTEN)
add_subdirectory(liblll)
add_subdirectory(test)
endif()
+if (ETHASHCL)
+ add_subdirectory(lllc)
+endif()
# TODO installation and packaging rules
diff --git a/lllc/CMakeLists.txt b/lllc/CMakeLists.txt
new file mode 100644
index 00000000..3a5b9c55
--- /dev/null
+++ b/lllc/CMakeLists.txt
@@ -0,0 +1,11 @@
+aux_source_directory(. SRC_LIST)
+
+set(EXECUTABLE lllc)
+
+file(GLOB HEADERS "*.h")
+add_executable(${EXECUTABLE} ${SRC_LIST} ${HEADERS})
+
+eth_use(${EXECUTABLE} REQUIRED Eth::lll Dev::buildinfo)
+
+install( TARGETS ${EXECUTABLE} DESTINATION bin )
+
diff --git a/lllc/main.cpp b/lllc/main.cpp
new file mode 100644
index 00000000..5f3078c2
--- /dev/null
+++ b/lllc/main.cpp
@@ -0,0 +1,124 @@
+/*
+ This file is part of cpp-ethereum.
+
+ cpp-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ cpp-ethereum is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
+/** @file main.cpp
+ * @author Gav Wood <i@gavwood.com>
+ * @date 2014
+ * Ethereum client.
+ */
+
+#include <fstream>
+#include <iostream>
+#include <liblll/Compiler.h>
+#include <libdevcore/CommonIO.h>
+#include <libdevcore/CommonData.h>
+#include <libevmcore/Instruction.h>
+#include "ethereum/BuildInfo.h"
+using namespace std;
+using namespace dev;
+using namespace dev::eth;
+
+void help()
+{
+ cout
+ << "Usage lllc [OPTIONS] <file>" << endl
+ << "Options:" << endl
+ << " -b,--binary Parse, compile and assemble; output byte code in binary." << endl
+ << " -x,--hex Parse, compile and assemble; output byte code in hex." << endl
+ << " -a,--assembly Only parse and compile; show assembly." << endl
+ << " -t,--parse-tree Only parse; show parse tree." << endl
+ << " -h,--help Show this help message and exit." << endl
+ << " -V,--version Show the version and exit." << endl;
+ exit(0);
+}
+
+void version()
+{
+ cout << "LLLC, the Lovely Little Language Compiler " << dev::Version << endl;
+ cout << " By Gav Wood, (c) 2014." << endl;
+ cout << "Build: " << DEV_QUOTED(ETH_BUILD_PLATFORM) << "/" << DEV_QUOTED(ETH_BUILD_TYPE) << endl;
+ exit(0);
+}
+
+enum Mode { Binary, Hex, Assembly, ParseTree, Disassemble };
+
+int main(int argc, char** argv)
+{
+ unsigned optimise = 1;
+ string infile;
+ Mode mode = Hex;
+
+ for (int i = 1; i < argc; ++i)
+ {
+ string arg = argv[i];
+ if (arg == "-h" || arg == "--help")
+ help();
+ else if (arg == "-b" || arg == "--binary")
+ mode = Binary;
+ else if (arg == "-x" || arg == "--hex")
+ mode = Hex;
+ else if (arg == "-a" || arg == "--assembly")
+ mode = Assembly;
+ else if (arg == "-t" || arg == "--parse-tree")
+ mode = ParseTree;
+ else if ((arg == "-o" || arg == "--optimise") && argc > i + 1)
+ optimise = atoi(argv[++i]);
+ else if (arg == "-d" || arg == "--disassemble")
+ mode = Disassemble;
+ else if (arg == "-V" || arg == "--version")
+ version();
+ else
+ infile = argv[i];
+ }
+
+ string src;
+ if (infile.empty())
+ {
+ string s;
+ while (!cin.eof())
+ {
+ getline(cin, s);
+ src.append(s);
+ }
+ }
+ else
+ src = contentsString(infile);
+
+ vector<string> errors;
+ if (src.empty())
+ errors.push_back("Empty file.");
+ else if (mode == Disassemble)
+ {
+ cout << disassemble(fromHex(src)) << endl;
+ }
+ else if (mode == Binary || mode == Hex)
+ {
+ auto bs = compileLLL(src, optimise ? true : false, &errors);
+ if (mode == Hex)
+ cout << toHex(bs) << endl;
+ else if (mode == Binary)
+ cout.write((char const*)bs.data(), bs.size());
+ }
+ else if (mode == ParseTree)
+ cout << parseLLL(src) << endl;
+ else if (mode == Assembly)
+ cout << compileLLLToAsm(src, optimise ? true : false, &errors) << endl;
+ for (auto const& i: errors)
+ cerr << i << endl;
+ if ( errors.size() )
+ return 1;
+ return 0;
+}