From 302145b305f08a59b88cc0a22ca47b8f6b59ffb8 Mon Sep 17 00:00:00 2001 From: Lorenzo Gomez <68551873+lorenzo-gomez-windhover@users.noreply.github.com> Date: Mon, 4 Nov 2024 11:05:02 -0600 Subject: [PATCH] Add union support (#41) * -Write macro records correctly. Fixes #7 * -Cleanup * -Update unit testing for draco patterns. WIP. * -Update eclipse project * -Minimally functional target_symbol * -Do not store row id for symbol target updates * -Update github CI * -Docker config for CI * -Point submodules to github * -Cleanup * -Add symbols and encoding mappings. WIP. * -Add symbols and encoding mappings. WIP. * Writer DWARF5 ecodings to encodings table * -Add minimally functional encodings implementation. -TODO:Cleanup. * -Update Makefile * -Update gitignore * -Cleanup * -Remove Ubuntu18 from github actions since it is not available anymore. -https://github.blog/changelog/2022-08-09-github-actions-the-ubuntu-18-04-actions-runner-image-is-being-deprecated-and-will-be-removed-by-12-1-22/ * -Remove dead code * -Cleanup * -Cleanup * -Cleanup * -Include unit test code in format checks. -Format unit test code. * -Update unit tests * -Configure coveralls.io for CI * -Configure coveralls.io for CI * -Configure coveralls.io for CI * -Configure coveralls.io for CI * -Configure coveralls.io for CI * -Configure coveralls.io for CI * -Configure coveralls.io for CI * -Configure coveralls.io for CI * -Update docs * -Update unit tests for new schema. WIP. -TODO:Add function to follow target symbols to test typdef'd types. -TODO:Add unit tests for new macro and elf image features. * -Add followTargetSymbol. Useful for testing typedef'd types. -Update unit tests. * -Use CFE_ES_HousekeepingTlm_Payload for unit testing. * -Update docs * -Update docs * -Extract ELF image data from 64-bit targets properly. -Add ElfClass to ElfFile * -Update docs * -Update unit-test test files * -Remove libdwarf from unit test code test file * -Remove dead code * -Remove dead code * -Add 32-bit make recipes. -Add 32-bit unit tests. * -Update 32-bit unit testing. * -Update docs * -Remove dead code * -Update Logger unit tests -Remove dead code * -Update unit tests * -Update docs * -Cleanup * -Cleanup * -Cleanup * -Add macro unit test. -Update Dockerfile * -Create test files that comply with DWARF4 and DWARF5. Allows us to verify support of DWARF4 as more features are added in the future. * -Unit test DWARF4 and DWARF5. WIP. * -Add DWARF4 testing to Dockerfile * -Cleanup * -Update docs * -Update docs * -Update Catch 2 due to issue on Ubuntu22:https://github.com/catchorg/Catch2/issues/2178 * -pathIndex handling for DWARF5. TODO:This changes for DWARF4, so add alternative for DWARF4. -Remove DisplayDie function for now as it blows up the stack with big c++ names inside DWARF. -TODO:Rewrite DisplayDie function -Add include to src/Artifact.h, needed for Ubuntu22. * -Handle DWARF dbg source files for DWARF4 and 5. -TODO:Figure out what to do about Ubuntu 20/22 behavior producing different DWARF src file line number info for the same DWARF version. * -Add group number as CLI argument. WIP. -Issues of interest:https://github.com/WindhoverLabs/juicer/issues/36, https://github.com/WindhoverLabs/juicer/issues/35 * -Group number argument. Useful for getting DWARF data from multiple COMBAT sections, like macros inside of unlinked ELF files. * -Add unit tests for macros across multiple COMDAT groups. * -Cleanup * -Update docs * -Update unit tests. * -Update Dockerfile for Ubuntu22 * -Update CI * -Update Dockerfiles for Ubuntu20 and Ubuntu22 * -Update Makefile * -Update CI * -Update CI * -Test DWARF version in unit tests * -Update docs * -Update docs * -Update docs * -Update docs. WIP. * -Update docs * -Cleanup * -Cleanup * -Update docs. -Remove DECL code from pointer types. Pointer types do not have DECL coords. * -Add unit tests for artifacts * -Cleanup * -Update test_file1 * -Remove dead code * -Update tests in Docker files * -Update docs * -Update docs * -Update docs * -Update unit tests * -Add support for unions. WIP. * -Add support for unions. WIP. * -Update CI to build Ubuntu20 first. * -Update CI to build Ubuntu20 first. * -Format files * -Update union object used for unit tests * -Add user to docker dev configs * -Add support for unions. WIP. -Update unit tests for unions. WIP. * -Minimally functional union support. -TODO:Upgrade to C++17 and std::optional for union fields, which will be NULL (or empty). * -Remove dead code * -Upgrade to C++17. -Use optional for byte offset of fields. -When byte offset value is empty, write NULL to db. This allows to make a distinction between unions and structs. -TODO:Finish union unit testing. -TODO:Add union support documentation. * -Update docs * -Remove duplicate recipes from Makefile * -Handle default case in getdbgSourceFile * -Update unit testing for union support * -Update unit testing for union support * -Update docs * -Update docs * -Use std::optional for symbol encoding * -Add vscode config * -Add tests for padding. Fixes https://github.com/WindhoverLabs/juicer/issues/21 * -Give root access to dev docker user * -Use std::optional for getdbgSourceFile * -Do not attempt to add padding for unions. -Add checks to padding function. * -Add warning message when field byte offsets do not exist * -Add warning message when field byte offsets do not exist * -Use git tag and latest commit as version value * -Log warning when there is no DW_AT_name attribute --------- Co-authored-by: Mathew Benson --- .github/workflows/ci.yaml | 8 +- .vscode/c_cpp_properties.json | 17 ++ .vscode/settings.json | 87 +++++++++ Dockerfile.ubuntu18 | 5 + Dockerfile.ubuntu18.dev | 8 + Dockerfile.ubuntu20.dev | 6 + Dockerfile.ubuntu22.dev | 6 + Images/union_fields_tbl.png | Bin 0 -> 116698 bytes Images/union_symbol_tbl.png | Bin 0 -> 110246 bytes Makefile | 7 +- README.md | 30 ++- src/Field.cpp | 15 +- src/Field.h | 72 +++---- src/Juicer.cpp | 340 ++++++++++++++++++++++++++++++++-- src/Juicer.h | 83 +++++---- src/SQLiteDB.cpp | 113 +++++++---- src/SQLiteDB.h | 2 +- src/Symbol.cpp | 18 +- src/Symbol.h | 8 +- src/main.cpp | 4 +- unit-test/main_test.cpp | 206 +++++++++++++++++--- unit-test/test_file1.h | 7 +- 22 files changed, 853 insertions(+), 189 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/settings.json create mode 100644 Images/union_fields_tbl.png create mode 100644 Images/union_symbol_tbl.png diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7364db3e..76130dd8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -31,16 +31,20 @@ jobs: # push: false # Do not push the image # tags: juicer:latest # Local tag for the built image - - name: Build Docker image For Ubuntu22 - run: docker build --no-cache -t juicer:latest -f Dockerfile.ubuntu22 . - name: Build Docker image For Ubuntu20 run: docker build --no-cache -t juicer:latest -f Dockerfile.ubuntu20 . + - name: Copy coverage report to host run: docker image ls && img_id=$(docker create juicer:latest) && docker cp $img_id:/home/docker/juicer/coverage.gcov . + - name: publish to coveralls.io run: wget https://github.com/coverallsapp/coverage-reporter/releases/download/v0.6.14/coveralls-linux && chmod a+x ./coveralls-linux && COVERALLS_REPO_TOKEN=${{ secrets.COVERALLS_REPO_TOKEN }} ./coveralls-linux + - name: Build Docker image For Ubuntu22 + run: docker build --no-cache -t juicer:latest -f Dockerfile.ubuntu22 . + + - name: Build Docker image For Ubuntu18 run: docker build --no-cache -t juicer:latest -f Dockerfile.ubuntu18 . diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..ad08b14d --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,17 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "/usr/include/libdwarf" + ], + "defines": [], + "compilerPath": "/usr/bin/clang", + "cStandard": "c17", + "cppStandard": "c++17", + "intelliSenseMode": "linux-clang-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..0970c4c8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,87 @@ +{ + "configurations": [ + { + "name": "x86", + "includePath": [ + "/usr/include/libdwarf" + ], + "browse": { + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + } + } + ], + "files.associations": { + "macro_test.h": "c", + "stdint.h": "c", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "array": "cpp", + "atomic": "cpp", + "strstream": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "chrono": "cpp", + "complex": "cpp", + "condition_variable": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "list": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "map": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", + "set": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "ostream": "cpp", + "shared_mutex": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp", + "variant": "cpp", + "bit": "cpp", + "compare": "cpp", + "concepts": "cpp", + "numbers": "cpp", + "semaphore": "cpp", + "stop_token": "cpp" + }, + "editor.formatOnSave": true +} \ No newline at end of file diff --git a/Dockerfile.ubuntu18 b/Dockerfile.ubuntu18 index 3c7a41b5..c1c9bd22 100644 --- a/Dockerfile.ubuntu18 +++ b/Dockerfile.ubuntu18 @@ -50,6 +50,11 @@ RUN ./juicer-ut "[main_test#20]" RUN ./juicer-ut "[Module]" RUN ./juicer-ut "[Symbol]" +RUN cd /home/docker/juicer && make coverage +#Useful for CI +RUN cd /home/docker/juicer && gcovr --filter /home/docker/juicer/src/ --object-directory /home/docker/juicer/build/ut_obj/ --xml coverage.gcov + + diff --git a/Dockerfile.ubuntu18.dev b/Dockerfile.ubuntu18.dev index bc3295d9..17ed50d3 100644 --- a/Dockerfile.ubuntu18.dev +++ b/Dockerfile.ubuntu18.dev @@ -20,3 +20,11 @@ RUN mkdir /home/docker/juicer WORKDIR /home/docker/juicer + +RUN useradd -ms /bin/bash juicer-dev +RUN usermod -aG sudo juicer-dev +RUN echo "juicer-dev ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + +USER juicer-dev + + diff --git a/Dockerfile.ubuntu20.dev b/Dockerfile.ubuntu20.dev index 61f55e19..a122954a 100644 --- a/Dockerfile.ubuntu20.dev +++ b/Dockerfile.ubuntu20.dev @@ -27,3 +27,9 @@ RUN apt-get install -y clang-format RUN mkdir /home/docker RUN mkdir /home/docker/juicer WORKDIR /home/docker/juicer + +RUN useradd -ms /bin/bash juicer-dev +RUN usermod -aG sudo juicer-dev +RUN echo "juicer-dev ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + +USER juicer-dev diff --git a/Dockerfile.ubuntu22.dev b/Dockerfile.ubuntu22.dev index 79f5f591..083dd484 100644 --- a/Dockerfile.ubuntu22.dev +++ b/Dockerfile.ubuntu22.dev @@ -19,3 +19,9 @@ RUN apt-get install -y gcovr RUN mkdir /home/docker RUN mkdir /home/docker/juicer WORKDIR /home/docker/juicer + +RUN useradd -ms /bin/bash juicer-dev +RUN usermod -aG sudo juicer-dev +RUN echo "juicer-dev ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + +USER juicer-dev diff --git a/Images/union_fields_tbl.png b/Images/union_fields_tbl.png new file mode 100644 index 0000000000000000000000000000000000000000..5c1a57da4ad41afded2fa7c7d64e2f56e82befa1 GIT binary patch literal 116698 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

ig9WW1zl8xh9z$Oip`WazEeMT%nxB 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

AP!(8#NA>3cx_w5V?}N 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 literal 0 HcmV?d00001 diff --git a/Makefile b/Makefile index f9213f60..2f373611 100644 --- a/Makefile +++ b/Makefile @@ -38,10 +38,12 @@ UT_SRC_32 := $(wildcard $(UT_SRC_DIR)/test_file*.cpp) UT_OBJ_32 := $(UT_SRC_32:$(UT_SRC_DIR)/test_file%.cpp=$(UT_OBJ_32BIT_DIR)/test_file%.o) UT_OBJ_32 := $(UT_OBJ_32:$(UT_SRC_DIR)/test_file%.cpp=$(UT_OBJ_32BIT_DIR)/test_file%.o) +GIT_VERSION := "$(shell git describe --tags --abbrev=0)($(shell git rev-parse --short HEAD))" + # Set target flags -CPPFLAGS := -MMD -MP -std=c++14 -fmessage-length=0 $(INCLUDES) -CFLAGS := -Wall -g3 +CPPFLAGS := -MMD -MP -std=c++17 -fmessage-length=0 $(INCLUDES) +CFLAGS := -Wall -g3 -DJUICER_VERSION=\"$(GIT_VERSION)\" CFLAGS_32BIT := -Wall -g3 -m32 LDFLAGS := -Llib LDLIBS := -lm -ldwarf -lsqlite3 -lelf -lcrypto @@ -123,7 +125,6 @@ clean: -include $(UT_OBJ:.o=.d) -include $(OBJ:.o=.d) - docker-ubuntu18-build: @sudo docker build --no-cache -t juicer:ubuntu18 -f Dockerfile.ubuntu18 . diff --git a/README.md b/README.md index c4760666..fbbd2077 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Run juicer tests](https://github.com/WindhoverLabs/juicer/actions/workflows/ci.yaml/badge.svg)](https://github.com/WindhoverLabs/juicer/actions/workflows/ci.yaml) -[![Coverage Status](https://coveralls.io/repos/github/WindhoverLabs/juicer/badge.svg?branch=unit_test_updates)](https://coveralls.io/github/WindhoverLabs/juicer?branch=unit_test_updates) +[![Coverage Status](https://coveralls.io/repos/github/WindhoverLabs/juicer/badge.svg?branch=unit_test_updates)](https://coveralls.io/github/WindhoverLabs/juicer?branch=develop) # Table of Contents 1. [Dependencies](#dependencies) @@ -17,6 +17,7 @@ 12. [Notes On Multiple DWARF Versions](#multiple_dwarf_versions) 13. [Bitfields](#Bitfields) 14. [Docker Dev Environments](#docker_dev_env) +15. [Union Support](#union_support) ## Dependencies * `libdwarf-dev` @@ -322,6 +323,7 @@ As juicer evolves, dwarf support will grow and evolve as well. At the moment, we | DW_MACRO_define | This tag represents define macros such as "#define CFE_MISSION_ES_PERF_MAX_IDS 128"| | DW_AT_decl_file | This tag represents the file where a certain symbol is declared. Very useful for traceability of source code.| | DW_AT_encoding | The encoding of base type. For example; "unsigned int" will have encoding "DW_ATE_unsigned". This is what the "encodings" table is for in the SQLITE db.| +| DW_TAG_union_type | The tag used for unions. For example; `union Object { int32_t id; int32_t bit_field : 10; uint8_t data[4];};`.| For more details on the DWARF debugging format, go on [here](http://www.dwarfstd.org/doc/DWARF4.pdf). @@ -433,5 +435,29 @@ For example `make docker-ubuntu22-build-dev` will start a dev environment inside The repo is mounted as a volume under "/home/docker/juicer" so developers can make their changes on the host and build inside the container. +# Union Support -Documentation updated on September 19, 2024 \ No newline at end of file +Given the following union: + +```C +union Object +{ + int32_t id; + int32_t bit_field : 10; + uint8_t data[4]; +}; + +``` + +The union is represented as such in the SQLITE db: + + +![union_symbol](Images/union_symbol_tbl.png "symbols-table") + +![union_fields](Images/union_fields_tbl.png "fields-table") + +Notice that the byte_offset is `NULL` for the fields that belong to the union. This is how consumers (such as [auto-yamcs](https://github.com/WindhoverLabs/auto-yamcs)) can make a distinction between unions and structs. + + + +Documentation updated on September 19, 2024 diff --git a/src/Field.cpp b/src/Field.cpp index c7dadcd9..78d88548 100644 --- a/src/Field.cpp +++ b/src/Field.cpp @@ -10,7 +10,7 @@ Field::Field(Symbol& inSymbol, Symbol& inType) : symbol{inSymbol}, // @suppress("Symbol is not resolved") name{""}, - byte_offset{0}, + byte_offset{std::nullopt}, type{inType}, // @suppress("Symbol is not resolved") dimensionList{}, little_endian{false}, @@ -22,7 +22,7 @@ Field::Field(Symbol& inSymbol, Symbol& inType) type.getName().c_str(), dimensionList.toString(), little_endian ? "LE" : "BE"); } -Field::Field(Symbol& inSymbol, std::string& inName, uint32_t inByteOffset, Symbol& inType, DimensionList& inDimensionList, bool inLittleEndian, +Field::Field(Symbol& inSymbol, std::string& inName, std::optional inByteOffset, Symbol& inType, DimensionList& inDimensionList, bool inLittleEndian, uint32_t inBitSize, uint32_t inBitOffset) : symbol{inSymbol}, // @suppress("Symbol is not resolved") name{inName}, // @suppress("Symbol is not resolved") @@ -41,7 +41,8 @@ Field::Field(Symbol& inSymbol, std::string& inName, uint32_t inByteOffset, Symbo type.getName().c_str(), dimensionList.toString(), little_endian ? "LE" : "BE"); } -Field::Field(Symbol& inSymbol, std::string& inName, uint32_t inByteOffset, Symbol& inType, bool inLittleEndian, uint32_t inBitSize, uint32_t inBitOffset) +Field::Field(Symbol& inSymbol, std::string& inName, std::optional inByteOffset, Symbol& inType, bool inLittleEndian, uint32_t inBitSize, + uint32_t inBitOffset) : symbol{inSymbol}, // @suppress("Symbol is not resolved") name{inName}, // @suppress("Symbol is not resolved") byte_offset{inByteOffset}, @@ -60,13 +61,13 @@ Field::Field(Symbol& inSymbol, std::string& inName, uint32_t inByteOffset, Symbo } Field::~Field() {} -uint32_t Field::getByteOffset() const { return byte_offset; } +std::optional Field::getByteOffset() const { return byte_offset; } -bool Field::isLittleEndian() const { return little_endian; } +bool Field::isLittleEndian() const { return little_endian; } -std::string& Field::getName() { return name; } +std::string& Field::getName() { return name; } -void Field::setName(const std::string& inName) +void Field::setName(const std::string& inName) { logger.logDebug("Field %s::%s renamed to %s.", symbol.getName().c_str(), name.c_str(), inName.c_str()); diff --git a/src/Field.h b/src/Field.h index fa6797f6..b7e2fa3e 100644 --- a/src/Field.h +++ b/src/Field.h @@ -12,6 +12,7 @@ #include +#include #include #include "DimensionList.h" @@ -30,50 +31,51 @@ class Field { public: Field(Symbol &symbol, Symbol &type); - Field(Symbol &symbol, std::string &name, uint32_t byte_offset, Symbol &type, DimensionList &dimensionList, bool little_endian, uint32_t inBitSize = 0, + Field(Symbol &symbol, std::string &name, std::optional byte_offset, Symbol &type, DimensionList &dimensionList, bool little_endian, + uint32_t inBitSize = 0, uint32_t inBitOffset = 0); + Field(Symbol &symbol, std::string &name, std::optional byte_offset, Symbol &type, bool little_endian, uint32_t inBitSize = 0, uint32_t inBitOffset = 0); - Field(Symbol &symbol, std::string &name, uint32_t byte_offset, Symbol &type, bool little_endian, uint32_t inBitSize = 0, uint32_t inBitOffset = 0); virtual ~Field(); - uint32_t getByteOffset() const; - bool isLittleEndian() const; - uint32_t getMultiplicity() const; - uint32_t getArraySize() const; - void setMultiplicity(uint32_t multiplicity); - std::string &getName(); - void setName(const std::string &name); - Symbol &getSymbol() const; - Symbol &getType(); - uint32_t getId(void) const; - void setId(uint32_t newId); - uint32_t getBitOffset() const; - void setBitOffset(uint32_t bitOffset); - uint32_t getBitSize() const; - void setBitSize(uint32_t bitSize); - bool isBitField(void); - DimensionList &getDimensionList(); - bool isArray(void) const; - std::string getDimensionListStr(); + std::optional getByteOffset() const; + bool isLittleEndian() const; + uint32_t getMultiplicity() const; + uint32_t getArraySize() const; + void setMultiplicity(uint32_t multiplicity); + std::string &getName(); + void setName(const std::string &name); + Symbol &getSymbol() const; + Symbol &getType(); + uint32_t getId(void) const; + void setId(uint32_t newId); + uint32_t getBitOffset() const; + void setBitOffset(uint32_t bitOffset); + uint32_t getBitSize() const; + void setBitSize(uint32_t bitSize); + bool isBitField(void); + DimensionList &getDimensionList(); + bool isArray(void) const; + std::string getDimensionListStr(); - const std::string &getShortDescription() const { return short_description; } + const std::string &getShortDescription() const { return short_description; } - const std::string &getLongDescription() const { return long_description; } + const std::string &getLongDescription() const { return long_description; } private: - Symbol &symbol; - std::string name; - uint32_t byte_offset; - Symbol &type; - DimensionList dimensionList; - bool little_endian; + Symbol &symbol; + std::string name; + std::optional byte_offset{std::nullopt}; + Symbol &type; + DimensionList dimensionList; + bool little_endian; /*bit fields members. * If this field is not bit-packed, then the bit_size and bit_offset are 0.*/ - uint32_t bit_offset; - uint32_t bit_size; - Logger logger; - uint32_t id; + uint32_t bit_offset; + uint32_t bit_size; + Logger logger; + uint32_t id; - std::string short_description; - std::string long_description; + std::string short_description; + std::string long_description; }; #endif /* FIELD_H_ */ diff --git a/src/Juicer.cpp b/src/Juicer.cpp index 6b011fdd..e19d941a 100644 --- a/src/Juicer.cpp +++ b/src/Juicer.cpp @@ -707,7 +707,7 @@ Symbol *Juicer::process_DW_TAG_pointer_type(ElfFile &elf, Dwarf_Debug dbg, Dwarf */ /* This branch represents a "void*" since there is no valid type. * Read section 5.2 of DWARF4 for details on this.*/ - Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex)}; + Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex).value_or(std::string{"NOT_FOUND:"})}; std::string checkSum = generateMD5SumForFile(newArtifact.getFilePath()); newArtifact.setMD5(checkSum); outSymbol = elf.addSymbol(voidType, byteSize, newArtifact); @@ -1047,8 +1047,17 @@ Symbol *Juicer::getBaseTypeSymbol(ElfFile &elf, Dwarf_Die inDie, DimensionList & if (res == DW_DLV_OK) { - std::string cName = dieName; - res = dwarf_attr(inDie, DW_AT_decl_file, &attr_struct, &error); + std::string cName{""}; + if (dieName != nullptr) + { + cName = dieName; + } + else + { + logger.logWarning("Symbol does not have a name. This usually means an anonymous struct or union."); + } + + res = dwarf_attr(inDie, DW_AT_decl_file, &attr_struct, &error); if (DW_DLV_OK == res) { @@ -1087,7 +1096,7 @@ Symbol *Juicer::getBaseTypeSymbol(ElfFile &elf, Dwarf_Die inDie, DimensionList & * indicates that no source file has been specified. * */ - Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex)}; + Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex).value_or(std::string{"NOT_FOUND:"})}; std::string checkSum = generateMD5SumForFile(newArtifact.getFilePath()); newArtifact.setMD5(checkSum); outSymbol = elf.addSymbol(cName, byteSize, newArtifact); @@ -1260,7 +1269,7 @@ Symbol *Juicer::getBaseTypeSymbol(ElfFile &elf, Dwarf_Die inDie, DimensionList & * indicates that no source file has been specified. * */ - Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex)}; + Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex).value_or(std::string{"NOT_FOUND:"})}; std::string checkSum = generateMD5SumForFile(newArtifact.getFilePath()); newArtifact.setMD5(checkSum); outSymbol = elf.addSymbol(cName, byteSize, newArtifact); @@ -1326,9 +1335,127 @@ Symbol *Juicer::getBaseTypeSymbol(ElfFile &elf, Dwarf_Die inDie, DimensionList & } case DW_TAG_union_type: + { + Dwarf_Bool structHasName = false; + Dwarf_Bool parentHasName = false; + Dwarf_Unsigned byteSize = 0; + + /* Does the structure type itself have the name? */ + res = dwarf_hasattr(typeDie, DW_AT_name, &structHasName, &error); + if (res != DW_DLV_OK) + { + logger.logError("Error in dwarf_hasattr(DW_AT_name). errno=%u %s", dwarf_errno(error), dwarf_errmsg(error)); + } + + res = dwarf_hasattr(inDie, DW_AT_name, &parentHasName, &error); + if (res != DW_DLV_OK) + { + logger.logError("Error in dwarf_hasattr(DW_AT_name). errno=%u %s", dwarf_errno(error), dwarf_errmsg(error)); + } + + /* Read the name from the Die that has it. */ + if (structHasName) + { + res = dwarf_attr(typeDie, DW_AT_name, &attr_struct, &error); + if (res != DW_DLV_OK) + { + logger.logError("Error in dwarf_attr(DW_AT_name). %u errno=%u %s", __LINE__, dwarf_errno(error), dwarf_errmsg(error)); + } + + if (res == DW_DLV_OK) + { + res = dwarf_formstring(attr_struct, &dieName, &error); + if (res != DW_DLV_OK) + { + logger.logError("Error in dwarf_formstring. errno=%u %s", dwarf_errno(error), dwarf_errmsg(error)); + } + } + } + + if (res == DW_DLV_OK) + { + res = dwarf_bytesize(typeDie, &byteSize, &error); + if (res != DW_DLV_OK) + { + logger.logWarning("Skipping '%s'. Error in dwarf_bytesize. %u errno=%u %s", dieName, __LINE__, dwarf_errno(error), + dwarf_errmsg(error)); + } + } + + if (res == DW_DLV_OK) + { + std::string cName{""}; + if (dieName != nullptr) + { + cName = dieName; + } + else + { + logger.logWarning("Symbol does not have a name. This usually means an anonymous struct or union."); + } + + res = dwarf_attr(inDie, DW_AT_decl_file, &attr_struct, &error); + + if (DW_DLV_OK == res) + { + unsigned long long pathIndex = 0; + res = dwarf_formudata(attr_struct, &pathIndex, &error); + + /** + * According to 6.2 Line Number Information in DWARF 4: + * Line number information generated for a compilation unit is represented in the .debug_line + * section of an object file and is referenced by a corresponding compilation unit debugging + * information entry (see Section 3.1.1) in the .debug_info section. + * This is why we are using dwarf_siblingof_b instead of dwarf_siblingof and setting + * the is_info to true. + * + * We are using a new Dwarf_Die because if we use cur_die, we segfault. + * + * My theory on this is that even though when we initially call dwarf_siblingof on + * cur_die and as we read different kinds of tags/attributes(in particular type-related), + * the libdwarf library is modifying the die when I call dwarf_srcfiles on it. + * + * Notice that in https://penguin.windhoverlabs.lan/gitlab/ground-systems/libdwarf/-/blob/main/libdwarf/libdwarf/dwarf_die_deliv.c#L1365 + * + * This is just a theory, however. In the future we may revisit this + * to figure out the root cause of this. + * + */ + + if (pathIndex != 0) + { + /** + * Why we are checking against 0 as per DWARF section 2.14: + * + * The value of the DW_AT_decl_file attribute corresponds to a file number from the line number + * information table for the compilation unit containing the debugging information entry and + * represents the source file in which the declaration appeared (see Section 6.2 ). The value 0 + * indicates that no source file has been specified. + * + */ + Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex).value_or(std::string{"NOT_FOUND:"})}; + std::string checkSum = generateMD5SumForFile(newArtifact.getFilePath()); + newArtifact.setMD5(checkSum); + outSymbol = elf.addSymbol(cName, byteSize, newArtifact); + } + else + { + Artifact newArtifact{elf, "NOT_FOUND:" + cName}; + std::string checkSum{}; + newArtifact.setMD5(checkSum); + outSymbol = elf.addSymbol(cName, byteSize, newArtifact); + } + } + + if (nullptr != outSymbol) + { + process_DW_TAG_union_type(elf, *outSymbol, dbg, typeDie); + } + } + /* TODO */ - outSymbol = process_DW_TAG_base_type(elf, dbg, typeDie); + // outSymbol = process_DW_TAG_base_type(elf, dbg, typeDie); break; } @@ -3228,7 +3355,7 @@ Symbol *Juicer::process_DW_TAG_base_type(ElfFile &elf, Dwarf_Debug dbg, Dwarf_Di * indicates that no source file has been specified. * */ - Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex)}; + Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex).value_or(std::string{"NOT_FOUND:"})}; std::string checkSum = generateMD5SumForFile(newArtifact.getFilePath()); newArtifact.setMD5(checkSum); outSymbol = elf.addSymbol(sDieName, byteSize, newArtifact); @@ -3518,7 +3645,7 @@ Symbol *Juicer::process_DW_TAG_typedef(ElfFile &elf, Dwarf_Debug dbg, Dwarf_Die * indicates that no source file has been specified. * */ - Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex)}; + Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex).value_or(std::string{"NOT_FOUND:"})}; std::string checkSum = generateMD5SumForFile(newArtifact.getFilePath()); newArtifact.setMD5(checkSum); outSymbol = elf.addSymbol(sDieName, byteSize, newArtifact, baseTypeSymbol); @@ -3838,6 +3965,164 @@ void Juicer::process_DW_TAG_structure_type(ElfFile &elf, Symbol &symbol, Dwarf_D } } +/** + * @brief Inspects the union and adds each member as a field with byte_offset of zero. + * @param in_die the die entry that has the dwarf data. + * @param in_level The current level on the dbg structure. + * @return 0 if the die, its children and siblings are scanned successfully. + * 1 if there is a problem with dies or any of its children. + */ +void Juicer::process_DW_TAG_union_type(ElfFile &elf, Symbol &symbol, Dwarf_Debug dbg, Dwarf_Die inDie) +{ + int res = DW_DLV_OK; + Dwarf_Attribute attr_struct = nullptr; + Dwarf_Die memberDie = 0; + + Dwarf_Unsigned udata = 0; + Dwarf_Error error = 0; + + /* Get the fields by getting the first child. */ + if (res == DW_DLV_OK) + { + res = dwarf_child(inDie, &memberDie, &error); + if (res == DW_DLV_ERROR) + { + logger.logError("Error in dwarf_child. errno=%u %s", dwarf_errno(error), dwarf_errmsg(error)); + } + } + + /* Start processing the fields. */ + for (;;) + { + char *memberName = nullptr; + Symbol *memberBaseTypeSymbol = nullptr; + uint32_t memberLocation = 0; + + Dwarf_Unsigned udata = 0; + + if (res == DW_DLV_OK) + { + Dwarf_Half tag; + Dwarf_Die siblingDie = 0; + + res = dwarf_tag(memberDie, &tag, &error); + if (res == DW_DLV_ERROR) + { + logger.logError("Error in dwarf_tag. errno=%u %s", dwarf_errno(error), dwarf_errmsg(error)); + } + else + { + switch (tag) + { + case DW_TAG_union_type: + { + logger.logWarning("TODO: Union members are not yet supported."); + break; + } + + case DW_TAG_inheritance: + { + logger.logWarning("TODO: Inherited members not yet supported."); + break; + } + + case DW_TAG_typedef: + { + logger.logWarning("TODO: Typedef member attributes not yet supported."); + break; + } + + case DW_TAG_member: + { + DimensionList dimensionList{}; + + /* Get the name attribute of this Die. */ + + if (res == DW_DLV_OK) + { + res = dwarf_attr(memberDie, DW_AT_name, &attr_struct, &error); + if (res != DW_DLV_OK) + { + logger.logError("Error in dwarf_attr(DW_AT_name). %u errno=%u %s", __LINE__, dwarf_errno(error), dwarf_errmsg(error)); + } + } + + /* Get the actual name of this member. */ + if (res == DW_DLV_OK) + { + res = dwarf_formstring(attr_struct, &memberName, &error); + + if (res != DW_DLV_OK) + { + logger.logError("Error in dwarf_formstring. errno=%u %s", dwarf_errno(error), dwarf_errmsg(error)); + } + } + + /* Get the base type die. */ + if (res == DW_DLV_OK) + { + memberBaseTypeSymbol = getBaseTypeSymbol(elf, memberDie, dimensionList); + + if (memberBaseTypeSymbol == 0) + { + logger.logWarning("Couldn't find base type for %s:%s.", symbol.getName().c_str(), memberName); + + /* Set the error code so we don't do anymore processing. */ + res = DW_DLV_ERROR; + } + } + + /* We have everything we need. Add this field. */ + if (res == DW_DLV_OK) + { + std::string sMemberName = memberName; + + Field memberField{symbol, sMemberName, std::nullopt, *memberBaseTypeSymbol, dimensionList, elf.isLittleEndian()}; + + addBitFields(memberDie, memberField); + symbol.addField(memberField); + } + + break; + } + + /* Fall through */ + case DW_TAG_template_type_parameter: + case DW_TAG_template_value_parameter: + case DW_TAG_GNU_template_parameter_pack: + case DW_TAG_subprogram: + { + /* Ignore these */ + break; + } + + default: + break; + } + } + + res = dwarf_siblingof(dbg, memberDie, &siblingDie, &error); + if (res == DW_DLV_ERROR) + { + logger.logError("Error in dwarf_siblingof. errno=%u %s", dwarf_errno(error), dwarf_errmsg(error)); + } + else if (res == DW_DLV_NO_ENTRY) + { + /* We wrapped around. We're done processing the member fields. */ + break; + } + + memberDie = siblingDie; + } + + /* Don't continue looping if there was a problem. */ + if (res != DW_DLV_OK) + { + break; + } + } +} + void Juicer::addPaddingToStruct(Symbol &symbol) { uint32_t spareCount{0}; @@ -3859,9 +4144,16 @@ void Juicer::addPaddingToStruct(Symbol &symbol) previousFieldSize = symbol.getFields().at(i - 1)->getArraySize() * previousFieldSize; } - uint32_t lastFieldOffset = symbol.getFields().at(i - 1)->getByteOffset(); + // There are cases when the byte offset does not exist (e.g. unions) + if (!((symbol.getFields().at(i - 1)->getByteOffset()) && (symbol.getFields().at(i)->getByteOffset()))) + { + logger.logWarning("Fields of Symbol %s do not have byte offset.", symbol.getName()); + continue; + } + + uint32_t lastFieldOffset = symbol.getFields().at(i - 1)->getByteOffset().value(); - uint32_t memberLocationDelta = symbol.getFields().at(i)->getByteOffset() - lastFieldOffset; + uint32_t memberLocationDelta = symbol.getFields().at(i)->getByteOffset().value() - lastFieldOffset; uint32_t memberLocation = lastFieldOffset + previousFieldSize; @@ -3924,12 +4216,12 @@ void Juicer::addPaddingEndToStruct(Symbol &symbol) if (!hasBitFields && symbol.getFields().size() > 0) { - symbolSize = symbol.getFields().back()->getByteOffset() + symbol.getFields().back()->getType().getByteSize(); + symbolSize = symbol.getFields().back()->getByteOffset().value() + symbol.getFields().back()->getType().getByteSize(); if (symbol.getFields().back()->getArraySize() > 0) { - symbolSize = - symbol.getFields().back()->getByteOffset() + (symbol.getFields().back()->getType().getByteSize() * symbol.getFields().back()->getArraySize()); + symbolSize = symbol.getFields().back()->getByteOffset().value() + + (symbol.getFields().back()->getType().getByteSize() * symbol.getFields().back()->getArraySize()); } sizeDelta = symbol.getByteSize() - symbolSize; @@ -3950,7 +4242,7 @@ void Juicer::addPaddingEndToStruct(Symbol &symbol) paddingSymbol = symbol.getElf().addSymbol(paddingType, sizeDelta, newArtifact); } - uint32_t newFieldByteOffset = symbol.getFields().back()->getByteOffset() + symbol.getFields().back()->getType().getByteSize(); + uint32_t newFieldByteOffset = symbol.getFields().back()->getByteOffset().value() + symbol.getFields().back()->getType().getByteSize(); symbol.addField(paddingFieldName, newFieldByteOffset, *paddingSymbol, symbol.getElf().isLittleEndian(), 0, 0); } @@ -4149,7 +4441,7 @@ int Juicer::getDieAndSiblings(ElfFile &elf, Dwarf_Debug dbg, Dwarf_Die in_die, i * indicates that no source file has been specified. * */ - Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex)}; + Artifact newArtifact{elf, getdbgSourceFile(elf, pathIndex).value_or(std::string{"NOT_FOUND:"})}; std::string checkSum = generateMD5SumForFile(newArtifact.getFilePath()); newArtifact.setMD5(checkSum); outSymbol = elf.addSymbol(sDieName, byteSize, newArtifact); @@ -5148,7 +5440,6 @@ int Juicer::parse(std::string &elfFilePath) if (JUICER_OK == return_value) { - /* Initialize the Dwarf library. This will open the file. */ /* Initialize the Dwarf library. This will open the file. */ dwarf_value = dwarf_init_b(elfFile, DW_DLC_READ, groupNumber, errhand, errarg, &dbg, &error); if (dwarf_value != DW_DLV_OK) @@ -5459,8 +5750,13 @@ std::string Juicer::generateMD5SumForFile(std::string filePath) * handles debug source files lookups for different DWARF versions. * It is assumed the pathIndex is the value of DW_AT_decl_file attribute */ -std::string &Juicer::getdbgSourceFile(ElfFile &elf, int pathIndex) +std::optional Juicer::getdbgSourceFile(ElfFile &elf, int pathIndex) { + if (dbgSourceFiles.empty()) + { + return std::nullopt; + } + switch (dwarfVersion) { /** @@ -5472,14 +5768,18 @@ std::string &Juicer::getdbgSourceFile(ElfFile &elf, int pathIndex) case 4: { - return dbgSourceFiles.at(pathIndex - 1); + return std::string{dbgSourceFiles.at(pathIndex - 1)}; } case 5: { + return std::string{dbgSourceFiles.at(pathIndex)}; + } + default: + { + logger.logWarning("Found unsupported version(%d) of DWARF. The index to the source file name table will be used as is.", dwarfVersion); return dbgSourceFiles.at(pathIndex); } } - return dbgSourceFiles.at(pathIndex); } -unsigned int Juicer::getDwarfVersion() { return dwarfVersion; } \ No newline at end of file +unsigned int Juicer::getDwarfVersion() { return dwarfVersion; } diff --git a/src/Juicer.h b/src/Juicer.h index 0a4fece6..61353c0c 100644 --- a/src/Juicer.h +++ b/src/Juicer.h @@ -106,47 +106,48 @@ class Juicer unsigned int getDwarfVersion(); private: - Dwarf_Debug dbg = 0; - int res = DW_DLV_ERROR; - Dwarf_Handler errhand; - Dwarf_Ptr errarg = 0; - int readCUList(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Error& error); - int getDieAndSiblings(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die in_die, int in_level); - Symbol* process_DW_TAG_typedef(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die in_die); - Symbol* process_DW_TAG_base_type(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die in_die); - void process_DW_TAG_structure_type(ElfFile& elf, Symbol& symbol, Dwarf_Debug dbg, Dwarf_Die inDie); - Symbol* process_DW_TAG_pointer_type(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die inDie); - Symbol* process_DW_TAG_variable_type(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die inDie); - void process_DW_TAG_enumeration_type(ElfFile& elf, Symbol& symbol, Dwarf_Debug dbg, Dwarf_Die inDie); - int process_DW_TAG_array_type(ElfFile& elf, Symbol& symbol, Dwarf_Debug dbg, Dwarf_Die inDie); - char* getFirstAncestorName(Dwarf_Die inDie); - int printDieData(Dwarf_Debug dbg, Dwarf_Die print_me, uint32_t level); - char* dwarfStringToChar(char* dwarfString); - void addBitFields(Dwarf_Die dataMemberDie, Field& dataMemberField); - void addPaddingToStruct(Symbol& symbol); - void addPaddingEndToStruct(Symbol& symbol); - bool isDWARFVersionSupported(Dwarf_Die); - int elfFile = 0; - Logger logger; - IDataContainer* idc = 0; - bool isIDCSet(void); - Symbol* getBaseTypeSymbol(ElfFile& elf, Dwarf_Die inDie, DimensionList& multiplicity); - void DisplayDie(Dwarf_Die inDie, uint32_t level); - - std::vector getChildrenVector(Dwarf_Debug dbg, Dwarf_Die die); - int getNumberOfSiblingsForDie(Dwarf_Debug dbg, Dwarf_Die die); - - uint32_t calcArraySizeForDimension(Dwarf_Debug dbg, Dwarf_Die die); - - DimensionList getDimList(Dwarf_Debug dbg, Dwarf_Die die); - - std::vector dbgSourceFiles{}; - - std::string generateMD5SumForFile(std::string filePath); - std::string& getdbgSourceFile(ElfFile& elf, int pathIndex); - DefineMacro getDefineMacro(Dwarf_Half macro_operator, Dwarf_Macro_Context mac_context, int i, Dwarf_Unsigned line_number, Dwarf_Unsigned index, - Dwarf_Unsigned offset, const char* macro_string, Dwarf_Half& forms_count, Dwarf_Error& error, Dwarf_Die cu_die, ElfFile& elf); - DefineMacro getDefineMacroFromString(std::string macro_string); + Dwarf_Debug dbg = 0; + int res = DW_DLV_ERROR; + Dwarf_Handler errhand; + Dwarf_Ptr errarg = 0; + int readCUList(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Error& error); + int getDieAndSiblings(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die in_die, int in_level); + Symbol* process_DW_TAG_typedef(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die in_die); + Symbol* process_DW_TAG_base_type(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die in_die); + void process_DW_TAG_structure_type(ElfFile& elf, Symbol& symbol, Dwarf_Debug dbg, Dwarf_Die inDie); + Symbol* process_DW_TAG_pointer_type(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die inDie); + Symbol* process_DW_TAG_variable_type(ElfFile& elf, Dwarf_Debug dbg, Dwarf_Die inDie); + void process_DW_TAG_enumeration_type(ElfFile& elf, Symbol& symbol, Dwarf_Debug dbg, Dwarf_Die inDie); + int process_DW_TAG_array_type(ElfFile& elf, Symbol& symbol, Dwarf_Debug dbg, Dwarf_Die inDie); + void process_DW_TAG_union_type(ElfFile& elf, Symbol& symbol, Dwarf_Debug dbg, Dwarf_Die inDie); + char* getFirstAncestorName(Dwarf_Die inDie); + int printDieData(Dwarf_Debug dbg, Dwarf_Die print_me, uint32_t level); + char* dwarfStringToChar(char* dwarfString); + void addBitFields(Dwarf_Die dataMemberDie, Field& dataMemberField); + void addPaddingToStruct(Symbol& symbol); + void addPaddingEndToStruct(Symbol& symbol); + bool isDWARFVersionSupported(Dwarf_Die); + int elfFile = 0; + Logger logger; + IDataContainer* idc = 0; + bool isIDCSet(void); + Symbol* getBaseTypeSymbol(ElfFile& elf, Dwarf_Die inDie, DimensionList& multiplicity); + void DisplayDie(Dwarf_Die inDie, uint32_t level); + + std::vector getChildrenVector(Dwarf_Debug dbg, Dwarf_Die die); + int getNumberOfSiblingsForDie(Dwarf_Debug dbg, Dwarf_Die die); + + uint32_t calcArraySizeForDimension(Dwarf_Debug dbg, Dwarf_Die die); + + DimensionList getDimList(Dwarf_Debug dbg, Dwarf_Die die); + + std::vector dbgSourceFiles{}; + + std::string generateMD5SumForFile(std::string filePath); + std::optional getdbgSourceFile(ElfFile& elf, int pathIndex); + DefineMacro getDefineMacro(Dwarf_Half macro_operator, Dwarf_Macro_Context mac_context, int i, Dwarf_Unsigned line_number, Dwarf_Unsigned index, + Dwarf_Unsigned offset, const char* macro_string, Dwarf_Half& forms_count, Dwarf_Error& error, Dwarf_Die cu_die, ElfFile& elf); + DefineMacro getDefineMacroFromString(std::string macro_string); std::map> getObjDataFromElf(ElfFile* elfFileObj); bool extras; diff --git a/src/SQLiteDB.cpp b/src/SQLiteDB.cpp index f6aaabce..bd6f8e60 100644 --- a/src/SQLiteDB.cpp +++ b/src/SQLiteDB.cpp @@ -1179,7 +1179,7 @@ int SQLiteDB::writeSymbolsToDatabase(ElfFile& inElf) */ std::string writeSymbolQuery{}; - if (!symbol->hasEncoding()) + if (!symbol->getEncoding()) { writeSymbolQuery += "INSERT INTO symbols(elf, name, byte_size, artifact, long_description, short_description) " @@ -1242,8 +1242,7 @@ int SQLiteDB::writeSymbolsToDatabase(ElfFile& inElf) writeSymbolQuery += ","; writeSymbolQuery += "\""; - writeSymbolQuery += std::to_string(symbol->getElf().getDWARFEncoding(symbol->getEncoding()).getId()); - // writeSymbolQuery += "-47"; + writeSymbolQuery += std::to_string(symbol->getElf().getDWARFEncoding(symbol->getEncoding().value()).getId()); writeSymbolQuery += "\","; writeSymbolQuery += std::to_string(symbol->getArtifact().getId()); @@ -1354,41 +1353,79 @@ int SQLiteDB::writeFieldsToDatabase(ElfFile& inElf) * but I'm not sure what is the best way to do that without it being * messy. */ - std::string writeFieldQuery{}; - - writeFieldQuery += - "INSERT INTO fields(symbol, name, byte_offset, type, " - "little_endian, bit_size, bit_offset, long_description, short_description) VALUES("; - writeFieldQuery += std::to_string(field->getSymbol().getId()); - writeFieldQuery += ","; - writeFieldQuery += "\""; - writeFieldQuery += field->getName(); - writeFieldQuery += "\""; - writeFieldQuery += ","; - writeFieldQuery += std::to_string(field->getByteOffset()); - writeFieldQuery += ","; - writeFieldQuery += std::to_string(field->getType().getId()); - writeFieldQuery += ","; - writeFieldQuery += std::to_string(field->isLittleEndian() ? SQLiteDB_TRUE : SQLiteDB_FALSE); - - writeFieldQuery += ","; - writeFieldQuery += std::to_string(field->getBitSize()); - writeFieldQuery += ","; - writeFieldQuery += std::to_string(field->getBitOffset()); - - writeFieldQuery += ","; - writeFieldQuery += "\""; - writeFieldQuery += field->getLongDescription(); - writeFieldQuery += "\""; - - writeFieldQuery += ","; - writeFieldQuery += "\""; - writeFieldQuery += field->getShortDescription(); - writeFieldQuery += "\""; - - writeFieldQuery += ");"; - - rc = sqlite3_exec(database, writeFieldQuery.c_str(), NULL, NULL, &errorMessage); + std::string writeFieldQuery{}; + + std::optional byteOffset = field->getByteOffset(); + + if (byteOffset) + { + writeFieldQuery += + "INSERT INTO fields(symbol, name, byte_offset, type, " + "little_endian, bit_size, bit_offset, long_description, short_description) VALUES("; + writeFieldQuery += std::to_string(field->getSymbol().getId()); + writeFieldQuery += ","; + writeFieldQuery += "\""; + writeFieldQuery += field->getName(); + writeFieldQuery += "\""; + writeFieldQuery += ","; + writeFieldQuery += std::to_string(field->getByteOffset().value()); + writeFieldQuery += ","; + writeFieldQuery += std::to_string(field->getType().getId()); + writeFieldQuery += ","; + writeFieldQuery += std::to_string(field->isLittleEndian() ? SQLiteDB_TRUE : SQLiteDB_FALSE); + + writeFieldQuery += ","; + writeFieldQuery += std::to_string(field->getBitSize()); + writeFieldQuery += ","; + writeFieldQuery += std::to_string(field->getBitOffset()); + + writeFieldQuery += ","; + writeFieldQuery += "\""; + writeFieldQuery += field->getLongDescription(); + writeFieldQuery += "\""; + + writeFieldQuery += ","; + writeFieldQuery += "\""; + writeFieldQuery += field->getShortDescription(); + writeFieldQuery += "\""; + + writeFieldQuery += ");"; + } + + else + { + writeFieldQuery += + "INSERT INTO fields(symbol, name, type, " + "little_endian, bit_size, bit_offset, long_description, short_description) VALUES("; + writeFieldQuery += std::to_string(field->getSymbol().getId()); + writeFieldQuery += ","; + writeFieldQuery += "\""; + writeFieldQuery += field->getName(); + writeFieldQuery += "\""; + writeFieldQuery += ","; + writeFieldQuery += std::to_string(field->getType().getId()); + writeFieldQuery += ","; + writeFieldQuery += std::to_string(field->isLittleEndian() ? SQLiteDB_TRUE : SQLiteDB_FALSE); + + writeFieldQuery += ","; + writeFieldQuery += std::to_string(field->getBitSize()); + writeFieldQuery += ","; + writeFieldQuery += std::to_string(field->getBitOffset()); + + writeFieldQuery += ","; + writeFieldQuery += "\""; + writeFieldQuery += field->getLongDescription(); + writeFieldQuery += "\""; + + writeFieldQuery += ","; + writeFieldQuery += "\""; + writeFieldQuery += field->getShortDescription(); + writeFieldQuery += "\""; + + writeFieldQuery += ");"; + } + + rc = sqlite3_exec(database, writeFieldQuery.c_str(), NULL, NULL, &errorMessage); if (SQLITE_OK == rc) { diff --git a/src/SQLiteDB.h b/src/SQLiteDB.h index 2cea08cb..d023345e 100644 --- a/src/SQLiteDB.h +++ b/src/SQLiteDB.h @@ -64,7 +64,7 @@ id INTEGER PRIMARY KEY,\ symbol INTEGER NOT NULL,\ name TEXT NOT NULL,\ - byte_offset INTEGER NOT NULL,\ + byte_offset INTEGER,\ type INTEGER NOT NULL,\ little_endian BOOLEAN,\ bit_size INTEGER NOT NULL,\ diff --git a/src/Symbol.cpp b/src/Symbol.cpp index a96805ae..5dad9996 100644 --- a/src/Symbol.cpp +++ b/src/Symbol.cpp @@ -48,8 +48,8 @@ void Symbol::addField(Field& inField) *unique_ptr, which is also called addField. Maybe we should place our *elf data structures inside a namespace called ElfData? */ -void Symbol::addField(std::string& inName, uint32_t inByteOffset, Symbol& inType, DimensionList& dimensionList, bool inLittleEndian, uint32_t inBitSize, - uint32_t inBitOffset) +void Symbol::addField(std::string& inName, std::optional inByteOffset, Symbol& inType, DimensionList& dimensionList, bool inLittleEndian, + uint32_t inBitSize, uint32_t inBitOffset) { Field* field = getField(inName); @@ -191,31 +191,31 @@ bool Symbol::hasBitFields(void) return hasBitField; } -Artifact& Symbol::getArtifact() { return artifact; } +Artifact& Symbol::getArtifact() { return artifact; } /** * @brief Symbol::setTargetSymbol * @note Might make sense to use std:optional for targetSymbol, however need to upgrade to C++17 first. * @param newTargetSymbol */ -void Symbol::setTargetSymbol(Symbol* newTargetSymbol) { targetSymbol = newTargetSymbol; } +void Symbol::setTargetSymbol(Symbol* newTargetSymbol) { targetSymbol = newTargetSymbol; } /** * @brief Symbol::hasTargetSymbol * If this function returns false, then * that means this is the concrete symbol not a typdef'd(aliased) symbol. */ -bool Symbol::hasTargetSymbol() { return targetSymbol != nullptr; } +bool Symbol::hasTargetSymbol() { return targetSymbol != nullptr; } -Symbol* Symbol::getTargetSymbol() { return targetSymbol; } +Symbol* Symbol::getTargetSymbol() { return targetSymbol; } /** * @brief Symbol::setEncoding * @param newEncoding an integer which is one of the values specified in * in dwarf.h or in DWARF5 specification document section 5.1.1 titled "Base Type Encodings" */ -void Symbol::setEncoding(int newEncoding) { encoding = newEncoding; } +void Symbol::setEncoding(int newEncoding) { encoding = newEncoding; } -bool Symbol::hasEncoding() { return encoding != -1; } +bool Symbol::hasEncoding() { return encoding != -1; } -int Symbol::getEncoding() { return encoding; } +std::optional Symbol::getEncoding() { return encoding; } diff --git a/src/Symbol.h b/src/Symbol.h index 2d8c1807..53246be4 100644 --- a/src/Symbol.h +++ b/src/Symbol.h @@ -45,8 +45,8 @@ class Symbol uint32_t getId(void) const; Symbol(const Symbol &symbol); void addField(Field &inField); - void addField(std::string &inName, uint32_t inByteOffset, Symbol &inType, DimensionList &dimensionList, bool inLittleEndian, uint32_t inBitSize = 0, - uint32_t inBitOffset = 0); + void addField(std::string &inName, std::optional inByteOffset, Symbol &inType, DimensionList &dimensionList, bool inLittleEndian, + uint32_t inBitSize = 0, uint32_t inBitOffset = 0); void addField(std::string &inName, uint32_t inByteOffset, Symbol &inType, bool inLittleEndian, uint32_t inBitSize = 0, uint32_t inBitOffset = 0); void addEnumeration(Enumeration &inEnumeration); void addEnumeration(std::string &name, int32_t value); @@ -71,7 +71,7 @@ class Symbol bool hasEncoding(); - int getEncoding(); + std::optional getEncoding(); private: ElfFile &elf; @@ -87,7 +87,7 @@ class Symbol std::string short_description; std::string long_description; - int encoding{-1}; + std::optional encoding{std::nullopt}; }; #endif /* SYMBOL_H_ */ diff --git a/src/main.cpp b/src/main.cpp index bb136a24..09e45b4b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -45,7 +45,7 @@ #include "TestSymbolsA.h" #include "TestSymbolsB.h" -const char *argp_program_version = "juicer 0.1"; +const char *argp_program_version = JUICER_VERSION; // JUICER_VERSION macro is generated by build const char *argp_program_bug_address = ""; /* Program documentation. */ @@ -56,7 +56,7 @@ static char doc[] = /* A description of the arguments we accept. */ static char args_doc[] = "--input --mode (--output | " - "(--address --port --project )) -x -g"; + "(--address --port --project )) -x -g --version"; /* The options we understand. */ static struct argp_option options[] = {{"input", 'i', "FILE", 0, "Input ELF file"}, diff --git a/unit-test/main_test.cpp b/unit-test/main_test.cpp index d4924364..e18eab81 100644 --- a/unit-test/main_test.cpp +++ b/unit-test/main_test.cpp @@ -625,37 +625,159 @@ TEST_CASE("Test the correctness of the Circle struct after Juicer has processed REQUIRE(modeEnumsRecords[7]["name"] == "MODE_SLOT_MAX"); REQUIRE(modeEnumsRecords[7]["value"] == "6"); - REQUIRE(fieldsRecords.at(4)["name"] == "_spare_end"); - /** - *Check the correctness of the fields - */ + // TODO:Add support for unions first before adding these tests. - std::string getSpareEndType{"SELECT * FROM symbols where id="}; + REQUIRE(fieldsRecords.at(4)["name"] == "union_object"); + // /** + // *Check the correctness of the fields + // */ - getSpareEndType += fieldsRecords.at(4)["type"]; - getSpareEndType += ";"; + std::string getUnionObjectType{"SELECT * FROM symbols where id="}; + + getUnionObjectType += fieldsRecords.at(4)["type"]; + getUnionObjectType += ";"; - std::vector> spareEndSymbolRecords{}; + std::vector> unionObjectSymbolRecords{}; - rc = sqlite3_exec(database, getSpareEndType.c_str(), selectCallbackUsingColNameAsKey, &spareEndSymbolRecords, &errorMessage); + rc = sqlite3_exec(database, getUnionObjectType.c_str(), selectCallbackUsingColNameAsKey, &unionObjectSymbolRecords, &errorMessage); REQUIRE(rc == SQLITE_OK); - REQUIRE(spareEndSymbolRecords.size() == 1); + REQUIRE(unionObjectSymbolRecords.size() == 1); - std::string spareEndType{spareEndSymbolRecords.at(0).at("id")}; + std::string unionObjectType{unionObjectSymbolRecords.at(0).at("id")}; - // TODO:Add support for unions first before adding these tests. + REQUIRE(fieldsRecords.at(4)["symbol"] == circleRecords.at(0)["id"]); + REQUIRE(fieldsRecords.at(4)["name"] == "union_object"); + REQUIRE(fieldsRecords.at(4)["byte_offset"] == std::to_string(offsetof(Circle, union_object))); + REQUIRE(fieldsRecords.at(4)["type"] == unionObjectType); + REQUIRE(fieldsRecords.at(4)["little_endian"] == little_endian); + REQUIRE(fieldsRecords.at(4)["bit_size"] == "0"); + REQUIRE(fieldsRecords.at(4)["bit_offset"] == "0"); + REQUIRE(fieldsRecords.at(4)["short_description"] == ""); + REQUIRE(fieldsRecords.at(4)["long_description"] == ""); + + // Test the members of the union + + std::string getUnionFields{"SELECT * FROM fields WHERE symbol = "}; + + getUnionFields += unionObjectSymbolRecords.at(0).at("id"); + getUnionFields += ";"; + + std::vector> unionFieldsRecords{}; + + rc = sqlite3_exec(database, getUnionFields.c_str(), selectCallbackUsingColNameAsKey, &unionFieldsRecords, &errorMessage); + + REQUIRE(rc == SQLITE_OK); + + REQUIRE(unionFieldsRecords.size() == 3); + + // Map each record to field name since unions don't have byte_offset, we can't rely on "order" + + std::map> nameToUnionField{}; + + for (auto unionFieldsRecord : unionFieldsRecords) + { + nameToUnionField[unionFieldsRecord.at("name")] = unionFieldsRecord; + } + + REQUIRE((nameToUnionField.find("id") != nameToUnionField.end())); + REQUIRE((nameToUnionField.find("bit_field") != nameToUnionField.end())); + REQUIRE((nameToUnionField.find("data") != nameToUnionField.end())); + + std::string getUnionIdtType{"SELECT * FROM symbols where id="}; + + getUnionIdtType += nameToUnionField.at("id").at("type"); + getUnionIdtType += ";"; + + std::vector> unionIdtTypeRecords{}; + + rc = sqlite3_exec(database, getUnionIdtType.c_str(), selectCallbackUsingColNameAsKey, &unionIdtTypeRecords, &errorMessage); + + REQUIRE(rc == SQLITE_OK); + + REQUIRE(unionIdtTypeRecords.size() == 1); + + REQUIRE("int32_t" == unionIdtTypeRecords.at(0).at("name")); + + REQUIRE(nameToUnionField["id"]["symbol"] == unionObjectSymbolRecords.at(0)["id"]); + REQUIRE(nameToUnionField["id"]["name"] == "id"); + REQUIRE(nameToUnionField["id"]["byte_offset"] == "NULL"); + // REQUIRE(nameToUnionField["id"]["type"] == unionObjectType); + REQUIRE(nameToUnionField["id"]["little_endian"] == little_endian); + REQUIRE(nameToUnionField["id"]["bit_size"] == "0"); + REQUIRE(nameToUnionField["id"]["bit_offset"] == "0"); + REQUIRE(nameToUnionField["id"]["short_description"] == ""); + REQUIRE(nameToUnionField["id"]["long_description"] == ""); + + std::string getUnionBitFieldType{"SELECT * FROM symbols where id="}; + + getUnionBitFieldType += nameToUnionField.at("bit_field").at("type"); + getUnionBitFieldType += ";"; + + std::vector> unionBitFieldTypeRecords{}; + + rc = sqlite3_exec(database, getUnionBitFieldType.c_str(), selectCallbackUsingColNameAsKey, &unionBitFieldTypeRecords, &errorMessage); - // REQUIRE(fieldsRecords.at(4)["symbol"] == circleRecords.at(0)["id"]); - // REQUIRE(fieldsRecords.at(4)["name"] == "_spare_end"); - // REQUIRE(fieldsRecords.at(4)["byte_offset"] == std::to_string( sizeof(float) + sizeof(float) + (sizeof(int) * 128) + sizeof(ModeSlot_t) )); - // REQUIRE(fieldsRecords.at(4)["type"] == spareEndType); - // REQUIRE(fieldsRecords.at(4)["little_endian"] == little_endian); - // REQUIRE(fieldsRecords.at(4)["bit_size"] == "0"); - // REQUIRE(fieldsRecords.at(4)["bit_offset"] == "0"); - // REQUIRE(fieldsRecords.at(4)["short_description"] == ""); - // REQUIRE(fieldsRecords.at(4)["long_description"] == ""); + REQUIRE(rc == SQLITE_OK); + + REQUIRE(unionBitFieldTypeRecords.size() == 1); + + REQUIRE("int32_t" == unionBitFieldTypeRecords.at(0).at("name")); + + REQUIRE(nameToUnionField["bit_field"]["symbol"] == unionObjectSymbolRecords.at(0)["id"]); + REQUIRE(nameToUnionField["bit_field"]["name"] == "bit_field"); + REQUIRE(nameToUnionField["bit_field"]["byte_offset"] == "NULL"); + // REQUIRE(nameToUnionField["id"]["type"] == unionObjectType); + REQUIRE(nameToUnionField["bit_field"]["little_endian"] == little_endian); + REQUIRE(nameToUnionField["bit_field"]["bit_size"] == "10"); + REQUIRE(nameToUnionField["bit_field"]["bit_offset"] == "22"); + REQUIRE(nameToUnionField["bit_field"]["short_description"] == ""); + REQUIRE(nameToUnionField["bit_field"]["long_description"] == ""); + + std::string getUnionDataFieldType{"SELECT * FROM symbols where id="}; + + getUnionDataFieldType += nameToUnionField.at("data").at("type"); + getUnionDataFieldType += ";"; + + std::vector> unionDataFieldTypeRecords{}; + + rc = sqlite3_exec(database, getUnionDataFieldType.c_str(), selectCallbackUsingColNameAsKey, &unionDataFieldTypeRecords, &errorMessage); + + REQUIRE(rc == SQLITE_OK); + + REQUIRE(unionDataFieldTypeRecords.size() == 1); + + REQUIRE("uint8_t" == unionDataFieldTypeRecords.at(0).at("name")); + + REQUIRE(nameToUnionField["bit_field"]["symbol"] == unionObjectSymbolRecords.at(0)["id"]); + REQUIRE(nameToUnionField["bit_field"]["name"] == "bit_field"); + REQUIRE(nameToUnionField["bit_field"]["byte_offset"] == "NULL"); + // REQUIRE(nameToUnionField["id"]["type"] == unionObjectType); + REQUIRE(nameToUnionField["bit_field"]["little_endian"] == little_endian); + REQUIRE(nameToUnionField["bit_field"]["bit_size"] == "10"); + REQUIRE(nameToUnionField["bit_field"]["bit_offset"] == "22"); + REQUIRE(nameToUnionField["bit_field"]["short_description"] == ""); + REQUIRE(nameToUnionField["bit_field"]["long_description"] == ""); + + // Test uint8_t data[32] inside of union + std::string getDataDimensionLists{"SELECT * FROM dimension_lists WHERE field_id="}; + getDataDimensionLists += nameToUnionField.at("data")["id"]; + getDataDimensionLists += ";"; + + std::vector> dataDimensionListsRecords{}; + + rc = sqlite3_exec(database, getDataDimensionLists.c_str(), selectCallbackUsingColNameAsKey, &dataDimensionListsRecords, &errorMessage); + REQUIRE(rc == SQLITE_OK); + REQUIRE(dataDimensionListsRecords.size() == 1); + + // Enforce order of records by dim_order + std::sort(dataDimensionListsRecords.begin(), dataDimensionListsRecords.end(), + [](std::map a, std::map b) { return std::stoi(a["dim_order"]) < std::stoi(b["dim_order"]); }); + + REQUIRE(dataDimensionListsRecords.at(0)["field_id"] == nameToUnionField.at("data")["id"]); + REQUIRE(dataDimensionListsRecords.at(0)["dim_order"] == "0"); + REQUIRE(dataDimensionListsRecords.at(0)["upper_bound"] == "3"); /** * *Clean up our database handle and objects in memory. @@ -1446,7 +1568,7 @@ TEST_CASE( REQUIRE(numberOfColumns == 9); /** - * Check the correctness of Square struct. + * Check the correctness of CFE_ES_HousekeepingTlm_Payload_t struct. */ REQUIRE(hkRecords.at(0)["name"] == "CFE_ES_HousekeepingTlm_Payload_t"); @@ -2813,6 +2935,46 @@ TEST_CASE("Test 32-bit binary.", "[main_test#10]") REQUIRE(matrix1DDimensionListsRecords.at(0)["dim_order"] == "0"); REQUIRE(matrix1DDimensionListsRecords.at(0)["upper_bound"] == "1"); + std::string getExtraType{"SELECT * FROM symbols where id="}; + getExtraType += squareFieldsRecords.at(9)["type"]; + getExtraType += ";"; + + std::vector> extraTypeRecords{}; + + rc = sqlite3_exec(database, getExtraType.c_str(), selectCallbackUsingColNameAsKey, &extraTypeRecords, &errorMessage); + REQUIRE(rc == SQLITE_OK); + REQUIRE(extraTypeRecords.size() == 1); + + std::string extraType{extraTypeRecords.at(0)["id"]}; + + REQUIRE(extraTypeRecords.at(0)["byte_size"] == std::to_string(sizeof(uint8_t))); + + REQUIRE(squareFieldsRecords.at(9)["symbol"] == squareRecords.at(0)["id"]); + REQUIRE(squareFieldsRecords.at(9)["name"] == "extra"); + REQUIRE(squareFieldsRecords.at(9)["byte_offset"] == std::to_string(offsetof(Square, extra))); + REQUIRE(squareFieldsRecords.at(9)["type"] == extraType); + REQUIRE(squareFieldsRecords.at(9)["little_endian"] == little_endian); + + std::string getSpareEndType{"SELECT * FROM symbols where id="}; + getSpareEndType += squareFieldsRecords.at(10)["type"]; + getSpareEndType += ";"; + + std::vector> spareEndTypeRecords{}; + + rc = sqlite3_exec(database, getSpareEndType.c_str(), selectCallbackUsingColNameAsKey, &spareEndTypeRecords, &errorMessage); + REQUIRE(rc == SQLITE_OK); + REQUIRE(spareEndTypeRecords.size() == 1); + + std::string spareEndType{spareEndTypeRecords.at(0)["id"]}; + + REQUIRE(spareEndTypeRecords.at(0)["byte_size"] == std::to_string(3)); + + REQUIRE(squareFieldsRecords.at(10)["symbol"] == squareRecords.at(0)["id"]); + REQUIRE(squareFieldsRecords.at(10)["name"] == "_spare_end"); + REQUIRE(squareFieldsRecords.at(10)["byte_offset"] == std::to_string(offsetof(Square, extra) + sizeof(uint8_t))); + REQUIRE(squareFieldsRecords.at(10)["type"] == spareEndType); + REQUIRE(squareFieldsRecords.at(10)["little_endian"] == little_endian); + REQUIRE(remove("./test_db.sqlite") == 0); delete idc; } diff --git a/unit-test/test_file1.h b/unit-test/test_file1.h index 29052592..d2b5f1c4 100644 --- a/unit-test/test_file1.h +++ b/unit-test/test_file1.h @@ -13,10 +13,11 @@ #include "stdint.h" -union Oject +union Object { int32_t id; - char data[16]; + int32_t bit_field : 10; + uint8_t data[4]; }; /*************************************************************************/ @@ -186,7 +187,7 @@ struct Circle float radius; int points[128]; ModeSlot_t mode; - Oject union_object; + Object union_object; }; enum Color