diff --git a/CMakeLists.txt b/CMakeLists.txt index 6dde5c6..6ea7d78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,6 @@ cmake_minimum_required(VERSION 3.10) project(asm-parser) set(CMAKE_CXX_STANDARD 17) -add_compile_options(-Werror -Wall -Wextra) +add_compile_options(-Werror -Wall -Wextra -O3 -flto) add_subdirectory(src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a415a3c..1a4a593 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,4 +2,5 @@ add_executable(asm-parser main.cpp types/state.cpp + utils/utils.cpp objdump/parser.cpp) diff --git a/src/objdump/parser.cpp b/src/objdump/parser.cpp index 13766e1..b7c856f 100644 --- a/src/objdump/parser.cpp +++ b/src/objdump/parser.cpp @@ -1,27 +1,12 @@ #include "parser.hpp" #include "../types/line.hpp" +#include "../utils/utils.hpp" #include AsmParser::ObjDumpParser::ObjDumpParser() { } -bool is_whitespace(const char c) { - return ((c == 32) || (c == 7)); -} - -bool is_hex(const char c) { - return (c >= 'a' && c <= 'f') || (c >= '0' && c <= '9'); -} - -int8_t hex2int(const char c) { - if (c >= '0' && c <= '9') { - return c - '0'; - } else { - return 10 + (c - 'a'); - } -} - void AsmParser::ObjDumpParser::eol() { this->state.currentLine.text = this->state.text; lines.push_back(this->state.currentLine); @@ -31,6 +16,7 @@ void AsmParser::ObjDumpParser::eol() { void AsmParser::ObjDumpParser::label() { this->state.previousLabel = this->state.text; + labels.emplace(this->state.previousLabel, lines.size()); this->state.text.clear(); } @@ -112,7 +98,7 @@ void AsmParser::ObjDumpParser::fromStream(std::istream &in) { } void AsmParser::ObjDumpParser::outputJson(std::ostream &out) { - out << "["; + out << "{["; for (auto line: this->lines) { out << "{\n"; @@ -134,7 +120,13 @@ void AsmParser::ObjDumpParser::outputJson(std::ostream &out) { out << "},\n"; } - out << "]"; + out << "],"; + + out << "\"labels\": [\n"; + for (auto label: this->labels) { + out << "\"" << label.first << "\": " << label.second << ",\n"; + } + out << "]}\n"; } void AsmParser::ObjDumpParser::outputText(std::ostream &out) { diff --git a/src/objdump/parser.hpp b/src/objdump/parser.hpp index 06c07f9..72c2e61 100644 --- a/src/objdump/parser.hpp +++ b/src/objdump/parser.hpp @@ -3,6 +3,7 @@ #include "../types/line.hpp" #include "../types/state.hpp" #include +#include namespace AsmParser { @@ -10,6 +11,7 @@ class ObjDumpParser { private: ParserState state{}; std::vector lines; + std::unordered_map labels; void eol(); void address(); diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp new file mode 100644 index 0000000..4d7704b --- /dev/null +++ b/src/utils/utils.cpp @@ -0,0 +1,17 @@ +#include "utils.hpp" + +bool AsmParser::is_whitespace(const char c) { + return ((c == 32) || (c == 7)); +} + +bool AsmParser::is_hex(const char c) { + return (c >= 'a' && c <= 'f') || (c >= '0' && c <= '9'); +} + +int8_t AsmParser::hex2int(const char c) { + if (c >= '0' && c <= '9') { + return c - '0'; + } else { + return 10 + (c - 'a'); + } +} diff --git a/src/utils/utils.hpp b/src/utils/utils.hpp new file mode 100644 index 0000000..1af823e --- /dev/null +++ b/src/utils/utils.hpp @@ -0,0 +1,10 @@ + +#include + +namespace AsmParser { + +bool is_whitespace(const char c); +bool is_hex(const char c); +int8_t hex2int(const char c); + +}